diff options
author | Oliver Endriss <o.endriss@gmx.de> | 2009-12-19 04:54:44 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-02-26 15:10:53 -0300 |
commit | 83f3c7157e087ace8fc67fd759bc3d7b3b64531e (patch) | |
tree | a35d48a58a8d8d1fa78138c3818c50b3a27cd37f /drivers/media/dvb | |
parent | dae52d009fc950b5c209260d50fcc000f5becd3c (diff) |
V4L/DVB: ngene: Driver compiles now
Remove LNBH21 routines, disable code which broke compilation.
Signed-off-by: Oliver Endriss <o.endriss@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb')
-rw-r--r-- | drivers/media/dvb/Kconfig | 4 | ||||
-rw-r--r-- | drivers/media/dvb/Makefile | 3 | ||||
-rw-r--r-- | drivers/media/dvb/ngene/Kconfig | 9 | ||||
-rw-r--r-- | drivers/media/dvb/ngene/Makefile | 11 | ||||
-rw-r--r-- | drivers/media/dvb/ngene/ngene-core.c | 1409 | ||||
-rw-r--r-- | drivers/media/dvb/ngene/ngene.h | 29 |
6 files changed, 35 insertions, 1430 deletions
diff --git a/drivers/media/dvb/Kconfig b/drivers/media/dvb/Kconfig index cf8f65f309d..161ccfd471c 100644 --- a/drivers/media/dvb/Kconfig +++ b/drivers/media/dvb/Kconfig @@ -76,6 +76,10 @@ comment "Supported Mantis Adapters" depends on DVB_CORE && PCI && I2C source "drivers/media/dvb/mantis/Kconfig" +comment "Supported nGene Adapters" + depends on DVB_CORE && PCI && I2C + source "drivers/media/dvb/ngene/Kconfig" + comment "Supported DVB Frontends" depends on DVB_CORE source "drivers/media/dvb/frontends/Kconfig" diff --git a/drivers/media/dvb/Makefile b/drivers/media/dvb/Makefile index c12922c3659..a1a08758a6f 100644 --- a/drivers/media/dvb/Makefile +++ b/drivers/media/dvb/Makefile @@ -14,6 +14,7 @@ obj-y := dvb-core/ \ siano/ \ dm1105/ \ pt1/ \ - mantis/ + mantis/ \ + ngene/ obj-$(CONFIG_DVB_FIREDTV) += firewire/ diff --git a/drivers/media/dvb/ngene/Kconfig b/drivers/media/dvb/ngene/Kconfig new file mode 100644 index 00000000000..3ec8e6fcbb1 --- /dev/null +++ b/drivers/media/dvb/ngene/Kconfig @@ -0,0 +1,9 @@ +config DVB_NGENE + tristate "Micronas nGene support" + depends on DVB_CORE && PCI && I2C + select DVB_LNBP21 if !DVB_FE_CUSTOMISE + select DVB_STV6110x if !DVB_FE_CUSTOMISE + select DVB_STV090x if !DVB_FE_CUSTOMISE + ---help--- + Support for Micronas PCI express cards with nGene bridge. + diff --git a/drivers/media/dvb/ngene/Makefile b/drivers/media/dvb/ngene/Makefile new file mode 100644 index 00000000000..40435cad481 --- /dev/null +++ b/drivers/media/dvb/ngene/Makefile @@ -0,0 +1,11 @@ +# +# Makefile for the nGene device driver +# + +ngene-objs := ngene-core.o + +obj-$(CONFIG_DVB_NGENE) += ngene.o + +EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ +EXTRA_CFLAGS += -Idrivers/media/dvb/frontends/ + diff --git a/drivers/media/dvb/ngene/ngene-core.c b/drivers/media/dvb/ngene/ngene-core.c index 744a232bd10..c0ef11c77f5 100644 --- a/drivers/media/dvb/ngene/ngene-core.c +++ b/drivers/media/dvb/ngene/ngene-core.c @@ -48,14 +48,12 @@ #include "ngene-ioctls.h" #endif -#define FW_INC 1 +/* #define FW_INC 1 */ #ifdef FW_INC #include "ngene_fw_15.h" #include "ngene_fw_16.h" #include "ngene_fw_17.h" -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); - static int load_firmware; module_param(load_firmware, int, 0444); MODULE_PARM_DESC(load_firmware, "Try to load firmware from file."); @@ -73,6 +71,8 @@ static int debug; module_param(debug, int, 0444); MODULE_PARM_DESC(debug, "Print debugging information."); +DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); + #define dprintk if (debug) printk #define DEVICE_NAME "ngene" @@ -670,15 +670,6 @@ static void FillTSBuffer(void *Buffer, int Length, u32 Flags) } } -static void clear_tsin(struct ngene_channel *chan) -{ - struct SBufferHeader *Cur = chan->nextBuffer; - - do { - memset(&Cur->ngeneBuffer.SR, 0, sizeof(Cur->ngeneBuffer.SR)); - Cur = Cur->Next; - } while (Cur != chan->nextBuffer); -} static void flush_buffers(struct ngene_channel *chan) { @@ -952,37 +943,6 @@ done: } -static int ngene_i2c_algo_control(struct i2c_adapter *adap, - unsigned int cmd, unsigned long arg) -{ - struct ngene_channel *chan = - (struct ngene_channel *)i2c_get_adapdata(adap); - - switch (cmd) { - case IOCTL_MIC_TUN_RDY: - chan->tun_rdy = 1; - if (chan->dec_rdy == 1) - chan->tun_dec_rdy = 1; - break; - - case IOCTL_MIC_DEC_RDY: - chan->dec_rdy = 1; - if (chan->tun_rdy == 1) - chan->tun_dec_rdy = 1; - break; - - case IOCTL_MIC_TUN_DETECT: - { - int *palorbtsc = (int *)arg; - *palorbtsc = chan->dev->card_info->ntsc; - break; - } - - default: - break; - } - return 0; -} static u32 ngene_i2c_functionality(struct i2c_adapter *adap) { @@ -994,16 +954,6 @@ struct i2c_algorithm ngene_i2c_algo = { .functionality = ngene_i2c_functionality, }; -static int ngene_i2c_attach(struct i2c_client *client) -{ - return 0; -} - -static int ngene_i2c_detach(struct i2c_client *client) -{ - return 0; -} - static int ngene_i2c_init(struct ngene *dev, int dev_nr) { struct i2c_adapter *adap = &(dev->channel[dev_nr].i2c_adapter); @@ -1018,8 +968,6 @@ static int ngene_i2c_init(struct ngene *dev, int dev_nr) strcpy(adap->name, "nGene"); adap->id = I2C_HW_SAA7146; - adap->client_register = ngene_i2c_attach; - adap->client_unregister = ngene_i2c_detach; adap->algo = &ngene_i2c_algo; adap->algo_data = (void *)&(dev->channel[dev_nr]); @@ -1040,20 +988,6 @@ int i2c_write(struct i2c_adapter *adapter, u8 adr, u8 data) return 0; } -static int i2c_write_register(struct i2c_adapter *adapter, - u8 adr, u8 reg, u8 data) -{ - u8 m[2] = {reg, data}; - struct i2c_msg msg = {.addr = adr, .flags = 0, .buf = m, .len = 2}; - - if (i2c_transfer(adapter, &msg, 1) != 1) { - printk(KERN_ERR DEVICE_NAME - ": Failed to write to I2C register %02x@%02x!\n", - reg, adr); - return -1; - } - return 0; -} static int i2c_write_read(struct i2c_adapter *adapter, u8 adr, u8 *w, u8 wlen, u8 *r, u8 rlen) @@ -1143,146 +1077,6 @@ static int i2c_read_eeprom(struct i2c_adapter *adapter, return 0; } -static int ReadEEProm(struct i2c_adapter *adapter, - u16 Tag, u32 MaxLen, u8 *data, u32 *pLength) -{ - int status = 0; - u16 Addr = MICNG_EE_START, Length, tag = 0; - u8 EETag[3]; - - while (Addr + sizeof(u16) + 1 < MICNG_EE_END) { - if (i2c_read_eeprom(adapter, 0x50, Addr, EETag, sizeof(EETag))) - return -1; - tag = (EETag[0] << 8) | EETag[1]; - if (tag == MICNG_EETAG_END0 || tag == MICNG_EETAG_END1) - return -1; - if (tag == Tag) - break; - Addr += sizeof(u16) + 1 + EETag[2]; - } - if (Addr + sizeof(u16) + 1 + EETag[2] > MICNG_EE_END) { - printk(KERN_ERR DEVICE_NAME - ": Reached EOEE @ Tag = %04x Length = %3d\n", - tag, EETag[2]); - return -1; - } - Length = EETag[2]; - if (Length > MaxLen) - Length = (u16) MaxLen; - if (Length > 0) { - Addr += sizeof(u16) + 1; - status = i2c_read_eeprom(adapter, 0x50, Addr, data, Length); - if (!status) { - *pLength = EETag[2]; - if (Length < EETag[2]) - ; /*status=STATUS_BUFFER_OVERFLOW; */ - } - } - return status; -} - -static int WriteEEProm(struct i2c_adapter *adapter, - u16 Tag, u32 Length, u8 *data) -{ - int status = 0; - u16 Addr = MICNG_EE_START; - u8 EETag[3]; - u16 tag = 0; - int retry, i; - - while (Addr + sizeof(u16) + 1 < MICNG_EE_END) { - if (i2c_read_eeprom(adapter, 0x50, Addr, EETag, sizeof(EETag))) - return -1; - tag = (EETag[0] << 8) | EETag[1]; - if (tag == MICNG_EETAG_END0 || tag == MICNG_EETAG_END1) - return -1; - if (tag == Tag) - break; - Addr += sizeof(u16) + 1 + EETag[2]; - } - if (Addr + sizeof(u16) + 1 + EETag[2] > MICNG_EE_END) { - printk(KERN_ERR DEVICE_NAME - ": Reached EOEE @ Tag = %04x Length = %3d\n", - tag, EETag[2]); - return -1; - } - - if (Length > EETag[2]) - return -EINVAL; - /* Note: We write the data one byte at a time to avoid - issues with page sizes. (which are different for - each manufacture and eeprom size) - */ - Addr += sizeof(u16) + 1; - for (i = 0; i < Length; i++, Addr++) { - status = i2c_write_eeprom(adapter, 0x50, Addr, data[i]); - - if (status) - break; - - /* Poll for finishing write cycle */ - retry = 10; - while (retry) { - u8 Tmp; - - msleep(50); - status = i2c_read_eeprom(adapter, 0x50, Addr, &Tmp, 1); - if (status) - break; - if (Tmp != data[i]) - printk(KERN_ERR DEVICE_NAME - "eeprom write error\n"); - retry -= 1; - } - if (status) { - printk(KERN_ERR DEVICE_NAME - ": Timeout polling eeprom\n"); - break; - } - } - return status; -} - -static void i2c_init_eeprom(struct i2c_adapter *adapter) -{ - u8 tags[] = {0x10, 0x00, 0x02, 0x00, 0x00, - 0x10, 0x01, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00}; - - int i; - - for (i = 0; i < sizeof(tags); i++) - i2c_write_eeprom(adapter, 0x50, 0x0100 + i, tags[i]); -} - -static int eeprom_read_ushort(struct i2c_adapter *adapter, u16 tag, u16 *data) -{ - int stat; - u8 buf[2]; - u32 len = 0; - - stat = ReadEEProm(adapter, tag, 2, buf, &len); - if (stat) - return stat; - if (len != 2) - return -EINVAL; - - *data = (buf[0] << 8) | buf[1]; - return 0; -} - -static int eeprom_write_ushort(struct i2c_adapter *adapter, u16 tag, u16 data) -{ - int stat; - u8 buf[2]; - - buf[0] = data >> 8; - buf[1] = data & 0xff; - stat = WriteEEProm(adapter, tag, 2, buf); - if (stat) - return stat; - return 0; -} static int i2c_dump_eeprom(struct i2c_adapter *adapter, u8 adr) { @@ -1665,36 +1459,6 @@ static void swap_buffer(u32 *p, u32 len) } } -static void *ain_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags) -{ - struct ngene_channel *chan = priv; - struct ngene *dev = chan->dev; - - if (dvb_ringbuffer_free(&dev->ain_rbuf) >= len) { - dvb_ringbuffer_write(&dev->ain_rbuf, buf, len); - wake_up_interruptible(&dev->ain_rbuf.queue); - } else - printk(KERN_INFO DEVICE_NAME ": Dropped ain packet.\n"); - - return 0; -} - -static void *vcap_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags) -{ - - struct ngene_channel *chan = priv; - struct ngene *dev = chan->dev; - - if (len >= 1920 * 1080) - len = 1920 * 1080; - if (dvb_ringbuffer_free(&dev->vin_rbuf) >= len) { - dvb_ringbuffer_write(&dev->vin_rbuf, buf, len); - wake_up_interruptible(&dev->vin_rbuf.queue); - } else { - ;/*printk(KERN_INFO DEVICE_NAME ": Dropped vcap packet.\n"); */ - } - return 0; -} static void *tsin_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags) { @@ -1728,15 +1492,6 @@ static void *tsout_exchange(void *priv, void *buf, u32 len, return buf; } -static void set_dto(struct ngene_channel *chan, u32 rate) -{ - u64 val = rate * 0x89705f41ULL; /* times val for 2^26 Hz */ - - val = ((val >> 25) + 1) >> 1; - chan->AudioDTOValue = (u32) val; - /* chan->AudioDTOUpdated=1; */ - /* printk(KERN_INFO DEVICE_NAME ": Setting DTO to %08x\n", val); */ -} static void set_transfer(struct ngene_channel *chan, int state) { @@ -1814,6 +1569,7 @@ static int ngene_start_feed(struct dvb_demux_feed *dvbdmxfeed) { struct dvb_demux *dvbdmx = dvbdmxfeed->demux; struct ngene_channel *chan = dvbdmx->priv; +#ifdef NGENE_COMMAND_API struct ngene *dev = chan->dev; if (dev->card_info->io_type[chan->number] & NGENE_IO_TSOUT) { @@ -1838,6 +1594,7 @@ static int ngene_start_feed(struct dvb_demux_feed *dvbdmxfeed) } } +#endif if (chan->users == 0) { set_transfer(chan, 1); @@ -1851,6 +1608,7 @@ static int ngene_stop_feed(struct dvb_demux_feed *dvbdmxfeed) { struct dvb_demux *dvbdmx = dvbdmxfeed->demux; struct ngene_channel *chan = dvbdmx->priv; +#ifdef NGENE_COMMAND_API struct ngene *dev = chan->dev; if (dev->card_info->io_type[chan->number] & NGENE_IO_TSOUT) { @@ -1870,6 +1628,7 @@ static int ngene_stop_feed(struct dvb_demux_feed *dvbdmxfeed) } } +#endif if (--chan->users) return chan->users; @@ -1879,186 +1638,7 @@ static int ngene_stop_feed(struct dvb_demux_feed *dvbdmxfeed) return 0; } -static int write_demod(struct i2c_adapter *adapter, u8 adr, u16 reg, u16 data) -{ - u8 mm[5] = { 0x10, (reg >> 8) & 0xff, reg & 0xff, - (data >> 8) & 0xff, data & 0xff}; - struct i2c_msg msg = {.addr = adr, .flags = 0, .buf = mm, .len = 5 }; - if (i2c_transfer(adapter, &msg, 1) != 1) { - printk(KERN_ERR DEVICE_NAME ": error in write_demod\n"); - return -1; - } - return 0; -} - - -static int ngene_drxd_pll_set(struct ngene_channel *chan, - u8 *pll, u8 *aux, u8 plladr) -{ - struct i2c_adapter *adap = &chan->i2c_adapter; - struct i2c_msg msg_pll = {.addr = plladr, .flags = 0, .buf = pll, - .len = 4}; - struct i2c_msg msg_aux = {.addr = plladr, .flags = 0, .buf = aux, - .len = 2}; - int err = 0; - - if (chan->dev->card_info->i2c_access & 1) - down(&chan->dev->pll_mutex); - - chan->fe->ops.i2c_gate_ctrl(chan->fe, 1); - err = i2c_transfer(adap, &msg_pll, 1); - if (err != 1) - goto error; - if (aux) - err = i2c_transfer(adap, &msg_aux, 1); -error: - chan->fe->ops.i2c_gate_ctrl(chan->fe, 0); - if (chan->dev->card_info->i2c_access & 1) - up(&chan->dev->pll_mutex); - return err; -} - -static int ngene_pll_set_th_dtt7520x(void *priv, void *priv_params, - u8 plladr, u8 dadr, s32 *off) -{ - struct dvb_frontend_parameters *params = priv_params; - struct ngene_channel *chan = priv; - - u32 freq = params->frequency; - u8 pll[4], aux[2]; - u8 c1, c2; - u32 div; - - if (freq < 185000000 || freq > 900000000) - return -EINVAL; - - if (freq < 465000000) - c2 = 0x12; - else - c2 = 0x18; - - if (freq < 305000000) - c1 = 0xb4; - else if (freq < 405000000) - c1 = 0xbc; - else if (freq < 445000000) - c1 = 0xf4; - else if (freq < 465000000) - c1 = 0xfc; - else if (freq < 735000000) - c1 = 0xbc; - else if (freq < 835000000) - c1 = 0xf4; - else - c1 = 0xfc; - - if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ) - c2 ^= 0x10; - - div = (freq + 36000000 + 166667 / 2) / 166667; - *off = ((s32) div) * 166667 - (s32) freq - 36000000; - - pll[0] = (div >> 8) & 0x7f; - pll[1] = div & 0xff; - pll[2] = c1; - pll[3] = c2; - - aux[0] = (c1 & 0xc7) | 0x98; - aux[1] = 0x30; - - return ngene_drxd_pll_set(chan, pll, aux, plladr); -} - -static int ngene_pll_set_mt_3x0823(void *priv, - void *priv_params, - u8 plladr, u8 dadr, s32 *off) -{ - struct dvb_frontend_parameters *params = priv_params; - struct ngene_channel *chan = priv; - struct i2c_adapter *adap = &chan->i2c_adapter; - u32 freq = params->frequency; - u8 pll[4]; - u8 aux[2]; - u8 c1, c2; - u32 div; - - if (freq < 47125000 || freq > 855250000) - return -EINVAL; - else if (freq < 120000000) { - c1 = 0xcc; - c2 = 0x01; - } else if (freq < 155500000) { - c1 = 0xfc; - c2 = 0x01; - } else if (freq < 300000000) { - c1 = 0xbc; - c2 = 0x02; - } else if (freq < 467000000) { - c1 = 0xcc; - c2 = 0x02; - } else { - c1 = 0xcc; - c2 = 0x04; - } - - if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ) - c2 |= 0x08; - -#define INTERFREQ (36000000) - - div = (freq + INTERFREQ + 166667 / 2) / 166667; - - *off = ((s32) div) * 166667 - (s32) freq - INTERFREQ; - - pll[0] = (div >> 8) & 0x7f; - pll[1] = div & 0xff; - pll[2] = c1; - pll[3] = c2; - - aux[0] = (c1 & 0xc7) | 0x98; - aux[1] = 0x20; - - write_demod(adap, dadr, 0x1007, 0xc27); - - switch (params->u.ofdm.bandwidth) { - case BANDWIDTH_7_MHZ: - write_demod(adap, dadr, 0x0020, 0x103); - break; - case BANDWIDTH_AUTO: - case BANDWIDTH_8_MHZ: - write_demod(adap, dadr, 0x0020, 0x003); - break; - case BANDWIDTH_6_MHZ: - write_demod(adap, dadr, 0x0020, 0x002); - /*write_demod(adap, dadr, 0x1022, 397);*/ - break; - } - - return ngene_drxd_pll_set(chan, pll, aux, plladr); - -} - -static s16 osc_deviation(void *priv, s16 deviation, int flag) -{ - struct ngene_channel *chan = priv; - struct i2c_adapter *adap = &chan->i2c_adapter; - u16 data = 0; - - if (flag) { - data = (u16) deviation; - printk(KERN_INFO DEVICE_NAME ": write deviation %d\n", - deviation); - eeprom_write_ushort(adap, 0x1000 + chan->number, data); - } else { - if (eeprom_read_ushort(adap, 0x1000 + chan->number, &data)) - data = 0; - printk(KERN_INFO DEVICE_NAME ": read deviation %d\n", - (s16) data); - } - - return (s16) data; -} static int write_to_decoder(struct dvb_demux_feed *feed, const u8 *buf, size_t len) @@ -2175,8 +1755,6 @@ int dec_fw_boot(struct ngene *dev) u32 size; const struct firmware *fw = NULL; u8 *dec_fw; - char *fw_name; - int err, version; if (request_firmware(&fw, DECYPHER_FW, &dev->pci_dev->dev) < 0) { printk(KERN_ERR DEVICE_NAME @@ -2188,7 +1766,7 @@ int dec_fw_boot(struct ngene *dev) DECYPHER_FW); size = fw->size; - dec_fw = fw->data; + dec_fw = (u8 *)fw->data; dec_fw_send(dev, dec_fw, size); release_firmware(fw); return 0; @@ -2487,83 +2065,6 @@ static u32 Buffer2Sizes[MAX_STREAM] = { 0 }; -static int allocate_buffer(struct pci_dev *pci_dev, dma_addr_t of, - struct SRingBufferDescriptor *rbuf, - u32 entries, u32 size1, u32 size2) -{ - if (create_ring_buffer(pci_dev, rbuf, entries) < 0) - return -ENOMEM; - - if (AllocateRingBuffers(pci_dev, of, rbuf, size1, size2) < 0) - return -ENOMEM; - - return 0; -} - -static int channel_allocate_buffers(struct ngene_channel *chan) -{ - struct ngene *dev = chan->dev; - int type = dev->card_info->io_type[chan->number]; - int status; - - chan->State = KSSTATE_STOP; - - if (type & (NGENE_IO_TV | NGENE_IO_HDTV | NGENE_IO_AIN)) { - status = create_ring_buffer(dev->pci_dev, - &chan->RingBuffer, - RingBufferSizes[chan->number]); - if (status < 0) - return -ENOMEM; - - if (type & (NGENE_IO_TV | NGENE_IO_AIN)) { - status = AllocateRingBuffers(dev->pci_dev, - dev->PAOverflowBuffer, - &chan->RingBuffer, - Buffer1Sizes[chan->number], - Buffer2Sizes[chan-> - number]); - if (status < 0) - return -ENOMEM; - } else if (type & NGENE_IO_HDTV) { - status = AllocateRingBuffers(dev->pci_dev, - dev->PAOverflowBuffer, - &chan->RingBuffer, - MAX_HDTV_BUFFER_SIZE, 0); - if (status < 0) - return -ENOMEM; - } - } - - if (type & (NGENE_IO_TSIN | NGENE_IO_TSOUT)) { - - status = create_ring_buffer(dev->pci_dev, - &chan->TSRingBuffer, RING_SIZE_TS); - if (status < 0) - return -ENOMEM; - - status = AllocateRingBuffers(dev->pci_dev, - dev->PAOverflowBuffer, - &chan->TSRingBuffer, - MAX_TS_BUFFER_SIZE, 0); - if (status) - return -ENOMEM; - } - - if (type & NGENE_IO_TSOUT) { - status = create_ring_buffer(dev->pci_dev, - &chan->TSIdleBuffer, 1); - if (status < 0) - return -ENOMEM; - status = AllocateRingBuffers(dev->pci_dev, - dev->PAOverflowBuffer, - &chan->TSIdleBuffer, - MAX_TS_BUFFER_SIZE, 0); - if (status) - return -ENOMEM; - FillTSIdleBuffer(&chan->TSIdleBuffer, &chan->TSRingBuffer); - } - return 0; -} static int AllocCommonBuffers(struct ngene *dev) { @@ -2737,18 +2238,12 @@ static int ngene_load_firm(struct ngene *dev) default: case 15: version = 15; - ngene_fw = FW15; - size = sizeof(FW15); fw_name = "ngene_15.fw"; break; case 16: - ngene_fw = FW16; - size = sizeof(FW16); fw_name = "ngene_16.fw"; break; case 17: - ngene_fw = FW17; - size = sizeof(FW17); fw_name = "ngene_17.fw"; break; } @@ -2776,7 +2271,7 @@ static int ngene_load_firm(struct ngene *dev) } printk(KERN_INFO DEVICE_NAME ": Loading firmware file %s.\n", fw_name); size = fw->size; - ngene_fw = fw->data; + ngene_fw = (u8 *) fw->data; err = ngene_command_load_firmware(dev, ngene_fw, size); release_firmware(fw); #endif @@ -2843,9 +2338,6 @@ static int ngene_start(struct ngene *dev) {6144 / 64, 0, 0, 2048 / 64, 2048 / 64, 2048 / 64}; u8 tsin4_config[6] = {3072 / 64, 3072 / 64, 0, 3072 / 64, 3072 / 64, 0}; - u8 ts5_config[6] = - {2048 / 64, 2048 / 64, 0, 2048 / 64, 2048 / 64, - 2048 / 64}; u8 default_config[6] = {4096 / 64, 4096 / 64, 0, 2048 / 64, 2048 / 64, 0}; u8 *bconf = default_config; @@ -2883,540 +2375,17 @@ fail: return stat; } -/****************************************************************************/ -/* DVB audio/video device functions *****************************************/ -/****************************************************************************/ -static ssize_t audio_write(struct file *file, - const char *buf, size_t count, loff_t *ppos) -{ - return -EINVAL; -} - -ssize_t audio_read(struct file *file, char *buf, size_t count, loff_t *ppos) -{ - struct dvb_device *dvbdev = file->private_data; - struct ngene_channel *chan = dvbdev->priv; - struct ngene *dev = chan->dev; - int left; - int avail; - - left = count; - while (left) { - if (wait_event_interruptible( - dev->ain_rbuf.queue, - dvb_ringbuffer_avail(&dev->ain_rbuf) > 0) < 0) - return -EAGAIN; - avail = dvb_ringbuffer_avail(&dev->ain_rbuf); - if (avail > left) - avail = left; - dvb_ringbuffer_read_user(&dev->ain_rbuf, buf, avail); - left -= avail; - buf += avail; - } - return count; -} - -static int audio_open(struct inode *inode, struct file *file) -{ - struct dvb_device *dvbdev = file->private_data; - struct ngene_channel *chan = dvbdev->priv; - struct ngene *dev = chan->dev; - struct ngene_channel *chan2 = &chan->dev->channel[2]; - int ret; - - ret = dvb_generic_open(inode, file); - if (ret < 0) - return ret; - my_dvb_ringbuffer_flush(&dev->ain_rbuf); - - chan2->Capture1Length = MAX_AUDIO_BUFFER_SIZE; - chan2->pBufferExchange = ain_exchange; - ngene_command_stream_control(chan2->dev, chan2->number, 0x80, - SMODE_AUDIO_CAPTURE, 0); - return ret; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct dvb_device *dvbdev = file->private_data; - struct ngene_channel *chan = dvbdev->priv; - struct ngene *dev = chan->dev; - struct ngene_channel *chan2 = &chan->dev->channel[2]; - - ngene_command_stream_control(dev, 2, 0, 0, 0); - chan2->pBufferExchange = 0; - - return dvb_generic_release(inode, file); -} - -static const struct file_operations audio_fops = { - .owner = THIS_MODULE, - .read = audio_read, - .write = audio_write, - .open = audio_open, - .release = audio_release, -}; - -static struct dvb_device dvbdev_audio = { - .priv = 0, - .readers = -1, - .writers = 1, - .users = 1, - .fops = &audio_fops, -}; - -static int video_open(struct inode *inode, struct file *file) -{ - struct dvb_device *dvbdev = file->private_data; - struct ngene_channel *chan = dvbdev->priv; - struct ngene *dev = chan->dev; - struct ngene_channel *chan0 = &chan->dev->channel[0]; - int ret; - - ret = dvb_generic_open(inode, file); - if (ret < 0) - return ret; - if ((file->f_flags & O_ACCMODE) != O_RDONLY) - return ret; - my_dvb_ringbuffer_flush(&dev->vin_rbuf); - - chan0->nBytesPerLine = 1920 * 2; - chan0->nLines = 540; - chan0->Capture1Length = 1920 * 2 * 540; - chan0->pBufferExchange = vcap_exchange; - chan0->itumode = 2; - ngene_command_stream_control(chan0->dev, chan0->number, - 0x80, SMODE_VIDEO_CAPTURE, 0); - return ret; -} - -static int video_release(struct inode *inode, struct file *file) -{ - struct dvb_device *dvbdev = file->private_data; - struct ngene_channel *chan = dvbdev->priv; - struct ngene *dev = chan->dev; - struct ngene_channel *chan0 = &chan->dev->channel[0]; - - ngene_command_stream_control(dev, 0, 0, 0, 0); - chan0->pBufferExchange = 0; - - return dvb_generic_release(inode, file); -} - -static ssize_t video_write(struct file *file, - const char *buf, size_t count, loff_t *ppos) -{ - return -EINVAL; -} - -ssize_t video_read(struct file *file, char *buf, size_t count, loff_t *ppos) -{ - struct dvb_device *dvbdev = file->private_data; - struct ngene_channel *chan = dvbdev->priv; - struct ngene *dev = chan->dev; - int left, avail; - - left = count; - while (left) { - if (wait_event_interruptible( - dev->vin_rbuf.queue, - dvb_ringbuffer_avail(&dev->vin_rbuf) > 0) < 0) - return -EAGAIN; - avail = dvb_ringbuffer_avail(&dev->vin_rbuf); - if (avail > left) - avail = left; - dvb_ringbuffer_read_user(&dev->vin_rbuf, buf, avail); - left -= avail; - buf += avail; - } - return count; -} - -/* Why is this not exported from dvb_core ?!?! */ - -static int dvb_usercopy2(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg, - int (*func)(struct inode *inode, struct file *file, - unsigned int cmd, void *arg)) -{ - char sbuf[128]; - void *mbuf = NULL; - void *parg = NULL; - int err = -EINVAL; - - /* Copy arguments into temp kernel buffer */ - switch (_IOC_DIR(cmd)) { - case _IOC_NONE: - /* - * For this command, the pointer is actually an integer - * argument. - */ - parg = (void *)arg; - break; - case _IOC_READ: /* some v4l ioctls are marked wrong ... */ - case _IOC_WRITE: - case (_IOC_WRITE | _IOC_READ): - if (_IOC_SIZE(cmd) <= sizeof(sbuf)) { - parg = sbuf; - } else { - /* too big to allocate from stack */ - mbuf = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL); - if (NULL == mbuf) - return -ENOMEM; - parg = mbuf; - } - - err = -EFAULT; - if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd))) - goto out; - break; - } - - /* call driver */ - err = func(inode, file, cmd, parg); - if (err == -ENOIOCTLCMD) - err = -EINVAL; - - if (err < 0) - goto out; - - /* Copy results into user buffer */ - switch (_IOC_DIR(cmd)) { - case _IOC_READ: - case (_IOC_WRITE | _IOC_READ): - if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd))) - err = -EFAULT; - break; - } - -out: - kfree(mbuf); - return err; -} - -static int video_do_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, void *parg) -{ - struct dvb_device *dvbdev = file->private_data; - struct ngene_channel *chan = dvbdev->priv; - struct ngene *dev = chan->dev; - int ret = 0; - unsigned long arg = (unsigned long)parg; - - switch (cmd) { - case VIDEO_SET_STREAMTYPE: - switch (arg) { - case VIDEO_CAP_MPEG2: - /* printk(KERN_INFO DEVICE_NAME ": setting MPEG2\n"); */ - send_cli(dev, "vdec mpeg2\n"); - break; - case VIDEO_CAP_AVC: - /* printk(KERN_INFO DEVICE_NAME ": setting H264\n"); */ - send_cli(dev, "vdec h264\n"); - break; - case VIDEO_CAP_VC1: - /* printk(KERN_INFO DEVICE_NAME ": setting VC1\n"); */ - send_cli(dev, "vdec vc1\n"); - break; - default: - ret = -EINVAL; - break; - } - break; - default: - ret = -ENOIOCTLCMD; - return -EINVAL; - } - return ret; -} - -static int video_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) -{ - return dvb_usercopy2(inode, file, cmd, arg, video_do_ioctl); -} - -static const struct file_operations video_fops = { - .owner = THIS_MODULE, - .read = video_read, - .write = video_write, - .open = video_open, - .release = video_release, - .ioctl = video_ioctl, -}; - -static struct dvb_device dvbdev_video = { - .priv = 0, - .readers = -1, - .writers = 1, - .users = -1, - .fops = &video_fops, -}; - -/****************************************************************************/ -/* LNBH21 *******************************************************************/ -/****************************************************************************/ - -static int lnbh21_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) -{ - struct ngene_channel *chan = - *(struct ngene_channel **) fe->demodulator_priv; - - switch (voltage) { - case SEC_VOLTAGE_OFF: - chan->lnbh &= 0xf3; - break; - case SEC_VOLTAGE_13: - chan->lnbh |= 0x04; - chan->lnbh &= ~0x08; - break; - case SEC_VOLTAGE_18: - chan->lnbh |= 0x0c; - break; - default: - return -EINVAL; - }; - chan->lnbh |= 0x10; - return i2c_write(&chan->i2c_adapter, - chan->dev->card_info->lnb[chan->number], chan->lnbh); -} - -static int lnbh21_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) -{ - struct ngene_channel *chan = - *(struct ngene_channel **)fe->demodulator_priv; - - switch (tone) { - case SEC_TONE_ON: - chan->lnbh |= 0x20; - break; - case SEC_TONE_OFF: - chan->lnbh &= 0xdf; - break; - default: - return -EINVAL; - } - return i2c_write(&chan->i2c_adapter, - chan->dev->card_info->lnb[chan->number], chan->lnbh); -} /****************************************************************************/ /* Switch control (I2C gates, etc.) *****************************************/ /****************************************************************************/ -static int avf_output(struct ngene_channel *chan, int state) -{ - if (chan->dev->card_info->avf[chan->number]) - i2c_write_register(&chan->i2c_adapter, - chan->dev->card_info->avf[chan->number], - 0xf2, state ? 0x89 : 0x80); - return 0; -} - -/* Viper expander: sw11,sw12,sw21,sw22,i2csw1,i2csw2,tsen1,tsen2 */ - -static int exp_set(struct ngene *dev) -{ - return i2c_write(&dev->channel[0].i2c_adapter, - dev->card_info->exp, dev->exp_val); -} - -static int exp_init(struct ngene *dev) -{ - if (!dev->card_info->exp) - return 0; - dev->exp_val = dev->card_info->exp_init; - return exp_set(dev); -} - -static int exp_set_bit(struct ngene *dev, int bit, int val) -{ - if (val) - set_bit(bit, &dev->exp_val); - else - clear_bit(bit, &dev->exp_val); - return exp_set(dev); -} - -static int viper_switch_ctrl(struct ngene_channel *chan, int type, int val) -{ - switch (type) { - case 0: /* I2C tuner gate on/off */ - return exp_set_bit(chan->dev, 4 + chan->number, val); - case 1: /* Stream: 0=TS 1=ITU */ - avf_output(chan, val); - return exp_set_bit(chan->dev, 6 + chan->number, val); - case 2: /* Input: 0=digital 1=analog antenna input */ - exp_set_bit(chan->dev, 0 + chan->number * 2, val ? 0 : 1); - exp_set_bit(chan->dev, 1 + chan->number * 2, val ? 1 : 0); - break; - } - return 0; -} - -static int viper_switch_ctrl2(struct ngene_channel *chan, int type, int val) -{ - switch (type) { - case 0: /* I2C tuner gate on/off */ - return exp_set_bit(chan->dev, 4 + chan->number, val); - case 1: /* Stream: 0=TS 1=ITU */ - avf_output(chan, val); - return exp_set_bit(chan->dev, 6 + chan->number, val); - case 2: /* Input: 0=digital 1=analog antenna input */ - exp_set_bit(chan->dev, 0 + chan->number * 2, val ? 0 : 1); - exp_set_bit(chan->dev, 1 + chan->number * 2, 0); - break; - } - return 0; -} - -static int viper_gate_ctrl(struct dvb_frontend *fe, int enable) -{ - /* Well, just abuse sec :-) */ - struct ngene_channel *chan = fe->sec_priv; - struct ngene *dev = chan->dev; - - return dev->card_info->switch_ctrl(chan, 0, enable); -} - |