Browse Source

- linux-kernel.mk: build hd51 kernels from original source

master
vanhofen 5 years ago
parent
commit
03f9534324
  1. 18
      make/environment-linux.mk
  2. 33
      make/linux-kernel.mk
  3. 12
      patches/kernel/gfutures/4_10_0001-export_pmpoweroffprepare.patch
  4. 46
      patches/kernel/gfutures/4_10_0002-TBS-fixes-for-4.10-kernel.patch
  5. 1334
      patches/kernel/gfutures/4_10_0003-Support-TBS-USB-drivers-for-4.6-kernel.patch
  6. 55
      patches/kernel/gfutures/4_10_0004-TBS-fixes-for-4.6-kernel.patch
  7. 94
      patches/kernel/gfutures/4_10_0005-STV-Add-PLS-support.patch
  8. 92
      patches/kernel/gfutures/4_10_0006-STV-Add-SNR-Signal-report-parameters.patch
  9. 261
      patches/kernel/gfutures/4_10_0007-blindscan2.patch
  10. 92
      patches/kernel/gfutures/4_10_0007-stv090x-optimized-TS-sync-control.patch
  11. 65
      patches/kernel/gfutures/4_10_add-more-devices-rtl8xxxu.patch
  12. 12
      patches/kernel/gfutures/4_10_bitsperlong.patch
  13. 15
      patches/kernel/gfutures/4_10_blacklist_mmc0.patch
  14. 13
      patches/kernel/gfutures/4_10_reserve_dvb_adapter_0.patch
  15. 323
      patches/kernel/gfutures/4_10_t230c2.patch

18
make/environment-linux.mk

@ -3,7 +3,6 @@
#
# -----------------------------------------------------------------------------
# cst-nevis
ifeq ($(BOXMODEL), nevis)
KERNEL_VER = 2.6.34.13
KERNEL_TMP = linux-$(KERNEL_VER)
@ -13,7 +12,6 @@ ifeq ($(BOXMODEL), nevis)
KERNEL_BRANCH = ni/linux-2.6.34.15
KERNEL_DTB = $(EMPTY)
# cst-apollo/cst-kronos
else ifeq ($(BOXMODEL), $(filter $(BOXMODEL), apollo shiner kronos kronos_v2))
KERNEL_VER = 3.10.93
KERNEL_TMP = linux-$(KERNEL_VER)
@ -29,18 +27,18 @@ else ifeq ($(BOXMODEL), $(filter $(BOXMODEL), apollo shiner kronos kronos_v2))
KERNEL_CONFIG = $(CONFIGS)/kernel-kronos.config
endif
# arm-hd51
else ifeq ($(BOXMODEL), $(filter $(BOXMODEL), hd51 bre2ze4k h7))
KERNEL_VER = 4.10.12
KERNEL_TMP = linux-$(KERNEL_VER)
KERNEL_SOURCE = git
KERNEL_URL = $(EMPTY)
KERNEL_SOURCE = linux-$(KERNEL_VER)-arm.tar.gz
KERNEL_URL = http://downloads.mutant-digital.net
KERNEL_BRANCH = ni/linux-$(KERNEL_VER)
KERNEL_PATCH = $($(call UPPERCASE,$(BOXMODEL))_PATCH)
KERNEL_BRANCH = $(EMPTY)
KERNEL_DTB = $(BUILD_TMP)/$(KERNEL_OBJ)/arch/$(BOXARCH)/boot/dts/bcm7445-bcm97445svmb.dtb
KERNEL_CONFIG = $(CONFIGS)/kernel-hd51.config
# arm-vusolo4k
else ifeq ($(BOXMODEL), vusolo4k)
KERNEL_VER = 3.14.28-1.8
KERNEL_TMP = linux
@ -59,7 +57,6 @@ else ifeq ($(BOXMODEL), vusolo4k)
BOOT_PARTITION = 1
# arm-vuduo4k
else ifeq ($(BOXMODEL), vuduo4k)
KERNEL_VER = 4.1.45-1.17
KERNEL_TMP = linux
@ -78,7 +75,6 @@ else ifeq ($(BOXMODEL), vuduo4k)
BOOT_PARTITION = 6
# arm-vuultimo4k
else ifeq ($(BOXMODEL), vuultimo4k)
KERNEL_VER = 3.14.28-1.12
KERNEL_TMP = linux
@ -97,7 +93,6 @@ else ifeq ($(BOXMODEL), vuultimo4k)
BOOT_PARTITION = 1
# arm-vuzero4k
else ifeq ($(BOXMODEL), vuzero4k)
KERNEL_VER = 4.1.20-1.9
KERNEL_TMP = linux
@ -116,7 +111,6 @@ else ifeq ($(BOXMODEL), vuzero4k)
BOOT_PARTITION = 4
# arm-vuuno4k
else ifeq ($(BOXMODEL), vuuno4k)
KERNEL_VER = 3.14.28-1.12
KERNEL_TMP = linux
@ -135,7 +129,6 @@ else ifeq ($(BOXMODEL), vuuno4k)
BOOT_PARTITION = 1
# arm-vuuno4kse
else ifeq ($(BOXMODEL), vuuno4kse)
KERNEL_VER = 4.1.20-1.9
KERNEL_TMP = linux
@ -154,7 +147,6 @@ else ifeq ($(BOXMODEL), vuuno4kse)
BOOT_PARTITION = 1
# mips-vuduo
else ifeq ($(BOXMODEL), vuduo)
KERNEL_VER = 3.9.6
KERNEL_TMP = linux

33
make/linux-kernel.mk

@ -3,7 +3,23 @@
#
# -----------------------------------------------------------------------------
# arm-vuduo
# arm hd51/bre2ze4k/h7
GFUTURES_4_10_PATCH = \
gfutures/4_10_0001-export_pmpoweroffprepare.patch \
gfutures/4_10_0002-TBS-fixes-for-4.10-kernel.patch \
gfutures/4_10_0003-Support-TBS-USB-drivers-for-4.6-kernel.patch \
gfutures/4_10_0004-TBS-fixes-for-4.6-kernel.patch \
gfutures/4_10_0005-STV-Add-PLS-support.patch \
gfutures/4_10_0006-STV-Add-SNR-Signal-report-parameters.patch \
gfutures/4_10_0007-blindscan2.patch \
gfutures/4_10_0007-stv090x-optimized-TS-sync-control.patch \
gfutures/4_10_add-more-devices-rtl8xxxu.patch \
gfutures/4_10_bitsperlong.patch \
gfutures/4_10_blacklist_mmc0.patch \
gfutures/4_10_reserve_dvb_adapter_0.patch \
gfutures/4_10_t230c2.patch
# arm vuduo
VUPLUS_3_9_PATCH = \
vuplus/3_9_0001-rt2800usb-add-support-for-rt55xx.patch \
vuplus/3_9_0001-stv090x-optimized-TS-sync-control.patch \
@ -41,7 +57,7 @@ VUPLUS_3_9_PATCH = \
vuplus/3_9_tda18271-advertise-supported-delsys.patch \
vuplus/3_9_test.patch
# arm-vusolo4k/arm-vuultimo4k/arm-vuuno4k
# arm vusolo4k/vuultimo4k/vuuno4k
VUPLUS_3_14_PATCH = \
vuplus/3_14_bcm_genet_disable_warn.patch \
vuplus/3_14_linux_dvb-core.patch \
@ -71,7 +87,7 @@ VUPLUS_3_14_PATCH = \
vuplus/3_14_0006-makefile-disable-warnings.patch \
vuplus/3_14_linux_dvb_adapter.patch
# arm-vuduo4k/arm-vuzero4k/arm-vuuno4kse
# arm vuduo4k/vuzero4k/vuuno4kse
VUPLUS_4_1_PATCH = \
vuplus/4_1_linux_dvb_adapter.patch \
vuplus/4_1_linux_dvb-core.patch \
@ -109,6 +125,17 @@ VUPLUS_4_1_PATCH = \
vuplus/4_1_0002-log2-give-up-on-gcc-constant-optimizations.patch \
vuplus/4_1_0003-uaccess-dont-mark-register-as-const.patch
# -----------------------------------------------------------------------------
HD51_PATCH = \
$(GFUTURES_4_10_PATCH)
BRE2ZE4K_PATCH = \
$(GFUTURES_4_10_PATCH)
H7_PATCH = \
$(GFUTURES_4_10_PATCH)
VUSOLO4K_PATCH = \
$(VUPLUS_3_14_PATCH) \
vuplus/3_14_linux_rpmb_not_alloc.patch \

12
patches/kernel/gfutures/4_10_0001-export_pmpoweroffprepare.patch

@ -0,0 +1,12 @@
diff --git a/kernel/reboot.c b/kernel/reboot.c
index bd30a97..a6903bf 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -49,6 +49,7 @@
*/
void (*pm_power_off_prepare)(void);
+EXPORT_SYMBOL(pm_power_off_prepare);
/**
* emergency_restart - reboot the system

46
patches/kernel/gfutures/4_10_0002-TBS-fixes-for-4.10-kernel.patch

@ -0,0 +1,46 @@
diff --git a/drivers/media/dvb-core/dvb-usb-ids.h b/drivers/media/dvb-core/dvb-usb-ids.h
index 779f4224b63e..ae6005436639 100644
--- a/drivers/media/dvb-core/dvb-usb-ids.h
+++ b/drivers/media/dvb-core/dvb-usb-ids.h
@@ -411,6 +411,6 @@
#define USB_PID_PCTV_2002E_SE 0x025d
#define USB_PID_SVEON_STV27 0xd3af
#define USB_PID_TURBOX_DTT_2000 0xd3a4
-#define USB_PID_WINTV_SOLOHD 0x0264
#define USB_PID_EVOLVEO_XTRATV_STICK 0xa115
+#define USB_PID_WINTV_SOLOHD 0x0264
#endif
diff --git a/drivers/media/dvb-frontends/stv090x.c b/drivers/media/dvb-frontends/stv090x.c
index 7ef469c0c866..b586d2a49737 100644
--- a/drivers/media/dvb-frontends/stv090x.c
+++ b/drivers/media/dvb-frontends/stv090x.c
@@ -3692,12 +3692,9 @@ static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr)
}
val /= 16;
last = ARRAY_SIZE(stv090x_s2cn_tab) - 1;
- div = stv090x_s2cn_tab[last].real -
- stv090x_s2cn_tab[3].real;
- val = stv090x_table_lookup(stv090x_s2cn_tab, last, val);
- if (val < 0)
- val = 0;
- *cnr = val * 0xFFFF / div;
+ div = stv090x_s2cn_tab[0].read -
+ stv090x_s2cn_tab[last].read;
+ *cnr = 0xFFFF - ((val * 0xFFFF) / div);
}
break;
@@ -3717,10 +3714,9 @@ static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr)
}
val /= 16;
last = ARRAY_SIZE(stv090x_s1cn_tab) - 1;
- div = stv090x_s1cn_tab[last].real -
- stv090x_s1cn_tab[0].real;
- val = stv090x_table_lookup(stv090x_s1cn_tab, last, val);
- *cnr = val * 0xFFFF / div;
+ div = stv090x_s1cn_tab[0].read -
+ stv090x_s1cn_tab[last].read;
+ *cnr = 0xFFFF - ((val * 0xFFFF) / div);
}
break;
default:

1334
patches/kernel/gfutures/4_10_0003-Support-TBS-USB-drivers-for-4.6-kernel.patch

File diff suppressed because it is too large

55
patches/kernel/gfutures/4_10_0004-TBS-fixes-for-4.6-kernel.patch

@ -0,0 +1,55 @@
From 1553b610994b399f4d42772f4a9565a4ce2a1245 Mon Sep 17 00:00:00 2001
From: Athanasios Oikonomou <athoik@gmail.com>
Date: Sat, 5 Mar 2016 01:34:21 +0200
Subject: [PATCH] TBS: fixes for 4.3 kernel
Change fe_sec_voltage_t to enum fe_sec_voltage.
Remove TBS5921 because it uses tda10071_config that is unavailable.
Driver should use I2C platform data now in order to load tda10071.
More info: https://patchwork.linuxtv.org/patch/30472/
diff --git a/drivers/media/usb/dvb-usb/tbs-usb.c b/drivers/media/usb/dvb-usb/tbs-usb.c
index f142be3..98347c9 100644
--- a/drivers/media/usb/dvb-usb/tbs-usb.c
+++ b/drivers/media/usb/dvb-usb/tbs-usb.c
@@ -339,7 +339,7 @@ static int tbsusb_set_pin(struct dvb_frontend *fe, u8 *what)
}
static int tbsusb_set_voltage(struct dvb_frontend *fe,
- fe_sec_voltage_t voltage)
+ enum fe_sec_voltage voltage)
{
static u8 command_13v[2] = {0x03, 0x00};
static u8 command_18v[2] = {0x03, 0x01};
@@ -787,17 +787,6 @@ static const struct stv090x_config stv0900_config = {
.set_lock_led = tbsusb_led_ctrl,
};
-static const struct tda10071_config tda10071_config = {
- .demod_i2c_addr = 0x55, /* (0xaa >> 1) */
- .tuner_i2c_addr = 0x14,
- .i2c_wr_max = 64,
- .ts_mode = TDA10071_TS_PARALLEL,
- .spec_inv = 0,
- .xtal = 40444000, /* 40.444 MHz */
- .pll_multiplier = 20,
- .set_lock_led = tbsusb_led_ctrl,
-};
-
static const struct cx24116_config cx24116_config = {
.demod_address = 0x55,
.mpg_clk_pos_pol = 0x01,
@@ -840,9 +829,6 @@ static int tbsusb_frontend_attach(struct dvb_usb_adapter *d)
d->fe_adap[0].fe = dvb_attach(stv0288_attach, &stv0288_config,
&d->dev->i2c_adap);
break;
- case USB_PID_TENOW_TBS5921:
- d->fe_adap[0].fe = dvb_attach(tda10071_attach, &tda10071_config,
- &d->dev->i2c_adap);
}
if (!d->fe_adap[0].fe)
--
2.1.4

94
patches/kernel/gfutures/4_10_0005-STV-Add-PLS-support.patch

@ -0,0 +1,94 @@
From 4bbe1b749c6f01a7a2648714f195802517e138ed Mon Sep 17 00:00:00 2001
From: Athanasios Oikonomou <athoik@gmail.com>
Date: Sat, 5 Mar 2016 00:32:57 +0200
Subject: [PATCH] STV: Add PLS support
diff --git a/drivers/media/dvb-frontends/stv0900_core.c b/drivers/media/dvb-frontends/stv0900_core.c
index fe31dd5..3a5df06 100644
--- a/drivers/media/dvb-frontends/stv0900_core.c
+++ b/drivers/media/dvb-frontends/stv0900_core.c
@@ -1554,12 +1554,25 @@ static int stv0900_status(struct stv0900_internal *intp,
return locked;
}
+static int stv0900_set_pls(struct stv0900_internal *intp,
+ enum fe_stv0900_demod_num demod, u8 pls_mode, u32 pls_code)
+{
+ enum fe_stv0900_error error = STV0900_NO_ERROR;
+
+ dprintk("Set PLS code %d (mode %d)", pls_code, pls_mode);
+ stv0900_write_reg(intp, PLROOT2, (pls_mode<<2) | (pls_code>>16));
+ stv0900_write_reg(intp, PLROOT1, pls_code>>8);
+ stv0900_write_reg(intp, PLROOT0, pls_code);
+
+ return error;
+}
+
static int stv0900_set_mis(struct stv0900_internal *intp,
enum fe_stv0900_demod_num demod, int mis)
{
dprintk("%s\n", __func__);
- if (mis < 0 || mis > 255) {
+ if (mis == NO_STREAM_ID_FILTER) {
dprintk("Disable MIS filtering\n");
stv0900_write_bits(intp, FILTER_EN, 0);
} else {
@@ -1593,6 +1606,7 @@ static enum dvbfe_search stv0900_search(struct dvb_frontend *fe)
if (state->config->set_ts_params)
state->config->set_ts_params(fe, 0);
+ stv0900_set_pls(intp, demod, (c->stream_id>>26) & 0x3, (c->stream_id>>8) & 0x3FFFF);
stv0900_set_mis(intp, demod, c->stream_id);
p_result.locked = FALSE;
diff --git a/drivers/media/dvb-frontends/stv090x.c b/drivers/media/dvb-frontends/stv090x.c
index ce99b9d..264c4b8 100644
--- a/drivers/media/dvb-frontends/stv090x.c
+++ b/drivers/media/dvb-frontends/stv090x.c
@@ -3429,18 +3429,40 @@ err:
return -1;
}
+static int stv090x_set_pls(struct stv090x_state *state, u8 pls_mode, u32 pls_code)
+{
+ if (pls_mode == 0 && pls_code == 0)
+ pls_code = 1;
+ pls_mode &= 0x03;
+ pls_code &= 0x3FFFF;
+
+ dprintk(FE_DEBUG, 1, "Set PLS code %d (mode %d)", pls_code, pls_mode);
+ if (STV090x_WRITE_DEMOD(state, PLROOT2, (pls_mode<<2) | (pls_code>>16)) < 0)
+ goto err;
+ if (STV090x_WRITE_DEMOD(state, PLROOT1, pls_code>>8) < 0)
+ goto err;
+ if (STV090x_WRITE_DEMOD(state, PLROOT0, pls_code) < 0)
+ goto err;
+ return 0;
+err:
+ dprintk(FE_ERROR, 1, "I/O error");
+ return -1;
+}
+
static int stv090x_set_mis(struct stv090x_state *state, int mis)
{
u32 reg;
- if (mis < 0 || mis > 255) {
+ if (mis == NO_STREAM_ID_FILTER) {
dprintk(FE_DEBUG, 1, "Disable MIS filtering");
+ stv090x_set_pls(state, 0, 0);
reg = STV090x_READ_DEMOD(state, PDELCTRL1);
STV090x_SETFIELD_Px(reg, FILTER_EN_FIELD, 0x00);
if (STV090x_WRITE_DEMOD(state, PDELCTRL1, reg) < 0)
goto err;
} else {
dprintk(FE_DEBUG, 1, "Enable MIS filtering - %d", mis);
+ stv090x_set_pls(state, (mis>>26) & 0x3, (mis>>8) & 0x3FFFF);
reg = STV090x_READ_DEMOD(state, PDELCTRL1);
STV090x_SETFIELD_Px(reg, FILTER_EN_FIELD, 0x01);
if (STV090x_WRITE_DEMOD(state, PDELCTRL1, reg) < 0)
--
2.1.4

92
patches/kernel/gfutures/4_10_0006-STV-Add-SNR-Signal-report-parameters.patch

@ -0,0 +1,92 @@
From 0d3b277d19137c4a0fdadfd1381f1c66515d1b0c Mon Sep 17 00:00:00 2001
From: Athanasios Oikonomou <athoik@gmail.com>
Date: Mon, 8 Feb 2016 22:14:31 +0200
Subject: [PATCH] STV: Add SNR/Signal report parameters
diff --git a/drivers/media/dvb-frontends/stv090x.c b/drivers/media/dvb-frontends/stv090x.c
index 264c4b8..12fd3d0 100644
--- a/drivers/media/dvb-frontends/stv090x.c
+++ b/drivers/media/dvb-frontends/stv090x.c
@@ -41,6 +41,18 @@
static unsigned int verbose;
module_param(verbose, int, 0644);
+/* define how SNR measurement is reported */
+static int esno;
+module_param(esno, int, 0644);
+MODULE_PARM_DESC(esno, "SNR is reported in 0:Percentage, "\
+ "1:(EsNo dB)*10 (default:0)");
+
+/* define how signal measurement is reported */
+static int dbm;
+module_param(dbm, int, 0644);
+MODULE_PARM_DESC(dbm, "Signal is reported in 0:Percentage, "\
+ "1:-1*dBm (default:0)");
+
/* internal params node */
struct stv090x_dev {
/* pointer for internal params, one for each pair of demods */
@@ -3687,7 +3699,10 @@ static int stv090x_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
str = 0;
else if (agc < stv090x_rf_tab[ARRAY_SIZE(stv090x_rf_tab) - 1].read)
str = -100;
- *strength = (str + 100) * 0xFFFF / 100;
+ if (dbm)
+ *strength = -str;
+ else
+ *strength = (str + 100) * 0xFFFF / 100;
return 0;
}
@@ -3698,8 +3713,7 @@ static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr)
u32 reg_0, reg_1, reg, i;
s32 val_0, val_1, val = 0;
u8 lock_f;
- s32 div;
- u32 last;
+ s32 snr;
switch (state->delsys) {
case STV090x_DVBS2:
@@ -3716,10 +3730,14 @@ static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr)
msleep(1);
}
val /= 16;
- last = ARRAY_SIZE(stv090x_s2cn_tab) - 1;
- div = stv090x_s2cn_tab[0].read -
- stv090x_s2cn_tab[last].read;
- *cnr = 0xFFFF - ((val * 0xFFFF) / div);
+ snr = stv090x_table_lookup(stv090x_s2cn_tab,
+ ARRAY_SIZE(stv090x_s2cn_tab) - 1, val);
+ if (snr < 0) snr = 0;
+ if (snr > 200) snr = 200;
+ if (esno)
+ *cnr = snr;
+ else
+ *cnr = snr * 0xFFFF / 200;
}
break;
@@ -3738,10 +3756,14 @@ static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr)
msleep(1);
}
val /= 16;
- last = ARRAY_SIZE(stv090x_s1cn_tab) - 1;
- div = stv090x_s1cn_tab[0].read -
- stv090x_s1cn_tab[last].read;
- *cnr = 0xFFFF - ((val * 0xFFFF) / div);
+ snr = stv090x_table_lookup(stv090x_s1cn_tab,
+ ARRAY_SIZE(stv090x_s1cn_tab) - 1, val);
+ if (snr < 0) snr = 0;
+ if (snr > 200) snr = 200;
+ if (esno)
+ *cnr = snr;
+ else
+ *cnr = snr * 0xFFFF / 200;
}
break;
default:
--
2.1.4

261
patches/kernel/gfutures/4_10_0007-blindscan2.patch

@ -0,0 +1,261 @@
diff --git a/drivers/media/dvb-frontends/stv090x.c b/drivers/media/dvb-frontends/stv090x.c
index ce99b9d..0b59a1f 100644
--- a/drivers/media/dvb-frontends/stv090x.c
+++ b/drivers/media/dvb-frontends/stv090x.c
@@ -1694,6 +1694,7 @@ static u32 stv090x_get_srate(struct stv090x_state *state, u32 clk)
((int_1 * tmp_2) >> 16) +
((int_2 * tmp_1) >> 16);
+ state->srate = srate;
return srate;
}
@@ -2606,6 +2607,94 @@ static int stv090x_get_viterbi(struct stv090x_state *state)
static enum stv090x_signal_state stv090x_get_sig_params(struct stv090x_state *state)
{
struct dvb_frontend *fe = &state->frontend;
+ struct dtv_frontend_properties *props = &fe->dtv_property_cache;
+
+ int fe_stv0900_tracking_standard_return[] = {
+ SYS_UNDEFINED,
+ SYS_DVBS,
+ SYS_DVBS2,
+ SYS_DSS
+ };
+
+ int fe_stv0900_rolloff_return[] = {
+ ROLLOFF_35,
+ ROLLOFF_25,
+ ROLLOFF_20,
+ ROLLOFF_AUTO
+ };
+
+ int fe_stv0900_modulation_return[] = {
+ QPSK,
+ PSK_8,
+ APSK_16,
+ APSK_32
+ };
+
+ int fe_stv0900_modcod_return_dvbs[] = {
+ FEC_NONE,
+ FEC_AUTO,
+ FEC_AUTO,
+ FEC_AUTO,
+ FEC_1_2,
+ FEC_3_5,
+ FEC_2_3,
+ FEC_3_4,
+ FEC_4_5,
+ FEC_5_6,
+ FEC_6_7,
+ FEC_7_8,
+ FEC_3_5,
+ FEC_2_3,
+ FEC_3_4,
+ FEC_5_6,
+ FEC_8_9,
+ FEC_9_10,
+ FEC_2_3,
+ FEC_3_4,
+ FEC_4_5,
+ FEC_5_6,
+ FEC_8_9,
+ FEC_9_10,
+ FEC_3_4,
+ FEC_4_5,
+ FEC_5_6,
+ FEC_8_9,
+ FEC_9_10,
+ FEC_AUTO
+ };
+
+ int fe_stv0900_modcod_return_dvbs2[] = {
+ FEC_NONE,
+ FEC_AUTO,
+ FEC_AUTO,
+ FEC_AUTO,
+ FEC_1_2,
+ FEC_3_5,
+ FEC_2_3,
+ FEC_3_4,
+ FEC_4_5,
+ FEC_5_6,
+ FEC_8_9,
+ FEC_9_10,
+ FEC_3_5,
+ FEC_2_3,
+ FEC_3_4,
+ FEC_5_6,
+ FEC_8_9,
+ FEC_9_10,
+ FEC_2_3,
+ FEC_3_4,
+ FEC_4_5,
+ FEC_5_6,
+ FEC_8_9,
+ FEC_9_10,
+ FEC_3_4,
+ FEC_4_5,
+ FEC_5_6,
+ FEC_8_9,
+ FEC_9_10,
+ FEC_AUTO
+ };
u8 tmg;
u32 reg;
@@ -2645,10 +2734,71 @@ static enum stv090x_signal_state stv090x_get_sig_params(struct stv090x_state *st
state->modcod = STV090x_GETFIELD_Px(reg, DEMOD_MODCOD_FIELD);
state->pilots = STV090x_GETFIELD_Px(reg, DEMOD_TYPE_FIELD) & 0x01;
state->frame_len = STV090x_GETFIELD_Px(reg, DEMOD_TYPE_FIELD) >> 1;
- reg = STV090x_READ_DEMOD(state, TMGOBS);
- state->rolloff = STV090x_GETFIELD_Px(reg, ROLLOFF_STATUS_FIELD);
- reg = STV090x_READ_DEMOD(state, FECM);
- state->inversion = STV090x_GETFIELD_Px(reg, IQINV_FIELD);
+ reg = STV090x_READ_DEMOD(state, MATSTR1);
+ state->rolloff = STV090x_GETFIELD_Px(reg, MATYPE_ROLLOFF_FIELD);
+
+ switch (state->delsys) {
+ case STV090x_DVBS2:
+ if (state->modcod <= STV090x_QPSK_910)
+ state->modulation = STV090x_QPSK;
+ else if (state->modcod <= STV090x_8PSK_910)
+ state->modulation = STV090x_8PSK;
+ else if (state->modcod <= STV090x_16APSK_910)
+ state->modulation = STV090x_16APSK;
+ else if (state->modcod <= STV090x_32APSK_910)
+ state->modulation = STV090x_32APSK;
+ else
+ state->modulation = STV090x_UNKNOWN;
+ reg = STV090x_READ_DEMOD(state, PLHMODCOD);
+ state->inversion = STV090x_GETFIELD_Px(reg, SPECINV_DEMOD_FIELD);
+ break;
+ case STV090x_DVBS1:
+ case STV090x_DSS:
+ switch(state->fec) {
+ case STV090x_PR12:
+ state->modcod = STV090x_QPSK_12;
+ break;
+ case STV090x_PR23:
+ state->modcod = STV090x_QPSK_23;
+ break;
+ case STV090x_PR34:
+ state->modcod = STV090x_QPSK_34;
+ break;
+ case STV090x_PR45:
+ state->modcod = STV090x_QPSK_45;
+ break;
+ case STV090x_PR56:
+ state->modcod = STV090x_QPSK_56;
+ break;
+ case STV090x_PR67:
+ state->modcod = STV090x_QPSK_89;
+ break;
+ case STV090x_PR78:
+ state->modcod = STV090x_QPSK_910;
+ break;
+ default:
+ state->modcod = STV090x_DUMMY_PLF;
+ break;
+ }
+ state->modulation = STV090x_QPSK;
+ reg = STV090x_READ_DEMOD(state, FECM);
+ state->inversion = STV090x_GETFIELD_Px(reg, IQINV_FIELD);
+ break;
+ default:
+ break;
+ }
+
+ props->frequency = state->frequency;
+ props->symbol_rate = state->srate;
+ if (state->delsys == 2)
+ props->fec_inner = fe_stv0900_modcod_return_dvbs2[state->modcod];
+ else
+ props->fec_inner = fe_stv0900_modcod_return_dvbs[state->modcod];
+ props->pilot = state->pilots;
+ props->rolloff = fe_stv0900_rolloff_return[state->rolloff];
+ props->modulation = fe_stv0900_modulation_return[state->modulation];
+ props->inversion = state->inversion;
+ props->delivery_system = fe_stv0900_tracking_standard_return[state->delsys];
if ((state->algo == STV090x_BLIND_SEARCH) || (state->srate < 10000000)) {
@@ -2858,6 +3008,7 @@ static int stv090x_optimize_track(struct stv090x_state *state)
{
struct dvb_frontend *fe = &state->frontend;
+ enum stv090x_rolloff rolloff;
enum stv090x_modcod modcod;
s32 srate, pilots, aclc, f_1, f_0, i = 0, blind_tune = 0;
@@ -2981,6 +3132,7 @@ static int stv090x_optimize_track(struct stv090x_state *state)
f_1 = STV090x_READ_DEMOD(state, CFR2);
f_0 = STV090x_READ_DEMOD(state, CFR1);
reg = STV090x_READ_DEMOD(state, TMGOBS);
+ rolloff = STV090x_GETFIELD_Px(reg, ROLLOFF_STATUS_FIELD);
if (state->algo == STV090x_BLIND_SEARCH) {
STV090x_WRITE_DEMOD(state, SFRSTEP, 0x00);
@@ -3515,20 +3667,24 @@ static enum dvbfe_search stv090x_search(struct dvb_frontend *fe)
state->frequency = props->frequency;
state->srate = props->symbol_rate;
state->search_mode = STV090x_SEARCH_AUTO;
- state->algo = STV090x_COLD_SEARCH;
+ state->algo = STV090x_BLIND_SEARCH;
state->fec = STV090x_PRERR;
- if (state->srate > 10000000) {
- dprintk(FE_DEBUG, 1, "Search range: 10 MHz");
- state->search_range = 10000000;
- } else {
- dprintk(FE_DEBUG, 1, "Search range: 5 MHz");
- state->search_range = 5000000;
- }
+ state->search_range = 0;
stv090x_set_mis(state, props->stream_id);
+ dprintk(FE_DEBUG, 1, "Search started...");
if (stv090x_algo(state) == STV090x_RANGEOK) {
+ stv090x_get_sig_params(state);
dprintk(FE_DEBUG, 1, "Search success!");
+ dprintk(FE_DEBUG, 1, "frequency = %d", props->frequency);
+ dprintk(FE_DEBUG, 1, "symbol_rate = %d", props->symbol_rate);
+ dprintk(FE_DEBUG, 1, "fec_inner = %d, %d", props->fec_inner, state->modcod);
+ dprintk(FE_DEBUG, 1, "pilot = %d", props->pilot);
+ dprintk(FE_DEBUG, 1, "rolloff = %d", props->rolloff);
+ dprintk(FE_DEBUG, 1, "modulation = %d, %d", props->modulation, state->modulation);
+ dprintk(FE_DEBUG, 1, "inversion = %d", props->inversion);
+ dprintk(FE_DEBUG, 1, "delivery_system = %d, %d", props->delivery_system, state->delsys);
return DVBFE_ALGO_SEARCH_SUCCESS;
} else {
dprintk(FE_DEBUG, 1, "Search failed!");
@@ -3571,6 +3727,7 @@ static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status)
*status |= FE_HAS_SYNC | FE_HAS_LOCK;
}
}
+ stv090x_get_sig_params(state);
break;
case 3: /* DVB-S1/legacy mode */
@@ -3584,6 +3742,7 @@ static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status)
*status |= FE_HAS_SYNC | FE_HAS_LOCK;
}
}
+ stv090x_get_sig_params(state);
break;
}
diff --git a/drivers/media/dvb-frontends/stv090x_reg.h b/drivers/media/dvb-frontends/stv090x_reg.h
index 93741ee..ac6bc30 100644
--- a/drivers/media/dvb-frontends/stv090x_reg.h
+++ b/drivers/media/dvb-frontends/stv090x_reg.h
@@ -1927,6 +1927,8 @@
#define STV090x_P1_MATSTR1 STV090x_Px_MATSTRy(1, 1)
#define STV090x_P2_MATSTR0 STV090x_Px_MATSTRy(2, 0)
#define STV090x_P2_MATSTR1 STV090x_Px_MATSTRy(2, 1)
+#define STV090x_OFFST_Px_MATYPE_ROLLOFF_FIELD 0
+#define STV090x_WIDTH_Px_MATYPE_ROLLOFF_FIELD 2
#define STV090x_OFFST_Px_MATYPE_CURRENT_FIELD 0
#define STV090x_WIDTH_Px_MATYPE_CURRENT_FIELD 8

92
patches/kernel/gfutures/4_10_0007-stv090x-optimized-TS-sync-control.patch

@ -0,0 +1,92 @@
From 8cc2e0072bc2dfc9a64b569e2b7bb804bf82bc55 Mon Sep 17 00:00:00 2001
From: Athanasios Oikonomou <athoik@gmail.com>
Date: Thu, 17 Mar 2016 06:53:34 +0200
Subject: [PATCH] stv090x: optimized TS sync control
Based on crazycat commits:
stv090x: Minimum latence TS FIFO mode for DVB-S2.
https://github.com/Taapat/driver/commit/b831c1a22b96ece05d0af1cc1e55d5e34d2ca13b
stv090x: optimized TS sync control.
https://github.com/Taapat/driver/commit/f2cacf05651efe48bb5abb02df94646a0d712362
diff --git a/drivers/media/dvb-frontends/stv090x.c b/drivers/media/dvb-frontends/stv090x.c
index 12fd3d0..396e0ab 100644
--- a/drivers/media/dvb-frontends/stv090x.c
+++ b/drivers/media/dvb-frontends/stv090x.c
@@ -3017,6 +3017,28 @@ static int stv090x_optimize_track(struct stv090x_state *state)
srate = stv090x_get_srate(state, state->internal->mclk);
srate += stv090x_get_tmgoffst(state, srate);
+ if (state->delsys == STV090x_DVBS2 && srate > 10000000) {
+ reg = stv090x_read_reg(state, STV090x_P1_TSSTATEM);
+ STV090x_SETFIELD_Px(reg, TSOUT_NOSYNC, 1);
+ if (stv090x_write_reg(state, STV090x_P1_TSSTATEM, reg) < 0)
+ goto err;
+
+ reg = stv090x_read_reg(state, STV090x_P1_TSSYNC);
+ STV090x_SETFIELD_Px(reg, TSFIFO_SYNCMODE, 2);
+ if (stv090x_write_reg(state, STV090x_P1_TSSYNC, reg) < 0)
+ goto err;
+ } else {
+ reg = stv090x_read_reg(state, STV090x_P1_TSSTATEM);
+ STV090x_SETFIELD_Px(reg, TSOUT_NOSYNC, 0);
+ if (stv090x_write_reg(state, STV090x_P1_TSSTATEM, reg) < 0)
+ goto err;
+
+ reg = stv090x_read_reg(state, STV090x_P1_TSSYNC);
+ STV090x_SETFIELD_Px(reg, TSFIFO_SYNCMODE, 0);
+ if (stv090x_write_reg(state, STV090x_P1_TSSYNC, reg) < 0)
+ goto err;
+ }
+
switch (state->delsys) {
case STV090x_DVBS1:
case STV090x_DSS:
@@ -4517,10 +4539,6 @@ static int stv0900_set_tspath(struct stv090x_state *state)
case STV090x_TSMODE_DVBCI:
if (stv090x_write_reg(state, STV090x_TSGENERAL, 0x06) < 0) /* Mux'd stream mode */
goto err;
- reg = stv090x_read_reg(state, STV090x_P1_TSCFGM);
- STV090x_SETFIELD_Px(reg, TSFIFO_MANSPEED_FIELD, 3);
- if (stv090x_write_reg(state, STV090x_P1_TSCFGM, reg) < 0)
- goto err;
reg = stv090x_read_reg(state, STV090x_P2_TSCFGM);
STV090x_SETFIELD_Px(reg, TSFIFO_MANSPEED_FIELD, 3);
if (stv090x_write_reg(state, STV090x_P2_TSCFGM, reg) < 0)
diff --git a/drivers/media/dvb-frontends/stv090x_reg.h b/drivers/media/dvb-frontends/stv090x_reg.h
index 93741ee..c1dac9c 100644
--- a/drivers/media/dvb-frontends/stv090x_reg.h
+++ b/drivers/media/dvb-frontends/stv090x_reg.h
@@ -2106,6 +2106,14 @@
#define STV090x_WIDTH_Px_TSDIL_ON_FIELD 1
#define STV090x_OFFST_Px_TSRS_ON_FIELD 5
#define STV090x_WIDTH_Px_TSRS_ON_FIELD 1
+#define STV090x_OFFST_Px_TSDESCRAMB_ON 4
+#define STV090x_WIDTH_Px_TSDESCRAMB_ON 1
+#define STV090x_OFFST_Px_TSFRAME_MODE 3
+#define STV090x_WIDTH_Px_TSFRAME_MODE 1
+#define STV090x_OFFST_Px_TS_DISABLE 2
+#define STV090x_WIDTH_Px_TS_DISABLE 1
+#define STV090x_OFFST_Px_TSOUT_NOSYNC 0
+#define STV090x_WIDTH_Px_TSOUT_NOSYNC 1
#define STV090x_Px_TSCFGH(__x) (0xF572 - (__x - 1) * 0x200)
#define STV090x_P1_TSCFGH STV090x_Px_TSCFGH(1)
@@ -2149,6 +2157,14 @@
#define STV090x_OFFST_Px_TSFIFO_DPUNACT_FIELD 1
#define STV090x_WIDTH_Px_TSFIFO_DPUNACT_FIELD 1
+#define STV090x_Px_TSSYNC(__x) (0xF575 - (__x - 1) * 0x200)
+#define STV090x_P1_TSSYNC STV090x_Px_TSSYNC(1)
+#define STV090x_P2_TSSYNC STV090x_Px_TSSYNC(2)
+#define STV090x_OFFST_Px_TSFIFO_FISCR3B 5
+#define STV090x_WIDTH_Px_TSFIFO_FISCR3B 2
+#define STV090x_OFFST_Px_TSFIFO_SYNCMODE 3
+#define STV090x_WIDTH_Px_TSFIFO_SYNCMODE 2
+
#define STV090x_Px_TSINSDELH(__x) (0xF576 - (__x - 1) * 0x200)
#define STV090x_P1_TSINSDELH STV090x_Px_TSINSDELH(1)
#define STV090x_P2_TSINSDELH STV090x_Px_TSINSDELH(2)
--
2.1.4

65
patches/kernel/gfutures/4_10_add-more-devices-rtl8xxxu.patch

@ -0,0 +1,65 @@
Date: Sat, 22 Nov 2017 21:30:00 +0200
Subject: [rtl8xxxu] Add more devices support
rtl8xxxu: Mark 8192eu device 0x0bda:0x818b as tested
rtl8xxxu: Add another 8192eu device to the USB list
rtl8xxxu: Add USB ID for D-Link DWA-131 rev E1 (rtl8192eu)
rtl8xxxu: Add additional USB IDs for rtl8192eu devices
rtl8xxxu: Update author/maintainer contact info
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c 2017-03-29 16:58:08 +0200
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c 2017-05-22 21:04:21 +0200
@@ -1,7 +1,7 @@
/*
* RTL8XXXU mac80211 USB driver
*
- * Copyright (c) 2014 - 2016 Jes Sorensen <Jes.Sorensen@redhat.com>
+ * Copyright (c) 2014 - 2017 Jes Sorensen <Jes.Sorensen@gmail.com>
*
* Portions, notably calibration code:
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
@@ -48,7 +48,7 @@
static int rtl8xxxu_dma_agg_timeout = -1;
static int rtl8xxxu_dma_agg_pages = -1;
-MODULE_AUTHOR("Jes Sorensen <Jes.Sorensen@redhat.com>");
+MODULE_AUTHOR("Jes Sorensen <Jes.Sorensen@gmail.com>");
MODULE_DESCRIPTION("RTL8XXXu USB mac80211 Wireless LAN Driver");
MODULE_LICENSE("GPL");
MODULE_FIRMWARE("rtlwifi/rtl8723aufw_A.bin");
@@ -6000,6 +6000,7 @@
case 0x8176:
case 0x8178:
case 0x817f:
+ case 0x818b:
untested = 0;
break;
}
@@ -6196,6 +6197,12 @@
.driver_info = (unsigned long)&rtl8723au_fops},
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x818b, 0xff, 0xff, 0xff),
.driver_info = (unsigned long)&rtl8192eu_fops},
+/* TP-Link TL-WN822N v4 */
+{USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0108, 0xff, 0xff, 0xff),
+ .driver_info = (unsigned long)&rtl8192eu_fops},
+/* D-Link DWA-131 rev E1, tested by David Patiño */
+{USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3319, 0xff, 0xff, 0xff),
+ .driver_info = (unsigned long)&rtl8192eu_fops},
/* Tested by Myckel Habets */
{USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0109, 0xff, 0xff, 0xff),
.driver_info = (unsigned long)&rtl8192eu_fops},
@@ -6347,6 +6354,13 @@
.driver_info = (unsigned long)&rtl8192cu_fops},
{USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0x7822, 0xff, 0xff, 0xff),
.driver_info = (unsigned long)&rtl8192cu_fops},
+/* found in rtl8192eu vendor driver */
+{USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0107, 0xff, 0xff, 0xff),
+ .driver_info = (unsigned long)&rtl8192eu_fops},
+{USB_DEVICE_AND_INTERFACE_INFO(0x2019, 0xab33, 0xff, 0xff, 0xff),
+ .driver_info = (unsigned long)&rtl8192eu_fops},
+{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x818c, 0xff, 0xff, 0xff),
+ .driver_info = (unsigned long)&rtl8192eu_fops},
#endif
{ }
};

12
patches/kernel/gfutures/4_10_bitsperlong.patch

@ -0,0 +1,12 @@
--- a/include/uapi/asm-generic/int-ll64.h
+++ b/include/uapi/asm-generic/int-ll64.h
@@ -8,7 +8,7 @@
#ifndef _UAPI_ASM_GENERIC_INT_LL64_H
#define _UAPI_ASM_GENERIC_INT_LL64_H
-#include <asm/bitsperlong.h>
+#include <asm-generic/bitsperlong.h>
#ifndef __ASSEMBLY__
/*

15
patches/kernel/gfutures/4_10_blacklist_mmc0.patch

@ -0,0 +1,15 @@
diff --git a/drivers/mmc/host/sdhci-brcmstb.c b/drivers/mmc/host/sdhci-brcmstb.c
index 942b42b..b678310 100644
--- a/drivers/mmc/host/sdhci-brcmstb.c
+++ b/drivers/mmc/host/sdhci-brcmstb.c
@@ -71,6 +71,10 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev)
struct clk *clk;
int res;
+ if (platform_get_resource(pdev, IORESOURCE_MEM, 0) && (unsigned int)platform_get_resource(pdev, IORESOURCE_MEM, 0)->start == 0xf03e0000) {
+ return -ENODEV;
+ }
+
clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(clk)) {
dev_err(&pdev->dev, "Clock not found in Device Tree\n");

13
patches/kernel/gfutures/4_10_reserve_dvb_adapter_0.patch

@ -0,0 +1,13 @@
diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c
index 560450a..eb1a212 100644
--- a/drivers/media/dvb-core/dvbdev.c
+++ b/drivers/media/dvb-core/dvbdev.c
@@ -789,7 +789,7 @@ static int dvbdev_check_free_adapter_num(int num)
static int dvbdev_get_free_adapter_num (void)
{
- int num = 0;
+ int num = 1;
while (num < DVB_MAX_ADAPTERS) {
if (dvbdev_check_free_adapter_num(num))

323
patches/kernel/gfutures/4_10_t230c2.patch

@ -0,0 +1,323 @@
--- a/drivers/media/usb/dvb-usb/cxusb.c
+++ b/drivers/media/usb/dvb-usb/cxusb.c
@@ -1402,6 +1402,76 @@
return 0;
}
+static int cxusb_mygica_t230c_frontend_attach(struct dvb_usb_adapter *adap)
+{
+ struct dvb_usb_device *d = adap->dev;
+ struct cxusb_state *st = d->priv;
+ struct i2c_adapter *adapter;
+ struct i2c_client *client_demod;
+ struct i2c_client *client_tuner;
+ struct i2c_board_info info;
+ struct si2168_config si2168_config;
+ struct si2157_config si2157_config;
+
+ /* Select required USB configuration */
+ if (usb_set_interface(d->udev, 0, 0) < 0)
+ err("set interface failed");
+
+ /* Unblock all USB pipes */
+ usb_clear_halt(d->udev,
+ usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
+ usb_clear_halt(d->udev,
+ usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
+ usb_clear_halt(d->udev,
+ usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
+
+ /* attach frontend */
+ memset(&si2168_config, 0, sizeof(si2168_config));
+ si2168_config.i2c_adapter = &adapter;
+ si2168_config.fe = &adap->fe_adap[0].fe;
+ si2168_config.ts_mode = SI2168_TS_PARALLEL;
+ si2168_config.ts_clock_inv = 1;
+ memset(&info, 0, sizeof(struct i2c_board_info));
+ strlcpy(info.type, "si2168", I2C_NAME_SIZE);
+ info.addr = 0x64;
+ info.platform_data = &si2168_config;
+ request_module(info.type);
+ client_demod = i2c_new_device(&d->i2c_adap, &info);
+ if (client_demod == NULL || client_demod->dev.driver == NULL)
+ return -ENODEV;
+
+ if (!try_module_get(client_demod->dev.driver->owner)) {
+ i2c_unregister_device(client_demod);
+ return -ENODEV;
+ }
+
+ /* attach tuner */
+ memset(&si2157_config, 0, sizeof(si2157_config));
+ si2157_config.fe = adap->fe_adap[0].fe;
+ memset(&info, 0, sizeof(struct i2c_board_info));
+ strlcpy(info.type, "si2141", I2C_NAME_SIZE);
+ info.addr = 0x60;
+ info.platform_data = &si2157_config;
+ request_module("si2157");
+ client_tuner = i2c_new_device(adapter, &info);
+ if (client_tuner == NULL || client_tuner->dev.driver == NULL) {
+ module_put(client_demod->dev.driver->owner);
+ i2c_unregister_device(client_demod);
+ return -ENODEV;
+ }
+ if (!try_module_get(client_tuner->dev.driver->owner)) {
+ i2c_unregister_device(client_tuner);
+ module_put(client_demod->dev.driver->owner);
+ i2c_unregister_device(client_demod);
+ return -ENODEV;
+ }
+
+ st->i2c_client_demod = client_demod;
+ st->i2c_client_tuner = client_tuner;
+
+ return 0;
+}
+
/*
* DViCO has shipped two devices with the same USB ID, but only one of them
* needs a firmware download. Check the device class details to see if they
@@ -1484,6 +1554,7 @@
static struct dvb_usb_device_properties cxusb_d680_dmb_properties;
static struct dvb_usb_device_properties cxusb_mygica_d689_properties;
static struct dvb_usb_device_properties cxusb_mygica_t230_properties;
+static struct dvb_usb_device_properties cxusb_mygica_t230c_properties;
static int cxusb_probe(struct usb_interface *intf,
const struct usb_device_id *id)
@@ -1516,6 +1587,8 @@
THIS_MODULE, NULL, adapter_nr) ||
0 == dvb_usb_device_init(intf, &cxusb_mygica_t230_properties,
THIS_MODULE, NULL, adapter_nr) ||
+ 0 == dvb_usb_device_init(intf, &cxusb_mygica_t230c_properties,
+ THIS_MODULE, NULL, adapter_nr) ||
0)
return 0;
@@ -1567,6 +1640,8 @@
CONEXANT_D680_DMB,
MYGICA_D689,
MYGICA_T230,
+ MYGICA_T230C,
+ MYGICA_T230C2,
NR__cxusb_table_index
};
@@ -1633,6 +1708,12 @@
},
[MYGICA_T230] = {
USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230)
+ },
+ [MYGICA_T230C] = {
+ USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230+1)
+ },
+ [MYGICA_T230C2] = {
+ USB_DEVICE(0x0572, 0xc68a)
},
{} /* Terminating entry */
};
@@ -2333,6 +2414,66 @@
}
};
+static struct dvb_usb_device_properties cxusb_mygica_t230c_properties = {
+ .caps = DVB_USB_IS_AN_I2C_ADAPTER,
+
+ .usb_ctrl = CYPRESS_FX2,
+
+ .size_of_priv = sizeof(struct cxusb_state),
+
+ .num_adapters = 1,
+ .adapter = {
+ {
+ .num_frontends = 1,
+ .fe = {{
+ .streaming_ctrl = cxusb_streaming_ctrl,
+ .frontend_attach = cxusb_mygica_t230c_frontend_attach,
+
+ /* parameter for the MPEG2-data transfer */
+ .stream = {
+ .type = USB_BULK,
+ .count = 5,
+ .endpoint = 0x02,
+ .u = {
+ .bulk = {
+ .buffersize = 8192,
+ }
+ }
+ },
+ } },
+ },
+ },
+
+ .power_ctrl = cxusb_d680_dmb_power_ctrl,
+
+ .i2c_algo = &cxusb_i2c_algo,
+
+ .generic_bulk_ctrl_endpoint = 0x01,
+
+#if 0 /* FIXME: crash dump kernel - dvb_usb_nec_rc_key_to_event */
+ .rc.legacy = {
+ .rc_interval = 100,
+ .rc_map_table = rc_map_d680_dmb_table,
+ .rc_map_size = ARRAY_SIZE(rc_map_d680_dmb_table),
+ .rc_query = cxusb_d680_dmb_rc_query,
+ },
+#endif
+
+ .num_device_descs = 2,
+ .devices = {
+ {
+ "Mygica T230C DVB-T/T2/C",
+ { NULL },
+ { &cxusb_table[MYGICA_T230C], NULL },
+ },
+ {
+ "Mygica T230C2 DVB-T/T2/C",
+ { NULL },
+ { &cxusb_table[MYGICA_T230C2], NULL },
+ },
+ }
+};
+
static struct usb_driver cxusb_driver = {
.name = "dvb_usb_cxusb",
.probe = cxusb_probe,
diff --git a/drivers/media/tuners/si2157.c b/drivers/media/tuners/si2157.c
index 57b250847cd3..e35b1faf0ddc 100644
--- a/drivers/media/tuners/si2157.c
+++ b/drivers/media/tuners/si2157.c
@@ -106,6 +106,9 @@ static int si2157_init(struct dvb_frontend *fe)
if (dev->chiptype == SI2157_CHIPTYPE_SI2146) {
memcpy(cmd.args, "\xc0\x05\x01\x00\x00\x0b\x00\x00\x01", 9);
cmd.wlen = 9;
+ } else if (dev->chiptype == SI2157_CHIPTYPE_SI2141) {
+ memcpy(cmd.args, "\xc0\x00\x0d\x0e\x00\x01\x01\x01\x01\x03", 10);
+ cmd.wlen = 10;
} else {
memcpy(cmd.args, "\xc0\x00\x0c\x00\x00\x01\x01\x01\x01\x01\x01\x02\x00\x00\x01", 15);
cmd.wlen = 15;
@@ -115,6 +118,15 @@ static int si2157_init(struct dvb_frontend *fe)
if (ret)
goto err;
+ /* Si2141 needs a second command before it answers the revision query */
+ if (dev->chiptype == SI2157_CHIPTYPE_SI2141) {
+ memcpy(cmd.args, "\xc0\x08\x01\x02\x00\x00\x01", 7);
+ cmd.wlen = 7;
+ ret = si2157_cmd_execute(client, &cmd);
+ if (ret)
+ goto err;
+ }
+
/* query chip revision */
memcpy(cmd.args, "\x02", 1);
cmd.wlen = 1;
@@ -131,12 +143,16 @@ static int si2157_init(struct dvb_frontend *fe)
#define SI2157_A30 ('A' << 24 | 57 << 16 | '3' << 8 | '0' << 0)
#define SI2147_A30 ('A' << 24 | 47 << 16 | '3' << 8 | '0' << 0)
#define SI2146_A10 ('A' << 24 | 46 << 16 | '1' << 8 | '0' << 0)
+ #define SI2141_A10 ('A' << 24 | 41 << 16 | '1' << 8 | '0' << 0)
switch (chip_id) {
case SI2158_A20:
case SI2148_A20:
fw_name = SI2158_A20_FIRMWARE;
break;
+ case SI2141_A10:
+ fw_name = SI2141_A10_FIRMWARE;
+ break;
case SI2157_A30:
case SI2147_A30:
case SI2146_A10:
@@ -371,7 +387,7 @@ static int si2157_get_if_frequency(struct dvb_frontend *fe, u32 *frequency)
static const struct dvb_tuner_ops si2157_ops = {
.info = {
- .name = "Silicon Labs Si2146/2147/2148/2157/2158",
+ .name = "Silicon Labs Si2141/Si2146/2147/2148/2157/2158",
.frequency_min = 42000000,
.frequency_max = 870000000,
},
@@ -471,6 +487,7 @@ static int si2157_probe(struct i2c_client *client,
#endif
dev_info(&client->dev, "Silicon Labs %s successfully attached\n",
+ dev->chiptype == SI2157_CHIPTYPE_SI2141 ? "Si2141" :
dev->chiptype == SI2157_CHIPTYPE_SI2146 ?
"Si2146" : "Si2147/2148/2157/2158");
@@ -508,6 +525,7 @@ static int si2157_remove(struct i2c_client *client)
static const struct i2c_device_id si2157_id_table[] = {
{"si2157", SI2157_CHIPTYPE_SI2157},
{"si2146", SI2157_CHIPTYPE_SI2146},
+ {"si2141", SI2157_CHIPTYPE_SI2141},
{}
};
MODULE_DEVICE_TABLE(i2c, si2157_id_table);
@@ -524,7 +542,8 @@ static struct i2c_driver si2157_driver = {
module_i2c_driver(si2157_driver);
-MODULE_DESCRIPTION("Silicon Labs Si2146/2147/2148/2157/2158 silicon tuner driver");
+MODULE_DESCRIPTION("Silicon Labs Si2141/Si2146/2147/2148/2157/2158 silicon tuner driver");
MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
MODULE_LICENSE("GPL");
MODULE_FIRMWARE(SI2158_A20_FIRMWARE);
+MODULE_FIRMWARE(SI2141_A10_FIRMWARE);
diff --git a/drivers/media/tuners/si2157_priv.h b/drivers/media/tuners/si2157_priv.h
index d6b2c7b44053..e6436f74abaa 100644
--- a/drivers/media/tuners/si2157_priv.h
+++ b/drivers/media/tuners/si2157_priv.h
@@ -42,6 +42,7 @@ struct si2157_dev {
#define SI2157_CHIPTYPE_SI2157 0
#define SI2157_CHIPTYPE_SI2146 1
+#define SI2157_CHIPTYPE_SI2141 2
/* firmware command struct */
#define SI2157_ARGLEN 30
@@ -52,5 +53,6 @@ struct si2157_cmd {
};
#define SI2158_A20_FIRMWARE "dvb-tuner-si2158-a20-01.fw"
+#define SI2141_A10_FIRMWARE "dvb-tuner-si2141-a10-01.fw"
#endif
--- a/drivers/media/dvb-frontends/si2168.c
+++ b/drivers/media/dvb-frontends/si2168.c
@@ -674,6 +674,9 @@ static int si2168_probe(struct i2c_client *client,
case SI2168_CHIP_ID_B40:
dev->firmware_name = SI2168_B40_FIRMWARE;
break;
+ case SI2168_CHIP_ID_D60:
+ dev->firmware_name = SI2168_D60_FIRMWARE;
+ break;
default:
dev_dbg(&client->dev, "unknown chip version Si21%d-%c%c%c\n",
cmd.args[2], cmd.args[1], cmd.args[3], cmd.args[4]);
@@ -761,3 +764,4 @@ MODULE_LICENSE("GPL");
MODULE_FIRMWARE(SI2168_A20_FIRMWARE);
MODULE_FIRMWARE(SI2168_A30_FIRMWARE);
MODULE_FIRMWARE(SI2168_B40_FIRMWARE);
+MODULE_FIRMWARE(SI2168_D60_FIRMWARE);
diff --git a/drivers/media/dvb-frontends/si2168_priv.h b/drivers/media/dvb-frontends/si2168_priv.h
index 7843ccb448a0..4baa95b7d648 100644
--- a/drivers/media/dvb-frontends/si2168_priv.h
+++ b/drivers/media/dvb-frontends/si2168_priv.h
@@ -25,6 +25,7 @@
#define SI2168_A20_FIRMWARE "dvb-demod-si2168-a20-01.fw"
#define SI2168_A30_FIRMWARE "dvb-demod-si2168-a30-01.fw"
#define SI2168_B40_FIRMWARE "dvb-demod-si2168-b40-01.fw"
+#define SI2168_D60_FIRMWARE "dvb-demod-si2168-d60-01.fw"
#define SI2168_B40_FIRMWARE_FALLBACK "dvb-demod-si2168-02.fw"
/* state struct */
@@ -37,6 +38,7 @@ struct si2168_dev {
#define SI2168_CHIP_ID_A20 ('A' << 24 | 68 << 16 | '2' << 8 | '0' << 0)
#define SI2168_CHIP_ID_A30 ('A' << 24 | 68 << 16 | '3' << 8 | '0' << 0)
#define SI2168_CHIP_ID_B40 ('B' << 24 | 68 << 16 | '4' << 8 | '0' << 0)
+ #define SI2168_CHIP_ID_D60 ('D' << 24 | 68 << 16 | '6' << 8 | '0' << 0)
unsigned int chip_id;
unsigned int version;
const char *firmware_name;
Loading…
Cancel
Save