From 9e1e24e1c44a8c8c5672e2d2e3894664d0baf9ac Mon Sep 17 00:00:00 2001 From: CvH Date: Sat, 20 Feb 2021 16:26:04 +0100 Subject: [PATCH 1/4] mkpkg_pvr: update cc to new url --- tools/mkpkg/mkpkg_pvr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/mkpkg/mkpkg_pvr b/tools/mkpkg/mkpkg_pvr index 128e6d46e6..842d3d8249 100755 --- a/tools/mkpkg/mkpkg_pvr +++ b/tools/mkpkg/mkpkg_pvr @@ -16,7 +16,7 @@ DVB_MKPKG_FOLDER="$(pwd)" # crazycat if [ "$MEDIA_BUILD_PROJECT" = "crazycat" ]; then - MEDIA_BUILD_URL="https://bitbucket.org/CrazyCat/media_build.git" + MEDIA_BUILD_URL="https://github.com/crazycat69/media_build.git" MEDIA_TREE_URL="https://github.com/crazycat69/linux_media.git" MEDIA_TREE_BRANCH="latest" MEDIA_BUILD_NAME="crazycat" From c7ea0f97d3875caa4f644688e55c6fc0fbf4bb98 Mon Sep 17 00:00:00 2001 From: CvH Date: Sat, 20 Feb 2021 16:26:04 +0100 Subject: [PATCH 2/4] crazycat: update to 2021-02-16 --- packages/linux-driver-addons/dvb/crazycat/package.mk | 4 ++-- .../dvb/depends/media_tree_cc/package.mk | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/linux-driver-addons/dvb/crazycat/package.mk b/packages/linux-driver-addons/dvb/crazycat/package.mk index 209b454ff1..fb645378cd 100644 --- a/packages/linux-driver-addons/dvb/crazycat/package.mk +++ b/packages/linux-driver-addons/dvb/crazycat/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="crazycat" -PKG_VERSION="18984b1ae3b4bd558e72a4196d9b392f31fd8447" -PKG_SHA256="90f2e4248102baa8935bd835cfc1cd4106b0013ff7482bf06aebc87485b1ffd1" +PKG_VERSION="4a6d5e54cb90363e50f20a91af93aec84eef3205" +PKG_SHA256="b55eb13d2f9a92d8b75a84f4f77d841ae12bbb6c97bd672ffd9eb2e2800d0523" PKG_LICENSE="GPL" PKG_SITE="https://github.com/crazycat69/media_build" PKG_URL="https://github.com/LibreELEC/media_build/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/linux-driver-addons/dvb/depends/media_tree_cc/package.mk b/packages/linux-driver-addons/dvb/depends/media_tree_cc/package.mk index ba856abfbc..ac8a0d456c 100644 --- a/packages/linux-driver-addons/dvb/depends/media_tree_cc/package.mk +++ b/packages/linux-driver-addons/dvb/depends/media_tree_cc/package.mk @@ -2,10 +2,10 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="media_tree_cc" -PKG_VERSION="2020-02-14" -PKG_SHA256="c81d0412c8f237ecf30100ba1260625ca25df463102af331b063f4a7dca164f5" +PKG_VERSION="2021-02-16" +PKG_SHA256="a4bc981015d48fda009f5588c001dbce6f67e11055efc7e58d3abceef95188fd" PKG_LICENSE="GPL" -PKG_SITE="https://bitbucket.org/CrazyCat/media_build/downloads/" +PKG_SITE="https://github.com/crazycat69/linux_media" PKG_URL="${DISTRO_SRC}/${PKG_NAME}-${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain" PKG_NEED_UNPACK="${LINUX_DEPENDS}" From 761c837718c42b9802004730a36091758e59b3e4 Mon Sep 17 00:00:00 2001 From: CvH Date: Sat, 20 Feb 2021 16:26:04 +0100 Subject: [PATCH 3/4] dvb-latest: update to 2021-02-10 --- .../dvb/depends/media_tree/package.mk | 4 +- .../patches/media_tree-01-m88ds3103b.patch | 747 ------------------ .../dvb/dvb-latest/package.mk | 4 +- 3 files changed, 4 insertions(+), 751 deletions(-) delete mode 100644 packages/linux-driver-addons/dvb/depends/media_tree/patches/media_tree-01-m88ds3103b.patch diff --git a/packages/linux-driver-addons/dvb/depends/media_tree/package.mk b/packages/linux-driver-addons/dvb/depends/media_tree/package.mk index 3542173da9..7ada1fc887 100644 --- a/packages/linux-driver-addons/dvb/depends/media_tree/package.mk +++ b/packages/linux-driver-addons/dvb/depends/media_tree/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="media_tree" -PKG_VERSION="2020-02-09-bb6d3fb354c5" -PKG_SHA256="d6b7088393b4676a94f628b37722e9a36efef65408d003e0b3bafa4933a5416b" +PKG_VERSION="2021-02-10-ce79aecf6084" +PKG_SHA256="4383675ff2394128a42d108ee47b44536396ab598fcff14926af256f1786f552" PKG_LICENSE="GPL" PKG_SITE="https://git.linuxtv.org/media_tree.git" PKG_URL="http://linuxtv.org/downloads/drivers/linux-media-${PKG_VERSION}.tar.bz2" diff --git a/packages/linux-driver-addons/dvb/depends/media_tree/patches/media_tree-01-m88ds3103b.patch b/packages/linux-driver-addons/dvb/depends/media_tree/patches/media_tree-01-m88ds3103b.patch deleted file mode 100644 index c20d641d75..0000000000 --- a/packages/linux-driver-addons/dvb/depends/media_tree/patches/media_tree-01-m88ds3103b.patch +++ /dev/null @@ -1,747 +0,0 @@ -From: Brad Love -https://git.linuxtv.org/brad/media_tree.git/log/?h=Montage-3103b.v2 -support for m88ds3103b - -diff --git a/drivers/media/dvb-frontends/m88ds3103.c b/drivers/media/dvb-frontends/m88ds3103.c -index c96f05f..a95461e 100644 ---- a/drivers/media/dvb-frontends/m88ds3103.c -+++ b/drivers/media/dvb-frontends/m88ds3103.c -@@ -64,6 +64,92 @@ err: - return ret; - } - -+/* -+ * m88ds3103b demod has an internal device related to clocking. First the i2c -+ * gate must be opened, for one transaction, then writes will be allowed. -+ */ -+static int m88ds3103b_dt_write(struct m88ds3103_dev *dev, int reg, int data) -+{ -+ struct i2c_client *client = dev->client; -+ u8 buf[] = {reg, data}; -+ u8 val; -+ int ret; -+ struct i2c_msg msg = { -+ .addr = dev->dt_addr, .flags = 0, .buf = buf, .len = 2 -+ }; -+ -+ m88ds3103_update_bits(dev, 0x11, 0x01, 0x00); -+ -+ val = 0x11; -+ ret = regmap_write(dev->regmap, 0x03, val); -+ if (ret) -+ dev_dbg(&client->dev, "fail=%d\n", ret); -+ -+ ret = i2c_transfer(dev->client->adapter, &msg, 1); -+ if (ret != 1) { -+ dev_dbg(&client->dev, "0x%02x (ret=%i, reg=0x%02x, value=0x%02x)\n", -+ dev->dt_addr, ret, reg, data); -+ -+ m88ds3103_update_bits(dev, 0x11, 0x01, 0x01); -+ return -EREMOTEIO; -+ } -+ m88ds3103_update_bits(dev, 0x11, 0x01, 0x01); -+ -+ dev_dbg(&client->dev, "0x%02x reg 0x%02x, value 0x%02x\n", -+ dev->dt_addr, reg, data); -+ -+ return 0; -+} -+ -+/* -+ * m88ds3103b demod has an internal device related to clocking. First the i2c -+ * gate must be opened, for two transactions, then reads will be allowed. -+ */ -+static int m88ds3103b_dt_read(struct m88ds3103_dev *dev, u8 reg) -+{ -+ struct i2c_client *client = dev->client; -+ int ret; -+ u8 val; -+ u8 b0[] = { reg }; -+ u8 b1[] = { 0 }; -+ struct i2c_msg msg[] = { -+ { -+ .addr = dev->dt_addr, -+ .flags = 0, -+ .buf = b0, -+ .len = 1 -+ }, -+ { -+ .addr = dev->dt_addr, -+ .flags = I2C_M_RD, -+ .buf = b1, -+ .len = 1 -+ } -+ }; -+ -+ m88ds3103_update_bits(dev, 0x11, 0x01, 0x00); -+ -+ val = 0x12; -+ ret = regmap_write(dev->regmap, 0x03, val); -+ if (ret) -+ dev_dbg(&client->dev, "fail=%d\n", ret); -+ -+ ret = i2c_transfer(dev->client->adapter, msg, 2); -+ if (ret != 2) { -+ dev_dbg(&client->dev, "0x%02x (err=%d, reg=0x%02x)\n", -+ dev->dt_addr, ret, reg); -+ -+ m88ds3103_update_bits(dev, 0x11, 0x01, 0x01); -+ return -EREMOTEIO; -+ } -+ m88ds3103_update_bits(dev, 0x11, 0x01, 0x01); -+ -+ dev_dbg(&client->dev, "0x%02x reg 0x%02x, value 0x%02x\n", -+ dev->dt_addr, reg, b1[0]); -+ -+ return b1[0]; -+} -+ - /* - * Get the demodulator AGC PWM voltage setting supplied to the tuner. - */ -@@ -288,6 +374,253 @@ err: - return ret; - } - -+static int m88ds3103b_select_mclk(struct m88ds3103_dev *dev) -+{ -+ struct i2c_client *client = dev->client; -+ struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache; -+ u32 adc_Freq_MHz[3] = {96, 93, 99}; -+ u8 reg16_list[3] = {96, 92, 100}, reg16, reg15; -+ u32 offset_MHz[3]; -+ u32 max_offset = 0; -+ u32 old_setting = dev->mclk; -+ u32 tuner_freq_MHz = c->frequency / 1000; -+ u8 i; -+ char big_symbol = 0; -+ -+ big_symbol = (c->symbol_rate > 45010000) ? 1 : 0; -+ -+ if (big_symbol) { -+ reg16 = 115; -+ } else { -+ reg16 = 96; -+ -+ /* TODO: IS THIS NECESSARY ? */ -+ for (i = 0; i < 3; i++) { -+ offset_MHz[i] = tuner_freq_MHz % adc_Freq_MHz[i]; -+ -+ if (offset_MHz[i] > (adc_Freq_MHz[i] / 2)) -+ offset_MHz[i] = adc_Freq_MHz[i] - offset_MHz[i]; -+ -+ if (offset_MHz[i] > max_offset) { -+ max_offset = offset_MHz[i]; -+ reg16 = reg16_list[i]; -+ dev->mclk = adc_Freq_MHz[i] * 1000 * 1000; -+ -+ if (big_symbol) -+ dev->mclk /= 2; -+ -+ dev_dbg(&client->dev, "modifying mclk %u -> %u\n", -+ old_setting, dev->mclk); -+ } -+ } -+ } -+ -+ if (dev->mclk == 93000000) -+ regmap_write(dev->regmap, 0xA0, 0x42); -+ else if (dev->mclk == 96000000) -+ regmap_write(dev->regmap, 0xA0, 0x44); -+ else if (dev->mclk == 99000000) -+ regmap_write(dev->regmap, 0xA0, 0x46); -+ else if (dev->mclk == 110250000) -+ regmap_write(dev->regmap, 0xA0, 0x4E); -+ else -+ regmap_write(dev->regmap, 0xA0, 0x44); -+ -+ reg15 = m88ds3103b_dt_read(dev, 0x15); -+ -+ m88ds3103b_dt_write(dev, 0x05, 0x40); -+ m88ds3103b_dt_write(dev, 0x11, 0x08); -+ -+ if (big_symbol) -+ reg15 |= 0x02; -+ else -+ reg15 &= ~0x02; -+ -+ m88ds3103b_dt_write(dev, 0x15, reg15); -+ m88ds3103b_dt_write(dev, 0x16, reg16); -+ -+ usleep_range(5000, 5500); -+ -+ m88ds3103b_dt_write(dev, 0x05, 0x00); -+ m88ds3103b_dt_write(dev, 0x11, (u8)(big_symbol ? 0x0E : 0x0A)); -+ -+ usleep_range(5000, 5500); -+ -+ return 0; -+} -+ -+static int m88ds3103b_set_mclk(struct m88ds3103_dev *dev, u32 mclk_khz) -+{ -+ u8 reg11 = 0x0A, reg15, reg16, reg1D, reg1E, reg1F, tmp; -+ u8 sm, f0 = 0, f1 = 0, f2 = 0, f3 = 0, pll_ldpc_mode; -+ u16 pll_div_fb, N; -+ u32 div; -+ -+ reg15 = m88ds3103b_dt_read(dev, 0x15); -+ reg16 = m88ds3103b_dt_read(dev, 0x16); -+ reg1D = m88ds3103b_dt_read(dev, 0x1D); -+ -+ if (dev->cfg->ts_mode != M88DS3103_TS_SERIAL) { -+ if (reg16 == 92) -+ tmp = 93; -+ else if (reg16 == 100) -+ tmp = 99; -+ else -+ tmp = 96; -+ -+ mclk_khz *= tmp; -+ mclk_khz /= 96; -+ } -+ -+ pll_ldpc_mode = (reg15 >> 1) & 0x01; -+ -+ pll_div_fb = (reg15 & 0x01) << 8; -+ pll_div_fb += reg16; -+ pll_div_fb += 32; -+ -+ div = 9000 * pll_div_fb * 4; -+ div /= mclk_khz; -+ -+ if (dev->cfg->ts_mode == M88DS3103_TS_SERIAL) { -+ reg11 |= 0x02; -+ -+ if (div <= 32) { -+ N = 2; -+ -+ f0 = 0; -+ f1 = div / N; -+ f2 = div - f1; -+ f3 = 0; -+ } else if (div <= 34) { -+ N = 3; -+ -+ f0 = div / N; -+ f1 = (div - f0) / (N - 1); -+ f2 = div - f0 - f1; -+ f3 = 0; -+ } else if (div <= 64) { -+ N = 4; -+ -+ f0 = div / N; -+ f1 = (div - f0) / (N - 1); -+ f2 = (div - f0 - f1) / (N - 2); -+ f3 = div - f0 - f1 - f2; -+ } else { -+ N = 4; -+ -+ f0 = 16; -+ f1 = 16; -+ f2 = 16; -+ f3 = 16; -+ } -+ -+ if (f0 == 16) -+ f0 = 0; -+ else if ((f0 < 8) && (f0 != 0)) -+ f0 = 8; -+ -+ if (f1 == 16) -+ f1 = 0; -+ else if ((f1 < 8) && (f1 != 0)) -+ f1 = 8; -+ -+ if (f2 == 16) -+ f2 = 0; -+ else if ((f2 < 8) && (f2 != 0)) -+ f2 = 8; -+ -+ if (f3 == 16) -+ f3 = 0; -+ else if ((f3 < 8) && (f3 != 0)) -+ f3 = 8; -+ } else { -+ reg11 &= ~0x02; -+ -+ if (div <= 32) { -+ N = 2; -+ -+ f0 = 0; -+ f1 = div / N; -+ f2 = div - f1; -+ f3 = 0; -+ } else if (div <= 48) { -+ N = 3; -+ -+ f0 = div / N; -+ f1 = (div - f0) / (N - 1); -+ f2 = div - f0 - f1; -+ f3 = 0; -+ } else if (div <= 64) { -+ N = 4; -+ -+ f0 = div / N; -+ f1 = (div - f0) / (N - 1); -+ f2 = (div - f0 - f1) / (N - 2); -+ f3 = div - f0 - f1 - f2; -+ } else { -+ N = 4; -+ -+ f0 = 16; -+ f1 = 16; -+ f2 = 16; -+ f3 = 16; -+ } -+ -+ if (f0 == 16) -+ f0 = 0; -+ else if ((f0 < 9) && (f0 != 0)) -+ f0 = 9; -+ -+ if (f1 == 16) -+ f1 = 0; -+ else if ((f1 < 9) && (f1 != 0)) -+ f1 = 9; -+ -+ if (f2 == 16) -+ f2 = 0; -+ else if ((f2 < 9) && (f2 != 0)) -+ f2 = 9; -+ -+ if (f3 == 16) -+ f3 = 0; -+ else if ((f3 < 9) && (f3 != 0)) -+ f3 = 9; -+ } -+ -+ sm = N - 1; -+ -+ /* Write to registers */ -+ //reg15 &= 0x01; -+ //reg15 |= (pll_div_fb >> 8) & 0x01; -+ -+ //reg16 = pll_div_fb & 0xFF; -+ -+ reg1D &= ~0x03; -+ reg1D |= sm; -+ reg1D |= 0x80; -+ -+ reg1E = ((f3 << 4) + f2) & 0xFF; -+ reg1F = ((f1 << 4) + f0) & 0xFF; -+ -+ m88ds3103b_dt_write(dev, 0x05, 0x40); -+ m88ds3103b_dt_write(dev, 0x11, 0x08); -+ m88ds3103b_dt_write(dev, 0x1D, reg1D); -+ m88ds3103b_dt_write(dev, 0x1E, reg1E); -+ m88ds3103b_dt_write(dev, 0x1F, reg1F); -+ -+ m88ds3103b_dt_write(dev, 0x17, 0xc1); -+ m88ds3103b_dt_write(dev, 0x17, 0x81); -+ -+ usleep_range(5000, 5500); -+ -+ m88ds3103b_dt_write(dev, 0x05, 0x00); -+ m88ds3103b_dt_write(dev, 0x11, 0x0A); -+ -+ usleep_range(5000, 5500); -+ -+ return 0; -+} -+ - static int m88ds3103_set_frontend(struct dvb_frontend *fe) - { - struct m88ds3103_dev *dev = fe->demodulator_priv; -@@ -298,7 +631,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) - u8 u8tmp, u8tmp1 = 0, u8tmp2 = 0; /* silence compiler warning */ - u8 buf[3]; - u16 u16tmp; -- u32 tuner_frequency_khz, target_mclk; -+ u32 tuner_frequency_khz, target_mclk, u32tmp; - s32 s32tmp; - static const struct reg_sequence reset_buf[] = { - {0x07, 0x80}, {0x07, 0x00} -@@ -321,6 +654,20 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) - - /* Disable demod clock path */ - if (dev->chip_id == M88RS6000_CHIP_ID) { -+ if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { -+ ret = regmap_read(dev->regmap, 0xb2, &u32tmp); -+ if (ret) -+ goto err; -+ if (u32tmp == 0x01) { -+ ret = regmap_write(dev->regmap, 0x00, 0x00); -+ if (ret) -+ goto err; -+ ret = regmap_write(dev->regmap, 0xb2, 0x00); -+ if (ret) -+ goto err; -+ } -+ } -+ - ret = regmap_write(dev->regmap, 0x06, 0xe0); - if (ret) - goto err; -@@ -346,7 +693,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) - tuner_frequency_khz = c->frequency; - } - -- /* select M88RS6000 demod main mclk and ts mclk from tuner die. */ -+ /* set M88RS6000/DS3103B demod main mclk and ts mclk from tuner die */ - if (dev->chip_id == M88RS6000_CHIP_ID) { - if (c->symbol_rate > 45010000) - dev->mclk = 110250000; -@@ -358,6 +705,11 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) - else - target_mclk = 144000000; - -+ if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { -+ m88ds3103b_select_mclk(dev); -+ m88ds3103b_set_mclk(dev, target_mclk / 1000); -+ } -+ - /* Enable demod clock path */ - ret = regmap_write(dev->regmap, 0x06, 0x00); - if (ret) -@@ -469,12 +821,42 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) - ret = m88ds3103_update_bits(dev, 0x9d, 0x08, 0x08); - if (ret) - goto err; -+ -+ if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { -+ buf[0] = m88ds3103b_dt_read(dev, 0x15); -+ buf[1] = m88ds3103b_dt_read(dev, 0x16); -+ -+ if (c->symbol_rate > 45010000) { -+ buf[0] &= ~0x03; -+ buf[0] |= 0x02; -+ buf[0] |= ((147 - 32) >> 8) & 0x01; -+ buf[1] = (147 - 32) & 0xFF; -+ -+ dev->mclk = 110250 * 1000; -+ } else { -+ buf[0] &= ~0x03; -+ buf[0] |= ((128 - 32) >> 8) & 0x01; -+ buf[1] = (128 - 32) & 0xFF; -+ -+ dev->mclk = 96000 * 1000; -+ } -+ m88ds3103b_dt_write(dev, 0x15, buf[0]); -+ m88ds3103b_dt_write(dev, 0x16, buf[1]); -+ -+ regmap_read(dev->regmap, 0x30, &u32tmp); -+ u32tmp &= ~0x80; -+ regmap_write(dev->regmap, 0x30, u32tmp & 0xff); -+ } -+ - ret = regmap_write(dev->regmap, 0xf1, 0x01); - if (ret) - goto err; -- ret = m88ds3103_update_bits(dev, 0x30, 0x80, 0x80); -- if (ret) -- goto err; -+ -+ if (dev->chiptype != M88DS3103_CHIPTYPE_3103B) { -+ ret = m88ds3103_update_bits(dev, 0x30, 0x80, 0x80); -+ if (ret) -+ goto err; -+ } - } - - switch (dev->cfg->ts_mode) { -@@ -488,6 +870,10 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) - break; - case M88DS3103_TS_PARALLEL: - u8tmp = 0x02; -+ if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { -+ u8tmp = 0x01; -+ u8tmp1 = 0x01; -+ } - break; - case M88DS3103_TS_CI: - u8tmp = 0x03; -@@ -516,6 +902,12 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) - u8tmp1 = 0x3f; - u8tmp2 = 0x3f; - break; -+ case M88DS3103_TS_PARALLEL: -+ if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { -+ ret = m88ds3103_update_bits(dev, 0x29, 0x01, u8tmp1); -+ if (ret) -+ goto err; -+ } - default: - u16tmp = DIV_ROUND_UP(target_mclk, dev->cfg->ts_clk); - u8tmp1 = u16tmp / 2 - 1; -@@ -543,6 +935,9 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) - else - u8tmp = 0x06; - -+ if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) -+ m88ds3103b_set_mclk(dev, target_mclk / 1000); -+ - ret = regmap_write(dev->regmap, 0xc3, 0x08); - if (ret) - goto err; -@@ -578,6 +973,16 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) - if (ret) - goto err; - -+ if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { -+ /* enable/disable 192M LDPC clock */ -+ ret = m88ds3103_update_bits(dev, 0x29, 0x10, -+ (c->delivery_system == SYS_DVBS) ? 0x10 : 0x0); -+ if (ret) -+ goto err; -+ -+ ret = m88ds3103_update_bits(dev, 0xc9, 0x08, 0x08); -+ } -+ - dev_dbg(&client->dev, "carrier offset=%d\n", - (tuner_frequency_khz - c->frequency)); - -@@ -654,10 +1059,13 @@ static int m88ds3103_init(struct dvb_frontend *fe) - dev_info(&client->dev, "found a '%s' in cold state\n", - m88ds3103_ops.info.name); - -- if (dev->chip_id == M88RS6000_CHIP_ID) -+ if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) -+ name = M88DS3103B_FIRMWARE; -+ else if (dev->chip_id == M88RS6000_CHIP_ID) - name = M88RS6000_FIRMWARE; - else - name = M88DS3103_FIRMWARE; -+ - /* request the firmware, this will block and timeout */ - ret = request_firmware(&firmware, name, &client->dev); - if (ret) { -@@ -704,6 +1112,12 @@ static int m88ds3103_init(struct dvb_frontend *fe) - dev_info(&client->dev, "firmware version: %X.%X\n", - (utmp >> 4) & 0xf, (utmp >> 0 & 0xf)); - -+ if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { -+ m88ds3103b_dt_write(dev, 0x21, 0x92); -+ m88ds3103b_dt_write(dev, 0x15, 0x6C); -+ m88ds3103b_dt_write(dev, 0x17, 0xC1); -+ m88ds3103b_dt_write(dev, 0x17, 0x81); -+ } - warm: - /* warm state */ - dev->warm = true; -@@ -1393,6 +1807,8 @@ static int m88ds3103_probe(struct i2c_client *client, - goto err_kfree; - - dev->chip_id = utmp >> 1; -+ dev->chiptype = (u8)id->driver_data; -+ - dev_dbg(&client->dev, "chip_id=%02x\n", dev->chip_id); - - switch (dev->chip_id) { -@@ -1470,6 +1886,19 @@ static int m88ds3103_probe(struct i2c_client *client, - /* setup callbacks */ - pdata->get_dvb_frontend = m88ds3103_get_dvb_frontend; - pdata->get_i2c_adapter = m88ds3103_get_i2c_adapter; -+ -+ if (dev->chiptype == M88DS3103_CHIPTYPE_3103B) { -+ /* enable i2c repeater for tuner */ -+ m88ds3103_update_bits(dev, 0x11, 0x01, 0x01); -+ -+ /* get frontend address */ -+ ret = regmap_read(dev->regmap, 0x29, &utmp); -+ if (ret) -+ goto err_kfree; -+ dev->dt_addr = ((utmp & 0x80) == 0) ? 0x42 >> 1 : 0x40 >> 1; -+ dev_err(&client->dev, "dt addr is 0x%02x", dev->dt_addr); -+ } -+ - return 0; - err_kfree: - kfree(dev); -@@ -1491,7 +1920,9 @@ static int m88ds3103_remove(struct i2c_client *client) - } - - static const struct i2c_device_id m88ds3103_id_table[] = { -- {"m88ds3103", 0}, -+ {"m88ds3103", M88DS3103_CHIPTYPE_3103}, -+ {"m88rs6000", M88DS3103_CHIPTYPE_RS6000}, -+ {"m88ds3103b", M88DS3103_CHIPTYPE_3103B}, - {} - }; - MODULE_DEVICE_TABLE(i2c, m88ds3103_id_table); -@@ -1513,3 +1944,4 @@ MODULE_DESCRIPTION("Montage Technology M88DS3103 DVB-S/S2 demodulator driver"); - MODULE_LICENSE("GPL"); - MODULE_FIRMWARE(M88DS3103_FIRMWARE); - MODULE_FIRMWARE(M88RS6000_FIRMWARE); -+MODULE_FIRMWARE(M88DS3103B_FIRMWARE); -diff --git a/drivers/media/dvb-frontends/m88ds3103_priv.h b/drivers/media/dvb-frontends/m88ds3103_priv.h -index c825032..d656ec2 100644 ---- a/drivers/media/dvb-frontends/m88ds3103_priv.h -+++ b/drivers/media/dvb-frontends/m88ds3103_priv.h -@@ -16,11 +16,17 @@ - #include - #include - --#define M88DS3103_FIRMWARE "dvb-demod-m88ds3103.fw" --#define M88RS6000_FIRMWARE "dvb-demod-m88rs6000.fw" -+#define M88DS3103B_FIRMWARE "dvb-demod-m88ds3103b.fw" -+#define M88DS3103_FIRMWARE "dvb-demod-m88ds3103.fw" -+#define M88RS6000_FIRMWARE "dvb-demod-m88rs6000.fw" -+ - #define M88RS6000_CHIP_ID 0x74 - #define M88DS3103_CHIP_ID 0x70 - -+#define M88DS3103_CHIPTYPE_3103 0 -+#define M88DS3103_CHIPTYPE_RS6000 1 -+#define M88DS3103_CHIPTYPE_3103B 2 -+ - struct m88ds3103_dev { - struct i2c_client *client; - struct regmap_config regmap_config; -@@ -35,10 +41,13 @@ struct m88ds3103_dev { - struct i2c_mux_core *muxc; - /* auto detect chip id to do different config */ - u8 chip_id; -+ /* chip type to differentiate m88rs6000 from m88ds3103b */ -+ u8 chiptype; - /* main mclk is calculated for M88RS6000 dynamically */ - s32 mclk; - u64 post_bit_error; - u64 post_bit_count; -+ u8 dt_addr; - }; - - struct m88ds3103_reg_val { -diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c -index def9cdd..a8c321d 100644 ---- a/drivers/media/usb/em28xx/em28xx-cards.c -+++ b/drivers/media/usb/em28xx/em28xx-cards.c -@@ -2397,6 +2397,20 @@ const struct em28xx_board em28xx_boards[] = { - .has_dvb = 1, - .ir_codes = RC_MAP_PINNACLE_PCTV_HD, - }, -+ /* -+ * 2013:0259 PCTV DVB-S2 Stick (461e_v2) -+ * Empia EM28178, Montage M88DS3103b, Montage M88TS2022, Allegro A8293 -+ */ -+ [EM28178_BOARD_PCTV_461E_V2] = { -+ .def_i2c_bus = 1, -+ .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | -+ EM28XX_I2C_FREQ_400_KHZ, -+ .name = "PCTV DVB-S2 Stick (461e v2)", -+ .tuner_type = TUNER_ABSENT, -+ .tuner_gpio = pctv_461e, -+ .has_dvb = 1, -+ .ir_codes = RC_MAP_PINNACLE_PCTV_HD, -+ }, - /* - * 2013:025f PCTV tripleStick (292e). - * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2157 -@@ -2696,6 +2710,10 @@ struct usb_device_id em28xx_id_table[] = { - .driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE }, - { USB_DEVICE(0x2013, 0x0258), - .driver_info = EM28178_BOARD_PCTV_461E }, -+ { USB_DEVICE(0x2013, 0x0461), -+ .driver_info = EM28178_BOARD_PCTV_461E_V2 }, -+ { USB_DEVICE(0x2013, 0x0259), -+ .driver_info = EM28178_BOARD_PCTV_461E_V2 }, - { USB_DEVICE(0x2013, 0x025f), - .driver_info = EM28178_BOARD_PCTV_292E }, - { USB_DEVICE(0x2013, 0x0264), /* Hauppauge WinTV-soloHD 292e SE */ -diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c -index 0ab6c49..cd7e40c 100644 ---- a/drivers/media/usb/em28xx/em28xx-dvb.c -+++ b/drivers/media/usb/em28xx/em28xx-dvb.c -@@ -1219,6 +1219,65 @@ static int em28178_dvb_init_pctv_461e(struct em28xx *dev) - return 0; - } - -+static int em28178_dvb_init_pctv_461e_v2(struct em28xx *dev) -+{ -+ struct em28xx_dvb *dvb = dev->dvb; -+ struct i2c_adapter *i2c_adapter; -+ struct m88ds3103_platform_data m88ds3103_pdata = {}; -+ struct ts2020_config ts2020_config = {}; -+ struct a8293_platform_data a8293_pdata = {}; -+ -+ /* attach demod */ -+ m88ds3103_pdata.clk = 27000000; -+ m88ds3103_pdata.i2c_wr_max = 33; -+ m88ds3103_pdata.ts_mode = M88DS3103_TS_PARALLEL; -+ m88ds3103_pdata.ts_clk = 16000; -+ m88ds3103_pdata.ts_clk_pol = 1; -+ m88ds3103_pdata.agc = 0x99; -+ m88ds3103_pdata.agc_inv = 1; -+ m88ds3103_pdata.spec_inv = 1; -+ dvb->i2c_client_demod = dvb_module_probe("m88ds3103", "m88ds3103b", -+ &dev->i2c_adap[dev->def_i2c_bus], -+ 0x6a, &m88ds3103_pdata); -+ -+ if (!dvb->i2c_client_demod) { -+ pr_err("%s() FUCK\n", __func__); -+ return -ENODEV; -+ } -+ -+ dvb->fe[0] = m88ds3103_pdata.get_dvb_frontend(dvb->i2c_client_demod); -+ i2c_adapter = m88ds3103_pdata.get_i2c_adapter(dvb->i2c_client_demod); -+ -+ /* attach tuner */ -+ ts2020_config.fe = dvb->fe[0]; -+ dvb->i2c_client_tuner = dvb_module_probe("ts2020", "ts2022", -+ i2c_adapter, -+ 0x60, &ts2020_config); -+ if (!dvb->i2c_client_tuner) { -+ pr_err("%s() FUCK2\n", __func__); -+ dvb_module_release(dvb->i2c_client_demod); -+ return -ENODEV; -+ } -+ -+ /* delegate signal strength measurement to tuner */ -+ dvb->fe[0]->ops.read_signal_strength = -+ dvb->fe[0]->ops.tuner_ops.get_rf_strength; -+ -+ /* attach SEC */ -+ a8293_pdata.dvb_frontend = dvb->fe[0]; -+ dvb->i2c_client_sec = dvb_module_probe("a8293", NULL, -+ &dev->i2c_adap[dev->def_i2c_bus], -+ 0x08, &a8293_pdata); -+ if (!dvb->i2c_client_sec) { -+ pr_err("%s() FUCK3\n", __func__); -+ dvb_module_release(dvb->i2c_client_tuner); -+ dvb_module_release(dvb->i2c_client_demod); -+ return -ENODEV; -+ } -+ -+ return 0; -+} -+ - static int em28178_dvb_init_pctv_292e(struct em28xx *dev) - { - struct em28xx_dvb *dvb = dev->dvb; -@@ -1860,6 +1919,11 @@ static int em28xx_dvb_init(struct em28xx *dev) - if (result) - goto out_free; - break; -+ case EM28178_BOARD_PCTV_461E_V2: -+ result = em28178_dvb_init_pctv_461e_v2(dev); -+ if (result) -+ goto out_free; -+ break; - case EM28178_BOARD_PCTV_292E: - result = em28178_dvb_init_pctv_292e(dev); - if (result) -diff --git a/drivers/media/usb/em28xx/em28xx.h b/drivers/media/usb/em28xx/em28xx.h -index 4ecadd5..ec38598 100644 ---- a/drivers/media/usb/em28xx/em28xx.h -+++ b/drivers/media/usb/em28xx/em28xx.h -@@ -150,6 +150,7 @@ - #define EM2884_BOARD_TERRATEC_H6 101 - #define EM2882_BOARD_ZOLID_HYBRID_TV_STICK 102 - #define EM2861_BOARD_MAGIX_VIDEOWANDLER2 103 -+#define EM28178_BOARD_PCTV_461E_V2 104 - - /* Limits minimum and default number of buffers */ - #define EM28XX_MIN_BUF 4 --- -2.17.1 - diff --git a/packages/linux-driver-addons/dvb/dvb-latest/package.mk b/packages/linux-driver-addons/dvb/dvb-latest/package.mk index ccc016af0c..4da178820a 100644 --- a/packages/linux-driver-addons/dvb/dvb-latest/package.mk +++ b/packages/linux-driver-addons/dvb/dvb-latest/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dvb-latest" -PKG_VERSION="d1db2a6142b75428f972165fe647a0d01345e085" -PKG_SHA256="97fb72725f60f0cb5f4fd1b2fcf2d5f02fd2b8276d7cf48f5a10f3bef1ba2b8d" +PKG_VERSION="9e52fd5c00a5e3bdb34561bc325f8ff864fdf1a7" +PKG_SHA256="0beeb160677012a94c1a0cf826edba9c501d9c2e2c3fceb4282d1ce1871debea" PKG_LICENSE="GPL" PKG_SITE="http://git.linuxtv.org/media_build.git" PKG_URL="https://github.com/LibreELEC/media_build/archive/${PKG_VERSION}.tar.gz" From 3234d0603fc92d0109bab254a8fa82c900a28430 Mon Sep 17 00:00:00 2001 From: CvH Date: Sat, 20 Feb 2021 16:26:04 +0100 Subject: [PATCH 4/4] Generic: enable dvb add-ons --- projects/Generic/options | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/Generic/options b/projects/Generic/options index 0dabb88226..fc75f0ecd9 100644 --- a/projects/Generic/options +++ b/projects/Generic/options @@ -74,7 +74,7 @@ ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS bcm_sta" # build and install driver addons (yes / no) - DRIVER_ADDONS_SUPPORT="no" + DRIVER_ADDONS_SUPPORT="yes" # driver addons to install: # for a list of additional drivers see packages/linux-driver-addons