Driver bundle for PT3 & PX-Q3PE
Subsystems (5)
cover Driver bundle for PT3 & PX-Q3PE
From: Буди Романто, AreMa Inc <[email protected]>
Polished driver bundle for PT3 & PX-Q3PE, two of the most powerful ISDB-S/ISDB-T receiver cards currently available in Japan. Useless features are removed.
Main Components:
A. PT3 (2 ISDB-S + 2 ISDB-T receiver)
1. Altera EP4CGX15BF14C8N : customized FPGA PCI bridge
2. Toshiba TC90522XBG : quad demodulator (2ch OFDM + 2ch 8PSK)
3. Sharp VA4M6JC2103 : contains 2 ISDB-S + 2 ISDB-T tuners
ISDB-S : Sharp QM1D1C0042 RF-IC ISDB-T : MaxLinear CMOS Hybrid TV MxL301RF
B. PX-Q3PE (4 ISDB-S + 4 ISDB-T receiver)
1. ASICEN ASV5220 : PCI-E bridge
2. Toshiba TC90522XBG : quad demodulator (2ch OFDM + 2ch 8PSK)
3. NXP Semiconductors TDA20142 : ISDB-S tuner
4. Newport Media NM120 : ISDB-T tuner
Буди Романто, AreMa Inc (7):
raise adapter number limit
add NXP tda2014x & Newport Media nm120/130/131 tuners
drop backstabbing drivers
Toshiba TC90522XBG quad demodulator (2ch OFDM + 2ch 8PSK) used by both PT3 & PX-Q3PE MaxLinear MxL301RF ISDB-T tuner
Sharp QM1D1C0042 ISDB-S tuner
PCI bridge driver for PT3 & PXQ3PE
drivers/media/dvb-core/dvbdev.h | 2 +- drivers/media/dvb-frontends/tc90522.c | 959 +++++++--------------------------- drivers/media/dvb-frontends/tc90522.h | 36 +- drivers/media/pci/Kconfig | 2 +- drivers/media/pci/Makefile | 2 +- drivers/media/pci/pt3/Kconfig | 10 - drivers/media/pci/pt3/Makefile | 8 - drivers/media/pci/pt3/pt3.c | 873 ------------------------------- drivers/media/pci/pt3/pt3.h | 186 ------- drivers/media/pci/pt3/pt3_dma.c | 225 -------- drivers/media/pci/pt3/pt3_i2c.c | 240 --------- drivers/media/pci/ptx/Kconfig | 21 + drivers/media/pci/ptx/Makefile | 8 + drivers/media/pci/ptx/pt3_pci.c | 509 ++++++++++++++++++ drivers/media/pci/ptx/ptx_common.c | 215 ++++++++ drivers/media/pci/ptx/ptx_common.h | 68 +++ drivers/media/pci/ptx/pxq3pe_pci.c | 607 +++++++++++++++++++++ drivers/media/tuners/Kconfig | 14 + drivers/media/tuners/Makefile | 2 + drivers/media/tuners/mxl301rf.c | 468 +++++++---------- drivers/media/tuners/mxl301rf.h | 19 +- drivers/media/tuners/nm131.c | 272 ++++++++++ drivers/media/tuners/nm131.h | 13 + drivers/media/tuners/qm1d1c0042.c | 566 +++++++------------- drivers/media/tuners/qm1d1c0042.h | 30 +- drivers/media/tuners/tda2014x.c | 356 +++++++++++++ drivers/media/tuners/tda2014x.h | 13 + 27 files changed, 2691 insertions(+), 3033 deletions(-) delete mode 100644 drivers/media/pci/pt3/Kconfig delete mode 100644 drivers/media/pci/pt3/Makefile delete mode 100644 drivers/media/pci/pt3/pt3.c delete mode 100644 drivers/media/pci/pt3/pt3.h delete mode 100644 drivers/media/pci/pt3/pt3_dma.c delete mode 100644 drivers/media/pci/pt3/pt3_i2c.c create mode 100644 drivers/media/pci/ptx/Kconfig create mode 100644 drivers/media/pci/ptx/Makefile create mode 100644 drivers/media/pci/ptx/pt3_pci.c create mode 100644 drivers/media/pci/ptx/ptx_common.c create mode 100644 drivers/media/pci/ptx/ptx_common.h create mode 100644 drivers/media/pci/ptx/pxq3pe_pci.c create mode 100644 drivers/media/tuners/nm131.c create mode 100644 drivers/media/tuners/nm131.h create mode 100644 drivers/media/tuners/tda2014x.c create mode 100644 drivers/media/tuners/tda2014x.h
Signature · 1 line
2.3.10
PATCH 1/7 raise adapter number limit
From: Буди Романто, AreMa Inc <[email protected]>
The current limit is too low for latest cards with 8+ tuners on a single slot, change to 64.
--- drivers/media/dvb-core/dvbdev.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/dvb-core/dvbdev.h +1 -1
@@ -34,7 +34,7 @@#if defined(CONFIG_DVB_MAX_ADAPTERS ) &&CONFIG_DVB_MAX_ADAPTERS >0 #define DVB_MAX_ADAPTERS CONFIG_DVB_MAX_ADAPTERS#else -#define DVB_MAX_ADAPTERS 8 +#define DVB_MAX_ADAPTERS 64#endif #define DVB_UNSET (-1)
Signature · 1 line
2.3.10
Re: [media 1/7] raise adapter number limit
Quoted 5 lines · On Mon, Feb 15, 2016 at 7:08 AM, <[email protected]> wrote:
From: Буди Романто, AreMa Inc <[email protected]>
The current limit is too low for latest cards with 8+ tuners on a single slot, change to 64.
Signed-off-by Буди Романто, AreMa Inc <[email protected]>
I think that here goes only your name, not <name>, <company>.
PATCH 2/7 add NXP tda2014x & Newport Media nm120/130/131 tuners
In reply to [email protected]From: Буди Романто, AreMa Inc <[email protected]>
--- drivers/media/tuners/Kconfig | 14 ++ drivers/media/tuners/Makefile | 2 + drivers/media/tuners/nm131.c | 272 ++++++++++++++++++++++++++++++ drivers/media/tuners/nm131.h | 13 ++ drivers/media/tuners/tda2014x.c | 356 ++++++++++++++++++++++++++++++++++++++++ drivers/media/tuners/tda2014x.h | 13 ++ 6 files changed, 670 insertions(+) create mode 100644 drivers/media/tuners/nm131.c create mode 100644 drivers/media/tuners/nm131.h create mode 100644 drivers/media/tuners/tda2014x.c create mode 100644 drivers/media/tuners/tda2014x.h
drivers/media/tuners/Kconfig +14 -0
@@ -277,4 +277,18 @@ config MEDIA_TUNER_QM1D1C0042 default m if !MEDIA_SUBDRV_AUTOSELECT help Sharp QM1D1C0042 trellis coded 8PSK tuner driver. + +config MEDIA_TUNER_NM131 + tristate "Newport Media tuners NM131, NM130 and NM120" + depends on MEDIA_SUPPORT && I2C + default m if !MEDIA_SUBDRV_AUTOSELECT + help + Newport Media NM131, NM130 and NM120 tuner driver. + +config MEDIA_TUNER_TDA2014X + tristate "NXP Semiconductors TDA2014x tuner" + depends on MEDIA_SUPPORT && I2C + default m if !MEDIA_SUBDRV_AUTOSELECT + help + NXP Semiconductor TDA2014x tuner driver. endmenu
drivers/media/tuners/Makefile +2 -0
@@ -41,6 +41,8 @@ obj-$(CONFIG_MEDIA_TUNER_R820T) += r820t.o obj-$(CONFIG_MEDIA_TUNER_MXL301RF) += mxl301rf.o obj-$(CONFIG_MEDIA_TUNER_QM1D1C0042) += qm1d1c0042.o obj-$(CONFIG_MEDIA_TUNER_M88RS6000T) += m88rs6000t.o +obj-$(CONFIG_MEDIA_TUNER_NM131) += nm131.o +obj-$(CONFIG_MEDIA_TUNER_TDA2014X) += tda2014x.o ccflags-y += -I$(srctree)/drivers/media/dvb-core ccflags-y += -I$(srctree)/drivers/media/dvb-frontends
drivers/media/tuners/nm131.c new file +272 -0
272 lines not on this page · raw message
drivers/media/tuners/nm131.h new file +13 -0
@@ -0,0 +1,13 @@ +/* +* Driver for Newport Media tuners NMI131, NMI130 and NMI120 +* +* Copyright (C) Budi Rachmanto, AreMa Inc. <[email protected]> +*/ + +#ifndef NM131_H +#define NM131_H + +#define NM131_MODNAME "nm131" + +#endif +
drivers/media/tuners/tda2014x.c new file +356 -0
356 lines not on this page · raw message
drivers/media/tuners/tda2014x.h new file +13 -0
@@ -0,0 +1,13 @@ +/* +* Driver for NXP Semiconductors tuner TDA2014x +* +* Copyright (C) Budi Rachmanto, AreMa Inc. <[email protected]> +*/ + +#ifndef TDA2014X_H +#define TDA2014X_H + +#define TDA2014X_MODNAME "tda2014x" + +#endif +
Signature · 1 line
2.3.10
PATCH 3/7 drop backstabbing drivers
In reply to [email protected]From: Буди Романто, AreMa Inc <[email protected]>
--- drivers/media/dvb-frontends/tc90522.c | 840 -------------------------------- drivers/media/dvb-frontends/tc90522.h | 42 -- drivers/media/pci/pt3/Kconfig | 10 - drivers/media/pci/pt3/Makefile | 8 - drivers/media/pci/pt3/pt3.c | 873 ---------------------------------- drivers/media/pci/pt3/pt3.h | 186 -------- drivers/media/pci/pt3/pt3_dma.c | 225 --------- drivers/media/pci/pt3/pt3_i2c.c | 240 ---------- drivers/media/tuners/mxl301rf.c | 349 -------------- drivers/media/tuners/mxl301rf.h | 26 - drivers/media/tuners/qm1d1c0042.c | 448 ----------------- drivers/media/tuners/qm1d1c0042.h | 37 -- 12 files changed, 3284 deletions(-) delete mode 100644 drivers/media/dvb-frontends/tc90522.c delete mode 100644 drivers/media/dvb-frontends/tc90522.h delete mode 100644 drivers/media/pci/pt3/Kconfig delete mode 100644 drivers/media/pci/pt3/Makefile delete mode 100644 drivers/media/pci/pt3/pt3.c delete mode 100644 drivers/media/pci/pt3/pt3.h delete mode 100644 drivers/media/pci/pt3/pt3_dma.c delete mode 100644 drivers/media/pci/pt3/pt3_i2c.c delete mode 100644 drivers/media/tuners/mxl301rf.c delete mode 100644 drivers/media/tuners/mxl301rf.h delete mode 100644 drivers/media/tuners/qm1d1c0042.c delete mode 100644 drivers/media/tuners/qm1d1c0042.h
drivers/media/dvb-frontends/tc90522.c deleted +0 -840
@@ -1,840 +0,0 @@ -/* -* Toshiba TC90522 Demodulator -* -* Copyright (C) 2014 Akihiro Tsukada <[email protected]> -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License as -* published by the Free Software Foundation version 2. -* -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/* -* NOTICE: -* This driver is incomplete and lacks init/config of the chips, -* as the necessary info is not disclosed. -* It assumes that users of this driver (such as a PCI bridge of -* DTV receiver cards) properly init and configure the chip -* via I2C *before* calling this driver's init() function. -* -* Currently, PT3 driver is the only one that uses this driver, -* and contains init/config code in its firmware. -* Thus some part of the code might be dependent on PT3 specific config. -*/ - -#include <linux/kernel.h> -#include <linux/math64.h> -#include <linux/dvb/frontend.h> -#include "dvb_math.h" -#include "tc90522.h" - -#define TC90522_I2C_THRU_REG 0xfe - -#define TC90522_MODULE_IDX (addr) (((u8)(addr) & 0x02U) >> 1) - -struct tc90522_state { -struct tc90522_config cfg; -struct dvb_frontend fe; -struct i2c_client *i2c_client; -struct i2c_adapter tuner_i2c; - -bool lna; -}; - -struct reg_val { -u8 reg; -u8 val; -}; - -static int -reg_write (struct tc90522_state *state,const struct reg_val *regs,int num) -{ -int i, ret; -struct i2c_msg msg; - - ret =0 ; - msg.addr = state->i2c_client->addr; - msg.flags =0 ; - msg.len =2 ; -for (i =0 ; i < num; i++) { - msg.buf = (u8 *)®s[i]; - ret =i2c_transfer (state->i2c_client->adapter, &msg,1 ); -if (ret ==0 ) - ret = -EIO ; -if (ret <0 ) -return ret; - } -return 0 ; -} - -static int reg_read (struct tc90522_state *state,u8 reg,u8 *val,u8 len) -{ -struct i2c_msg msgs[2 ] = { - { - .addr = state->i2c_client->addr, - .flags =0 , - .buf = ®, - .len =1 , - }, - { - .addr = state->i2c_client->addr, - .flags =I2C_M_RD , - .buf = val, - .len = len, - }, - }; -int ret; - - ret =i2c_transfer (state->i2c_client->adapter, msgs,ARRAY_SIZE (msgs)); -if (ret ==ARRAY_SIZE (msgs)) - ret =0 ; -else if (ret >=0 ) - ret = -EIO ; -return ret; -} - -static struct tc90522_state *cfg_to_state (struct tc90522_config *c) -{ - return container_of(c, struct tc90522_state, cfg); -} - - -static int tc90522s_set_tsid (struct dvb_frontend *fe) -{ -struct reg_val set_tsid[] = { - {0x8f ,00 }, - {0x90 ,00 } - }; - - set_tsid[0 ].val = (fe->dtv_property_cache.stream_id &0xff00 ) >>8 ; - set_tsid[1 ].val = fe->dtv_property_cache.stream_id &0xff ; -return reg_write (fe->demodulator_priv, set_tsid,ARRAY_SIZE (set_tsid)); -} - -static int tc90522t_set_layers (struct dvb_frontend *fe) -{ -struct reg_val rv; -u8 laysel; - - laysel = ~fe->dtv_property_cache.isdbt_layer_enabled &0x07 ; - laysel = (laysel &0x01 ) <<2 | (laysel &0x02 ) | (laysel &0x04 ) >>2 ; - rv.reg =0x71 ; - rv.val = laysel; -return reg_write (fe->demodulator_priv, &rv,1 ); -} - -/* frontend ops */ - -static int tc90522s_read_status (struct dvb_frontend *fe,enum fe_status *status) -{ -struct tc90522_state *state; -int ret; -u8 reg; - - state = fe->demodulator_priv; - ret =reg_read (state,0xc3 , ®,1 ); -if (ret <0 ) -return ret; - - *status =0 ; -if (reg &0x80 )/* input level under min ? */ -return 0 ; - *status |=FE_HAS_SIGNAL ; - -if (reg &0x60 )/* carrier? */ -return 0 ; - *status |=FE_HAS_CARRIER |FE_HAS_VITERBI |FE_HAS_SYNC ; - -if (reg &0x10 ) -return 0 ; -if (reg_read (state,0xc5 , ®,1 ) <0 || !(reg &0x03 )) -return 0 ; - *status |=FE_HAS_LOCK ; -return 0 ; -} - -static int tc90522t_read_status (struct dvb_frontend *fe,enum fe_status *status) -{ -struct tc90522_state *state; -int ret; -u8 reg; - - state = fe->demodulator_priv; - ret =reg_read (state,0x96 , ®,1 ); -if (ret <0 ) -return ret; - - *status =0 ; -if (reg &0xe0 ) { - *status =FE_HAS_SIGNAL |FE_HAS_CARRIER |FE_HAS_VITERBI - |FE_HAS_SYNC |FE_HAS_LOCK ; -return 0 ; - } - - ret =reg_read (state,0x80 , ®,1 ); -if (ret <0 ) -return ret; - -if (reg &0xf0 ) -return 0 ; - *status |=FE_HAS_SIGNAL |FE_HAS_CARRIER ; - -if (reg &0x0c ) -return 0 ; - *status |=FE_HAS_SYNC |FE_HAS_VITERBI ; - -if (reg &0x02 ) -return 0 ; - *status |=FE_HAS_LOCK ; -return 0 ; -} - -static const enum fe_code_rate fec_conv_sat[] = { -FEC_NONE ,/* unused */ -FEC_1_2 ,/* for BPSK */ -FEC_1_2 ,FEC_2_3 ,FEC_3_4 ,FEC_5_6 ,FEC_7_8 ,/* for QPSK */ -FEC_2_3 ,/* for 8PSK. (trellis code) */ -}; - -static int tc90522s_get_frontend (struct dvb_frontend *fe, -struct dtv_frontend_properties *c) -{ -struct tc90522_state *state; -struct dtv_fe_stats *stats; -int ret, i; -int layers; -u8 val[10 ]; -u32 cndat; - - state = fe->demodulator_priv; - c->delivery_system =SYS_ISDBS ; - c->symbol_rate =28860000 ; - - layers =0 ; - ret =reg_read (state,0xe6 , val,5 ); -if (ret ==0 ) { -u8 v; - - c->stream_id = val[0 ] <<8 | val[1 ]; - -/* high/single layer */ - v = (val[2 ] &0x70 ) >>4 ; - c->modulation = (v ==7 ) ?PSK_8 :QPSK ; - c->fec_inner = fec_conv_sat[v]; - c->layer[0 ].fec = c->fec_inner; - c->layer[0 ].modulation = c->modulation; - c->layer[0 ].segment_count = val[3 ] &0x3f ;/* slots */ - -/* low layer */ - v = (val[2 ] &0x07 ); - c->layer[1 ].fec = fec_conv_sat[v]; -if (v ==0 )/* no low layer */ - c->layer[1 ].segment_count =0 ; -else - c->layer[1 ].segment_count = val[4 ] &0x3f ;/* slots */ -/* -* actually, BPSK if v==1, but not defined in -* enum fe_modulation -*/ - c->layer[1 ].modulation =QPSK ; - layers = (v >0 ) ?2 :1 ; - } - -/* statistics */ - - stats = &c->strength; - stats->len =0 ; -/* let the connected tuner set RSSI property cache */ -if (fe->ops.tuner_ops.get_rf_strength) { -u16 dummy; - - fe->ops.tuner_ops.get_rf_strength (fe, &dummy); - } - - stats = &c->cnr; - stats->len =1 ; - stats->stat[0 ].scale =FE_SCALE_NOT_AVAILABLE ; - cndat =0 ; - ret =reg_read (state,0xbc , val,2 ); -if (ret ==0 ) - cndat = val[0 ] <<8 | val[1 ]; -if (cndat >=3000 ) { -u32 p, p4; -s64 cn; - - cndat -=3000 ;/* cndat: 4.12 fixed point float */ -/* -* cnr[mdB] = -1634.6 * P^5 + 14341 * P^4 - 50259 * P^3 -* + 88977 * P^2 - 89565 * P + 58857 -* (P = sqrt(cndat) / 64) -*/ -/* p := sqrt(cndat) << 8 = P << 14, 2.14 fixed point float */ -/* cn = cnr << 3 */ - p =int_sqrt (cndat <<16 ); - p4 = cndat * cndat; - cn =div64_s64 (-16346LL * p4 * p,10 ) >>35 ; - cn += (14341LL * p4) >>21 ; - cn -= (50259LL * cndat * p) >>23 ; - cn += (88977LL * cndat) >>9 ; - cn -= (89565LL * p) >>11 ; - cn +=58857 <<3 ; - stats->stat[0 ].svalue = cn >>3 ; - stats->stat[0 ].scale =FE_SCALE_DECIBEL ; - } - -/* per-layer post viterbi BER (or PER? config dependent?) */ - stats = &c->post_bit_error; -memset (stats,0 ,sizeof (*stats)); - stats->len = layers; - ret =reg_read (state,0xeb , val,10 ); -if (ret <0 ) -for (i =0 ; i < layers; i++) - stats->stat[i].scale =FE_SCALE_NOT_AVAILABLE ; -else { -for (i =0 ; i < layers; i++) { - stats->stat[i].scale =FE_SCALE_COUNTER ; - stats->stat[i].uvalue = val[i *5 ] <<16 - | val[i *5 +1 ] <<8 | val[i *5 +2 ]; - } - } - stats = &c->post_bit_count; -memset (stats,0 ,sizeof (*stats)); - stats->len = layers; -if (ret <0 ) -for (i =0 ; i < layers; i++) - stats->stat[i].scale =FE_SCALE_NOT_AVAILABLE ; -else { -for (i =0 ; i < layers; i++) { - stats->stat[i].scale =FE_SCALE_COUNTER ; - stats->stat[i].uvalue = - val[i *5 +3 ] <<8 | val[i *5 +4 ]; - stats->stat[i].uvalue *=204 *8 ; - } - } - -return 0 ; -} - - -static const enum fe_transmit_mode tm_conv[] = { -TRANSMISSION_MODE_2K , -TRANSMISSION_MODE_4K , -TRANSMISSION_MODE_8K , -0 -}; - -static const enum fe_code_rate fec_conv_ter[] = { -FEC_1_2 ,FEC_2_3 ,FEC_3_4 ,FEC_5_6 ,FEC_7_8 ,0 ,0 ,0 -}; - -static const enum fe_modulation mod_conv[] = { -DQPSK ,QPSK ,QAM_16 ,QAM_64 ,0 ,0 ,0 ,0 -}; - -static int tc90522t_get_frontend (struct dvb_frontend *fe, -struct dtv_frontend_properties *c) -{ -struct tc90522_state *state; -struct dtv_fe_stats *stats; -int ret, i; -int layers; -u8 val[15 ], mode; -u32 cndat; - - state = fe->demodulator_priv; - c->delivery_system =SYS_ISDBT ; - c->bandwidth_hz =6000000 ; - mode =1 ; - ret =reg_read (state,0xb0 , val,1 ); -if (ret ==0 ) { - mode = (val[0 ] &0xc0 ) >>2 ; - c->transmission_mode = tm_conv[mode]; - c->guard_interval = (val[0 ] &0x30 ) >>4 ; - } - - ret =reg_read (state,0xb2 , val,6 ); - layers =0 ; -if (ret ==0 ) { -u8 v; - - c->isdbt_partial_reception = val[0 ] &0x01 ; - c->isdbt_sb_mode = (val[0 ] &0xc0 ) ==0x40 ; - -/* layer A */ - v = (val[2 ] &0x78 ) >>3 ; -if (v ==0x0f ) - c->layer[0 ].segment_count =0 ; -else { - layers++; - c->layer[0 ].segment_count = v; - c->layer[0 ].fec = fec_conv_ter[(val[1 ] &0x1c ) >>2 ]; - c->layer[0 ].modulation = mod_conv[(val[1 ] &0xe0 ) >>5 ]; - v = (val[1 ] &0x03 ) <<1 | (val[2 ] &0x80 ) >>7 ; - c->layer[0 ].interleaving = v; - } - -/* layer B */ - v = (val[3 ] &0x03 ) <<1 | (val[4 ] &0xc0 ) >>6 ; -if (v ==0x0f ) - c->layer[1 ].segment_count =0 ; -else { - layers++; - c->layer[1 ].segment_count = v; - c->layer[1 ].fec = fec_conv_ter[(val[3 ] &0xe0 ) >>5 ]; - c->layer[1 ].modulation = mod_conv[(val[2 ] &0x07 )]; - c->layer[1 ].interleaving = (val[3 ] &0x1c ) >>2 ; - } - -/* layer C */ - v = (val[5 ] &0x1e ) >>1 ; -if (v ==0x0f ) - c->layer[2 ].segment_count =0 ; -else { - layers++; - c->layer[2 ].segment_count = v; - c->layer[2 ].fec = fec_conv_ter[(val[4 ] &0x07 )]; - c->layer[2 ].modulation = mod_conv[(val[4 ] &0x38 ) >>3 ]; - c->layer[2 ].interleaving = (val[5 ] &0xe0 ) >>5 ; - } - } - -/* statistics */ - - stats = &c->strength; - stats->len =0 ; -/* let the connected tuner set RSSI property cache */ -if (fe->ops.tuner_ops.get_rf_strength) { -u16 dummy; - - fe->ops.tuner_ops.get_rf_strength (fe, &dummy); - } - - stats = &c->cnr; - stats->len =1 ; - stats->stat[0 ].scale =FE_SCALE_NOT_AVAILABLE ; - cndat =0 ; - ret =reg_read (state,0x8b , val,3 ); -if (ret ==0 ) - cndat = val[0 ] <<16 | val[1 ] <<8 | val[2 ]; -if (cndat !=0 ) { -u32 p, tmp; -s64 cn; - -/* -* cnr[mdB] = 0.024 P^4 - 1.6 P^3 + 39.8 P^2 + 549.1 P + 3096.5 -* (P = 10log10(5505024/cndat)) -*/ -/* cn = cnr << 3 (61.3 fixed point float */ -/* p = 10log10(5505024/cndat) << 24 (8.24 fixed point float)*/ - p =intlog10 (5505024 ) -intlog10 (cndat); - p *=10 ; - - cn =24772 ; - cn +=div64_s64 (43827LL * p,10 ) >>24 ; - tmp = p >>8 ; - cn +=div64_s64 (3184LL * tmp * tmp,10 ) >>32 ; - tmp = p >>13 ; - cn -=div64_s64 (128LL * tmp * tmp * tmp,10 ) >>33 ; - tmp = p >>18 ; - cn +=div64_s64 (192LL * tmp * tmp * tmp * tmp,1000 ) >>24 ; - - stats->stat[0 ].svalue = cn >>3 ; - stats->stat[0 ].scale =FE_SCALE_DECIBEL ; - } - -/* per-layer post viterbi BER (or PER? config dependent?) */ - stats = &c->post_bit_error; -memset (stats,0 ,sizeof (*stats)); - stats->len = layers; - ret =reg_read (state,0x9d , val,15 ); -if (ret <0 ) -for (i =0 ; i < layers; i++) - stats->stat[i].scale =FE_SCALE_NOT_AVAILABLE ; -else { -for (i =0 ; i < layers; i++) { - stats->stat[i].scale =FE_SCALE_COUNTER ; - stats->stat[i].uvalue = val[i *3 ] <<16 - | val[i *3 +1 ] <<8 | val[i *3 +2 ]; - } - } - stats = &c->post_bit_count; -memset (stats,0 ,sizeof (*stats)); - stats->len = layers; -if (ret <0 ) -for (i =0 ; i < layers; i++) - stats->stat[i].scale =FE_SCALE_NOT_AVAILABLE ; -else { -for (i =0 ; i < layers; i++) { - stats->stat[i].scale =FE_SCALE_COUNTER ; - stats->stat[i].uvalue = - val[9 + i *2 ] <<8 | val[9 + i *2 +1 ]; - stats->stat[i].uvalue *=204 *8 ; - } - } - -return 0 ; -} - -static const struct reg_val reset_sat = {0x03 ,0x01 }; -static const struct reg_val reset_ter = {0x01 ,0x40 }; - -static int tc90522_set_frontend (struct dvb_frontend *fe) -{ -struct tc90522_state *state; -int ret; - - state = fe->demodulator_priv; - -if (fe->ops.tuner_ops.set_params) - ret = fe->ops.tuner_ops.set_params (fe); -else - ret = -ENODEV ; -if (ret <0 ) - goto failed; - -if (fe->ops.delsys[0 ] ==SYS_ISDBS ) { - ret =tc90522s_set_tsid (fe); -if (ret <0 ) - goto failed; - ret =reg_write (state, &reset_sat,1 ); - }else { - ret =tc90522t_set_layers (fe); -if (ret <0 ) - goto failed; - ret =reg_write (state, &reset_ter,1 ); - } -if (ret <0 ) - goto failed; - -return 0 ; - -failed: -dev_warn (&state->tuner_i2c.dev,"(%s) failed. [adap%d-fe%d]\n" , - __func__, fe->dvb->num, fe->id); -return ret; -} - -static int tc90522_get_tune_settings (struct dvb_frontend *fe, -struct dvb_frontend_tune_settings *settings) -{ -if (fe->ops.delsys[0 ] ==SYS_ISDBS ) { - settings->min_delay_ms =250 ; - settings->step_size =1000 ; - settings->max_drift = settings->step_size *2 ; - }else { - settings->min_delay_ms =400 ; - settings->step_size =142857 ; - settings->max_drift = settings->step_size; - } -return 0 ; -} - -static int tc90522_set_if_agc (struct dvb_frontend *fe,bool on) -{ -struct reg_val agc_sat[] = { - {0x0a ,0x00 }, - {0x10 ,0x30 }, - {0x11 ,0x00 }, - {0x03 ,0x01 }, - }; -struct reg_val agc_ter[] = { - {0x25 ,0x00 }, - {0x23 ,0x4c }, - {0x01 ,0x40 }, - }; -struct tc90522_state *state; -struct reg_val *rv; -int num; - - state = fe->demodulator_priv; -if (fe->ops.delsys[0 ] ==SYS_ISDBS ) { - agc_sat[0 ].val = on ?0xff :0x00 ; - agc_sat[1 ].val |=0x80 ; - agc_sat[1 ].val |= on ?0x01 :0x00 ; - agc_sat[2 ].val |= on ?0x40 :0x00 ; - rv = agc_sat; - num =ARRAY_SIZE (agc_sat); - }else { - agc_ter[0 ].val = on ?0x40 :0x00 ; - agc_ter[1 ].val |= on ?0x00 :0x01 ; - rv = agc_ter; - num =ARRAY_SIZE (agc_ter); - } -return reg_write (state, rv, num); -} - -static const struct reg_val sleep_sat = {0x17 ,0x01 }; -static const struct reg_val sleep_ter = {0x03 ,0x90 }; - -static int tc90522_sleep (struct dvb_frontend *fe) -{ -struct tc90522_state *state; -int ret; - - state = fe->demodulator_priv; -if (fe->ops.delsys[0 ] ==SYS_ISDBS ) - ret =reg_write (state, &sleep_sat,1 ); -else { - ret =reg_write (state, &sleep_ter,1 ); -if (ret ==0 && fe->ops.set_lna && - fe->dtv_property_cache.lna ==LNA_AUTO ) { - fe->dtv_property_cache.lna =0 ; - ret = fe->ops.set_lna (fe); - fe->dtv_property_cache.lna =LNA_AUTO ; - } - } -if (ret <0 ) -dev_warn (&state->tuner_i2c.dev, -"(%s) failed. [adap%d-fe%d]\n" , - __func__, fe->dvb->num, fe->id); -return ret; -} - -static const struct reg_val wakeup_sat = {0x17 ,0x00 }; -static const struct reg_val wakeup_ter = {0x03 ,0x80 }; - -static int tc90522_init (struct dvb_frontend *fe) -{ -struct tc90522_state *state; -int ret; - -/* -* Because the init sequence is not public, -* the parent device/driver should have init'ed the device before. -* just wake up the device here. -*/ - - state = fe->demodulator_priv; -if (fe->ops.delsys[0 ] ==SYS_ISDBS ) - ret =reg_write (state, &wakeup_sat,1 ); -else { - ret =reg_write (state, &wakeup_ter,1 ); -if (ret ==0 && fe->ops.set_lna && - fe->dtv_property_cache.lna ==LNA_AUTO ) { - fe->dtv_property_cache.lna =1 ; - ret = fe->ops.set_lna (fe); - fe->dtv_property_cache.lna =LNA_AUTO ; - } - } -if (ret <0 ) { -dev_warn (&state->tuner_i2c.dev, -"(%s) failed. [adap%d-fe%d]\n" , - __func__, fe->dvb->num, fe->id); -return ret; - } - -/* prefer 'all-layers' to 'none' as a default */ -if (fe->dtv_property_cache.isdbt_layer_enabled ==0 ) - fe->dtv_property_cache.isdbt_layer_enabled =7 ; -return tc90522_set_if_agc (fe, true); -} - - -/* -* tuner I2C adapter functions -*/ - -static int -tc90522_master_xfer (struct i2c_adapter *adap,struct i2c_msg *msgs,int num) -{ -struct tc90522_state *state; -struct i2c_msg *new_msgs; -int i, j; -int ret, rd_num; -u8 wbuf[256 ]; -u8 *p, *bufend; - -if (num <=0 ) -return -EINVAL ; - - rd_num =0 ; -for (i =0 ; i < num; i++) -if (msgs[i].flags &I2C_M_RD ) - rd_num++; - new_msgs =kmalloc (sizeof (*new_msgs) * (num + rd_num),GFP_KERNEL ); -if (!new_msgs) -return -ENOMEM ; - - state =i2c_get_adapdata (adap); - p = wbuf; - bufend = wbuf +sizeof (wbuf); -for (i =0 , j =0 ; i < num; i++, j++) { - new_msgs[j].addr = state->i2c_client->addr; - new_msgs[j].flags = msgs[i].flags; - -if (msgs[i].flags &I2C_M_RD ) { - new_msgs[j].flags &= ~I2C_M_RD ; -if (p +2 > bufend) -break ; - p[0 ] =TC90522_I2C_THRU_REG ; - p[1 ] = msgs[i].addr <<1 |0x01 ; - new_msgs[j].buf = p; - new_msgs[j].len =2 ; - p +=2 ; - j++; - new_msgs[j].addr = state->i2c_client->addr; - new_msgs[j].flags = msgs[i].flags; - new_msgs[j].buf = msgs[i].buf; - new_msgs[j].len = msgs[i].len; -continue ; - } - -if (p + msgs[i].len +2 > bufend) -break ; - p[0 ] =TC90522_I2C_THRU_REG ; - p[1 ] = msgs[i].addr <<1 ; -memcpy (p +2 , msgs[i].buf, msgs[i].len); - new_msgs[j].buf = p; - new_msgs[j].len = msgs[i].len +2 ; - p += new_msgs[j].len; - } - -if (i < num) - ret = -ENOMEM ; -else - ret =i2c_transfer (state->i2c_client->adapter, new_msgs, j); -if (ret >=0 && ret < j) - ret = -EIO ; -kfree (new_msgs); -return (ret == j) ? num : ret; -} - -static u32 tc90522_functionality (struct i2c_adapter *adap) -{ -return I2C_FUNC_I2C ; -} - -static const struct i2c_algorithm tc90522_tuner_i2c_algo = { - .master_xfer = &tc90522_master_xfer, - .functionality = &tc90522_functionality, -}; - - -/* -* I2C driver functions -*/ - -static const struct dvb_frontend_ops tc90522_ops_sat = { - .delsys = {SYS_ISDBS }, - .info = { - .name ="Toshiba TC90522 ISDB-S module" , - .frequency_min =950000 , - .frequency_max =2150000 , - .caps =FE_CAN_INVERSION_AUTO |FE_CAN_FEC_AUTO | -FE_CAN_QAM_AUTO |FE_CAN_TRANSMISSION_MODE_AUTO | -FE_CAN_GUARD_INTERVAL_AUTO |FE_CAN_HIERARCHY_AUTO , - }, - - .init = tc90522_init, - .sleep = tc90522_sleep, - .set_frontend = tc90522_set_frontend, - .get_tune_settings = tc90522_get_tune_settings, - - .get_frontend = tc90522s_get_frontend, - .read_status = tc90522s_read_status, -}; - -static const struct dvb_frontend_ops tc90522_ops_ter = { - .delsys = {SYS_ISDBT }, - .info = { - .name ="Toshiba TC90522 ISDB-T module" , - .frequency_min =470000000 , - .frequency_max =770000000 , - .frequency_stepsize =142857 , - .caps =FE_CAN_INVERSION_AUTO | -FE_CAN_FEC_1_2 |FE_CAN_FEC_2_3 |FE_CAN_FEC_3_4 | -FE_CAN_FEC_5_6 |FE_CAN_FEC_7_8 |FE_CAN_FEC_AUTO | -FE_CAN_QPSK |FE_CAN_QAM_16 |FE_CAN_QAM_64 | -FE_CAN_QAM_AUTO |FE_CAN_TRANSMISSION_MODE_AUTO | -FE_CAN_GUARD_INTERVAL_AUTO |FE_CAN_RECOVER | -FE_CAN_HIERARCHY_AUTO , - }, - - .init = tc90522_init, - .sleep = tc90522_sleep, - .set_frontend = tc90522_set_frontend, - .get_tune_settings = tc90522_get_tune_settings, - - .get_frontend = tc90522t_get_frontend, - .read_status = tc90522t_read_status, -}; - - -static int tc90522_probe (struct i2c_client *client, -const struct i2c_device_id *id) -{ -struct tc90522_state *state; -struct tc90522_config *cfg; -const struct dvb_frontend_ops *ops; -struct i2c_adapter *adap; -int ret; - - state =kzalloc (sizeof (*state),GFP_KERNEL ); -if (!state) -return -ENOMEM ; - state->i2c_client = client; - - cfg = client->dev.platform_data; -memcpy (&state->cfg, cfg,sizeof (state->cfg)); - cfg->fe = state->cfg.fe = &state->fe; - ops = id->driver_data ==0 ? &tc90522_ops_sat : &tc90522_ops_ter; -memcpy (&state->fe.ops, ops,sizeof (*ops)); - state->fe.demodulator_priv = state; - - adap = &state->tuner_i2c; - adap->owner =THIS_MODULE ; - adap->algo = &tc90522_tuner_i2c_algo; - adap->dev.parent = &client->dev; -strlcpy (adap->name,"tc90522_sub" ,sizeof (adap->name)); -i2c_set_adapdata (adap, state); - ret =i2c_add_adapter (adap); -if (ret <0 ) - goto err; - cfg->tuner_i2c = state->cfg.tuner_i2c = adap; - -i2c_set_clientdata (client, &state->cfg); -dev_info (&client->dev,"Toshiba TC90522 attached.\n" ); -return 0 ; - -err: -kfree (state); -return ret; -} - -static int tc90522_remove (struct i2c_client *client) -{ -struct tc90522_state *state; - - state =cfg_to_state (i2c_get_clientdata (client)); -i2c_del_adapter (&state->tuner_i2c); -kfree (state); -return 0 ; -} - - -static const struct i2c_device_id tc90522_id[] = { - {TC90522_I2C_DEV_SAT ,0 }, - {TC90522_I2C_DEV_TER ,1 }, - {} -}; -MODULE_DEVICE_TABLE (i2c, tc90522_id); - -static struct i2c_driver tc90522_driver = { - .driver = { - .name ="tc90522" , - }, - .probe = tc90522_probe, - .remove = tc90522_remove, - .id_table = tc90522_id, -}; - -module_i2c_driver (tc90522_driver); - -MODULE_DESCRIPTION ("Toshiba TC90522 frontend" ); -MODULE_AUTHOR ("Akihiro TSUKADA" ); -MODULE_LICENSE ("GPL" );
drivers/media/dvb-frontends/tc90522.h deleted +0 -42
42 lines not on this page · raw message
drivers/media/pci/pt3/Kconfig deleted +0 -10
@@ -1,10 +0,0 @@ -config DVB_PT3 - tristate "Earthsoft PT3 cards" - depends on DVB_CORE && PCI && I2C - select DVB_TC90522 if MEDIA_SUBDRV_AUTOSELECT - select MEDIA_TUNER_QM1D1C0042 if MEDIA_SUBDRV_AUTOSELECT - select MEDIA_TUNER_MXL301RF if MEDIA_SUBDRV_AUTOSELECT - help - Support for Earthsoft PT3 PCIe cards. - - Say Y or M if you own such a device and want to use it.
drivers/media/pci/pt3/Makefile deleted +0 -8
@@ -1,8 +0,0 @@ - -earth-pt3-objs += pt3.o pt3_i2c.o pt3_dma.o - -obj-$(CONFIG_DVB_PT3) += earth-pt3.o - -ccflags-y += -Idrivers/media/dvb-core -ccflags-y += -Idrivers/media/dvb-frontends -ccflags-y += -Idrivers/media/tuners
drivers/media/pci/pt3/pt3.c deleted +0 -873
873 lines not on this page · raw message
drivers/media/pci/pt3/pt3.h deleted +0 -186
186 lines not on this page · raw message
drivers/media/pci/pt3/pt3_dma.c deleted +0 -225
225 lines not on this page · raw message
drivers/media/pci/pt3/pt3_i2c.c deleted +0 -240
240 lines not on this page · raw message
drivers/media/tuners/mxl301rf.c deleted +0 -349
349 lines not on this page · raw message
drivers/media/tuners/mxl301rf.h deleted +0 -26
@@ -1,26 +0,0 @@ -/* -* MaxLinear MxL301RF OFDM tuner driver -* -* Copyright (C) 2014 Akihiro Tsukada <[email protected]> -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License as -* published by the Free Software Foundation version 2. -* -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -#ifndef MXL301RF_H -#define MXL301RF_H - -#include "dvb_frontend.h" - -struct mxl301rf_config { -struct dvb_frontend *fe; -}; - -#endif /* MXL301RF_H */
drivers/media/tuners/qm1d1c0042.c deleted +0 -448
201 lines not on this page · raw message
drivers/media/tuners/qm1d1c0042.h deleted +0 -37
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Signature · 1 line
2.3.10
Part of the diff is not shown here. View the raw message.
PATCH 4/7 Toshiba TC90522XBG quad demodulator (2ch OFDM + 2ch 8PSK) used by both PT3 & PX-Q3PE
In reply to [email protected]From: Буди Романто, AreMa Inc <[email protected]>
--- drivers/media/dvb-frontends/tc90522.c | 283 ++++++++++++++++++++++++++++++++++ drivers/media/dvb-frontends/tc90522.h | 18 +++ 2 files changed, 301 insertions(+) create mode 100644 drivers/media/dvb-frontends/tc90522.c create mode 100644 drivers/media/dvb-frontends/tc90522.h
drivers/media/dvb-frontends/tc90522.c new file +283 -0
@@ -0,0 +1,283 @@ +/* +* Toshiba TC90522XBG 2ch OFDM(ISDB-T) + 2ch 8PSK(ISDB-S) demodulator +* +* Copyright (C) Budi Rachmanto, AreMa Inc. <[email protected]> +* +* Supported cards: +* Earthsoft PT3 +* PLEX PX-Q3PE +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +*/ + +#include <linux/pci.h> +#include "dvb_math.h" +#include "dvb_frontend.h" +#include "tc90522.h" + +struct tc90522 { +struct i2c_adapter *i2c; +fe_status_t stat; +}; + +bool tc90522_r (struct dvb_frontend *fe,u8 slvadr,u8 *buf,u8 len) +{ +struct tc90522 *d = fe->demodulator_priv; +struct i2c_msg msg[] = { + {.addr = fe->id, .flags =0 , .buf = &slvadr, .len =1 ,}, + {.addr = fe->id, .flags =I2C_M_RD , .buf = buf, .len = len,}, + }; +return i2c_transfer (d->i2c, msg,2 ) ==2 ; +} + +bool tc90522_w (struct dvb_frontend *fe,u8 slvadr,u8 dat) +{ +struct tc90522 *d = fe->demodulator_priv; +u8 buf[] = {slvadr, dat}; +struct i2c_msg msg[] = { + {.addr = fe->id, .flags =0 , .buf = buf, .len =2 ,}, + }; +return i2c_transfer (d->i2c, msg,1 ) ==1 ; +} + +u64 tc90522_n2int (const u8 *data,u8 n)/* convert n_bytes data from stream (network byte order) to integer */ +{/* can't use <arpa/inet.h>'s ntoh*() as sometimes n = 3,5,... */ +u32 i, val =0 ; + +for (i =0 ; i < n; i++) { + val <<=8 ; + val |= data[i]; + } +return val; +} + +int tc90522_cn_raw (struct dvb_frontend *fe,u16 *raw)/* for DVBv3 compatibility */ +{ +u8 buf[3 ], + len = fe->dtv_property_cache.delivery_system ==SYS_ISDBS ?2 :3 , + adr = fe->dtv_property_cache.delivery_system ==SYS_ISDBS ?0xbc :0x8b ; +bool ok =tc90522_r (fe, adr, buf, len); +int cn =tc90522_n2int (buf, len); + +if (!ok) +return -EIO ; + *raw = cn; +return cn; +} + +int tc90522_status (struct dvb_frontend *fe,fe_status_t *stat) +{ +struct tc90522 *d = fe->demodulator_priv; +struct dtv_frontend_properties *c = &fe->dtv_property_cache; +u16 v16; +s64 raw =tc90522_cn_raw (fe, &v16), + x, + y; + +s64 cn_s (void )/* @ .0001 dB */ + { + raw -=3000 ; +if (raw <0 ) + raw =0 ; + x =int_sqrt (raw <<20 ); + y =16346ll * x - (143410ll <<16 ); + y = ((x * y) >>16 ) + (502590ll <<16 ); + y = ((x * y) >>16 ) - (889770ll <<16 ); + y = ((x * y) >>16 ) + (895650ll <<16 ); + y = (588570ll <<16 ) - ((x * y) >>16 ); +return y <0 ?0 : y >>16 ; + } + +s64 cn_t (void )/* @ .0001 dB */ + { +if (!raw) +return 0 ; + x = (1130911733ll -10ll *intlog10 (raw)) >>2 ; + y = (x >>2 ) - (x >>6 ) + (x >>8 ) + (x >>9 ) - (x >>10 ) + (x >>11 ) + (x >>12 ) - (16ll <<22 ); + y = ((x * y) >>22 ) + (398ll <<22 ); + y = ((x * y) >>22 ) + (5491ll <<22 ); + y = ((x * y) >>22 ) + (30965ll <<22 ); +return y >>22 ; + } + + c->cnr.len =1 ; + c->cnr.stat[0 ].svalue = fe->dtv_property_cache.delivery_system ==SYS_ISDBS ?cn_s () :cn_t (); + c->cnr.stat[0 ].scale =FE_SCALE_DECIBEL ; + *stat = d->stat; +return d->stat; +} + +int tc90522_get_frontend_algo (struct dvb_frontend *fe) +{ +return DVBFE_ALGO_HW ; +} + +int tc90522_tune (struct dvb_frontend *fe,bool retune,u32 mode_flags,u32 *delay,fe_status_t *stat) +{ +u32 fno2kHz (u32 fno) + { +u32 chno; + +if (fno <12 ) { + chno =1 +2 * fno;/* BS */ +return 1049480 +38360 * fno; + }else if (fno <24 ) { + fno -=12 ; + chno =2 +2 * fno;/* CS110 right */ +return 1613000 +40000 * fno; + } + fno -=24 ; + chno =1 +2 * fno;/* CS110 left */ +return 1593000 +40000 * fno; + } + +void s_kHz (u32 *f) + { + *f = *f >3000000 ?fno2kHz (14 ) :/* CNN etc. */ + *f >=1049480 ? *f : + *f >48 ?fno2kHz (4 ) :/* BS11 etc. */ +fno2kHz (*f -1 ); + } + +u32 fno2Hz (u32 fno) + { +return (fno >112 ?557 :93 +6 * fno + (fno <12 ?0 : fno <17 ?2 : fno <63 ?0 :2 )) *1000000 +142857 ; + } + +void t_Hz (u32 *f) + { + *f = *f >=90000000 ? *f :/* real_freq Hz */ + *f >255 ?fno2Hz (77 ) :/* NHK */ + *f >127 ?fno2Hz (*f -128 ) :/* freqno (IO#) */ + *f >63 ? (*f -=64 ,/* CATV */ + *f >22 ?fno2Hz (*f -1 ) :/* C23-C62 */ + *f >12 ?fno2Hz (*f -10 ) :/* C13-C22 */ +fno2Hz (77 )) : + *f >62 ?fno2Hz (77 ) : + *f >12 ?fno2Hz (*f +50 ) :/* 13-62 */ + *f >3 ?fno2Hz (*f +9 ) :/* 4-12 */ + *f ?fno2Hz (*f -1 ) :/* 1-3 */ +fno2Hz (77 ); + } +struct tc90522 *d = fe->demodulator_priv; +u16 stream_id = fe->dtv_property_cache.stream_id, + i =0xFFFF ; +u8 data[16 ]; + +if (!retune)/* once is enough */ +return 0 ; + d->stat =0 ; +if (fe->dtv_property_cache.delivery_system ==SYS_ISDBT ) + goto ISDBT; + +s_kHz (&fe->dtv_property_cache.frequency); +if (fe->ops.tuner_ops.set_params (fe)) +return -EIO ; +while (i--) { +if ((tc90522_r (fe,0xC3 , data,1 ), !(data[0 ] &0x10 )) &&/* locked */ + (tc90522_r (fe,0xCE , data,2 ), *(u16 *)data !=0 ) &&/* valid TSID */ +tc90522_r (fe,0xC3 , data,1 ) && +tc90522_r (fe,0xCE , data,16 )) +break ; +msleep_interruptible (1 ); + } +if (!i) +return -ETIMEDOUT ; +for (i =0 ; i <8 ; i++) { +u16 tsid =tc90522_n2int (data + i*2 ,2 ); + +if ((tsid == stream_id || stream_id == i) && +tc90522_w (fe,0x8F , tsid >>8 ) && +tc90522_w (fe,0x90 , tsid &0xFF ) && +tc90522_r (fe,0xE6 , data,2 ) && +tc90522_n2int (data,2 ) == tsid) + goto LOCK; + } + goto ERR; +ISDBT: +t_Hz (&fe->dtv_property_cache.frequency); +if (fe->ops.tuner_ops.set_params (fe)) +return -EIO ; +while (i--) { +bool retryov, + lock0, + lock1; +if (!tc90522_r (fe,0x80 , data,1 ) || !tc90522_r (fe,0xB0 , data +1 ,1 )) +break ; + retryov = data[0 ] &0b10000000 ? true : false; + lock0 = data[0 ] &0b00001000 ? false : true; + lock1 = data[1 ] &0b00001000 ? true : false; +if (lock0 && lock1) { +LOCK: + d->stat =FE_HAS_SIGNAL |FE_HAS_CARRIER |FE_HAS_LOCK ; + *stat = d->stat; +return 0 ; + } +if (retryov) +break ; +msleep_interruptible (1 ); + } +ERR: + *stat = d->stat; +return -ETIMEDOUT ; +} + +static struct dvb_frontend_ops tc90522_ops = { + .info = { + .name =TC90522_MODNAME , + .caps =FE_CAN_INVERSION_AUTO |FE_CAN_FEC_AUTO |FE_CAN_QAM_AUTO |FE_CAN_MULTISTREAM | +FE_CAN_TRANSMISSION_MODE_AUTO |FE_CAN_GUARD_INTERVAL_AUTO |FE_CAN_HIERARCHY_AUTO , + .frequency_min =1 , + .frequency_max =770000000 , + }, + .get_frontend_algo = tc90522_get_frontend_algo, + .read_snr = tc90522_cn_raw, + .read_status = tc90522_status, + .tune = tc90522_tune, +}; + +int tc90522_probe (struct i2c_client *c,const struct i2c_device_id *id) +{ +struct tc90522 *d =kzalloc (sizeof (struct tc90522 ),GFP_KERNEL ); +struct dvb_frontend *fe = c->dev.platform_data; + +if (!d) +return -ENOMEM ; + d->i2c = c->adapter; + fe->demodulator_priv = d; +i2c_set_clientdata (c, d); +memcpy (&fe->ops, &tc90522_ops,sizeof (struct dvb_frontend_ops )); + fe->ops.delsys[0 ] = fe->dtv_property_cache.delivery_system; +return 0 ; +} + +int tc90522_remove (struct i2c_client *c) +{ +kfree (i2c_get_clientdata (c)); +return 0 ; +} + +static struct i2c_device_id tc90522_id[] = { + {TC90522_MODNAME ,0 }, + {}, +}; +MODULE_DEVICE_TABLE (i2c, tc90522_id); + +static struct i2c_driver tc90522_driver = { + .driver = { + .owner =THIS_MODULE , + .name = tc90522_id->name, + }, + .probe = tc90522_probe, + .remove = tc90522_remove, + .id_table = tc90522_id, +}; +module_i2c_driver (tc90522_driver); + +MODULE_AUTHOR ("Budi Rachmanto, AreMa Inc. <knightrider(@)are.ma>" ); +MODULE_DESCRIPTION ("Toshiba TC90522 8PSK(ISDB-S)/OFDM(ISDB-T) quad demodulator" ); +MODULE_LICENSE ("GPL" ); +
drivers/media/dvb-frontends/tc90522.h new file +18 -0
@@ -0,0 +1,18 @@ +/* +* Toshiba TC90522XBG 2ch OFDM(ISDB-T) + 2ch 8PSK(ISDB-S) demodulator +* +* Copyright (C) Budi Rachmanto, AreMa Inc. <[email protected]> +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +*/ + +#ifndef TC90522_H +#define TC90522_H + +#define TC90522_MODNAME "tc90522" + +#endif +
Signature · 1 line
2.3.10
PATCH 5/7 MaxLinear MxL301RF ISDB-T tuner
In reply to [email protected]From: Буди Романто, AreMa Inc <[email protected]>
--- drivers/media/tuners/mxl301rf.c | 251 ++++++++++++++++++++++++++++++++++++++++ drivers/media/tuners/mxl301rf.h | 23 ++++ 2 files changed, 274 insertions(+) create mode 100644 drivers/media/tuners/mxl301rf.c create mode 100644 drivers/media/tuners/mxl301rf.h
drivers/media/tuners/mxl301rf.c new file +251 -0
@@ -0,0 +1,251 @@ +/* +* Sharp VA4M6JC2103 - Earthsoft PT3 ISDB-T tuner MaxLinear CMOS Hybrid TV MxL301RF +* +* Copyright (C) Budi Rachmanto, AreMa Inc. <[email protected]> +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +*/ + +#include "dvb_frontend.h" +#include "mxl301rf.h" + +struct mxl301rf { +struct i2c_adapter *i2c; +u8 adr_tuner; +}; + +int mxl301rf_w (struct dvb_frontend *fe,u8 slvadr,const u8 *dat,int len) +{ +u8 buf[len +1 ]; +struct mxl301rf *t = fe->tuner_priv; +struct i2c_msg msg[] = { + {.addr = fe->id, .flags =0 , .buf = buf, .len = len +1 ,}, + }; + + buf[0 ] = slvadr; +memcpy (buf +1 , dat, len); +return i2c_transfer (t->i2c, msg,1 ) ==1 ?0 : -EIO ; +} + +int mxl301rf_w_tuner (struct dvb_frontend *fe,const u8 *dat,int len) +{ +u8 buf[len +1 ]; + + buf[0 ] = ((struct mxl301rf *)fe->tuner_priv)->adr_tuner <<1 ; +memcpy (buf +1 , dat, len); +return mxl301rf_w (fe,0xFE , buf, len +1 ); +} + +void mxl301rf_r (struct dvb_frontend *fe,u8 regadr,u8 *dat) +{ +struct mxl301rf *t = fe->tuner_priv; +u8 wbuf[] = {0xFB , regadr}, + rbuf[] = {0xFE , (t->adr_tuner <<1 ) |1 ,0 }; +struct i2c_msg msg[] = { + {.addr = fe->id, .flags =0 , .buf = rbuf, .len =2 ,}, + {.addr = fe->id, .flags =I2C_M_RD , .buf = rbuf +2 , .len =1 ,}, + }; +mxl301rf_w_tuner (fe, wbuf,sizeof (wbuf)); + *dat = t->adr_tuner && (i2c_transfer (t->i2c, msg,2 ) ==2 ) ? rbuf[2 ] :0 ; +} + +enum mxl301rf_agc { +MXL301RF_AGC_AUTO , +MXL301RF_AGC_MANUAL , +}; + +int mxl301rf_set_agc (struct dvb_frontend *fe,enum mxl301rf_agc agc) +{ +u8 dat = agc ==MXL301RF_AGC_AUTO ?0x40 :0x00 , + imsrst =0x01 <<6 ; +int err =mxl301rf_w (fe,0x25 , &dat,1 ); + + dat =0x4c | (agc ==MXL301RF_AGC_AUTO ?0 :1 ); +return err || +mxl301rf_w (fe,0x23 , &dat,1 ) || +mxl301rf_w (fe,0x01 , &imsrst,1 ); +} + +int mxl301rf_sleep (struct dvb_frontend *fe) +{ +u8 buf = (1 <<7 ) | (1 <<4 ), + dat[] = {0x01 ,0x00 ,0x13 ,0x00 }; +int err =mxl301rf_set_agc (fe,MXL301RF_AGC_MANUAL ); + +if (err) +return err; +mxl301rf_w_tuner (fe, dat,sizeof (dat)); +return mxl301rf_w (fe,0x03 , &buf,1 ); +} + +int mxl301rf_tune (struct dvb_frontend *fe) +{ +struct shf_dvbt { +u32 freq,/* Channel center frequency @ kHz */ + freq_th;/* Offset frequency threshold @ kHz */ +u8 shf_val,/* Spur shift value */ + shf_dir;/* Spur shift direction */ + } shf_dvbt_tab[] = { + {64500 ,500 ,0x92 ,0x07 }, + {191500 ,300 ,0xe2 ,0x07 }, + {205500 ,500 ,0x2c ,0x04 }, + {212500 ,500 ,0x1e ,0x04 }, + {226500 ,500 ,0xd4 ,0x07 }, + {99143 ,500 ,0x9c ,0x07 }, + {173143 ,500 ,0xd4 ,0x07 }, + {191143 ,300 ,0xd4 ,0x07 }, + {207143 ,500 ,0xce ,0x07 }, + {225143 ,500 ,0xce ,0x07 }, + {243143 ,500 ,0xd4 ,0x07 }, + {261143 ,500 ,0xd4 ,0x07 }, + {291143 ,500 ,0xd4 ,0x07 }, + {339143 ,500 ,0x2c ,0x04 }, + {117143 ,500 ,0x7a ,0x07 }, + {135143 ,300 ,0x7a ,0x07 }, + {153143 ,500 ,0x01 ,0x07 } + }; +u8 rf_dat[] = { +0x13 ,0x00 ,/* abort tune */ +0x3b ,0xc0 , +0x3b ,0x80 , +0x10 ,0x95 ,/* BW */ +0x1a ,0x05 , +0x61 ,0x00 , +0x62 ,0xa0 , +0x11 ,0x40 ,/* 2 bytes to store RF */ +0x12 ,0x0e ,/* 2 bytes to store RF */ +0x13 ,0x01 /* start tune */ + }; +const u8 idac[] = { +0x0d ,0x00 , +0x0c ,0x67 , +0x6f ,0x89 , +0x70 ,0x0c , +0x6f ,0x8a , +0x70 ,0x0e , +0x6f ,0x8b , +0x70 ,0x10 +12 , + }; +u8 dat[20 ]; +int err =mxl301rf_set_agc (fe,MXL301RF_AGC_MANUAL ); +u32 freq = fe->dtv_property_cache.frequency, + kHz =1000 , + MHz =1000000 , + dig_rf = freq / MHz, + tmp = freq % MHz, + i, + fdiv =1000000 ; +bool rfsynth_locked, + refsynth_locked; +unsigned long timeout; + +if (err) +return err; +for (i =0 ; i <6 ; i++) { + dig_rf <<=1 ; + fdiv /=2 ; +if (tmp > fdiv) { + tmp -= fdiv; + dig_rf++; + } + } +if (tmp >7812 ) + dig_rf++; + rf_dat[2 *7 +1 ] = (u8)(dig_rf); + rf_dat[2 *8 +1 ] = (u8)(dig_rf >>8 ); +for (i =0 ; i <ARRAY_SIZE (shf_dvbt_tab); i++) { +if ((freq >= (shf_dvbt_tab[i].freq - shf_dvbt_tab[i].freq_th) * kHz) && + (freq <= (shf_dvbt_tab[i].freq + shf_dvbt_tab[i].freq_th) * kHz)) { + rf_dat[2 *5 +1 ] = shf_dvbt_tab[i].shf_val; + rf_dat[2 *6 +1 ] =0xa0 | shf_dvbt_tab[i].shf_dir; +break ; + } + } +memcpy (dat, rf_dat,sizeof (rf_dat)); + +mxl301rf_w_tuner (fe, dat,14 ); +msleep_interruptible (1 ); +mxl301rf_w_tuner (fe, dat +14 ,6 ); +msleep_interruptible (1 ); + dat[0 ] =0x1a ; + dat[1 ] =0x0d ; +mxl301rf_w_tuner (fe, dat,2 ); +mxl301rf_w_tuner (fe, idac,sizeof (idac)); + timeout = jiffies +msecs_to_jiffies (100 ); +while (time_before (jiffies, timeout)) { +mxl301rf_r (fe,0x16 , dat); + rfsynth_locked = (*dat &0x0c ) ==0x0c ; +mxl301rf_r (fe,0x16 , dat); + refsynth_locked = (*dat &0x03 ) ==0x03 ; +if (rfsynth_locked && refsynth_locked) +return mxl301rf_set_agc (fe,MXL301RF_AGC_AUTO ); +msleep_interruptible (1 ); + } +return -ETIMEDOUT ; +} + +int mxl301rf_wakeup (struct dvb_frontend *fe) +{ +u8 buf = (1 <<7 ) | (0 <<4 ), + dat[2 ] = {0x01 ,0x01 }; +int err =mxl301rf_w (fe,0x03 , &buf,1 ); + +if (err) +return err; +mxl301rf_w_tuner (fe, dat,sizeof (dat)); +return 0 ; +} + +static struct dvb_tuner_ops mxl301rf_ops = { + .set_params = mxl301rf_tune, + .sleep = mxl301rf_sleep, + .init = mxl301rf_wakeup, +}; + +int mxl301rf_remove (struct i2c_client *c) +{ +kfree (i2c_get_clientdata (c)); +return 0 ; +} + +int mxl301rf_probe (struct i2c_client *c,const struct i2c_device_id *id) +{ +struct dvb_frontend *fe = c->dev.platform_data; +struct mxl301rf *t =kzalloc (sizeof (struct mxl301rf ),GFP_KERNEL ); +u8 d[] = {0x10 ,0x01 }; + +if (!t) +return -ENOMEM ; + t->i2c = c->adapter; + t->adr_tuner = c->addr; + fe->tuner_priv = t; +memcpy (&fe->ops.tuner_ops, &mxl301rf_ops,sizeof (struct dvb_tuner_ops )); +i2c_set_clientdata (c, t); +return mxl301rf_w (fe,0x1c , d,1 ) || +mxl301rf_w (fe,0x1d , d+1 ,1 ); +} + +static struct i2c_device_id mxl301rf_id[] = { + {MXL301RF_MODNAME ,0 }, + {}, +}; +MODULE_DEVICE_TABLE (i2c, mxl301rf_id); + +static struct i2c_driver mxl301rf_driver = { + .driver = { + .owner =THIS_MODULE , + .name = mxl301rf_id->name, + }, + .probe = mxl301rf_probe, + .remove = mxl301rf_remove, + .id_table = mxl301rf_id, +}; +module_i2c_driver (mxl301rf_driver); + +MODULE_AUTHOR ("Budi Rachmanto, AreMa Inc. <knightrider(@)are.ma>" ); +MODULE_DESCRIPTION ("Earthsoft PT3 MxL301RF MaxLinear CMOS Hybrid TV ISDB-T tuner driver" ); +MODULE_LICENSE ("GPL" ); +
drivers/media/tuners/mxl301rf.h new file +23 -0
@@ -0,0 +1,23 @@ +/* +* Sharp VA4M6JC2103 - Earthsoft PT3 ISDB-T tuner MaxLinear CMOS Hybrid TV MxL301RF +* +* Copyright (C) 2014 Budi Rachmanto, AreMa Inc. <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +*/ + +#ifndef MXL301RF_H +#define MXL301RF_H + +#define MXL301RF_MODNAME "mxl301rf" + +#endif +
Signature · 1 line
2.3.10
PATCH 6/7 Sharp QM1D1C0042 ISDB-S tuner
In reply to [email protected]From: Буди Романто, AreMa Inc <[email protected]>
--- drivers/media/tuners/qm1d1c0042.c | 246 ++++++++++++++++++++++++++++++++++++++ drivers/media/tuners/qm1d1c0042.h | 23 ++++ 2 files changed, 269 insertions(+) create mode 100644 drivers/media/tuners/qm1d1c0042.c create mode 100644 drivers/media/tuners/qm1d1c0042.h
drivers/media/tuners/qm1d1c0042.c new file +246 -0
@@ -0,0 +1,246 @@ +/* +* Sharp VA4M6JC2103 - Earthsoft PT3 ISDB-S tuner driver QM1D1C0042 +* +* Copyright (C) Budi Rachmanto, AreMa Inc. <[email protected]> +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +*/ + +#include "dvb_frontend.h" +#include "qm1d1c0042.h" + +struct qm1d1c0042 { +struct i2c_adapter *i2c; +u8 adr_tuner, reg[32 ]; +}; + +bool qm1d1c0042_r (struct dvb_frontend *fe,u8 slvadr,u8 *dat) +{ +struct qm1d1c0042 *t = fe->tuner_priv; +u8 buf[] = {0xFE , t->adr_tuner <<1 , slvadr,0xFE , (t->adr_tuner <<1 ) |1 ,0 }; +struct i2c_msg msg[] = { + {.addr = fe->id, .flags =0 , .buf = buf, .len =3 ,}, + {.addr = fe->id, .flags =0 , .buf = buf +3 , .len =2 ,}, + {.addr = fe->id, .flags =I2C_M_RD , .buf = buf +5 , .len =1 ,}, + }; +bool ret =i2c_transfer (t->i2c, msg,3 ) ==3 ; + + *dat = buf[5 ]; +return ret; +} + +int qm1d1c0042_w (struct dvb_frontend *fe,u8 slvadr,u8 *dat,int len) +{ +u8 buf[len +1 ]; +struct qm1d1c0042 *t = fe->tuner_priv; +struct i2c_msg msg[] = { + {.addr = fe->id, .flags =0 , .buf = buf, .len = len +1 ,}, + }; + + buf[0 ] = slvadr; +memcpy (buf +1 , dat, len); +return i2c_transfer (t->i2c, msg,1 ) ==1 ?0 : -EIO ; +} + +int qm1d1c0042_w_tuner (struct dvb_frontend *fe,u8 adr,u8 dat) +{ +struct qm1d1c0042 *t = fe->tuner_priv; +u8 buf[] = {t->adr_tuner <<1 , adr, dat}; +int err =qm1d1c0042_w (fe,0xFE , buf,3 ); + + t->reg[adr] = dat; +return err; +} + +enum qm1d1c0042_agc { +QM1D1C0042_AGC_AUTO , +QM1D1C0042_AGC_MANUAL , +}; + +int qm1d1c0042_set_agc (struct dvb_frontend *fe,enum qm1d1c0042_agc agc) +{ +u8 dat = (agc ==QM1D1C0042_AGC_AUTO ) ?0xff :0x00 , + pskmsrst =0x01 ; +int err =qm1d1c0042_w (fe,0x0a , &dat,1 ); + +if (err) +return err; + dat =0xb0 | (agc ==QM1D1C0042_AGC_AUTO ?1 :0 ); + err =qm1d1c0042_w (fe,0x10 , &dat,1 ); +if (err) +return err; + dat = (agc ==QM1D1C0042_AGC_AUTO ) ?0x40 :0x00 ; +return (err =qm1d1c0042_w (fe,0x11 , &dat,1 )) ? + err :qm1d1c0042_w (fe,0x03 , &pskmsrst,1 ); +} + +int qm1d1c0042_sleep (struct dvb_frontend *fe) +{ +struct qm1d1c0042 *t = fe->tuner_priv; +u8 buf =1 ; + + t->reg[0x01 ] &= (~(1 <<3 )) &0xff ; + t->reg[0x01 ] |=1 <<0 ; + t->reg[0x05 ] |=1 <<3 ; +return qm1d1c0042_set_agc (fe,QM1D1C0042_AGC_MANUAL ) || +qm1d1c0042_w_tuner (fe,0x05 , t->reg[0x05 ]) || +qm1d1c0042_w_tuner (fe,0x01 , t->reg[0x01 ]) || +qm1d1c0042_w (fe,0x17 , &buf,1 ); +} + +int qm1d1c0042_wakeup (struct dvb_frontend *fe) +{ +struct qm1d1c0042 *t = fe->tuner_priv; +u8 buf =0 ; + + t->reg[0x01 ] |=1 <<3 ; + t->reg[0x01 ] &= (~(1 <<0 )) &0xff ; + t->reg[0x05 ] &= (~(1 <<3 )) &0xff ; +return qm1d1c0042_w (fe,0x17 , &buf,1 ) || +qm1d1c0042_w_tuner (fe,0x01 , t->reg[0x01 ]) || +qm1d1c0042_w_tuner (fe,0x05 , t->reg[0x05 ]); +} + +int qm1d1c0042_tune (struct dvb_frontend *fe) +{ +u32 freq2ch (u32 kHz) + { +u32 freq = kHz /10 , + ch0 = (freq -104948 ) /3836 , diff0 = freq - (104948 +3836 * ch0), + ch1 = (freq -161300 ) /4000 , diff1 = freq - (161300 +4000 * ch1), + ch2 = (freq -159300 ) /4000 , diff2 = freq - (159300 +4000 * ch2), + min = diff0 < diff1 ? diff0 : diff1; + +if (diff2 < min) +return ch2 +24 ; +if (min == diff1) +return ch1 +12 ; +return ch0; + } + +struct qm1d1c0042 *t = fe->tuner_priv; +u32 fgap_tab[9 ][3 ] = { + {2151000 ,1 ,7 }, {1950000 ,1 ,6 }, {1800000 ,1 ,5 }, + {1600000 ,1 ,4 }, {1450000 ,1 ,3 }, {1250000 ,1 ,2 }, + {1200000 ,0 ,7 }, {975000 ,0 ,6 }, {950000 ,0 ,0 } + }; +u32 sd_tab[24 ][3 ] = { + {0x38fae1 ,0x0d ,0x5 }, {0x3f570a ,0x0e ,0x3 }, {0x05b333 ,0x0e ,0x5 }, {0x3c0f5c ,0x0f ,0x4 }, + {0x026b85 ,0x0f ,0x6 }, {0x38c7ae ,0x10 ,0x5 }, {0x3f23d7 ,0x11 ,0x3 }, {0x058000 ,0x11 ,0x5 }, + {0x3bdc28 ,0x12 ,0x4 }, {0x023851 ,0x12 ,0x6 }, {0x38947a ,0x13 ,0x5 }, {0x3ef0a3 ,0x14 ,0x3 }, + {0x3c8000 ,0x16 ,0x4 }, {0x048000 ,0x16 ,0x6 }, {0x3c8000 ,0x17 ,0x5 }, {0x048000 ,0x18 ,0x3 }, + {0x3c8000 ,0x18 ,0x6 }, {0x048000 ,0x19 ,0x4 }, {0x3c8000 ,0x1a ,0x3 }, {0x048000 ,0x1a ,0x5 }, + {0x3c8000 ,0x1b ,0x4 }, {0x048000 ,0x1b ,0x6 }, {0x3c8000 ,0x1c ,0x5 }, {0x048000 ,0x1d ,0x3 }, + }; +int err =qm1d1c0042_set_agc (fe,QM1D1C0042_AGC_MANUAL ); +u32 kHz = fe->dtv_property_cache.frequency, + ch =freq2ch (kHz), +N = sd_tab[ch][1 ], +A = sd_tab[ch][2 ], + sd =0 , + i; + +if (err || ch >=24 ) +return -EIO ; + t->reg[0x08 ] &=0xf0 ; + t->reg[0x08 ] |=0x09 ; + t->reg[0x13 ] &=0x9f ; + t->reg[0x13 ] |=0x20 ; +for (i =0 ; i <8 ; i++) +if ((fgap_tab[i+1 ][0 ] <= kHz -500 ) && (kHz -500 < fgap_tab[i][0 ])) +qm1d1c0042_w_tuner (fe,0x02 , (t->reg[0x02 ] &0x0f ) | fgap_tab[i][1 ] <<7 | fgap_tab[i][2 ] <<4 ); + sd = sd_tab[ch][0 ]; + t->reg[0x06 ] &=0x40 ; + t->reg[0x06 ] |=N ; + t->reg[0x07 ] &=0xf0 ; + t->reg[0x07 ] |=A &0x0f ; + err =qm1d1c0042_w_tuner (fe,0x06 , t->reg[0x06 ]) || +qm1d1c0042_w_tuner (fe,0x07 , t->reg[0x07 ]) || +qm1d1c0042_w_tuner (fe,0x08 , (t->reg[0x08 ] &0xf0 ) |2 ); +if (err) +return err; + t->reg[0x09 ] &=0xc0 ; + t->reg[0x09 ] |= (sd >>16 ) &0x3f ; + t->reg[0x0a ] = (sd >>8 ) &0xff ; + t->reg[0x0b ] = (sd >>0 ) &0xff ; + err =qm1d1c0042_w_tuner (fe,0x09 , t->reg[0x09 ]) || +qm1d1c0042_w_tuner (fe,0x0a , t->reg[0x0a ]) || +qm1d1c0042_w_tuner (fe,0x0b , t->reg[0x0b ]) || +qm1d1c0042_w_tuner (fe,0x0c , t->reg[0x0c ] &0x3f ); +if (err) +return err; +msleep_interruptible (1 ); + err =qm1d1c0042_w_tuner (fe,0x0c , t->reg[0x0c ] |0xc0 ) || +qm1d1c0042_w_tuner (fe,0x08 ,0x09 ) || +qm1d1c0042_w_tuner (fe,0x13 , t->reg[0x13 ]); +if (err) +return err; +for (i =0 ; i <500 ; i++) { +if (!qm1d1c0042_r (fe,0x0d , &t->reg[0x0d ])) +return -EIO ; +if (t->reg[0x0d ] &0x40 )/* locked */ +return qm1d1c0042_set_agc (fe,QM1D1C0042_AGC_AUTO ); +msleep_interruptible (1 ); + } +return -ETIMEDOUT ; +} + +static struct dvb_tuner_ops qm1d1c0042_ops = { + .set_params = qm1d1c0042_tune, + .sleep = qm1d1c0042_sleep, + .init = qm1d1c0042_wakeup, +}; + +int qm1d1c0042_remove (struct i2c_client *c) +{ +kfree (i2c_get_clientdata (c)); +return 0 ; +} + +int qm1d1c0042_probe (struct i2c_client *c,const struct i2c_device_id *id) +{ +u8 reg_rw[] = { +0x48 ,0x1c ,0xa0 ,0x10 ,0xbc ,0xc5 ,0x20 ,0x33 ,0x06 ,0x00 ,0x00 ,0x00 ,0x03 ,0x00 ,0x00 ,0x00 , +0x00 ,0xff ,0xf3 ,0x00 ,0x2a ,0x64 ,0xa6 ,0x86 ,0x8c ,0xcf ,0xb8 ,0xf1 ,0xa8 ,0xf2 ,0x89 ,0x00 , + }; +u8 d[] = {0x10 ,0x15 ,0x04 }; +struct dvb_frontend *fe = c->dev.platform_data; +struct qm1d1c0042 *t =kzalloc (sizeof (struct qm1d1c0042 ),GFP_KERNEL ); + +if (!t) +return -ENOMEM ; + fe->tuner_priv = t; + t->i2c = c->adapter; + t->adr_tuner = c->addr; +memcpy (&fe->ops.tuner_ops, &qm1d1c0042_ops,sizeof (struct dvb_tuner_ops )); +memcpy (t->reg, reg_rw,sizeof (reg_rw)); +i2c_set_clientdata (c, t); +return qm1d1c0042_w (fe,0x1e , d,1 ) || +qm1d1c0042_w (fe,0x1c , d+1 ,1 ) || +qm1d1c0042_w (fe,0x1f , d+2 ,1 ); +} + +static struct i2c_device_id qm1d1c0042_id[] = { + {QM1D1C0042_MODNAME ,0 }, + {}, +}; +MODULE_DEVICE_TABLE (i2c, qm1d1c0042_id); + +static struct i2c_driver qm1d1c0042_driver = { + .driver = { + .owner =THIS_MODULE , + .name = qm1d1c0042_id->name, + }, + .probe = qm1d1c0042_probe, + .remove = qm1d1c0042_remove, + .id_table = qm1d1c0042_id, +}; +module_i2c_driver (qm1d1c0042_driver); + +MODULE_AUTHOR ("Budi Rachmanto, AreMa Inc. <knightrider(@)are.ma>" ); +MODULE_DESCRIPTION ("Earthsoft PT3 QM1D1C0042 ISDB-S tuner driver" ); +MODULE_LICENSE ("GPL" ); +
drivers/media/tuners/qm1d1c0042.h new file +23 -0
@@ -0,0 +1,23 @@ +/* +* Sharp VA4M6JC2103 - Earthsoft PT3 ISDB-S tuner driver QM1D1C0042 +* +* Copyright (C) 2014 Budi Rachmanto, AreMa Inc. <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +*/ + +#ifndef QM1D1C0042_H +#define QM1D1C0042_H + +#define QM1D1C0042_MODNAME "qm1d1c0042" + +#endif +
Signature · 1 line
2.3.10
PATCH 7/7 PCI bridge driver for PT3 & PXQ3PE
In reply to [email protected]From: Буди Романто, AreMa Inc <[email protected]>
--- drivers/media/pci/Kconfig | 2 +- drivers/media/pci/Makefile | 2 +- drivers/media/pci/ptx/Kconfig | 21 ++ drivers/media/pci/ptx/Makefile | 8 + drivers/media/pci/ptx/pt3_pci.c | 509 +++++++++++++++++++++++++++++++ drivers/media/pci/ptx/ptx_common.c | 215 +++++++++++++ drivers/media/pci/ptx/ptx_common.h | 68 +++++ drivers/media/pci/ptx/pxq3pe_pci.c | 607 +++++++++++++++++++++++++++++++++++++ 8 files changed, 1430 insertions(+), 2 deletions(-) create mode 100644 drivers/media/pci/ptx/Kconfig create mode 100644 drivers/media/pci/ptx/Makefile create mode 100644 drivers/media/pci/ptx/pt3_pci.c create mode 100644 drivers/media/pci/ptx/ptx_common.c create mode 100644 drivers/media/pci/ptx/ptx_common.h create mode 100644 drivers/media/pci/ptx/pxq3pe_pci.c
drivers/media/pci/Kconfig +1 -1
@@ -44,7 +44,7 @@ source "drivers/media/pci/b2c2/Kconfig" source "drivers/media/pci/pluto2/Kconfig" source "drivers/media/pci/dm1105/Kconfig" source "drivers/media/pci/pt1/Kconfig" -source "drivers/media/pci/pt3/Kconfig" +source "drivers/media/pci/ptx/Kconfig" source "drivers/media/pci/mantis/Kconfig" source "drivers/media/pci/ngene/Kconfig" source "drivers/media/pci/ddbridge/Kconfig"
drivers/media/pci/Makefile +1 -1
@@ -7,7 +7,7 @@ obj-y += ttpci/ \ pluto2/ \ dm1105/ \ pt1/ \ - pt3/ \ + ptx/ \ mantis/ \ ngene/ \ ddbridge/ \
drivers/media/pci/ptx/Kconfig new file +21 -0
@@ -0,0 +1,21 @@ +config DVB_PT3 + tristate "Earthsoft PT3 cards" + depends on DVB_CORE && PCI && I2C + select DVB_TC90522 if MEDIA_SUBDRV_AUTOSELECT + select MEDIA_TUNER_QM1D1C0042 if MEDIA_SUBDRV_AUTOSELECT + select MEDIA_TUNER_MXL301RF if MEDIA_SUBDRV_AUTOSELECT + help + Support for Earthsoft PT3 ISDB-S/T PCIe cards. + + Say Y or M if you own such a device and want to use it. + +config DVB_PXQ3PE + tristate "PLEX PX-Q3PE cards" + depends on DVB_CORE && PCI && I2C + select DVB_TC90522 if MEDIA_SUBDRV_AUTOSELECT + select MEDIA_TUNER_QM1D1C0042 if MEDIA_SUBDRV_AUTOSELECT + select MEDIA_TUNER_MXL301RF if MEDIA_SUBDRV_AUTOSELECT + help + Support for PLEX PX-Q3PE ISDB-S/T PCIe cards. + + Say Y or M if you own such a device and want to use it.
drivers/media/pci/ptx/Makefile new file +8 -0
@@ -0,0 +1,8 @@ +pt3-objs := pt3_pci.o ptx_common.o +pxq3pe-objs := pxq3pe_pci.o ptx_common.o + +obj-$(CONFIG_DVB_PT3) += pt3.o +obj-$(CONFIG_DVB_PXQ3PE) += pxq3pe.o + +ccflags-y += -Idrivers/media/dvb-core -Idrivers/media/dvb-frontends -Idrivers/media/tuners +
drivers/media/pci/ptx/pt3_pci.c new file +509 -0
509 lines not on this page · raw message
drivers/media/pci/ptx/ptx_common.c new file +215 -0
215 lines not on this page · raw message
drivers/media/pci/ptx/ptx_common.h new file +68 -0
68 lines not on this page · raw message
drivers/media/pci/ptx/pxq3pe_pci.c new file +607 -0
607 lines not on this page · raw message
Signature · 1 line
2.3.10
kbuild test robot
build botRe: [media 7/7] PCI bridge driver for PT3 & PXQ3PE
reproduce:
Hi Буди,
[auto build test ERROR on linuxtv-media/master]
[cannot apply to v4.5-rc4 next-20160212]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]
url: https://github.com/0day-ci/linux/commits/info-are-ma/Driver-bundle-for-PT3-PX-Q3PE/20160215-141501 base: git://linuxtv.org/media_tree.git master config: x86_64-randconfig-x006-201607 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=x86_64
All errors (new ones prefixed by >>):
>> drivers/media/dvb-frontends/tc90522.c:23:2: error: unknown type name 'fe_status_t'
fe_status_t stat;
^
drivers/media/dvb-frontends/tc90522.c:71:45: error: unknown type name 'fe_status_t'
int tc90522_status(struct dvb_frontend *fe, fe_status_t *stat)
^
drivers/media/dvb-frontends/tc90522.c:118:84: error: unknown type name 'fe_status_t'
int tc90522_tune(struct dvb_frontend *fe, bool retune, u32 mode_flags, u32 *delay, fe_status_t *stat)
^
>> drivers/media/dvb-frontends/tc90522.c:238:17: error: 'tc90522_status' undeclared here (not in a function)
.read_status = tc90522_status,
^
>> drivers/media/dvb-frontends/tc90522.c:239:11: error: 'tc90522_tune' undeclared here (not in a function)
.tune = tc90522_tune,
^vim +/fe_status_t +23 drivers/media/dvb-frontends/tc90522.c
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 17 #include "dvb_math.h"
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 18 #include "dvb_frontend.h"
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 19 #include "tc90522.h"
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 20
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 21 struct tc90522 {
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 22 struct i2c_adapter *i2c;
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 @23 fe_status_t stat;
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 24 };
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 25
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 26 bool tc90522_r(struct dvb_frontend *fe, u8 slvadr, u8 *buf, u8 len)
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 27 {
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 28 struct tc90522 *d = fe->demodulator_priv;
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 29 struct i2c_msg msg[] = {
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 30 {.addr = fe->id, .flags = 0, .buf = &slvadr, .len = 1,},
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 31 {.addr = fe->id, .flags = I2C_M_RD, .buf = buf, .len = len,},
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 32 };
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 33 return i2c_transfer(d->i2c, msg, 2) == 2;
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 34 }
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 35
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 36 bool tc90522_w(struct dvb_frontend *fe, u8 slvadr, u8 dat)
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 37 {
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 38 struct tc90522 *d = fe->demodulator_priv;
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 39 u8 buf[] = {slvadr, dat};
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 40 struct i2c_msg msg[] = {
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 41 {.addr = fe->id, .flags = 0, .buf = buf, .len = 2,},
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 42 };
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 43 return i2c_transfer(d->i2c, msg, 1) == 1;
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 44 }
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 45
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 46 u64 tc90522_n2int(const u8 *data, u8 n) /* convert n_bytes data from stream (network byte order) to integer */
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 47 { /* can't use <arpa/inet.h>'s ntoh*() as sometimes n = 3,5,... */
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 48 u32 i, val = 0;
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 49
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 50 for (i = 0; i < n; i++) {
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 51 val <<= 8;
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 52 val |= data[i];
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 53 }
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 54 return val;
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 55 }
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 56
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 57 int tc90522_cn_raw(struct dvb_frontend *fe, u16 *raw) /* for DVBv3 compatibility */
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 58 {
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 59 u8 buf[3],
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 60 len = fe->dtv_property_cache.delivery_system == SYS_ISDBS ? 2 : 3,
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 61 adr = fe->dtv_property_cache.delivery_system == SYS_ISDBS ? 0xbc : 0x8b;
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 62 bool ok = tc90522_r(fe, adr, buf, len);
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 63 int cn = tc90522_n2int(buf, len);
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 64
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 65 if (!ok)
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 66 return -EIO;
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 67 *raw = cn;
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 68 return cn;
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 69 }
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 70
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 @71 int tc90522_status(struct dvb_frontend *fe, fe_status_t *stat)
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 72 {
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 73 struct tc90522 *d = fe->demodulator_priv;
fc7fad5bd Буди Романто, AreMa Inc 2016-02-15 74 struct dtv_frontend_properties *c = &fe->dtv_property_cache;:::::: The code at line 23 was first introduced by commit
:::::: fc7fad5bdf7260bcb1bb53da404eb436af2269c0 Toshiba TC90522XBG quad demodulator (2ch OFDM + 2ch 8PSK) used by both PT3 & PX-Q3PE
:::::: TO: Буди Романто, AreMa Inc <[email protected]> :::::: CC: 0day robot <[email protected]>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
kbuild test robot
build botRe: [media 7/7] PCI bridge driver for PT3 & PXQ3PE
In reply to [email protected]reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree…
Hi Буди,
[auto build test WARNING on linuxtv-media/master]
[cannot apply to v4.5-rc4 next-20160212]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]
url: https://github.com/0day-ci/linux/commits/info-are-ma/Driver-bundle-for-PT3-PX-Q3PE/20160215-141501 base: git://linuxtv.org/media_tree.git master config: s390-allyesconfig (attached as .config)
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=s390
All warnings (new ones prefixed by >>):
drivers/media/tuners/mxl301rf.c: In function 'mxl301rf_w':
>> drivers/media/tuners/mxl301rf.c:31:1: warning: 'mxl301rf_w' uses dynamic stack allocation
}
^
drivers/media/tuners/mxl301rf.c: In function 'mxl301rf_w_tuner':
>> drivers/media/tuners/mxl301rf.c:40:1: warning: 'mxl301rf_w_tuner' uses dynamic stack allocation
}
^
--
drivers/media/tuners/qm1d1c0042.c: In function 'qm1d1c0042_w':
>> drivers/media/tuners/qm1d1c0042.c:46:1: warning: 'qm1d1c0042_w' uses dynamic stack allocation
}
^vim +/mxl301rf_w +31 drivers/media/tuners/mxl301rf.c
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 25 {.addr = fe->id, .flags = 0, .buf = buf, .len = len + 1,},
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 26 };
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 27
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 28 buf[0] = slvadr;
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 29 memcpy(buf + 1, dat, len);
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 30 return i2c_transfer(t->i2c, msg, 1) == 1 ? 0 : -EIO;
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 @31 }
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 32
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 33 int mxl301rf_w_tuner(struct dvb_frontend *fe, const u8 *dat, int len)
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 34 {
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 35 u8 buf[len + 1];
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 36
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 37 buf[0] = ((struct mxl301rf *)fe->tuner_priv)->adr_tuner << 1;
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 38 memcpy(buf + 1, dat, len);
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 39 return mxl301rf_w(fe, 0xFE, buf, len + 1);
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 @40 }
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 41
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 42 void mxl301rf_r(struct dvb_frontend *fe, u8 regadr, u8 *dat)
3f15bcc3 Буди Романто, AreMa Inc 2016-02-15 43 {:::::: The code at line 31 was first introduced by commit
:::::: 3f15bcc3ee23377c702f9635ca3e5908d147eb80 MaxLinear MxL301RF ISDB-T tuner
:::::: TO: Буди Романто, AreMa Inc <[email protected]> :::::: CC: 0day robot <[email protected]>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
kbuild test robot
build botRe: [media 7/7] PCI bridge driver for PT3 & PXQ3PE
In reply to [email protected]reproduce:
Hi Буди,
[auto build test ERROR on linuxtv-media/master]
[cannot apply to v4.5-rc4 next-20160212]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]
url: https://github.com/0day-ci/linux/commits/info-are-ma/Driver-bundle-for-PT3-PX-Q3PE/20160215-141501 base: git://linuxtv.org/media_tree.git master config: i386-allmodconfig (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=i386
All error/warnings (new ones prefixed by >>):
In file included from drivers/media/pci/ptx/pt3_pci.c:19:0:
>> drivers/media/pci/ptx/ptx_common.h:24:2: error: unknown type name 'fe_delivery_system_t'
fe_delivery_system_t type;
^
--
In file included from drivers/media/pci/ptx/ptx_common.c:9:0:
>> drivers/media/pci/ptx/ptx_common.h:24:2: error: unknown type name 'fe_delivery_system_t'
fe_delivery_system_t type;
^
drivers/media/pci/ptx/ptx_common.c: In function 'ptx_abort':
>> drivers/media/pci/ptx/ptx_common.c:199:6: error: implicit declaration of function 'vzalloc' [-Werror=implicit-function-declaration]
s = vzalloc(slen);
^
>> drivers/media/pci/ptx/ptx_common.c:199:4: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
s = vzalloc(slen);
^
>> drivers/media/pci/ptx/ptx_common.c:203:3: error: implicit declaration of function 'vfree' [-Werror=implicit-function-declaration]
vfree(s);
^
cc1: some warnings being treated as errors
--
In file included from drivers/media/pci/ptx/pxq3pe_pci.c:18:0:
>> drivers/media/pci/ptx/ptx_common.h:24:2: error: unknown type name 'fe_delivery_system_t'
fe_delivery_system_t type;
^
drivers/media/pci/ptx/pxq3pe_pci.c: In function 'pxq3pe_remove':
>> drivers/media/pci/ptx/pxq3pe_pci.c:499:3: error: implicit declaration of function 'vfree' [-Werror=implicit-function-declaration]
vfree(p->sBuf);
^
drivers/media/pci/ptx/pxq3pe_pci.c: In function 'pxq3pe_probe':
>> drivers/media/pci/ptx/pxq3pe_pci.c:552:14: error: implicit declaration of function 'vzalloc' [-Werror=implicit-function-declaration]
p->sBuf = vzalloc(p->sBufSize);
^
>> drivers/media/pci/ptx/pxq3pe_pci.c:552:12: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
p->sBuf = vzalloc(p->sBufSize);
^cc1: some warnings being treated as errors
coccinelle warnings: (new ones prefixed by >>)
>> drivers/media/dvb-frontends/tc90522.c:271:3-8: No need to set .owner here. The core will do it.
Please review and possibly fold the followup patch.
vim +/fe_delivery_system_t +24 drivers/media/pci/ptx/ptx_common.h
18 enum ePTX {
19 PTX_TS_SYNC = 0x47,
20 PTX_TS_NOT_SYNC = 0x74,
21 };
22
23 struct ptx_subdev_info {
> 24 fe_delivery_system_t type;
25 u8 demod_addr, *demod_name,
26 tuner_addr, *tuner_name;
27 };---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
kbuild test robot
build bot[PATCH] fix platform_no_drv_owner.cocci warnings
In reply to [email protected]drivers/media/dvb-frontends/tc90522.c:271:3-8: No need to set .owner here. The core will do it.
drivers/media/dvb-frontends/tc90522.c:271:3-8: No need to set .owner here. The core will do it.
Remove .owner field if calls are used which set it automatically
Generated by: scripts/coccinelle/api/platform_no_drv_owner.cocci
---
tc90522.c | 1 - 1 file changed, 1 deletion(-)
drivers/media/dvb-frontends/tc90522.c +0 -1
@@ -268,7 +268,6 @@ MODULE_DEVICE_TABLE(i2c, tc90522_id);static struct i2c_driver tc90522_driver = { .driver = { - .owner =THIS_MODULE , .name = tc90522_id->name, }, .probe = tc90522_probe,