diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.h b/drivers/media/dvb/dvb-core/dvb_frontend.h index 3b86050..f9f19be 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.h +++ b/drivers/media/dvb/dvb-core/dvb_frontend.h @@ -239,6 +239,7 @@ struct analog_demod_ops { void (*set_params)(struct dvb_frontend *fe, struct analog_parameters *params); int (*has_signal)(struct dvb_frontend *fe); + int (*is_stereo)(struct dvb_frontend *fe); int (*get_afc)(struct dvb_frontend *fe); void (*tuner_status)(struct dvb_frontend *fe); void (*standby)(struct dvb_frontend *fe); diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig index 83093d1..6cbd99c 100644 --- a/drivers/media/dvb/frontends/Kconfig +++ b/drivers/media/dvb/frontends/Kconfig @@ -193,6 +193,34 @@ config DVB_CX24116 help A DVB-S/S2 tuner module. Say Y when you want to support this frontend. +config DVB_TBSFE + tristate "TBS FE based" + depends on DVB_CORE && I2C + default m if DVB_FE_CUSTOMISE + help + A TurboSight TBS FE module. Say Y when you want to support this. + +config DVB_TBS6980FE + tristate "TurboSight TBS6980FE based" + depends on DVB_CORE && I2C + default m if DVB_FE_CUSTOMISE + help + A DVB-S/S2 tuner module. Say Y when you want to support this frontend. + +config DVB_TBS6981FE + tristate "TurboSight TBS6981FE based" + depends on DVB_CORE && I2C + default m if DVB_FE_CUSTOMISE + help + A DVB-S/S2 tuner module. Say Y when you want to support this frontend. + +config DVB_TBS6921FE + tristate "TurboSight TBS6921FE based" + depends on DVB_CORE && I2C + default m if DVB_FE_CUSTOMISE + help + A DVB-S/S2 tuner module. Say Y when you want to support this frontend. + config DVB_SI21XX tristate "Silicon Labs SI21XX based" depends on DVB_CORE && I2C diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile index 3b0c4bd..b4762fd 100644 --- a/drivers/media/dvb/frontends/Makefile +++ b/drivers/media/dvb/frontends/Makefile @@ -2,6 +2,7 @@ # Makefile for the kernel DVB frontend device drivers. # +EXTRA_CFLAGS += -fno-stack-protector EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ EXTRA_CFLAGS += -Idrivers/media/common/tuners/ @@ -70,6 +71,13 @@ obj-$(CONFIG_DVB_ATBM8830) += atbm8830.o obj-$(CONFIG_DVB_DUMMY_FE) += dvb_dummy_fe.o obj-$(CONFIG_DVB_AF9013) += af9013.o obj-$(CONFIG_DVB_CX24116) += cx24116.o +obj-$(CONFIG_DVB_TBSFE) += tbsfe.o +obj-$(CONFIG_DVB_TBS6980FE) += tbs6980fe.o +tbs6980fe-objs += kmem_wrap.o tbs6980fe_driver.o +obj-$(CONFIG_DVB_TBS6981FE) += tbs6981fe.o +tbs6981fe-objs += kmem_wrap.o tbs6981fe_driver.o +obj-$(CONFIG_DVB_TBS6921FE) += tbs6921fe.o +tbs6921fe-objs += kmem_wrap.o tbs6921fe_driver.o obj-$(CONFIG_DVB_SI21XX) += si21xx.o obj-$(CONFIG_DVB_STV0288) += stv0288.o obj-$(CONFIG_DVB_STB6000) += stb6000.o diff --git a/drivers/media/dvb/frontends/kmem_wrap.c b/drivers/media/dvb/frontends/kmem_wrap.c new file mode 100755 index 0000000..0a34db6 --- /dev/null +++ b/drivers/media/dvb/frontends/kmem_wrap.c @@ -0,0 +1,16 @@ +#include + +void *kmalloc_wrap(int size) +{ + return kmalloc(size, GFP_KERNEL); +} + +void *kzalloc_wrap(int size) +{ + return kzalloc(size, GFP_KERNEL); +} + +void kfree_wrap(void *p) +{ + kfree(p); +} diff --git a/drivers/media/dvb/frontends/tbs6921fe.h b/drivers/media/dvb/frontends/tbs6921fe.h new file mode 100644 index 0000000..88feb5c --- /dev/null +++ b/drivers/media/dvb/frontends/tbs6921fe.h @@ -0,0 +1,36 @@ +/* + TurboSight TBS 6921 DVBS/S2 frontend driver + Copyright (C) 2010 Konstantin Dimitrov + + Copyright (C) 2010 TurboSight.com +*/ + +#ifndef TBS6921FE_H +#define TBS6921FE_H + +#include +#include "cx23885.h" + +struct tbs6921fe_config { + u8 tbs6921fe_address; + + int (*tbs6921_ctrl1)(struct cx23885_dev *dev, int a); + int (*tbs6921_ctrl2)(struct cx23885_dev *dev, int a, int b); +}; + +#if defined(CONFIG_DVB_TBS6921FE) || \ + (defined(CONFIG_DVB_TBS6921FE_MODULE) && defined(MODULE)) +extern struct dvb_frontend *tbs6921fe_attach( + const struct tbs6921fe_config *config, + struct i2c_adapter *i2c, int demod); +#else +static inline struct dvb_frontend *tbs6921fe_attach( + const struct tbs6921fe_config *config, + struct i2c_adapter *i2c, int demod) +{ + printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); + return NULL; +} +#endif + +#endif /* TBS6921FE_H */ diff --git a/drivers/media/dvb/frontends/tbs6980fe.h b/drivers/media/dvb/frontends/tbs6980fe.h new file mode 100644 index 0000000..6219710 --- /dev/null +++ b/drivers/media/dvb/frontends/tbs6980fe.h @@ -0,0 +1,36 @@ +/* + TurboSight TBS 6980 Dual DVBS/S2 frontend driver + Copyright (C) 2009 Konstantin Dimitrov + + Copyright (C) 2009 TurboSight.com +*/ + +#ifndef TBS6980FE_H +#define TBS6980FE_H + +#include +#include "cx23885.h" + +struct tbs6980fe_config { + u8 tbs6980fe_address; + + int (*tbs6980_ctrl1)(struct cx23885_dev *dev, int a); + int (*tbs6980_ctrl2)(struct cx23885_dev *dev, int a, int b); +}; + +#if defined(CONFIG_DVB_TBS6980FE) || \ + (defined(CONFIG_DVB_TBS6980FE_MODULE) && defined(MODULE)) +extern struct dvb_frontend *tbs6980fe_attach( + const struct tbs6980fe_config *config, + struct i2c_adapter *i2c, int demod); +#else +static inline struct dvb_frontend *tbs6980fe_attach( + const struct tbs6980fe_config *config, + struct i2c_adapter *i2c, int demod) +{ + printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); + return NULL; +} +#endif + +#endif /* TBS6980FE_H */ diff --git a/drivers/media/dvb/frontends/tbs6981fe.h b/drivers/media/dvb/frontends/tbs6981fe.h new file mode 100644 index 0000000..b52f361 --- /dev/null +++ b/drivers/media/dvb/frontends/tbs6981fe.h @@ -0,0 +1,36 @@ +/* + TurboSight TBS 6981 Dual DVBS/S2 frontend driver + Copyright (C) 2009 Konstantin Dimitrov + + Copyright (C) 2009 TurboSight.com +*/ + +#ifndef TBS6981FE_H +#define TBS6981FE_H + +#include +#include "cx23885.h" + +struct tbs6981fe_config { + u8 tbs6981fe_address; + + int (*tbs6981_ctrl1)(struct cx23885_dev *dev, int a); + int (*tbs6981_ctrl2)(struct cx23885_dev *dev, int a, int b); +}; + +#if defined(CONFIG_DVB_TBS6981FE) || \ + (defined(CONFIG_DVB_TBS6981FE_MODULE) && defined(MODULE)) +extern struct dvb_frontend *tbs6981fe_attach( + const struct tbs6981fe_config *config, + struct i2c_adapter *i2c, int demod); +#else +static inline struct dvb_frontend *tbs6981fe_attach( + const struct tbs6981fe_config *config, + struct i2c_adapter *i2c, int demod) +{ + printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); + return NULL; +} +#endif + +#endif /* TBS6981FE_H */ diff --git a/drivers/media/dvb/frontends/tbsfe.c b/drivers/media/dvb/frontends/tbsfe.c new file mode 100755 index 0000000..1504d7a --- /dev/null +++ b/drivers/media/dvb/frontends/tbsfe.c @@ -0,0 +1,55 @@ +/* + TurboSight TBS FE module + Copyright (C) 2011 Konstantin Dimitrov + + Copyright (C) 2011 TurboSight.com +*/ + +#include "dvb_frontend.h" +#include "tbsfe.h" + +/* phase poise enhancements */ +static int pne; +module_param(pne, int, 0644); +MODULE_PARM_DESC(pne, "Phase noise enhancements 0:Off, "\ + "1:On (default:0)"); + +/* 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)"); + +/* define how outer code correction is performed */ +static int occ = 1; +module_param(occ, int, 0644); +MODULE_PARM_DESC(occ, "0:outer code correction is disabled, "\ + "1: outer code correction is enabled(default:1)"); + +static int tbsfe_params(struct dvb_frontend *fe, long arg) +{ + return (occ << 3) | (pne << 2) | (esno << 1) | dbm; +} + +static void tbsfe_release(struct dvb_frontend *fe) +{ +} + +struct dvb_frontend *tbsfe_attach(struct dvb_frontend *fe) +{ + fe->ops.release_sec = tbsfe_release; + fe->ops.enable_high_lnb_voltage = tbsfe_params; + + return fe; +} +EXPORT_SYMBOL(tbsfe_attach); + +MODULE_DESCRIPTION("TurboSight TBS FE module"); +MODULE_AUTHOR("Konstantin Dimitrov "); +MODULE_LICENSE("GPL"); diff --git a/drivers/media/dvb/frontends/tbsfe.h b/drivers/media/dvb/frontends/tbsfe.h new file mode 100755 index 0000000..b1cc081 --- /dev/null +++ b/drivers/media/dvb/frontends/tbsfe.h @@ -0,0 +1,27 @@ +/* + TurboSight TBS FE module + Copyright (C) 2011 Konstantin Dimitrov + + Copyright (C) 2011 TurboSight.com +*/ + +#ifndef TBSFE_H +#define TBSFE_H + +#include + +#if defined(CONFIG_DVB_TBSFE) || \ + (defined(CONFIG_DVB_TBSFE_MODULE) && defined(MODULE)) +extern struct dvb_frontend *tbsfe_attach( + struct dvb_frontend *fe); +#else +static inline struct dvb_frontend *tbsfe_attach( + struct dvb_frontend *fe) +{ + printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); + return NULL; +} + +#endif /* CONFIG_DVB_TBSFE */ + +#endif /* TBSFE_H */ diff --git a/drivers/media/video/cx23885/Kconfig b/drivers/media/video/cx23885/Kconfig index caab1bf..a54a4b9 100644 --- a/drivers/media/video/cx23885/Kconfig +++ b/drivers/media/video/cx23885/Kconfig @@ -23,6 +23,9 @@ config VIDEO_CX23885 select DVB_STV0900 if !DVB_FE_CUSTOMISE select DVB_DS3000 if !DVB_FE_CUSTOMISE select DVB_STV0367 if !DVB_FE_CUSTOMISE + select DVB_TBS6980FE if !DVB_FE_CUSTOMISE + select DVB_TBS6981FE if !DVB_FE_CUSTOMISE + select DVB_TBS6921FE if !DVB_FE_CUSTOMISE select MEDIA_TUNER_MT2131 if !MEDIA_TUNER_CUSTOMISE select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMISE select MEDIA_TUNER_TDA8290 if !MEDIA_TUNER_CUSTOMISE diff --git a/drivers/media/video/cx23885/Makefile b/drivers/media/video/cx23885/Makefile index 23293c7..100f734 100644 --- a/drivers/media/video/cx23885/Makefile +++ b/drivers/media/video/cx23885/Makefile @@ -2,11 +2,12 @@ cx23885-objs := cx23885-cards.o cx23885-video.o cx23885-vbi.o \ cx23885-core.o cx23885-i2c.o cx23885-dvb.o cx23885-417.o \ cx23885-ioctl.o cx23885-ir.o cx23885-av.o cx23885-input.o \ cx23888-ir.o netup-init.o cimax2.o netup-eeprom.o \ - cx23885-f300.o + cx23885-f300.o tbs6980ctrl.o tbs6981ctrl.o tbs6921ctrl.o obj-$(CONFIG_VIDEO_CX23885) += cx23885.o obj-$(CONFIG_MEDIA_ALTERA_CI) += altera-ci.o +EXTRA_CFLAGS += -Idrivers/media/video/cx23885 EXTRA_CFLAGS += -Idrivers/media/video EXTRA_CFLAGS += -Idrivers/media/common/tuners EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core diff --git a/drivers/media/video/cx23885/cx23885-cards.c b/drivers/media/video/cx23885/cx23885-cards.c index ea88722..1dcde65 100644 --- a/drivers/media/video/cx23885/cx23885-cards.c +++ b/drivers/media/video/cx23885/cx23885-cards.c @@ -183,6 +183,20 @@ struct cx23885_board cx23885_boards[] = { .name = "TurboSight TBS 6920", .portb = CX23885_MPEG_DVB, }, + [CX23885_BOARD_TBS_6921] = { + .name = "TurboSight TBS 6921", + .portb = CX23885_MPEG_DVB, + }, + [CX23885_BOARD_TBS_6980] = { + .name = "TurboSight TBS 6980", + .portb = CX23885_MPEG_DVB, + .portc = CX23885_MPEG_DVB, + }, + [CX23885_BOARD_TBS_6981] = { + .name = "TurboSight TBS 6981", + .portb = CX23885_MPEG_DVB, + .portc = CX23885_MPEG_DVB, + }, [CX23885_BOARD_TEVII_S470] = { .name = "TeVii S470", .portb = CX23885_MPEG_DVB, @@ -441,6 +455,18 @@ struct cx23885_subid cx23885_subids[] = { .subdevice = 0x8888, .card = CX23885_BOARD_TBS_6920, }, { + .subvendor = 0x6921, + .subdevice = 0x8888, + .card = CX23885_BOARD_TBS_6921, + }, { + .subvendor = 0x6980, + .subdevice = 0x8888, + .card = CX23885_BOARD_TBS_6980, + }, { + .subvendor = 0x6981, + .subdevice = 0x8888, + .card = CX23885_BOARD_TBS_6981, + }, { .subvendor = 0xd470, .subdevice = 0x9022, .card = CX23885_BOARD_TEVII_S470, @@ -925,6 +951,9 @@ void cx23885_gpio_setup(struct cx23885_dev *dev) cx_set(GP0_IO, 0x00040004); break; case CX23885_BOARD_TBS_6920: + case CX23885_BOARD_TBS_6921: + case CX23885_BOARD_TBS_6980: + case CX23885_BOARD_TBS_6981: cx_write(MC417_CTL, 0x00000036); cx_write(MC417_OEN, 0x00001000); cx_set(MC417_RWD, 0x00000002); @@ -1124,6 +1153,10 @@ int cx23885_ir_init(struct cx23885_dev *dev) v4l2_subdev_call(dev->sd_ir, ir, tx_s_parameters, ¶ms); break; case CX23885_BOARD_TEVII_S470: + case CX23885_BOARD_TBS_6920: + case CX23885_BOARD_TBS_6921: + case CX23885_BOARD_TBS_6980: + case CX23885_BOARD_TBS_6981: if (!enable_885_ir) break; dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_AV_CORE); @@ -1164,6 +1197,10 @@ void cx23885_ir_fini(struct cx23885_dev *dev) break; case CX23885_BOARD_TEVII_S470: case CX23885_BOARD_HAUPPAUGE_HVR1250: + case CX23885_BOARD_TBS_6920: + case CX23885_BOARD_TBS_6921: + case CX23885_BOARD_TBS_6980: + case CX23885_BOARD_TBS_6981: cx23885_irq_remove(dev, PCI_MSK_AV_CORE); /* sd_ir is a duplicate pointer to the AV Core, just clear it */ dev->sd_ir = NULL; @@ -1206,6 +1243,10 @@ void cx23885_ir_pci_int_enable(struct cx23885_dev *dev) break; case CX23885_BOARD_TEVII_S470: case CX23885_BOARD_HAUPPAUGE_HVR1250: + case CX23885_BOARD_TBS_6920: + case CX23885_BOARD_TBS_6921: + case CX23885_BOARD_TBS_6980: + case CX23885_BOARD_TBS_6981: if (dev->sd_ir) cx23885_irq_add_enable(dev, PCI_MSK_AV_CORE); break; @@ -1284,10 +1325,20 @@ void cx23885_card_setup(struct cx23885_dev *dev) ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; break; case CX23885_BOARD_TBS_6920: + case CX23885_BOARD_TBS_6921: ts1->gen_ctrl_val = 0x4; /* Parallel */ ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */ ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; break; + case CX23885_BOARD_TBS_6980: + case CX23885_BOARD_TBS_6981: + ts1->gen_ctrl_val = 0x0c; /* Serial bus + punctured clock */ + ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */ + ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; + ts2->gen_ctrl_val = 0x0c; /* Serial bus + punctured clock*/ + ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */ + ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; + break; case CX23885_BOARD_TEVII_S470: case CX23885_BOARD_DVBWORLD_2005: ts1->gen_ctrl_val = 0x5; /* Parallel */ @@ -1363,6 +1414,10 @@ void cx23885_card_setup(struct cx23885_dev *dev) case CX23885_BOARD_HAUPPAUGE_HVR1290: case CX23885_BOARD_LEADTEK_WINFAST_PXTV1200: case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID: + case CX23885_BOARD_TBS_6920: + case CX23885_BOARD_TBS_6921: + case CX23885_BOARD_TBS_6980: + case CX23885_BOARD_TBS_6981: dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_bus[2].i2c_adap, "cx25840", 0x88 >> 1, NULL); diff --git a/drivers/media/video/cx23885/cx23885-core.c b/drivers/media/video/cx23885/cx23885-core.c index 9933810..56dd082 100644 --- a/drivers/media/video/cx23885/cx23885-core.c +++ b/drivers/media/video/cx23885/cx23885-core.c @@ -923,7 +923,17 @@ static int cx23885_dev_setup(struct cx23885_dev *dev) dev->i2c_bus[1].reg_addr = I2C2_ADDR; dev->i2c_bus[1].reg_rdata = I2C2_RDATA; dev->i2c_bus[1].reg_wdata = I2C2_WDATA; - dev->i2c_bus[1].i2c_period = (0x9d << 24); /* 100kHz */ + switch (dev->board) { + case CX23885_BOARD_TBS_6920: + case CX23885_BOARD_TBS_6921: + case CX23885_BOARD_TBS_6980: + case CX23885_BOARD_TBS_6981: + dev->i2c_bus[1].i2c_period = (0x27 << 24); /* 100kHz */ + break; + default: + dev->i2c_bus[1].i2c_period = (0x9d << 24); /* 100kHz */ + break; + } /* Internal Master 3 Bus */ dev->i2c_bus[2].nr = 2; @@ -2060,12 +2070,8 @@ static int __devinit cx23885_initdev(struct pci_dev *pci_dev, goto fail_irq; } - if (!pci_enable_msi(pci_dev)) - err = request_irq(pci_dev->irq, cx23885_irq, - IRQF_DISABLED, dev->name, dev); - else - err = request_irq(pci_dev->irq, cx23885_irq, - IRQF_SHARED | IRQF_DISABLED, dev->name, dev); + err = request_irq(pci_dev->irq, cx23885_irq, + IRQF_SHARED | IRQF_DISABLED, dev->name, dev); if (err < 0) { printk(KERN_ERR "%s: can't get IRQ %d\n", dev->name, pci_dev->irq); @@ -2114,7 +2120,6 @@ static void __devexit cx23885_finidev(struct pci_dev *pci_dev) /* unregister stuff */ free_irq(pci_dev->irq, dev); - pci_disable_msi(pci_dev); cx23885_dev_unregister(dev); v4l2_device_unregister(v4l2_dev); diff --git a/drivers/media/video/cx23885/cx23885-dvb.c b/drivers/media/video/cx23885/cx23885-dvb.c index 3c315f9..f98e23e 100644 --- a/drivers/media/video/cx23885/cx23885-dvb.c +++ b/drivers/media/video/cx23885/cx23885-dvb.c @@ -60,6 +60,13 @@ #include "cx23885-f300.h" #include "altera-ci.h" #include "stv0367.h" +#include "tbs6980fe.h" +#include "tbs6980ctrl.h" +#include "tbs6981fe.h" +#include "tbs6981ctrl.h" +#include "tbs6921fe.h" +#include "tbs6921ctrl.h" +#include "tbsfe.h" static unsigned int debug; @@ -451,6 +458,27 @@ static struct cx24116_config tbs_cx24116_config = { .demod_address = 0x55, }; +static struct tbs6980fe_config tbs6980_fe_config = { + .tbs6980fe_address = 0x55, + + .tbs6980_ctrl1 = tbs6980ctrl1, + .tbs6980_ctrl2 = tbs6980ctrl2, +}; + +static struct tbs6981fe_config tbs6981_fe_config = { + .tbs6981fe_address = 0x55, + + .tbs6981_ctrl1 = tbs6981ctrl1, + .tbs6981_ctrl2 = tbs6981ctrl2, +}; + +static struct tbs6921fe_config tbs6921_fe_config = { + .tbs6921fe_address = 0x55, + + .tbs6921_ctrl1 = tbs6921ctrl1, + .tbs6921_ctrl2 = tbs6921ctrl2, +}; + static struct ds3000_config tevii_ds3000_config = { .demod_address = 0x68, }; @@ -931,6 +959,57 @@ static int dvb_register(struct cx23885_tsport *port) fe0->dvb.frontend->ops.set_voltage = f300_set_voltage; break; + case CX23885_BOARD_TBS_6921: + i2c_bus = &dev->i2c_bus[1]; + + fe0->dvb.frontend = dvb_attach(tbs6921fe_attach, + &tbs6921_fe_config, + &i2c_bus->i2c_adap, 0); + if (fe0->dvb.frontend != NULL) + dvb_attach(tbsfe_attach, fe0->dvb.frontend); + break; + case CX23885_BOARD_TBS_6980: + i2c_bus = &dev->i2c_bus[1]; + + switch (port->nr) { + case 1: + fe0->dvb.frontend = dvb_attach(tbs6980fe_attach, + &tbs6980_fe_config, + &i2c_bus->i2c_adap, 0); + if (fe0->dvb.frontend != NULL) + dvb_attach(tbsfe_attach, fe0->dvb.frontend); + break; + case 2: + fe0->dvb.frontend = dvb_attach(tbs6980fe_attach, + &tbs6980_fe_config, + &i2c_bus->i2c_adap, 1); + if (fe0->dvb.frontend != NULL) + dvb_attach(tbsfe_attach, fe0->dvb.frontend); + break; + } + + break; + case CX23885_BOARD_TBS_6981: + i2c_bus = &dev->i2c_bus[1]; + + switch (port->nr) { + case 1: + fe0->dvb.frontend = dvb_attach(tbs6981fe_attach, + &tbs6981_fe_config, + &i2c_bus->i2c_adap, 0); + if (fe0->dvb.frontend != NULL) + dvb_attach(tbsfe_attach, fe0->dvb.frontend); + break; + case 2: + fe0->dvb.frontend = dvb_attach(tbs6981fe_attach, + &tbs6981_fe_config, + &i2c_bus->i2c_adap, 1); + if (fe0->dvb.frontend != NULL) + dvb_attach(tbsfe_attach, fe0->dvb.frontend); + break; + } + + break; case CX23885_BOARD_TEVII_S470: i2c_bus = &dev->i2c_bus[1]; @@ -1172,6 +1251,51 @@ static int dvb_register(struct cx23885_tsport *port) memcpy(port->frontends.adapter.proposed_mac, eeprom + 0xa0, 6); break; } + case CX23885_BOARD_TBS_6920: + case CX23885_BOARD_TBS_6921: { + u8 eeprom[256]; /* 24C02 i2c eeprom */ + + cx23885_tbs(dev); + + if (port->nr != 1) + break; + + /* Read entire EEPROM */ + dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1; + tveeprom_read(&dev->i2c_bus[0].i2c_client, eeprom, sizeof(eeprom)); + printk(KERN_INFO "TurboSight TBS 692x MAC= " + "%02X:%02X:%02X:%02X:%02X:%02X\n", + eeprom[0xa0], eeprom[0xa1], eeprom[0xa2], + eeprom[0xa3], eeprom[0xa4], eeprom[0xa5]); + memcpy(port->frontends.adapter.proposed_mac, eeprom + 0xa0, 6); + break; + } + case CX23885_BOARD_TBS_6980: { + u8 eeprom[256]; /* 24C02 i2c eeprom */ + + cx23885_tbs(dev); + + /* Read entire EEPROM */ + dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1; + tveeprom_read(&dev->i2c_bus[0].i2c_client, eeprom, sizeof(eeprom)); + memcpy(port->frontends.adapter.proposed_mac, eeprom + 0xa0 + 16*(port->nr - 1), 6); + printk(KERN_INFO "TurboSight TBS6980 Dual DVB-S2 card port%d MAC=%pM\n", + (port->nr - 1), port->frontends.adapter.proposed_mac); + break; + } + case CX23885_BOARD_TBS_6981: { + u8 eeprom[256]; /* 24C02 i2c eeprom */ + + cx23885_tbs(dev); + + /* Read entire EEPROM */ + dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1; + tveeprom_read(&dev->i2c_bus[0].i2c_client, eeprom, sizeof(eeprom)); + memcpy(port->frontends.adapter.proposed_mac, eeprom + 0xa0 + 16*(port->nr - 1), 6); + printk(KERN_INFO "TurboSight TBS6981 Dual DVB-S2 card port%d MAC=%pM\n", + (port->nr - 1), port->frontends.adapter.proposed_mac); + break; + } } return ret; diff --git a/drivers/media/video/cx23885/cx23885-i2c.c b/drivers/media/video/cx23885/cx23885-i2c.c index 307ff54..56fe707 100644 --- a/drivers/media/video/cx23885/cx23885-i2c.c +++ b/drivers/media/video/cx23885/cx23885-i2c.c @@ -392,6 +392,27 @@ void cx23885_av_clk(struct cx23885_dev *dev, int enable) i2c_xfer(&dev->i2c_bus[2].i2c_adap, &msg, 1); } +void cx23885_tbs(struct cx23885_dev *dev) +{ + char buffer[2]; + struct i2c_msg msg; + + msg.addr = 0x4c; + msg.flags = I2C_M_TEN; + msg.len = 2; + msg.buf = buffer; + + buffer[0] = 0x1f; + buffer[1] = 0x80; + + i2c_xfer(&dev->i2c_bus[2].i2c_adap, &msg, 1); + + buffer[0] = 0x23; + buffer[1] = 0x80; + + i2c_xfer(&dev->i2c_bus[2].i2c_adap, &msg, 1); +} + /* ----------------------------------------------------------------------- */ /* diff --git a/drivers/media/video/cx23885/cx23885-input.c b/drivers/media/video/cx23885/cx23885-input.c index e97cafd..384f901 100644 --- a/drivers/media/video/cx23885/cx23885-input.c +++ b/drivers/media/video/cx23885/cx23885-input.c @@ -86,6 +86,10 @@ void cx23885_input_rx_work_handler(struct cx23885_dev *dev, u32 events) case CX23885_BOARD_HAUPPAUGE_HVR1290: case CX23885_BOARD_TEVII_S470: case CX23885_BOARD_HAUPPAUGE_HVR1250: + case CX23885_BOARD_TBS_6920: + case CX23885_BOARD_TBS_6921: + case CX23885_BOARD_TBS_6980: + case CX23885_BOARD_TBS_6981: /* * The only boards we handle right now. However other boards * using the CX2388x integrated IR controller should be similar @@ -161,6 +165,10 @@ static int cx23885_input_ir_start(struct cx23885_dev *dev) params.invert_level = true; break; case CX23885_BOARD_TEVII_S470: + case CX23885_BOARD_TBS_6920: + case CX23885_BOARD_TBS_6921: + case CX23885_BOARD_TBS_6980: + case CX23885_BOARD_TBS_6981: /* * The IR controller on this board only returns pulse widths. * Any other mode setting will fail to set up the device. @@ -273,6 +281,15 @@ int cx23885_input_init(struct cx23885_dev *dev) /* A guess at the remote */ rc_map = RC_MAP_TEVII_NEC; break; + case CX23885_BOARD_TBS_6920: + case CX23885_BOARD_TBS_6921: + case CX23885_BOARD_TBS_6980: + case CX23885_BOARD_TBS_6981: + /* Integrated CX23885 IR controller */ + driver_type = RC_DRIVER_IR_RAW; + allowed_protos = RC_TYPE_ALL; + rc_map = RC_MAP_TBS_NEC; + break; default: return -ENODEV; } diff --git a/drivers/media/video/cx23885/cx23885.h b/drivers/media/video/cx23885/cx23885.h index c186473..f7abe8e 100644 --- a/drivers/media/video/cx23885/cx23885.h +++ b/drivers/media/video/cx23885/cx23885.h @@ -19,6 +19,9 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#ifndef CX23885_H +#define CX23885_H + #include #include #include @@ -86,6 +89,9 @@ #define CX23885_BOARD_LEADTEK_WINFAST_PXTV1200 28 #define CX23885_BOARD_GOTVIEW_X5_3D_HYBRID 29 #define CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF 30 +#define CX23885_BOARD_TBS_6980 31 +#define CX23885_BOARD_TBS_6981 32 +#define CX23885_BOARD_TBS_6921 33 #define GPIO_0 0x00000001 #define GPIO_1 0x00000002 @@ -545,6 +551,7 @@ extern struct videobuf_queue_ops cx23885_vbi_qops; extern int cx23885_i2c_register(struct cx23885_i2c *bus); extern int cx23885_i2c_unregister(struct cx23885_i2c *bus); extern void cx23885_av_clk(struct cx23885_dev *dev, int enable); +extern void cx23885_tbs(struct cx23885_dev *dev); /* ----------------------------------------------------------- */ /* cx23885-417.c */ @@ -581,3 +588,5 @@ static inline unsigned int norm_swidth(v4l2_std_id norm) { return (norm & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 754 : 922; } + +#endif diff --git a/drivers/media/video/cx23885/tbs6921ctrl.c b/drivers/media/video/cx23885/tbs6921ctrl.c new file mode 100644 index 0000000..2e4c3e1 --- /dev/null +++ b/drivers/media/video/cx23885/tbs6921ctrl.c @@ -0,0 +1,14 @@ +#include "cx23885.h" +#include "tbs6921ctrl.h" + + +int tbs6921ctrl1(struct cx23885_dev *dev, int a) +{ + return cx_read(a); +} + +int tbs6921ctrl2(struct cx23885_dev *dev, int a, int b) +{ + cx_write(a, b); + return 0; +} diff --git a/drivers/media/video/cx23885/tbs6921ctrl.h b/drivers/media/video/cx23885/tbs6921ctrl.h new file mode 100644 index 0000000..177cc58 --- /dev/null +++ b/drivers/media/video/cx23885/tbs6921ctrl.h @@ -0,0 +1,14 @@ +/* + TurboSight TBS 6921 DVB-S/S2 controls + Copyright (C) 2010 Konstantin Dimitrov + + Copyright (C) 2010 TurboSight.com +*/ + +#ifndef TBS6921CTRL_H +#define TBS6921CTRL_H + +extern int tbs6921ctrl1(struct cx23885_dev *dev, int a); +extern int tbs6921ctrl2(struct cx23885_dev *dev, int a, int b); + +#endif diff --git a/drivers/media/video/cx23885/tbs6980ctrl.c b/drivers/media/video/cx23885/tbs6980ctrl.c new file mode 100644 index 0000000..d5e3c99 --- /dev/null +++ b/drivers/media/video/cx23885/tbs6980ctrl.c @@ -0,0 +1,14 @@ +#include "cx23885.h" +#include "tbs6980ctrl.h" + + +int tbs6980ctrl1(struct cx23885_dev *dev, int a) +{ + return cx_read(a); +} + +int tbs6980ctrl2(struct cx23885_dev *dev, int a, int b) +{ + cx_write(a, b); + return 0; +} diff --git a/drivers/media/video/cx23885/tbs6980ctrl.h b/drivers/media/video/cx23885/tbs6980ctrl.h new file mode 100644 index 0000000..4e4cb04 --- /dev/null +++ b/drivers/media/video/cx23885/tbs6980ctrl.h @@ -0,0 +1,14 @@ +/* + TurboSight TBS 6980 Dual DVB-S/S2 controls + Copyright (C) 2009 Konstantin Dimitrov + + Copyright (C) 2009 TurboSight.com +*/ + +#ifndef TBS6980CTRL_H +#define TBS6980CTRL_H + +extern int tbs6980ctrl1(struct cx23885_dev *dev, int a); +extern int tbs6980ctrl2(struct cx23885_dev *dev, int a, int b); + +#endif diff --git a/drivers/media/video/cx23885/tbs6981ctrl.c b/drivers/media/video/cx23885/tbs6981ctrl.c new file mode 100644 index 0000000..a621b1e --- /dev/null +++ b/drivers/media/video/cx23885/tbs6981ctrl.c @@ -0,0 +1,14 @@ +#include "cx23885.h" +#include "tbs6981ctrl.h" + + +int tbs6981ctrl1(struct cx23885_dev *dev, int a) +{ + return cx_read(a); +} + +int tbs6981ctrl2(struct cx23885_dev *dev, int a, int b) +{ + cx_write(a, b); + return 0; +} diff --git a/drivers/media/video/cx23885/tbs6981ctrl.h b/drivers/media/video/cx23885/tbs6981ctrl.h new file mode 100644 index 0000000..08e4907 --- /dev/null +++ b/drivers/media/video/cx23885/tbs6981ctrl.h @@ -0,0 +1,14 @@ +/* + TurboSight TBS 6981 Dual DVB-S/S2 controls + Copyright (C) 2009 Konstantin Dimitrov + + Copyright (C) 2009 TurboSight.com +*/ + +#ifndef TBS6981CTRL_H +#define TBS6981CTRL_H + +extern int tbs6981ctrl1(struct cx23885_dev *dev, int a); +extern int tbs6981ctrl2(struct cx23885_dev *dev, int a, int b); + +#endif diff --git a/include/linux/i2c.h b/include/linux/i2c.h index f1e3ff5..cd2f75b 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -353,6 +353,7 @@ struct i2c_algorithm { */ struct i2c_adapter { struct module *owner; + unsigned int id __deprecated; unsigned int class; /* classes to allow probing for */ const struct i2c_algorithm *algo; /* the algorithm to access the bus */ void *algo_data;