15 changed files with 2449 additions and 16 deletions
@ -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 |
@ -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: |
File diff suppressed because it is too large
@ -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 |
|||
|
@ -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 |
|||
|
@ -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 |
|||
|
@ -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 |
|||
|
@ -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 |
|||
|
@ -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 |
|||
{ } |
|||
}; |
@ -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__ |
|||
/* |
|||
|
@ -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"); |
@ -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)) |
@ -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…
Reference in new issue