diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-11 06:04:49 +0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-11 06:04:49 +0400 |
commit | 4d9708ea5e5a45973df7cf965805fdfb185dd5bf (patch) | |
tree | 833a918e85f1e3bff8cb182517707d12836d10a8 /drivers/staging | |
parent | 754c780953397dd5ee5191b7b3ca67e09088ce7a (diff) | |
parent | a66d05d504a24894a8fdf11e4569752f313e5764 (diff) | |
download | linux-4d9708ea5e5a45973df7cf965805fdfb185dd5bf.tar.xz |
Merge tag 'media/v3.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab:
- new IR driver: hix5hd2-ir
- the virtual test driver (vivi) was replaced by vivid, with has an
almost complete set of features to emulate most v4l2 devices and
properly test all sorts of userspace apps
- the as102 driver had several bugs fixed and was properly split into a
frontend and a core driver. With that, it got promoted from staging
into mainstream
- one new CI driver got added for CIMaX SP2/SP2HF (sp2 driver)
- one new frontend driver for Toshiba ISDB-T/ISDB-S demod (tc90522)
- one new PCI driver for ISDB-T/ISDB-S (pt3 driver)
- saa7134 driver got support for go7007-based devices
- added a new PCI driver for Techwell 68xx chipsets (tw68)
- a new platform driver was added (coda)
- new tuner drivers: mxl301rf and qm1d1c0042
- a new DVB USB driver was added for DVBSky S860 & similar devices
- added a new SDR driver (hackrf)
- usbtv got audio support
- several platform drivers are now compiled with COMPILE_TEST
- a series of compiler fixup patches, making sparse/spatch happier with
the media stuff and removing several warnings, especially on those
platform drivers that didn't use to compile on x86
- Support for several new modern devices got added
- lots of other fixes, improvements and cleanups
* tag 'media/v3.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (544 commits)
[media] ir-hix5hd2: fix build on c6x arch
[media] pt3: fix DTV FE I2C driver load error paths
Revert "[media] media: em28xx - remove reset_resume interface"
[media] exynos4-is: fix some warnings when compiling on arm64
[media] usb drivers: use %zu instead of %zd
[media] pci drivers: use %zu instead of %zd
[media] dvb-frontends: use %zu instead of %zd
[media] s5p-mfc: Fix several printk warnings
[media] s5p_mfc_opr: Fix warnings
[media] ti-vpe: Fix typecast
[media] s3c-camif: fix dma_addr_t printks
[media] s5p_mfc_opr_v6: get rid of warnings when compiled with 64 bits
[media] s5p_mfc_opr_v5: Fix lots of warnings on x86_64
[media] em28xx: Fix identation
[media] drxd: remove a dead code
[media] saa7146: remove return after BUG()
[media] cx88: remove return after BUG()
[media] cx88: fix cards table CodingStyle
[media] radio-sf16fmr2: declare some structs as static
[media] radio-sf16fmi: declare pnp_attached as static
...
Diffstat (limited to 'drivers/staging')
22 files changed, 5 insertions, 3379 deletions
diff --git a/drivers/staging/media/Kconfig b/drivers/staging/media/Kconfig index 3323eb5e77b0..655cf5037b0b 100644 --- a/drivers/staging/media/Kconfig +++ b/drivers/staging/media/Kconfig @@ -19,8 +19,6 @@ menuconfig STAGING_MEDIA if STAGING_MEDIA # Please keep them in alphabetic order -source "drivers/staging/media/as102/Kconfig" - source "drivers/staging/media/bcm2048/Kconfig" source "drivers/staging/media/cxd2099/Kconfig" diff --git a/drivers/staging/media/Makefile b/drivers/staging/media/Makefile index 7db83f373f63..6dbe578178cd 100644 --- a/drivers/staging/media/Makefile +++ b/drivers/staging/media/Makefile @@ -1,4 +1,3 @@ -obj-$(CONFIG_DVB_AS102) += as102/ obj-$(CONFIG_I2C_BCM2048) += bcm2048/ obj-$(CONFIG_DVB_CXD2099) += cxd2099/ obj-$(CONFIG_LIRC_STAGING) += lirc/ diff --git a/drivers/staging/media/as102/Kconfig b/drivers/staging/media/as102/Kconfig deleted file mode 100644 index 28aba00dc629..000000000000 --- a/drivers/staging/media/as102/Kconfig +++ /dev/null @@ -1,8 +0,0 @@ -config DVB_AS102 - tristate "Abilis AS102 DVB receiver" - depends on DVB_CORE && USB && I2C && INPUT - select FW_LOADER - help - Choose Y or M here if you have a device containing an AS102 - - To compile this driver as a module, choose M here diff --git a/drivers/staging/media/as102/Makefile b/drivers/staging/media/as102/Makefile deleted file mode 100644 index 8916d8a909bc..000000000000 --- a/drivers/staging/media/as102/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -dvb-as102-objs := as102_drv.o as102_fw.o as10x_cmd.o as10x_cmd_stream.o \ - as102_fe.o as102_usb_drv.o as10x_cmd_cfg.o - -obj-$(CONFIG_DVB_AS102) += dvb-as102.o - -ccflags-y += -Idrivers/media/dvb-core diff --git a/drivers/staging/media/as102/as102_drv.c b/drivers/staging/media/as102/as102_drv.c deleted file mode 100644 index 09d64cd67502..000000000000 --- a/drivers/staging/media/as102/as102_drv.c +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Abilis Systems Single DVB-T Receiver - * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> - * Copyright (C) 2010 Devin Heitmueller <dheitmueller@kernellabs.com> - * - * 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, 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -#include <linux/kernel.h> -#include <linux/errno.h> -#include <linux/slab.h> -#include <linux/module.h> -#include <linux/mm.h> -#include <linux/kref.h> -#include <linux/uaccess.h> -#include <linux/usb.h> - -/* header file for usb device driver*/ -#include "as102_drv.h" -#include "as102_fw.h" -#include "dvbdev.h" - -int as102_debug; -module_param_named(debug, as102_debug, int, 0644); -MODULE_PARM_DESC(debug, "Turn on/off debugging (default: off)"); - -int dual_tuner; -module_param_named(dual_tuner, dual_tuner, int, 0644); -MODULE_PARM_DESC(dual_tuner, "Activate Dual-Tuner config (default: off)"); - -static int fw_upload = 1; -module_param_named(fw_upload, fw_upload, int, 0644); -MODULE_PARM_DESC(fw_upload, "Turn on/off default FW upload (default: on)"); - -static int pid_filtering; -module_param_named(pid_filtering, pid_filtering, int, 0644); -MODULE_PARM_DESC(pid_filtering, "Activate HW PID filtering (default: off)"); - -static int ts_auto_disable; -module_param_named(ts_auto_disable, ts_auto_disable, int, 0644); -MODULE_PARM_DESC(ts_auto_disable, "Stream Auto Enable on FW (default: off)"); - -int elna_enable = 1; -module_param_named(elna_enable, elna_enable, int, 0644); -MODULE_PARM_DESC(elna_enable, "Activate eLNA (default: on)"); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); - -static void as102_stop_stream(struct as102_dev_t *dev) -{ - struct as10x_bus_adapter_t *bus_adap; - - if (dev != NULL) - bus_adap = &dev->bus_adap; - else - return; - - if (bus_adap->ops->stop_stream != NULL) - bus_adap->ops->stop_stream(dev); - - if (ts_auto_disable) { - if (mutex_lock_interruptible(&dev->bus_adap.lock)) - return; - - if (as10x_cmd_stop_streaming(bus_adap) < 0) - dprintk(debug, "as10x_cmd_stop_streaming failed\n"); - - mutex_unlock(&dev->bus_adap.lock); - } -} - -static int as102_start_stream(struct as102_dev_t *dev) -{ - struct as10x_bus_adapter_t *bus_adap; - int ret = -EFAULT; - - if (dev != NULL) - bus_adap = &dev->bus_adap; - else - return ret; - - if (bus_adap->ops->start_stream != NULL) - ret = bus_adap->ops->start_stream(dev); - - if (ts_auto_disable) { - if (mutex_lock_interruptible(&dev->bus_adap.lock)) - return -EFAULT; - - ret = as10x_cmd_start_streaming(bus_adap); - - mutex_unlock(&dev->bus_adap.lock); - } - - return ret; -} - -static int as10x_pid_filter(struct as102_dev_t *dev, - int index, u16 pid, int onoff) { - - struct as10x_bus_adapter_t *bus_adap = &dev->bus_adap; - int ret = -EFAULT; - - if (mutex_lock_interruptible(&dev->bus_adap.lock)) { - dprintk(debug, "mutex_lock_interruptible(lock) failed !\n"); - return -EBUSY; - } - - switch (onoff) { - case 0: - ret = as10x_cmd_del_PID_filter(bus_adap, (uint16_t) pid); - dprintk(debug, "DEL_PID_FILTER([%02d] 0x%04x) ret = %d\n", - index, pid, ret); - break; - case 1: - { - struct as10x_ts_filter filter; - - filter.type = TS_PID_TYPE_TS; - filter.idx = 0xFF; - filter.pid = pid; - - ret = as10x_cmd_add_PID_filter(bus_adap, &filter); - dprintk(debug, - "ADD_PID_FILTER([%02d -> %02d], 0x%04x) ret = %d\n", - index, filter.idx, filter.pid, ret); - break; - } - } - - mutex_unlock(&dev->bus_adap.lock); - return ret; -} - -static int as102_dvb_dmx_start_feed(struct dvb_demux_feed *dvbdmxfeed) -{ - int ret = 0; - struct dvb_demux *demux = dvbdmxfeed->demux; - struct as102_dev_t *as102_dev = demux->priv; - - if (mutex_lock_interruptible(&as102_dev->sem)) - return -ERESTARTSYS; - - if (pid_filtering) - as10x_pid_filter(as102_dev, dvbdmxfeed->index, - dvbdmxfeed->pid, 1); - - if (as102_dev->streaming++ == 0) - ret = as102_start_stream(as102_dev); - - mutex_unlock(&as102_dev->sem); - return ret; -} - -static int as102_dvb_dmx_stop_feed(struct dvb_demux_feed *dvbdmxfeed) -{ - struct dvb_demux *demux = dvbdmxfeed->demux; - struct as102_dev_t *as102_dev = demux->priv; - - if (mutex_lock_interruptible(&as102_dev->sem)) - return -ERESTARTSYS; - - if (--as102_dev->streaming == 0) - as102_stop_stream(as102_dev); - - if (pid_filtering) - as10x_pid_filter(as102_dev, dvbdmxfeed->index, - dvbdmxfeed->pid, 0); - - mutex_unlock(&as102_dev->sem); - return 0; -} - -int as102_dvb_register(struct as102_dev_t *as102_dev) -{ - struct device *dev = &as102_dev->bus_adap.usb_dev->dev; - int ret; - - ret = dvb_register_adapter(&as102_dev->dvb_adap, - as102_dev->name, THIS_MODULE, - dev, adapter_nr); - if (ret < 0) { - dev_err(dev, "%s: dvb_register_adapter() failed: %d\n", - __func__, ret); - return ret; - } - - as102_dev->dvb_dmx.priv = as102_dev; - as102_dev->dvb_dmx.filternum = pid_filtering ? 16 : 256; - as102_dev->dvb_dmx.feednum = 256; - as102_dev->dvb_dmx.start_feed = as102_dvb_dmx_start_feed; - as102_dev->dvb_dmx.stop_feed = as102_dvb_dmx_stop_feed; - - as102_dev->dvb_dmx.dmx.capabilities = DMX_TS_FILTERING | - DMX_SECTION_FILTERING; - - as102_dev->dvb_dmxdev.filternum = as102_dev->dvb_dmx.filternum; - as102_dev->dvb_dmxdev.demux = &as102_dev->dvb_dmx.dmx; - as102_dev->dvb_dmxdev.capabilities = 0; - - ret = dvb_dmx_init(&as102_dev->dvb_dmx); - if (ret < 0) { - dev_err(dev, "%s: dvb_dmx_init() failed: %d\n", __func__, ret); - goto edmxinit; - } - - ret = dvb_dmxdev_init(&as102_dev->dvb_dmxdev, &as102_dev->dvb_adap); - if (ret < 0) { - dev_err(dev, "%s: dvb_dmxdev_init() failed: %d\n", - __func__, ret); - goto edmxdinit; - } - - ret = as102_dvb_register_fe(as102_dev, &as102_dev->dvb_fe); - if (ret < 0) { - dev_err(dev, "%s: as102_dvb_register_frontend() failed: %d", - __func__, ret); - goto efereg; - } - - /* init bus mutex for token locking */ - mutex_init(&as102_dev->bus_adap.lock); - - /* init start / stop stream mutex */ - mutex_init(&as102_dev->sem); - - /* - * try to load as102 firmware. If firmware upload failed, we'll be - * able to upload it later. - */ - if (fw_upload) - try_then_request_module(as102_fw_upload(&as102_dev->bus_adap), - "firmware_class"); - - pr_info("Registered device %s", as102_dev->name); - return 0; - -efereg: - dvb_dmxdev_release(&as102_dev->dvb_dmxdev); -edmxdinit: - dvb_dmx_release(&as102_dev->dvb_dmx); -edmxinit: - dvb_unregister_adapter(&as102_dev->dvb_adap); - return ret; -} - -void as102_dvb_unregister(struct as102_dev_t *as102_dev) -{ - /* unregister as102 frontend */ - as102_dvb_unregister_fe(&as102_dev->dvb_fe); - - /* unregister demux device */ - dvb_dmxdev_release(&as102_dev->dvb_dmxdev); - dvb_dmx_release(&as102_dev->dvb_dmx); - - /* unregister dvb adapter */ - dvb_unregister_adapter(&as102_dev->dvb_adap); - - pr_info("Unregistered device %s", as102_dev->name); -} - -module_usb_driver(as102_usb_driver); - -/* modinfo details */ -MODULE_DESCRIPTION(DRIVER_FULL_NAME); -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Pierrick Hascoet <pierrick.hascoet@abilis.com>"); diff --git a/drivers/staging/media/as102/as102_drv.h b/drivers/staging/media/as102/as102_drv.h deleted file mode 100644 index a06837dcc05d..000000000000 --- a/drivers/staging/media/as102/as102_drv.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Abilis Systems Single DVB-T Receiver - * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> - * - * 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, 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include <linux/usb.h> -#include <dvb_demux.h> -#include <dvb_frontend.h> -#include <dmxdev.h> -#include "as10x_cmd.h" -#include "as102_usb_drv.h" - -#define DRIVER_FULL_NAME "Abilis Systems as10x usb driver" -#define DRIVER_NAME "as10x_usb" - -extern int as102_debug; -#define debug as102_debug -extern struct usb_driver as102_usb_driver; -extern int elna_enable; - -#define dprintk(debug, args...) \ - do { if (debug) { \ - pr_debug("%s: ", __func__); \ - printk(args); \ - } } while (0) - -#define AS102_DEVICE_MAJOR 192 - -#define AS102_USB_BUF_SIZE 512 -#define MAX_STREAM_URB 32 - -struct as10x_bus_adapter_t { - struct usb_device *usb_dev; - /* bus token lock */ - struct mutex lock; - /* low level interface for bus adapter */ - union as10x_bus_token_t { - /* usb token */ - struct as10x_usb_token_cmd_t usb; - } token; - - /* token cmd xfer id */ - uint16_t cmd_xid; - - /* as10x command and response for dvb interface*/ - struct as10x_cmd_t *cmd, *rsp; - - /* bus adapter private ops callback */ - struct as102_priv_ops_t *ops; -}; - -struct as102_dev_t { - const char *name; - struct as10x_bus_adapter_t bus_adap; - struct list_head device_entry; - struct kref kref; - uint8_t elna_cfg; - - struct dvb_adapter dvb_adap; - struct dvb_frontend dvb_fe; - struct dvb_demux dvb_dmx; - struct dmxdev dvb_dmxdev; - - /* demodulator stats */ - struct as10x_demod_stats demod_stats; - /* signal strength */ - uint16_t signal_strength; - /* bit error rate */ - uint32_t ber; - - /* timer handle to trig ts stream download */ - struct timer_list timer_handle; - - struct mutex sem; - dma_addr_t dma_addr; - void *stream; - int streaming; - struct urb *stream_urb[MAX_STREAM_URB]; -}; - -int as102_dvb_register(struct as102_dev_t *dev); -void as102_dvb_unregister(struct as102_dev_t *dev); - -int as102_dvb_register_fe(struct as102_dev_t *dev, struct dvb_frontend *fe); -int as102_dvb_unregister_fe(struct dvb_frontend *dev); diff --git a/drivers/staging/media/as102/as102_fe.c b/drivers/staging/media/as102/as102_fe.c deleted file mode 100644 index b686b7617cdc..000000000000 --- a/drivers/staging/media/as102/as102_fe.c +++ /dev/null @@ -1,571 +0,0 @@ -/* - * Abilis Systems Single DVB-T Receiver - * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> - * Copyright (C) 2010 Devin Heitmueller <dheitmueller@kernellabs.com> - * - * 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, 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -#include "as102_drv.h" -#include "as10x_types.h" -#include "as10x_cmd.h" - -static void as10x_fe_copy_tps_parameters(struct dtv_frontend_properties *dst, - struct as10x_tps *src); - -static void as102_fe_copy_tune_parameters(struct as10x_tune_args *dst, - struct dtv_frontend_properties *src); - -static int as102_fe_set_frontend(struct dvb_frontend *fe) -{ - struct dtv_frontend_properties *p = &fe->dtv_property_cache; - int ret = 0; - struct as102_dev_t *dev; - struct as10x_tune_args tune_args = { 0 }; - - dev = (struct as102_dev_t *) fe->tuner_priv; - if (dev == NULL) - return -ENODEV; - - if (mutex_lock_interruptible(&dev->bus_adap.lock)) - return -EBUSY; - - as102_fe_copy_tune_parameters(&tune_args, p); - - /* send abilis command: SET_TUNE */ - ret = as10x_cmd_set_tune(&dev->bus_adap, &tune_args); - if (ret != 0) - dprintk(debug, "as10x_cmd_set_tune failed. (err = %d)\n", ret); - - mutex_unlock(&dev->bus_adap.lock); - - return (ret < 0) ? -EINVAL : 0; -} - -static int as102_fe_get_frontend(struct dvb_frontend *fe) -{ - struct dtv_frontend_properties *p = &fe->dtv_property_cache; - int ret = 0; - struct as102_dev_t *dev; - struct as10x_tps tps = { 0 }; - - dev = (struct as102_dev_t *) fe->tuner_priv; - if (dev == NULL) - return -EINVAL; - - if (mutex_lock_interruptible(&dev->bus_adap.lock)) - return -EBUSY; - - /* send abilis command: GET_TPS */ - ret = as10x_cmd_get_tps(&dev->bus_adap, &tps); - - if (ret == 0) - as10x_fe_copy_tps_parameters(p, &tps); - - mutex_unlock(&dev->bus_adap.lock); - - return (ret < 0) ? -EINVAL : 0; -} - -static int as102_fe_get_tune_settings(struct dvb_frontend *fe, - struct dvb_frontend_tune_settings *settings) { - -#if 0 - dprintk(debug, "step_size = %d\n", settings->step_size); - dprintk(debug, "max_drift = %d\n", settings->max_drift); - dprintk(debug, "min_delay_ms = %d -> %d\n", settings->min_delay_ms, - 1000); -#endif - - settings->min_delay_ms = 1000; - - return 0; -} - - -static int as102_fe_read_status(struct dvb_frontend *fe, fe_status_t *status) -{ - int ret = 0; - struct as102_dev_t *dev; - struct as10x_tune_status tstate = { 0 }; - - dev = (struct as102_dev_t *) fe->tuner_priv; - if (dev == NULL) - return -ENODEV; - - if (mutex_lock_interruptible(&dev->bus_adap.lock)) - return -EBUSY; - - /* send abilis command: GET_TUNE_STATUS */ - ret = as10x_cmd_get_tune_status(&dev->bus_adap, &tstate); - if (ret < 0) { - dprintk(debug, "as10x_cmd_get_tune_status failed (err = %d)\n", - ret); - goto out; - } - - dev->signal_strength = tstate.signal_strength; - dev->ber = tstate.BER; - - switch (tstate.tune_state) { - case TUNE_STATUS_SIGNAL_DVB_OK: - *status = FE_HAS_SIGNAL | FE_HAS_CARRIER; - break; - case TUNE_STATUS_STREAM_DETECTED: - *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_SYNC; - break; - case TUNE_STATUS_STREAM_TUNED: - *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_SYNC | - FE_HAS_LOCK; - break; - default: - *status = TUNE_STATUS_NOT_TUNED; - } - - dprintk(debug, "tuner status: 0x%02x, strength %d, per: %d, ber: %d\n", - tstate.tune_state, tstate.signal_strength, - tstate.PER, tstate.BER); - - if (*status & FE_HAS_LOCK) { - if (as10x_cmd_get_demod_stats(&dev->bus_adap, - (struct as10x_demod_stats *) &dev->demod_stats) < 0) { - memset(&dev->demod_stats, 0, sizeof(dev->demod_stats)); - dprintk(debug, - "as10x_cmd_get_demod_stats failed (probably not tuned)\n"); - } else { - dprintk(debug, - "demod status: fc: 0x%08x, bad fc: 0x%08x, " - "bytes corrected: 0x%08x , MER: 0x%04x\n", - dev->demod_stats.frame_count, - dev->demod_stats.bad_frame_count, - dev->demod_stats.bytes_fixed_by_rs, - dev->demod_stats.mer); - } - } else { - memset(&dev->demod_stats, 0, sizeof(dev->demod_stats)); - } - -out: - mutex_unlock(&dev->bus_adap.lock); - return ret; -} - -/* - * Note: - * - in AS102 SNR=MER - * - the SNR will be returned in linear terms, i.e. not in dB - * - the accuracy equals ±2dB for a SNR range from 4dB to 30dB - * - the accuracy is >2dB for SNR values outside this range - */ -static int as102_fe_read_snr(struct dvb_frontend *fe, u16 *snr) -{ - struct as102_dev_t *dev; - - dev = (struct as102_dev_t *) fe->tuner_priv; - if (dev == NULL) - return -ENODEV; - - *snr = dev->demod_stats.mer; - - return 0; -} - -static int as102_fe_read_ber(struct dvb_frontend *fe, u32 *ber) -{ - struct as102_dev_t *dev; - - dev = (struct as102_dev_t *) fe->tuner_priv; - if (dev == NULL) - return -ENODEV; - - *ber = dev->ber; - - return 0; -} - -static int as102_fe_read_signal_strength(struct dvb_frontend *fe, - u16 *strength) -{ - struct as102_dev_t *dev; - - dev = (struct as102_dev_t *) fe->tuner_priv; - if (dev == NULL) - return -ENODEV; - - *strength = (((0xffff * 400) * dev->signal_strength + 41000) * 2); - - return 0; -} - -static int as102_fe_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) -{ - struct as102_dev_t *dev; - - dev = (struct as102_dev_t *) fe->tuner_priv; - if (dev == NULL) - return -ENODEV; - - if (dev->demod_stats.has_started) - *ucblocks = dev->demod_stats.bad_frame_count; - else - *ucblocks = 0; - - return 0; -} - -static int as102_fe_ts_bus_ctrl(struct dvb_frontend *fe, int acquire) -{ - struct as102_dev_t *dev; - int ret; - - dev = (struct as102_dev_t *) fe->tuner_priv; - if (dev == NULL) - return -ENODEV; - - if (mutex_lock_interruptible(&dev->bus_adap.lock)) - return -EBUSY; - - if (acquire) { - if (elna_enable) - as10x_cmd_set_context(&dev->bus_adap, - CONTEXT_LNA, dev->elna_cfg); - - ret = as10x_cmd_turn_on(&dev->bus_adap); - } else { - ret = as10x_cmd_turn_off(&dev->bus_adap); - } - - mutex_unlock(&dev->bus_adap.lock); - - return ret; -} - -static struct dvb_frontend_ops as102_fe_ops = { - .delsys = { SYS_DVBT }, - .info = { - .name = "Unknown AS102 device", - .frequency_min = 174000000, - .frequency_max = 862000000, - .frequency_stepsize = 166667, - .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_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QPSK - | FE_CAN_QAM_AUTO - | FE_CAN_TRANSMISSION_MODE_AUTO - | FE_CAN_GUARD_INTERVAL_AUTO - | FE_CAN_HIERARCHY_AUTO - | FE_CAN_RECOVER - | FE_CAN_MUTE_TS - }, - - .set_frontend = as102_fe_set_frontend, - .get_frontend = as102_fe_get_frontend, - .get_tune_settings = as102_fe_get_tune_settings, - - .read_status = as102_fe_read_status, - .read_snr = as102_fe_read_snr, - .read_ber = as102_fe_read_ber, - .read_signal_strength = as102_fe_read_signal_strength, - .read_ucblocks = as102_fe_read_ucblocks, - .ts_bus_ctrl = as102_fe_ts_bus_ctrl, -}; - -int as102_dvb_unregister_fe(struct dvb_frontend *fe) -{ - /* unregister frontend */ - dvb_unregister_frontend(fe); - - /* detach frontend */ - dvb_frontend_detach(fe); - - return 0; -} - -int as102_dvb_register_fe(struct as102_dev_t *as102_dev, - struct dvb_frontend *dvb_fe) -{ - int errno; - struct dvb_adapter *dvb_adap; - - if (as102_dev == NULL) - return -EINVAL; - - /* extract dvb_adapter */ - dvb_adap = &as102_dev->dvb_adap; - - /* init frontend callback ops */ - memcpy(&dvb_fe->ops, &as102_fe_ops, sizeof(struct dvb_frontend_ops)); - strncpy(dvb_fe->ops.info.name, as102_dev->name, - sizeof(dvb_fe->ops.info.name)); - - /* register dvb frontend */ - errno = dvb_register_frontend(dvb_adap, dvb_fe); - if (errno == 0) - dvb_fe->tuner_priv = as102_dev; - - return errno; -} - -static void as10x_fe_copy_tps_parameters(struct dtv_frontend_properties *fe_tps, - struct as10x_tps *as10x_tps) -{ - - /* extract constellation */ - switch (as10x_tps->modulation) { - case CONST_QPSK: - fe_tps->modulation = QPSK; - break; - case CONST_QAM16: - fe_tps->modulation = QAM_16; - break; - case CONST_QAM64: - fe_tps->modulation = QAM_64; - break; - } - - /* extract hierarchy */ - switch (as10x_tps->hierarchy) { - case HIER_NONE: - fe_tps->hierarchy = HIERARCHY_NONE; - break; - case HIER_ALPHA_1: - fe_tps->hierarchy = HIERARCHY_1; - break; - case HIER_ALPHA_2: - fe_tps->hierarchy = HIERARCHY_2; - break; - case HIER_ALPHA_4: - fe_tps->hierarchy = HIERARCHY_4; - break; - } - - /* extract code rate HP */ - switch (as10x_tps->code_rate_HP) { - case CODE_RATE_1_2: - fe_tps->code_rate_HP = FEC_1_2; - break; - case CODE_RATE_2_3: - fe_tps->code_rate_HP = FEC_2_3; - break; - case CODE_RATE_3_4: - fe_tps->code_rate_HP = FEC_3_4; - break; - case CODE_RATE_5_6: - fe_tps->code_rate_HP = FEC_5_6; - break; - case CODE_RATE_7_8: - fe_tps->code_rate_HP = FEC_7_8; - break; - } - - /* extract code rate LP */ - switch (as10x_tps->code_rate_LP) { - case CODE_RATE_1_2: - fe_tps->code_rate_LP = FEC_1_2; - break; - case CODE_RATE_2_3: - fe_tps->code_rate_LP = FEC_2_3; - break; - case CODE_RATE_3_4: - fe_tps->code_rate_LP = FEC_3_4; - break; - case CODE_RATE_5_6: - fe_tps->code_rate_LP = FEC_5_6; - break; - case CODE_RATE_7_8: - fe_tps->code_rate_LP = FEC_7_8; - break; - } - - /* extract guard interval */ - switch (as10x_tps->guard_interval) { - case GUARD_INT_1_32: - fe_tps->guard_interval = GUARD_INTERVAL_1_32; - break; - case GUARD_INT_1_16: - fe_tps->guard_interval = GUARD_INTERVAL_1_16; - break; - case GUARD_INT_1_8: - fe_tps->guard_interval = GUARD_INTERVAL_1_8; - break; - case GUARD_INT_1_4: - fe_tps->guard_interval = GUARD_INTERVAL_1_4; - break; - } - - /* extract transmission mode */ - switch (as10x_tps->transmission_mode) { - case TRANS_MODE_2K: - fe_tps->transmission_mode = TRANSMISSION_MODE_2K; - break; - case TRANS_MODE_8K: - fe_tps->transmission_mode = TRANSMISSION_MODE_8K; - break; - } -} - -static uint8_t as102_fe_get_code_rate(fe_code_rate_t arg) -{ - uint8_t c; - - switch (arg) { - case FEC_1_2: - c = CODE_RATE_1_2; - break; - case FEC_2_3: - c = CODE_RATE_2_3; - break; - case FEC_3_4: - c = CODE_RATE_3_4; - break; - case FEC_5_6: - c = CODE_RATE_5_6; - break; - case FEC_7_8: - c = CODE_RATE_7_8; - break; - default: - c = CODE_RATE_UNKNOWN; - break; - } - - return c; -} - -static void as102_fe_copy_tune_parameters(struct as10x_tune_args *tune_args, - struct dtv_frontend_properties *params) -{ - - /* set frequency */ - tune_args->freq = params->frequency / 1000; - - /* fix interleaving_mode */ - tune_args->interleaving_mode = INTLV_NATIVE; - - switch (params->bandwidth_hz) { - case 8000000: - tune_args->bandwidth = BW_8_MHZ; - break; - case 7000000: - tune_args->bandwidth = BW_7_MHZ; - break; - case 6000000: - tune_args->bandwidth = BW_6_MHZ; - break; - default: - tune_args->bandwidth = BW_8_MHZ; - } - - switch (params->guard_interval) { - case GUARD_INTERVAL_1_32: - tune_args->guard_interval = GUARD_INT_1_32; - break; - case GUARD_INTERVAL_1_16: - tune_args->guard_interval = GUARD_INT_1_16; - break; - case GUARD_INTERVAL_1_8: - tune_args->guard_interval = GUARD_INT_1_8; - break; - case GUARD_INTERVAL_1_4: - tune_args->guard_interval = GUARD_INT_1_4; - break; - case GUARD_INTERVAL_AUTO: - default: - tune_args->guard_interval = GUARD_UNKNOWN; - break; - } - - switch (params->modulation) { - case QPSK: - tune_args->modulation = CONST_QPSK; - break; - case QAM_16: - tune_args->modulation = CONST_QAM16; - break; - case QAM_64: - tune_args->modulation = CONST_QAM64; - break; - default: - tune_args->modulation = CONST_UNKNOWN; - break; - } - - switch (params->transmission_mode) { - case TRANSMISSION_MODE_2K: - tune_args->transmission_mode = TRANS_MODE_2K; - break; - case TRANSMISSION_MODE_8K: - tune_args->transmission_mode = TRANS_MODE_8K; - break; - default: - tune_args->transmission_mode = TRANS_MODE_UNKNOWN; - } - - switch (params->hierarchy) { - case HIERARCHY_NONE: - tune_args->hierarchy = HIER_NONE; - break; - case HIERARCHY_1: - tune_args->hierarchy = HIER_ALPHA_1; - break; - case HIERARCHY_2: - tune_args->hierarchy = HIER_ALPHA_2; - break; - case HIERARCHY_4: - tune_args->hierarchy = HIER_ALPHA_4; - break; - case HIERARCHY_AUTO: - tune_args->hierarchy = HIER_UNKNOWN; - break; - } - - dprintk(debug, "tuner parameters: freq: %d bw: 0x%02x gi: 0x%02x\n", - params->frequency, - tune_args->bandwidth, - tune_args->guard_interval); - - /* - * Detect a hierarchy selection - * if HP/LP are both set to FEC_NONE, HP will be selected. - */ - if ((tune_args->hierarchy != HIER_NONE) && - ((params->code_rate_LP == FEC_NONE) || - (params->code_rate_HP == FEC_NONE))) { - - if (params->code_rate_LP == FEC_NONE) { - tune_args->hier_select = HIER_HIGH_PRIORITY; - tune_args->code_rate = - as102_fe_get_code_rate(params->code_rate_HP); - } - - if (params->code_rate_HP == FEC_NONE) { - tune_args->hier_select = HIER_LOW_PRIORITY; - tune_args->code_rate = - as102_fe_get_code_rate(params->code_rate_LP); - } - - dprintk(debug, - "\thierarchy: 0x%02x selected: %s code_rate_%s: 0x%02x\n", - tune_args->hierarchy, - tune_args->hier_select == HIER_HIGH_PRIORITY ? - "HP" : "LP", - tune_args->hier_select == HIER_HIGH_PRIORITY ? - "HP" : "LP", - tune_args->code_rate); - } else { - tune_args->code_rate = - as102_fe_get_code_rate(params->code_rate_HP); - } -} diff --git a/drivers/staging/media/as102/as102_fw.c b/drivers/staging/media/as102/as102_fw.c deleted file mode 100644 index f33f752c0aad..000000000000 --- a/drivers/staging/media/as102/as102_fw.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Abilis Systems Single DVB-T Receiver - * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> - * Copyright (C) 2010 Devin Heitmueller <dheitmueller@kernellabs.com> - * - * 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, 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -#include <linux/kernel.h> -#include <linux/errno.h> -#include <linux/ctype.h> -#include <linux/delay.h> -#include <linux/firmware.h> - -#include "as102_drv.h" -#include "as102_fw.h" - -static const char as102_st_fw1[] = "as102_data1_st.hex"; -static const char as102_st_fw2[] = "as102_data2_st.hex"; -static const char as102_dt_fw1[] = "as102_data1_dt.hex"; -static const char as102_dt_fw2[] = "as102_data2_dt.hex"; - -static unsigned char atohx(unsigned char *dst, char *src) -{ - unsigned char value = 0; - - char msb = tolower(*src) - '0'; - char lsb = tolower(*(src + 1)) - '0'; - - if (msb > 9) - msb -= 7; - if (lsb > 9) - lsb -= 7; - - *dst = value = ((msb & 0xF) << 4) | (lsb & 0xF); - return value; -} - -/* - * Parse INTEL HEX firmware file to extract address and data. - */ -static int parse_hex_line(unsigned char *fw_data, unsigned char *addr, - unsigned char *data, int *dataLength, - unsigned char *addr_has_changed) { - - int count = 0; - unsigned char *src, dst; - - if (*fw_data++ != ':') { - pr_err("invalid firmware file\n"); - return -EFAULT; - } - - /* locate end of line */ - for (src = fw_data; *src != '\n'; src += 2) { - atohx(&dst, src); - /* parse line to split addr / data */ - switch (count) { - case 0: - *dataLength = dst; - break; - case 1: - addr[2] = dst; - break; - case 2: - addr[3] = dst; - break; - case 3: - /* check if data is an address */ - if (dst == 0x04) - *addr_has_changed = 1; - else - *addr_has_changed = 0; - break; - case 4: - case 5: - if (*addr_has_changed) - addr[(count - 4)] = dst; - else - data[(count - 4)] = dst; - break; - default: - data[(count - 4)] = dst; - break; - } - count++; - } - - /* return read value + ':' + '\n' */ - return (count * 2) + 2; -} - -static int as102_firmware_upload(struct as10x_bus_adapter_t *bus_adap, - unsigned char *cmd, - const struct firmware *firmware) { - - struct as10x_fw_pkt_t fw_pkt; - int total_read_bytes = 0, errno = 0; - unsigned char addr_has_changed = 0; - - for (total_read_bytes = 0; total_read_bytes < firmware->size; ) { - int read_bytes = 0, data_len = 0; - - /* parse intel hex line */ - read_bytes = parse_hex_line( - (u8 *) (firmware->data + total_read_bytes), - fw_pkt.raw.address, - fw_pkt.raw.data, - &data_len, - &addr_has_changed); - - if (read_bytes <= 0) - goto error; - - /* detect the end of file */ - total_read_bytes += read_bytes; - if (total_read_bytes == firmware->size) { - fw_pkt.u.request[0] = 0x00; - fw_pkt.u.request[1] = 0x03; - - /* send EOF command */ - errno = bus_adap->ops->upload_fw_pkt(bus_adap, - (uint8_t *) - &fw_pkt, 2, 0); - if (errno < 0) - goto error; - } else { - if (!addr_has_changed) { - /* prepare command to send */ - fw_pkt.u.request[0] = 0x00; - fw_pkt.u.request[1] = 0x01; - - data_len += sizeof(fw_pkt.u.request); - data_len += sizeof(fw_pkt.raw.address); - - /* send cmd to device */ - errno = bus_adap->ops->upload_fw_pkt(bus_adap, - (uint8_t *) - &fw_pkt, - data_len, - 0); - if (errno < 0) - goto error; - } - } - } -error: - return (errno == 0) ? total_read_bytes : errno; -} - -int as102_fw_upload(struct as10x_bus_adapter_t *bus_adap) -{ - int errno = -EFAULT; - const struct firmware *firmware = NULL; - unsigned char *cmd_buf = NULL; - const char *fw1, *fw2; - struct usb_device *dev = bus_adap->usb_dev; - - /* select fw file to upload */ - if (dual_tuner) { - fw1 = as102_dt_fw1; - fw2 = as102_dt_fw2; - } else { - fw1 = as102_st_fw1; - fw2 = as102_st_fw2; - } - - /* allocate buffer to store firmware upload command and data */ - cmd_buf = kzalloc(MAX_FW_PKT_SIZE, GFP_KERNEL); - if (cmd_buf == NULL) { - errno = -ENOMEM; - goto error; - } - - /* request kernel to locate firmware file: part1 */ - errno = request_firmware(&firmware, fw1, &dev->dev); - if (errno < 0) { - pr_err("%s: unable to locate firmware file: %s\n", - DRIVER_NAME, fw1); - goto error; - } - - /* initiate firmware upload */ - errno = as102_firmware_upload(bus_adap, cmd_buf, firmware); - if (errno < 0) { - pr_err("%s: error during firmware upload part1\n", - DRIVER_NAME); - goto error; - } - - pr_info("%s: firmware: %s loaded with success\n", - DRIVER_NAME, fw1); - release_firmware(firmware); - - /* wait for boot to complete */ - mdelay(100); - - /* request kernel to locate firmware file: part2 */ - errno = request_firmware(&firmware, fw2, &dev->dev); - if (errno < 0) { - pr_err("%s: unable to locate firmware file: %s\n", - DRIVER_NAME, fw2); - goto error; - } - - /* initiate firmware upload */ - errno = as102_firmware_upload(bus_adap, cmd_buf, firmware); - if (errno < 0) { - pr_err("%s: error during firmware upload part2\n", - DRIVER_NAME); - goto error; - } - - pr_info("%s: firmware: %s loaded with success\n", - DRIVER_NAME, fw2); -error: - kfree(cmd_buf); - release_firmware(firmware); - - return errno; -} diff --git a/drivers/staging/media/as102/as102_fw.h b/drivers/staging/media/as102/as102_fw.h deleted file mode 100644 index 4bfc6849d95a..000000000000 --- a/drivers/staging/media/as102/as102_fw.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Abilis Systems Single DVB-T Receiver - * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> - * - * 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, 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -#define MAX_FW_PKT_SIZE 64 - -extern int dual_tuner; - -struct as10x_raw_fw_pkt { - unsigned char address[4]; - unsigned char data[MAX_FW_PKT_SIZE - 6]; -} __packed; - -struct as10x_fw_pkt_t { - union { - unsigned char request[2]; - unsigned char length[2]; - } __packed u; - struct as10x_raw_fw_pkt raw; -} __packed; - -#ifdef __KERNEL__ -int as102_fw_upload(struct as10x_bus_adapter_t *bus_adap); -#endif diff --git a/drivers/staging/media/as102/as102_usb_drv.c b/drivers/staging/media/as102/as102_usb_drv.c deleted file mode 100644 index e6f6278e97d6..000000000000 --- a/drivers/staging/media/as102/as102_usb_drv.c +++ /dev/null @@ -1,472 +0,0 @@ -/* - * Abilis Systems Single DVB-T Receiver - * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> - * Copyright (C) 2010 Devin Heitmueller <dheitmueller@kernellabs.com> - * - * 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, 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -#include <linux/kernel.h> -#include <linux/errno.h> -#include <linux/slab.h> -#include <linux/mm.h> -#include <linux/usb.h> - -#include "as102_drv.h" -#include "as102_usb_drv.h" -#include "as102_fw.h" - -static void as102_usb_disconnect(struct usb_interface *interface); -static int as102_usb_probe(struct usb_interface *interface, - const struct usb_device_id *id); - -static int as102_usb_start_stream(struct as102_dev_t *dev); -static void as102_usb_stop_stream(struct as102_dev_t *dev); - -static int as102_open(struct inode *inode, struct file *file); -static int as102_release(struct inode *inode, struct file *file); - -static struct usb_device_id as102_usb_id_table[] = { - { USB_DEVICE(AS102_USB_DEVICE_VENDOR_ID, AS102_USB_DEVICE_PID_0001) }, - { USB_DEVICE(PCTV_74E_USB_VID, PCTV_74E_USB_PID) }, - { USB_DEVICE(ELGATO_EYETV_DTT_USB_VID, ELGATO_EYETV_DTT_USB_PID) }, - { USB_DEVICE(NBOX_DVBT_DONGLE_USB_VID, NBOX_DVBT_DONGLE_USB_PID) }, - { USB_DEVICE(SKY_IT_DIGITAL_KEY_USB_VID, SKY_IT_DIGITAL_KEY_USB_PID) }, - { } /* Terminating entry */ -}; - -/* Note that this table must always have the same number of entries as the - as102_usb_id_table struct */ -static const char * const as102_device_names[] = { - AS102_REFERENCE_DESIGN, - AS102_PCTV_74E, - AS102_ELGATO_EYETV_DTT_NAME, - AS102_NBOX_DVBT_DONGLE_NAME, - AS102_SKY_IT_DIGITAL_KEY_NAME, - NULL /* Terminating entry */ -}; - -/* eLNA configuration: devices built on the reference design work best - with 0xA0, while custom designs seem to require 0xC0 */ -static uint8_t const as102_elna_cfg[] = { - 0xA0, - 0xC0, - 0xC0, - 0xA0, - 0xA0, - 0x00 /* Terminating entry */ -}; - -struct usb_driver as102_usb_driver = { - .name = DRIVER_FULL_NAME, - .probe = as102_usb_probe, - .disconnect = as102_usb_disconnect, - .id_table = as102_usb_id_table -}; - -static const struct file_operations as102_dev_fops = { - .owner = THIS_MODULE, - .open = as102_open, - .release = as102_release, -}; - -static struct usb_class_driver as102_usb_class_driver = { - .name = "aton2-%d", - .fops = &as102_dev_fops, - .minor_base = AS102_DEVICE_MAJOR, -}; - -static int as102_usb_xfer_cmd(struct as10x_bus_adapter_t *bus_adap, - unsigned char *send_buf, int send_buf_len, - unsigned char *recv_buf, int recv_buf_len) -{ - int ret = 0; - - if (send_buf != NULL) { - ret = usb_control_msg(bus_adap->usb_dev, - usb_sndctrlpipe(bus_adap->usb_dev, 0), - AS102_USB_DEVICE_TX_CTRL_CMD, - USB_DIR_OUT | USB_TYPE_VENDOR | - USB_RECIP_DEVICE, - bus_adap->cmd_xid, /* value */ - 0, /* index */ - send_buf, send_buf_len, - USB_CTRL_SET_TIMEOUT /* 200 */); - if (ret < 0) { - dprintk(debug, "usb_control_msg(send) failed, err %i\n", - ret); - return ret; - } - - if (ret != send_buf_len) { - dprintk(debug, "only wrote %d of %d bytes\n", - ret, send_buf_len); - return -1; - } - } - - if (recv_buf != NULL) { -#ifdef TRACE - dprintk(debug, "want to read: %d bytes\n", recv_buf_len); -#endif - ret = usb_control_msg(bus_adap->usb_dev, - usb_rcvctrlpipe(bus_adap->usb_dev, 0), - AS102_USB_DEVICE_RX_CTRL_CMD, - USB_DIR_IN | USB_TYPE_VENDOR | - USB_RECIP_DEVICE, - bus_adap->cmd_xid, /* value */ - 0, /* index */ - recv_buf, recv_buf_len, - USB_CTRL_GET_TIMEOUT /* 200 */); - if (ret < 0) { - dprintk(debug, "usb_control_msg(recv) failed, err %i\n", - ret); - return ret; - } -#ifdef TRACE - dprintk(debug, "read %d bytes\n", recv_buf_len); -#endif - } - - return ret; -} - -static int as102_send_ep1(struct as10x_bus_adapter_t *bus_adap, - unsigned char *send_buf, - int send_buf_len, - int swap32) -{ - int ret = 0, actual_len; - - ret = usb_bulk_msg(bus_adap->usb_dev, - usb_sndbulkpipe(bus_adap->usb_dev, 1), - send_buf, send_buf_len, &actual_len, 200); - if (ret) { - dprintk(debug, "usb_bulk_msg(send) failed, err %i\n", ret); - return ret; - } - - if (actual_len != send_buf_len) { - dprintk(debug, "only wrote %d of %d bytes\n", - actual_len, send_buf_len); - return -1; - } - return ret ? ret : actual_len; -} - -static int as102_read_ep2(struct as10x_bus_adapter_t *bus_adap, - unsigned char *recv_buf, int recv_buf_len) -{ - int ret = 0, actual_len; - - if (recv_buf == NULL) - return -EINVAL; - - ret = usb_bulk_msg(bus_adap->usb_dev, - usb_rcvbulkpipe(bus_adap->usb_dev, 2), - recv_buf, recv_buf_len, &actual_len, 200); - if (ret) { - dprintk(debug, "usb_bulk_msg(recv) failed, err %i\n", ret); - return ret; - } - - if (actual_len != recv_buf_len) { - dprintk(debug, "only read %d of %d bytes\n", - actual_len, recv_buf_len); - return -1; - } - return ret ? ret : actual_len; -} - -static struct as102_priv_ops_t as102_priv_ops = { - .upload_fw_pkt = as102_send_ep1, - .xfer_cmd = as102_usb_xfer_cmd, - .as102_read_ep2 = as102_read_ep2, - .start_stream = as102_usb_start_stream, - .stop_stream = as102_usb_stop_stream, -}; - -static int as102_submit_urb_stream(struct as102_dev_t *dev, struct urb *urb) -{ - int err; - - usb_fill_bulk_urb(urb, - dev->bus_adap.usb_dev, - usb_rcvbulkpipe(dev->bus_adap.usb_dev, 0x2), - urb->transfer_buffer, - AS102_USB_BUF_SIZE, - as102_urb_stream_irq, - dev); - - err = usb_submit_urb(urb, GFP_ATOMIC); - if (err) - dprintk(debug, "%s: usb_submit_urb failed\n", __func__); - - return err; -} - -void as102_urb_stream_irq(struct urb *urb) -{ - struct as102_dev_t *as102_dev = urb->context; - - if (urb->actual_length > 0) { - dvb_dmx_swfilter(&as102_dev->dvb_dmx, - urb->transfer_buffer, - urb->actual_length); - } else { - if (urb->actual_length == 0) - memset(urb->transfer_buffer, 0, AS102_USB_BUF_SIZE); - } - - /* is not stopped, re-submit urb */ - if (as102_dev->streaming) - as102_submit_urb_stream(as102_dev, urb); -} - -static void as102_free_usb_stream_buffer(struct as102_dev_t *dev) -{ - int i; - - for (i = 0; i < MAX_STREAM_URB; i++) - usb_free_urb(dev->stream_urb[i]); - - usb_free_coherent(dev->bus_adap.usb_dev, - MAX_STREAM_URB * AS102_USB_BUF_SIZE, - dev->stream, - dev->dma_addr); -} - -static int as102_alloc_usb_stream_buffer(struct as102_dev_t *dev) -{ - int i; - - dev->stream = usb_alloc_coherent(dev->bus_adap.usb_dev, - MAX_STREAM_URB * AS102_USB_BUF_SIZE, - GFP_KERNEL, - &dev->dma_addr); - if (!dev->stream) { - dprintk(debug, "%s: usb_buffer_alloc failed\n", __func__); - return -ENOMEM; - } - - memset(dev->stream, 0, MAX_STREAM_URB * AS102_USB_BUF_SIZE); - - /* init urb buffers */ - for (i = 0; i < MAX_STREAM_URB; i++) { - struct urb *urb; - - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (urb == NULL) { - dprintk(debug, "%s: usb_alloc_urb failed\n", __func__); - as102_free_usb_stream_buffer(dev); - return -ENOMEM; - } - - urb->transfer_buffer = dev->stream + (i * AS102_USB_BUF_SIZE); - urb->transfer_dma = dev->dma_addr + (i * AS102_USB_BUF_SIZE); - urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; - urb->transfer_buffer_length = AS102_USB_BUF_SIZE; - - dev->stream_urb[i] = urb; - } - return 0; -} - -static void as102_usb_stop_stream(struct as102_dev_t *dev) -{ - int i; - - for (i = 0; i < MAX_STREAM_URB; i++) - usb_kill_urb(dev->stream_urb[i]); -} - -static int as102_usb_start_stream(struct as102_dev_t *dev) -{ - int i, ret = 0; - - for (i = 0; i < MAX_STREAM_URB; i++) { - ret = as102_submit_urb_stream(dev, dev->stream_urb[i]); - if (ret) { - as102_usb_stop_stream(dev); - return ret; - } - } - - return 0; -} - -static void as102_usb_release(struct kref *kref) -{ - struct as102_dev_t *as102_dev; - - as102_dev = container_of(kref, struct as102_dev_t, kref); - if (as102_dev != NULL) { - usb_put_dev(as102_dev->bus_adap.usb_dev); - kfree(as102_dev); - } -} - -static void as102_usb_disconnect(struct usb_interface *intf) -{ - struct as102_dev_t *as102_dev; - - /* extract as102_dev_t from usb_device private data */ - as102_dev = usb_get_intfdata(intf); - - /* unregister dvb layer */ - as102_dvb_unregister(as102_dev); - - /* free usb buffers */ - as102_free_usb_stream_buffer(as102_dev); - - usb_set_intfdata(intf, NULL); - - /* usb unregister device */ - usb_deregister_dev(intf, &as102_usb_class_driver); - - /* decrement usage counter */ - kref_put(&as102_dev->kref, as102_usb_release); - - pr_info("%s: device has been disconnected\n", DRIVER_NAME); -} - -static int as102_usb_probe(struct usb_interface *intf, - const struct usb_device_id *id) -{ - int ret; - struct as102_dev_t *as102_dev; - int i; - - /* This should never actually happen */ - if (ARRAY_SIZE(as102_usb_id_table) != - (sizeof(as102_device_names) / sizeof(const char *))) { - pr_err("Device names table invalid size"); - return -EINVAL; - } - - as102_dev = kzalloc(sizeof(struct as102_dev_t), GFP_KERNEL); - if (as102_dev == NULL) - return -ENOMEM; - - /* Assign the user-friendly device name */ - for (i = 0; i < ARRAY_SIZE(as102_usb_id_table); i++) { - if (id == &as102_usb_id_table[i]) { - as102_dev->name = as102_device_names[i]; - as102_dev->elna_cfg = as102_elna_cfg[i]; - } - } - - if (as102_dev->name == NULL) - as102_dev->name = "Unknown AS102 device"; - - /* set private callback functions */ - as102_dev->bus_adap.ops = &as102_priv_ops; - - /* init cmd token for usb bus */ - as102_dev->bus_adap.cmd = &as102_dev->bus_adap.token.usb.c; - as102_dev->bus_adap.rsp = &as102_dev->bus_adap.token.usb.r; - - /* init kernel device reference */ - kref_init(&as102_dev->kref); - - /* store as102 device to usb_device private data */ - usb_set_intfdata(intf, (void *) as102_dev); - - /* store in as102 device the usb_device pointer */ - as102_dev->bus_adap.usb_dev = usb_get_dev(interface_to_usbdev(intf)); - - /* we can register the device now, as it is ready */ - ret = usb_register_dev(intf, &as102_usb_class_driver); - if (ret < 0) { - /* something prevented us from registering this driver */ - dev_err(&intf->dev, - "%s: usb_register_dev() failed (errno = %d)\n", - __func__, ret); - goto failed; - } - - pr_info("%s: device has been detected\n", DRIVER_NAME); - - /* request buffer allocation for streaming */ - ret = as102_alloc_usb_stream_buffer(as102_dev); - if (ret != 0) - goto failed_stream; - - /* register dvb layer */ - ret = as102_dvb_register(as102_dev); - if (ret != 0) - goto failed_dvb; - - return ret; - -failed_dvb: - as102_free_usb_stream_buffer(as102_dev); -failed_stream: - usb_deregister_dev(intf, &as102_usb_class_driver); -failed: - usb_put_dev(as102_dev->bus_adap.usb_dev); - usb_set_intfdata(intf, NULL); - kfree(as102_dev); - return ret; -} - -static int as102_open(struct inode *inode, struct file *file) -{ - int ret = 0, minor = 0; - struct usb_interface *intf = NULL; - struct as102_dev_t *dev = NULL; - - /* read minor from inode */ - minor = iminor(inode); - - /* fetch device from usb interface */ - intf = usb_find_interface(&as102_usb_driver, minor); - if (intf == NULL) { - pr_err("%s: can't find device for minor %d\n", - __func__, minor); - ret = -ENODEV; - goto exit; - } - - /* get our device */ - dev = usb_get_intfdata(intf); - if (dev == NULL) { - ret = -EFAULT; - goto exit; - } - - /* save our device object in the file's private structure */ - file->private_data = dev; - - /* increment our usage count for the device */ - kref_get(&dev->kref); - -exit: - return ret; -} - -static int as102_release(struct inode *inode, struct file *file) -{ - struct as102_dev_t *dev = NULL; - - dev = file->private_data; - if (dev != NULL) { - /* decrement the count on our device */ - kref_put(&dev->kref, as102_usb_release); - } - - return 0; -} - -MODULE_DEVICE_TABLE(usb, as102_usb_id_table); diff --git a/drivers/staging/media/as102/as102_usb_drv.h b/drivers/staging/media/as102/as102_usb_drv.h deleted file mode 100644 index 1ad1ec52b11e..000000000000 --- a/drivers/staging/media/as102/as102_usb_drv.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Abilis Systems Single DVB-T Receiver - * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> - * Copyright (C) 2010 Devin Heitmueller <dheitmueller@kernellabs.com> - * - * 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, 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -#ifndef _AS102_USB_DRV_H_ -#define _AS102_USB_DRV_H_ - -#define AS102_USB_DEVICE_TX_CTRL_CMD 0xF1 -#define AS102_USB_DEVICE_RX_CTRL_CMD 0xF2 - -/* define these values to match the supported devices */ - -/* Abilis system: "TITAN" */ -#define AS102_REFERENCE_DESIGN "Abilis Systems DVB-Titan" -#define AS102_USB_DEVICE_VENDOR_ID 0x1BA6 -#define AS102_USB_DEVICE_PID_0001 0x0001 - -/* PCTV Systems: PCTV picoStick (74e) */ -#define AS102_PCTV_74E "PCTV Systems picoStick (74e)" -#define PCTV_74E_USB_VID 0x2013 -#define PCTV_74E_USB_PID 0x0246 - -/* Elgato: EyeTV DTT Deluxe */ -#define AS102_ELGATO_EYETV_DTT_NAME "Elgato EyeTV DTT Deluxe" -#define ELGATO_EYETV_DTT_USB_VID 0x0fd9 -#define ELGATO_EYETV_DTT_USB_PID 0x002c - -/* nBox: nBox DVB-T Dongle */ -#define AS102_NBOX_DVBT_DONGLE_NAME "nBox DVB-T Dongle" -#define NBOX_DVBT_DONGLE_USB_VID 0x0b89 -#define NBOX_DVBT_DONGLE_USB_PID 0x0007 - -/* Sky Italia: Digital Key (green led) */ -#define AS102_SKY_IT_DIGITAL_KEY_NAME "Sky IT Digital Key (green led)" -#define SKY_IT_DIGITAL_KEY_USB_VID 0x2137 -#define SKY_IT_DIGITAL_KEY_USB_PID 0x0001 - -void as102_urb_stream_irq(struct urb *urb); - -struct as10x_usb_token_cmd_t { - /* token cmd */ - struct as10x_cmd_t c; - /* token response */ - struct as10x_cmd_t r; -}; -#endif diff --git a/drivers/staging/media/as102/as10x_cmd.c b/drivers/staging/media/as102/as10x_cmd.c deleted file mode 100644 index 9e49f15a7c9f..000000000000 --- a/drivers/staging/media/as102/as10x_cmd.c +++ /dev/null @@ -1,418 +0,0 @@ -/* - * Abilis Systems Single DVB-T Receiver - * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> - * Copyright (C) 2010 Devin Heitmueller <dheitmueller@kernellabs.com> - * - * 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, 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include <linux/kernel.h> -#include "as102_drv.h" -#include "as10x_types.h" -#include "as10x_cmd.h" - -/** - * as10x_cmd_turn_on - send turn on command to AS10x - * @adap: pointer to AS10x bus adapter - * - * Return 0 when no error, < 0 in case of error. - */ -int as10x_cmd_turn_on(struct as10x_bus_adapter_t *adap) -{ - int error = AS10X_CMD_ERROR; - struct as10x_cmd_t *pcmd, *prsp; - - pcmd = adap->cmd; - prsp = adap->rsp; - - /* prepare command */ - as10x_cmd_build(pcmd, (++adap->cmd_xid), - sizeof(pcmd->body.turn_on.req)); - - /* fill command */ - pcmd->body.turn_on.req.proc_id = cpu_to_le16(CONTROL_PROC_TURNON); - - /* send command */ - if (adap->ops->xfer_cmd) { - error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd, - sizeof(pcmd->body.turn_on.req) + - HEADER_SIZE, - (uint8_t *) prsp, - sizeof(prsp->body.turn_on.rsp) + - HEADER_SIZE); - } - - if (error < 0) - goto out; - - /* parse response */ - error = as10x_rsp_parse(prsp, CONTROL_PROC_TURNON_RSP); - -out: - return error; -} - -/** - * as10x_cmd_turn_off - send turn off command to AS10x - * @adap: pointer to AS10x bus adapter - * - * Return 0 on success or negative value in case of error. - */ -int as10x_cmd_turn_off(struct as10x_bus_adapter_t *adap) -{ - int error = AS10X_CMD_ERROR; - struct as10x_cmd_t *pcmd, *prsp; - - pcmd = adap->cmd; - prsp = adap->rsp; - - /* prepare command */ - as10x_cmd_build(pcmd, (++adap->cmd_xid), - sizeof(pcmd->body.turn_off.req)); - - /* fill command */ - pcmd->body.turn_off.req.proc_id = cpu_to_le16(CONTROL_PROC_TURNOFF); - - /* send command */ - if (adap->ops->xfer_cmd) { - error = adap->ops->xfer_cmd( - adap, (uint8_t *) pcmd, - sizeof(pcmd->body.turn_off.req) + HEADER_SIZE, - (uint8_t *) prsp, - sizeof(prsp->body.turn_off.rsp) + HEADER_SIZE); - } - - if (error < 0) - goto out; - - /* parse response */ - error = as10x_rsp_parse(prsp, CONTROL_PROC_TURNOFF_RSP); - -out: - return error; -} - -/** - * as10x_cmd_set_tune - send set tune command to AS10x - * @adap: pointer to AS10x bus adapter - * @ptune: tune parameters - * - * Return 0 on success or negative value in case of error. - */ -int as10x_cmd_set_tune(struct as10x_bus_adapter_t *adap, - struct as10x_tune_args *ptune) -{ - int error = AS10X_CMD_ERROR; - struct as10x_cmd_t *preq, *prsp; - - preq = adap->cmd; - prsp = adap->rsp; - - /* prepare command */ - as10x_cmd_build(preq, (++adap->cmd_xid), - sizeof(preq->body.set_tune.req)); - - /* fill command */ - preq->body.set_tune.req.proc_id = cpu_to_le16(CONTROL_PROC_SETTUNE); - preq->body.set_tune.req.args.freq = cpu_to_le32(ptune->freq); - preq->body.set_tune.req.args.bandwidth = ptune->bandwidth; - preq->body.set_tune.req.args.hier_select = ptune->hier_select; - preq->body.set_tune.req.args.modulation = ptune->modulation; - preq->body.set_tune.req.args.hierarchy = ptune->hierarchy; - preq->body.set_tune.req.args.interleaving_mode = - ptune->interleaving_mode; - preq->body.set_tune.req.args.code_rate = ptune->code_rate; - preq->body.set_tune.req.args.guard_interval = ptune->guard_interval; - preq->body.set_tune.req.args.transmission_mode = - ptune->transmission_mode; - - /* send command */ - if (adap->ops->xfer_cmd) { - error = adap->ops->xfer_cmd(adap, - (uint8_t *) preq, - sizeof(preq->body.set_tune.req) - + HEADER_SIZE, - (uint8_t *) prsp, - sizeof(prsp->body.set_tune.rsp) - + HEADER_SIZE); - } - - if (error < 0) - goto out; - - /* parse response */ - error = as10x_rsp_parse(prsp, CONTROL_PROC_SETTUNE_RSP); - -out: - return error; -} - -/** - * as10x_cmd_get_tune_status - send get tune status command to AS10x - * @adap: pointer to AS10x bus adapter - * @pstatus: pointer to updated status structure of the current tune - * - * Return 0 on success or negative value in case of error. - */ -int as10x_cmd_get_tune_status(struct as10x_bus_adapter_t *adap, - struct as10x_tune_status *pstatus) -{ - int error = AS10X_CMD_ERROR; - struct as10x_cmd_t *preq, *prsp; - - preq = adap->cmd; - prsp = adap->rsp; - - /* prepare command */ - as10x_cmd_build(preq, (++adap->cmd_xid), - sizeof(preq->body.get_tune_status.req)); - - /* fill command */ - preq->body.get_tune_status.req.proc_id = - cpu_to_le16(CONTROL_PROC_GETTUNESTAT); - - /* send command */ - if (adap->ops->xfer_cmd) { - error = adap->ops->xfer_cmd( - adap, - (uint8_t *) preq, - sizeof(preq->body.get_tune_status.req) + HEADER_SIZE, - (uint8_t *) prsp, - sizeof(prsp->body.get_tune_status.rsp) + HEADER_SIZE); - } - - if (error < 0) - goto out; - - /* parse response */ - error = as10x_rsp_parse(prsp, CONTROL_PROC_GETTUNESTAT_RSP); - if (error < 0) - goto out; - - /* Response OK -> get response data */ - pstatus->tune_state = prsp->body.get_tune_status.rsp.sts.tune_state; - pstatus->signal_strength = - le16_to_cpu(prsp->body.get_tune_status.rsp.sts.signal_strength); - pstatus->PER = le16_to_cpu(prsp->body.get_tune_status.rsp.sts.PER); - pstatus->BER = le16_to_cpu(prsp->body.get_tune_status.rsp.sts.BER); - -out: - return error; -} - -/** - * as10x_cmd_get_tps - send get TPS command to AS10x - * @adap: pointer to AS10x handle - * @ptps: pointer to TPS parameters structure - * - * Return 0 on success or negative value in case of error. - */ -int as10x_cmd_get_tps(struct as10x_bus_adapter_t *adap, struct as10x_tps *ptps) -{ - int error = AS10X_CMD_ERROR; - struct as10x_cmd_t *pcmd, *prsp; - - pcmd = adap->cmd; - prsp = adap->rsp; - - /* prepare command */ - as10x_cmd_build(pcmd, (++adap->cmd_xid), - sizeof(pcmd->body.get_tps.req)); - - /* fill command */ - pcmd->body.get_tune_status.req.proc_id = - cpu_to_le16(CONTROL_PROC_GETTPS); - - /* send command */ - if (adap->ops->xfer_cmd) { - error = adap->ops->xfer_cmd(adap, - (uint8_t *) pcmd, - sizeof(pcmd->body.get_tps.req) + - HEADER_SIZE, - (uint8_t *) prsp, - sizeof(prsp->body.get_tps.rsp) + - HEADER_SIZE); - } - - if (error < 0) - goto out; - - /* parse response */ - error = as10x_rsp_parse(prsp, CONTROL_PROC_GETTPS_RSP); - if (error < 0) - goto out; - - /* Response OK -> get response data */ - ptps->modulation = prsp->body.get_tps.rsp.tps.modulation; - ptps->hierarchy = prsp->body.get_tps.rsp.tps.hierarchy; - ptps->interleaving_mode = prsp->body.get_tps.rsp.tps.interleaving_mode; - ptps->code_rate_HP = prsp->body.get_tps.rsp.tps.code_rate_HP; - ptps->code_rate_LP = prsp->body.get_tps.rsp.tps.code_rate_LP; - ptps->guard_interval = prsp->body.get_tps.rsp.tps.guard_interval; - ptps->transmission_mode = prsp->body.get_tps.rsp.tps.transmission_mode; - ptps->DVBH_mask_HP = prsp->body.get_tps.rsp.tps.DVBH_mask_HP; - ptps->DVBH_mask_LP = prsp->body.get_tps.rsp.tps.DVBH_mask_LP; - ptps->cell_ID = le16_to_cpu(prsp->body.get_tps.rsp.tps.cell_ID); - -out: - return error; -} - -/** - * as10x_cmd_get_demod_stats - send get demod stats command to AS10x - * @adap: pointer to AS10x bus adapter - * @pdemod_stats: pointer to demod stats parameters structure - * - * Return 0 on success or negative value in case of error. - */ -int as10x_cmd_get_demod_stats(struct as10x_bus_adapter_t *adap, - struct as10x_demod_stats *pdemod_stats) -{ - int error = AS10X_CMD_ERROR; - struct as10x_cmd_t *pcmd, *prsp; - - pcmd = adap->cmd; - prsp = adap->rsp; - - /* prepare command */ - as10x_cmd_build(pcmd, (++adap->cmd_xid), - sizeof(pcmd->body.get_demod_stats.req)); - - /* fill command */ - pcmd->body.get_demod_stats.req.proc_id = - cpu_to_le16(CONTROL_PROC_GET_DEMOD_STATS); - - /* send command */ - if (adap->ops->xfer_cmd) { - error = adap->ops->xfer_cmd(adap, - (uint8_t *) pcmd, - sizeof(pcmd->body.get_demod_stats.req) - + HEADER_SIZE, - (uint8_t *) prsp, - sizeof(prsp->body.get_demod_stats.rsp) - + HEADER_SIZE); - } - - if (error < 0) - goto out; - - /* parse response */ - error = as10x_rsp_parse(prsp, CONTROL_PROC_GET_DEMOD_STATS_RSP); - if (error < 0) - goto out; - - /* Response OK -> get response data */ - pdemod_stats->frame_count = - le32_to_cpu(prsp->body.get_demod_stats.rsp.stats.frame_count); - pdemod_stats->bad_frame_count = - le32_to_cpu(prsp->body.get_demod_stats.rsp.stats.bad_frame_count); - pdemod_stats->bytes_fixed_by_rs = - le32_to_cpu(prsp->body.get_demod_stats.rsp.stats.bytes_fixed_by_rs); - pdemod_stats->mer = - le16_to_cpu(prsp->body.get_demod_stats.rsp.stats.mer); - pdemod_stats->has_started = - prsp->body.get_demod_stats.rsp.stats.has_started; - -out: - return error; -} - -/** - * as10x_cmd_get_impulse_resp - send get impulse response command to AS10x - * @adap: pointer to AS10x bus adapter - * @is_ready: pointer to value indicating when impulse - * response data is ready - * - * Return 0 on success or negative value in case of error. - */ -int as10x_cmd_get_impulse_resp(struct as10x_bus_adapter_t *adap, - uint8_t *is_ready) -{ - int error = AS10X_CMD_ERROR; - struct as10x_cmd_t *pcmd, *prsp; - - pcmd = adap->cmd; - prsp = adap->rsp; - - /* prepare command */ - as10x_cmd_build(pcmd, (++adap->cmd_xid), - sizeof(pcmd->body.get_impulse_rsp.req)); - - /* fill command */ - pcmd->body.get_impulse_rsp.req.proc_id = - cpu_to_le16(CONTROL_PROC_GET_IMPULSE_RESP); - - /* send command */ - if (adap->ops->xfer_cmd) { - error = adap->ops->xfer_cmd(adap, - (uint8_t *) pcmd, - sizeof(pcmd->body.get_impulse_rsp.req) - + HEADER_SIZE, - (uint8_t *) prsp, - sizeof(prsp->body.get_impulse_rsp.rsp) - + HEADER_SIZE); - } - - if (error < 0) - goto out; - - /* parse response */ - error = as10x_rsp_parse(prsp, CONTROL_PROC_GET_IMPULSE_RESP_RSP); - if (error < 0) - goto out; - - /* Response OK -> get response data */ - *is_ready = prsp->body.get_impulse_rsp.rsp.is_ready; - -out: - return error; -} - -/** - * as10x_cmd_build - build AS10x command header - * @pcmd: pointer to AS10x command buffer - * @xid: sequence id of the command - * @cmd_len: length of the command - */ -void as10x_cmd_build(struct as10x_cmd_t *pcmd, - uint16_t xid, uint16_t cmd_len) -{ - pcmd->header.req_id = cpu_to_le16(xid); - pcmd->header.prog = cpu_to_le16(SERVICE_PROG_ID); - pcmd->header.version = cpu_to_le16(SERVICE_PROG_VERSION); - pcmd->header.data_len = cpu_to_le16(cmd_len); -} - -/** - * as10x_rsp_parse - Parse command response - * @prsp: pointer to AS10x command buffer - * @proc_id: id of the command - * - * Return 0 on success or negative value in case of error. - */ -int as10x_rsp_parse(struct as10x_cmd_t *prsp, uint16_t proc_id) -{ - int error; - - /* extract command error code */ - error = prsp->body.common.rsp.error; - - if ((error == 0) && - (le16_to_cpu(prsp->body.common.rsp.proc_id) == proc_id)) { - return 0; - } - - return AS10X_CMD_ERROR; -} diff --git a/drivers/staging/media/as102/as10x_cmd.h b/drivers/staging/media/as102/as10x_cmd.h deleted file mode 100644 index e21ec6c702a9..000000000000 --- a/drivers/staging/media/as102/as10x_cmd.h +++ /dev/null @@ -1,529 +0,0 @@ -/* - * Abilis Systems Single DVB-T Receiver - * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> - * - * 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, 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -#ifndef _AS10X_CMD_H_ -#define _AS10X_CMD_H_ - -#ifdef __KERNEL__ -#include <linux/kernel.h> -#endif - -#include "as10x_types.h" - -/*********************************/ -/* MACRO DEFINITIONS */ -/*********************************/ -#define AS10X_CMD_ERROR -1 - -#define SERVICE_PROG_ID 0x0002 -#define SERVICE_PROG_VERSION 0x0001 - -#define HIER_NONE 0x00 -#define HIER_LOW_PRIORITY 0x01 - -#define HEADER_SIZE (sizeof(struct as10x_cmd_header_t)) - -/* context request types */ -#define GET_CONTEXT_DATA 1 -#define SET_CONTEXT_DATA 2 - -/* ODSP suspend modes */ -#define CFG_MODE_ODSP_RESUME 0 -#define CFG_MODE_ODSP_SUSPEND 1 - -/* Dump memory size */ -#define DUMP_BLOCK_SIZE_MAX 0x20 - -/*********************************/ -/* TYPE DEFINITION */ -/*********************************/ -enum control_proc { - CONTROL_PROC_TURNON = 0x0001, - CONTROL_PROC_TURNON_RSP = 0x0100, - CONTROL_PROC_SET_REGISTER = 0x0002, - CONTROL_PROC_SET_REGISTER_RSP = 0x0200, - CONTROL_PROC_GET_REGISTER = 0x0003, - CONTROL_PROC_GET_REGISTER_RSP = 0x0300, - CONTROL_PROC_SETTUNE = 0x000A, - CONTROL_PROC_SETTUNE_RSP = 0x0A00, - CONTROL_PROC_GETTUNESTAT = 0x000B, - CONTROL_PROC_GETTUNESTAT_RSP = 0x0B00, - CONTROL_PROC_GETTPS = 0x000D, - CONTROL_PROC_GETTPS_RSP = 0x0D00, - CONTROL_PROC_SETFILTER = 0x000E, - CONTROL_PROC_SETFILTER_RSP = 0x0E00, - CONTROL_PROC_REMOVEFILTER = 0x000F, - CONTROL_PROC_REMOVEFILTER_RSP = 0x0F00, - CONTROL_PROC_GET_IMPULSE_RESP = 0x0012, - CONTROL_PROC_GET_IMPULSE_RESP_RSP = 0x1200, - CONTROL_PROC_START_STREAMING = 0x0013, - CONTROL_PROC_START_STREAMING_RSP = 0x1300, - CONTROL_PROC_STOP_STREAMING = 0x0014, - CONTROL_PROC_STOP_STREAMING_RSP = 0x1400, - CONTROL_PROC_GET_DEMOD_STATS = 0x0015, - CONTROL_PROC_GET_DEMOD_STATS_RSP = 0x1500, - CONTROL_PROC_ELNA_CHANGE_MODE = 0x0016, - CONTROL_PROC_ELNA_CHANGE_MODE_RSP = 0x1600, - CONTROL_PROC_ODSP_CHANGE_MODE = 0x0017, - CONTROL_PROC_ODSP_CHANGE_MODE_RSP = 0x1700, - CONTROL_PROC_AGC_CHANGE_MODE = 0x0018, - CONTROL_PROC_AGC_CHANGE_MODE_RSP = 0x1800, - - CONTROL_PROC_CONTEXT = 0x00FC, - CONTROL_PROC_CONTEXT_RSP = 0xFC00, - CONTROL_PROC_DUMP_MEMORY = 0x00FD, - CONTROL_PROC_DUMP_MEMORY_RSP = 0xFD00, - CONTROL_PROC_DUMPLOG_MEMORY = 0x00FE, - CONTROL_PROC_DUMPLOG_MEMORY_RSP = 0xFE00, - CONTROL_PROC_TURNOFF = 0x00FF, - CONTROL_PROC_TURNOFF_RSP = 0xFF00 -}; - -union as10x_turn_on { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* error */ - uint8_t error; - } __packed rsp; -} __packed; - -union as10x_turn_off { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* error */ - uint8_t err; - } __packed rsp; -} __packed; - -union as10x_set_tune { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - /* tune params */ - struct as10x_tune_args args; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* response error */ - uint8_t error; - } __packed rsp; -} __packed; - -union as10x_get_tune_status { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* response error */ - uint8_t error; - /* tune status */ - struct as10x_tune_status sts; - } __packed rsp; -} __packed; - -union as10x_get_tps { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* response error */ - uint8_t error; - /* tps details */ - struct as10x_tps tps; - } __packed rsp; -} __packed; - -union as10x_common { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* response error */ - uint8_t error; - } __packed rsp; -} __packed; - -union as10x_add_pid_filter { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - /* PID to filter */ - uint16_t pid; - /* stream type (MPE, PSI/SI or PES )*/ - uint8_t stream_type; - /* PID index in filter table */ - uint8_t idx; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* response error */ - uint8_t error; - /* Filter id */ - uint8_t filter_id; - } __packed rsp; -} __packed; - -union as10x_del_pid_filter { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - /* PID to remove */ - uint16_t pid; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* response error */ - uint8_t error; - } __packed rsp; -} __packed; - -union as10x_start_streaming { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* error */ - uint8_t error; - } __packed rsp; -} __packed; - -union as10x_stop_streaming { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* error */ - uint8_t error; - } __packed rsp; -} __packed; - -union as10x_get_demod_stats { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* error */ - uint8_t error; - /* demod stats */ - struct as10x_demod_stats stats; - } __packed rsp; -} __packed; - -union as10x_get_impulse_resp { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* error */ - uint8_t error; - /* impulse response ready */ - uint8_t is_ready; - } __packed rsp; -} __packed; - -union as10x_fw_context { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - /* value to write (for set context)*/ - struct as10x_register_value reg_val; - /* context tag */ - uint16_t tag; - /* context request type */ - uint16_t type; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* value read (for get context) */ - struct as10x_register_value reg_val; - /* context request type */ - uint16_t type; - /* error */ - uint8_t error; - } __packed rsp; -} __packed; - -union as10x_set_register { - /* request */ - struct { - /* response identifier */ - uint16_t proc_id; - /* register description */ - struct as10x_register_addr reg_addr; - /* register content */ - struct as10x_register_value reg_val; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* error */ - uint8_t error; - } __packed rsp; -} __packed; - -union as10x_get_register { - /* request */ - struct { - /* response identifier */ - uint16_t proc_id; - /* register description */ - struct as10x_register_addr reg_addr; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* error */ - uint8_t error; - /* register content */ - struct as10x_register_value reg_val; - } __packed rsp; -} __packed; - -union as10x_cfg_change_mode { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - /* mode */ - uint8_t mode; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* error */ - uint8_t error; - } __packed rsp; -} __packed; - -struct as10x_cmd_header_t { - uint16_t req_id; - uint16_t prog; - uint16_t version; - uint16_t data_len; -} __packed; - -#define DUMP_BLOCK_SIZE 16 - -union as10x_dump_memory { - /* request */ - struct { - /* request identifier */ - uint16_t proc_id; - /* dump memory type request */ - uint8_t dump_req; - /* register description */ - struct as10x_register_addr reg_addr; - /* nb blocks to read */ - uint16_t num_blocks; - } __packed req; - /* response */ - struct { - /* response identifier */ - uint16_t proc_id; - /* error */ - uint8_t error; - /* dump response */ - uint8_t dump_rsp; - /* data */ - union { - uint8_t data8[DUMP_BLOCK_SIZE]; - uint16_t data16[DUMP_BLOCK_SIZE / sizeof(uint16_t)]; - uint32_t data32[DUMP_BLOCK_SIZE / sizeof(uint32_t)]; - } __packed u; - } __packed rsp; -} __packed; - -union as10x_dumplog_memory { - struct { - /* request identifier */ - uint16_t proc_id; - /* dump memory type request */ - uint8_t dump_req; - } __packed req; - struct { - /* request identifier */ - uint16_t proc_id; - /* error */ - uint8_t error; - /* dump response */ - uint8_t dump_rsp; - /* dump data */ - uint8_t data[DUMP_BLOCK_SIZE]; - } __packed rsp; -} __packed; - -union as10x_raw_data { - /* request */ - struct { - uint16_t proc_id; - uint8_t data[64 - sizeof(struct as10x_cmd_header_t) - - 2 /* proc_id */]; - } __packed req; - /* response */ - struct { - uint16_t proc_id; - uint8_t error; - uint8_t data[64 - sizeof(struct as10x_cmd_header_t) - - 2 /* proc_id */ - 1 /* rc */]; - } __packed rsp; -} __packed; - -struct as10x_cmd_t { - struct as10x_cmd_header_t header; - union { - union as10x_turn_on turn_on; - union as10x_turn_off turn_off; - union as10x_set_tune set_tune; - union as10x_get_tune_status get_tune_status; - union as10x_get_tps get_tps; - union as10x_common common; - union as10x_add_pid_filter add_pid_filter; - union as10x_del_pid_filter del_pid_filter; - union as10x_start_streaming start_streaming; - union as10x_stop_streaming stop_streaming; - union as10x_get_demod_stats get_demod_stats; - union as10x_get_impulse_resp get_impulse_rsp; - union as10x_fw_context context; - union as10x_set_register set_register; - union as10x_get_register get_register; - union as10x_cfg_change_mode cfg_change_mode; - union as10x_dump_memory dump_memory; - union as10x_dumplog_memory dumplog_memory; - union as10x_raw_data raw_data; - } __packed body; -} __packed; - -struct as10x_token_cmd_t { - /* token cmd */ - struct as10x_cmd_t c; - /* token response */ - struct as10x_cmd_t r; -} __packed; - - -/**************************/ -/* FUNCTION DECLARATION */ -/**************************/ - -void as10x_cmd_build(struct as10x_cmd_t *pcmd, uint16_t proc_id, - uint16_t cmd_len); -int as10x_rsp_parse(struct as10x_cmd_t *r, uint16_t proc_id); - -/* as10x cmd */ -int as10x_cmd_turn_on(struct as10x_bus_adapter_t *adap); -int as10x_cmd_turn_off(struct as10x_bus_adapter_t *adap); - -int as10x_cmd_set_tune(struct as10x_bus_adapter_t *adap, - struct as10x_tune_args *ptune); - -int as10x_cmd_get_tune_status(struct as10x_bus_adapter_t *adap, - struct as10x_tune_status *pstatus); - -int as10x_cmd_get_tps(struct as10x_bus_adapter_t *adap, - struct as10x_tps *ptps); - -int as10x_cmd_get_demod_stats(struct as10x_bus_adapter_t *adap, - struct as10x_demod_stats *pdemod_stats); - -int as10x_cmd_get_impulse_resp(struct as10x_bus_adapter_t *adap, - uint8_t *is_ready); - -/* as10x cmd stream */ -int as10x_cmd_add_PID_filter(struct as10x_bus_adapter_t *adap, - struct as10x_ts_filter *filter); -int as10x_cmd_del_PID_filter(struct as10x_bus_adapter_t *adap, - uint16_t pid_value); - -int as10x_cmd_start_streaming(struct as10x_bus_adapter_t *adap); -int as10x_cmd_stop_streaming(struct as10x_bus_adapter_t *adap); - -/* as10x cmd cfg */ -int as10x_cmd_set_context(struct as10x_bus_adapter_t *adap, - uint16_t tag, - uint32_t value); -int as10x_cmd_get_context(struct as10x_bus_adapter_t *adap, - uint16_t tag, - uint32_t *pvalue); - -int as10x_cmd_eLNA_change_mode(struct as10x_bus_adapter_t *adap, uint8_t mode); -int as10x_context_rsp_parse(struct as10x_cmd_t *prsp, uint16_t proc_id); -#endif diff --git a/drivers/staging/media/as102/as10x_cmd_cfg.c b/drivers/staging/media/as102/as10x_cmd_cfg.c deleted file mode 100644 index b1e300d88753..000000000000 --- a/drivers/staging/media/as102/as10x_cmd_cfg.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Abilis Systems Single DVB-T Receiver - * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> - * - * 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, 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include <linux/kernel.h> -#include "as102_drv.h" -#include "as10x_types.h" -#include "as10x_cmd.h" - -/***************************/ -/* FUNCTION DEFINITION */ -/***************************/ - -/** - * as10x_cmd_get_context - Send get context command to AS10x - * @adap: pointer to AS10x bus adapter - * @tag: context tag - * @pvalue: pointer where to store context value read - * - * Return 0 on success or negative value in case of error. - */ -int as10x_cmd_get_context(struct as10x_bus_adapter_t *adap, uint16_t tag, - uint32_t *pvalue) -{ - int error; - struct as10x_cmd_t *pcmd, *prsp; - - pcmd = adap->cmd; - prsp = adap->rsp; - - /* prepare command */ - as10x_cmd_build(pcmd, (++adap->cmd_xid), - sizeof(pcmd->body.context.req)); - - /* fill command */ - pcmd->body.context.req.proc_id = cpu_to_le16(CONTROL_PROC_CONTEXT); - pcmd->body.context.req.tag = cpu_to_le16(tag); - pcmd->body.context.req.type = cpu_to_le16(GET_CONTEXT_DATA); - - /* send command */ - if (adap->ops->xfer_cmd) { - error = adap->ops->xfer_cmd(adap, - (uint8_t *) pcmd, - sizeof(pcmd->body.context.req) - + HEADER_SIZE, - (uint8_t *) prsp, - sizeof(prsp->body.context.rsp) - + HEADER_SIZE); - } else { - error = AS10X_CMD_ERROR; - } - - if (error < 0) - goto out; - - /* parse response: context command do not follow the common response */ - /* structure -> specific handling response parse required */ - error = as10x_context_rsp_parse(prsp, CONTROL_PROC_CONTEXT_RSP); - - if (error == 0) { - /* Response OK -> get response data */ - *pvalue = le32_to_cpu(prsp->body.context.rsp.reg_val.u.value32); - /* value returned is always a 32-bit value */ - } - -out: - return error; -} - -/** - * as10x_cmd_set_context - send set context command to AS10x - * @adap: pointer to AS10x bus adapter - * @tag: context tag - * @value: value to set in context - * - * Return 0 on success or negative value in case of error. - */ -int as10x_cmd_set_context(struct as10x_bus_adapter_t *adap, uint16_t tag, - uint32_t value) -{ - int error; - struct as10x_cmd_t *pcmd, *prsp; - - pcmd = adap->cmd; - prsp = adap->rsp; - - /* prepare command */ - as10x_cmd_build(pcmd, (++adap->cmd_xid), - sizeof(pcmd->body.context.req)); - - /* fill command */ - pcmd->body.context.req.proc_id = cpu_to_le16(CONTROL_PROC_CONTEXT); - /* pcmd->body.context.req.reg_val.mode initialization is not required */ - pcmd->body.context.req.reg_val.u.value32 = cpu_to_le32(value); - pcmd->body.context.req.tag = cpu_to_le16(tag); - pcmd->body.context.req.type = cpu_to_le16(SET_CONTEXT_DATA); - - /* send command */ - if (adap->ops->xfer_cmd) { - error = adap->ops->xfer_cmd(adap, - (uint8_t *) pcmd, - sizeof(pcmd->body.context.req) - + HEADER_SIZE, - (uint8_t *) prsp, - sizeof(prsp->body.context.rsp) - + HEADER_SIZE); - } else { - error = AS10X_CMD_ERROR; - } - - if (error < 0) - goto out; - - /* parse response: context command do not follow the common response */ - /* structure -> specific handling response parse required */ - error = as10x_context_rsp_parse(prsp, CONTROL_PROC_CONTEXT_RSP); - -out: - return error; -} - -/** - * as10x_cmd_eLNA_change_mode - send eLNA change mode command to AS10x - * @adap: pointer to AS10x bus adapter - * @mode: mode selected: - * - ON : 0x0 => eLNA always ON - * - OFF : 0x1 => eLNA always OFF - * - AUTO : 0x2 => eLNA follow hysteresis parameters - * to be ON or OFF - * - * Return 0 on success or negative value in case of error. - */ -int as10x_cmd_eLNA_change_mode(struct as10x_bus_adapter_t *adap, uint8_t mode) -{ - int error; - struct as10x_cmd_t *pcmd, *prsp; - - pcmd = adap->cmd; - prsp = adap->rsp; - - /* prepare command */ - as10x_cmd_build(pcmd, (++adap->cmd_xid), - sizeof(pcmd->body.cfg_change_mode.req)); - - /* fill command */ - pcmd->body.cfg_change_mode.req.proc_id = - cpu_to_le16(CONTROL_PROC_ELNA_CHANGE_MODE); - pcmd->body.cfg_change_mode.req.mode = mode; - - /* send command */ - if (adap->ops->xfer_cmd) { - error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd, - sizeof(pcmd->body.cfg_change_mode.req) - + HEADER_SIZE, (uint8_t *) prsp, - sizeof(prsp->body.cfg_change_mode.rsp) - + HEADER_SIZE); - } else { - error = AS10X_CMD_ERROR; - } - - if (error < 0) - goto out; - - /* parse response */ - error = as10x_rsp_parse(prsp, CONTROL_PROC_ELNA_CHANGE_MODE_RSP); - -out: - return error; -} - -/** - * as10x_context_rsp_parse - Parse context command response - * @prsp: pointer to AS10x command response buffer - * @proc_id: id of the command - * - * Since the contex command response does not follow the common - * response, a specific parse function is required. - * Return 0 on success or negative value in case of error. - */ -int as10x_context_rsp_parse(struct as10x_cmd_t *prsp, uint16_t proc_id) -{ - int err; - - err = prsp->body.context.rsp.error; - - if ((err == 0) && - (le16_to_cpu(prsp->body.context.rsp.proc_id) == proc_id)) { - return 0; - } - return AS10X_CMD_ERROR; -} diff --git a/drivers/staging/media/as102/as10x_cmd_stream.c b/drivers/staging/media/as102/as10x_cmd_stream.c deleted file mode 100644 index 1088ca1fe92f..000000000000 --- a/drivers/staging/media/as102/as10x_cmd_stream.c +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Abilis Systems Single DVB-T Receiver - * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> - * - * 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, 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include <linux/kernel.h> -#include "as102_drv.h" -#include "as10x_cmd.h" - -/** - * as10x_cmd_add_PID_filter - send add filter command to AS10x - * @adap: pointer to AS10x bus adapter - * @filter: TSFilter filter for DVB-T - * - * Return 0 on success or negative value in case of error. - */ -int as10x_cmd_add_PID_filter(struct as10x_bus_adapter_t *adap, - struct as10x_ts_filter *filter) -{ - int error; - struct as10x_cmd_t *pcmd, *prsp; - - pcmd = adap->cmd; - prsp = adap->rsp; - - /* prepare command */ - as10x_cmd_build(pcmd, (++adap->cmd_xid), - sizeof(pcmd->body.add_pid_filter.req)); - - /* fill command */ - pcmd->body.add_pid_filter.req.proc_id = - cpu_to_le16(CONTROL_PROC_SETFILTER); - pcmd->body.add_pid_filter.req.pid = cpu_to_le16(filter->pid); - pcmd->body.add_pid_filter.req.stream_type = filter->type; - - if (filter->idx < 16) - pcmd->body.add_pid_filter.req.idx = filter->idx; - else - pcmd->body.add_pid_filter.req.idx = 0xFF; - - /* send command */ - if (adap->ops->xfer_cmd) { - error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd, - sizeof(pcmd->body.add_pid_filter.req) - + HEADER_SIZE, (uint8_t *) prsp, - sizeof(prsp->body.add_pid_filter.rsp) - + HEADER_SIZE); - } else { - error = AS10X_CMD_ERROR; - } - - if (error < 0) - goto out; - - /* parse response */ - error = as10x_rsp_parse(prsp, CONTROL_PROC_SETFILTER_RSP); - - if (error == 0) { - /* Response OK -> get response data */ - filter->idx = prsp->body.add_pid_filter.rsp.filter_id; - } - -out: - return error; -} - -/** - * as10x_cmd_del_PID_filter - Send delete filter command to AS10x - * @adap: pointer to AS10x bus adapte - * @pid_value: PID to delete - * - * Return 0 on success or negative value in case of error. - */ -int as10x_cmd_del_PID_filter(struct as10x_bus_adapter_t *adap, - uint16_t pid_value) -{ - int error; - struct as10x_cmd_t *pcmd, *prsp; - - pcmd = adap->cmd; - prsp = adap->rsp; - - /* prepare command */ - as10x_cmd_build(pcmd, (++adap->cmd_xid), - sizeof(pcmd->body.del_pid_filter.req)); - - /* fill command */ - pcmd->body.del_pid_filter.req.proc_id = - cpu_to_le16(CONTROL_PROC_REMOVEFILTER); - pcmd->body.del_pid_filter.req.pid = cpu_to_le16(pid_value); - - /* send command */ - if (adap->ops->xfer_cmd) { - error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd, - sizeof(pcmd->body.del_pid_filter.req) - + HEADER_SIZE, (uint8_t *) prsp, - sizeof(prsp->body.del_pid_filter.rsp) - + HEADER_SIZE); - } else { - error = AS10X_CMD_ERROR; - } - - if (error < 0) - goto out; - - /* parse response */ - error = as10x_rsp_parse(prsp, CONTROL_PROC_REMOVEFILTER_RSP); - -out: - return error; -} - -/** - * as10x_cmd_start_streaming - Send start streaming command to AS10x - * @adap: pointer to AS10x bus adapter - * - * Return 0 on success or negative value in case of error. - */ -int as10x_cmd_start_streaming(struct as10x_bus_adapter_t *adap) -{ - int error; - struct as10x_cmd_t *pcmd, *prsp; - - pcmd = adap->cmd; - prsp = adap->rsp; - - /* prepare command */ - as10x_cmd_build(pcmd, (++adap->cmd_xid), - sizeof(pcmd->body.start_streaming.req)); - - /* fill command */ - pcmd->body.start_streaming.req.proc_id = - cpu_to_le16(CONTROL_PROC_START_STREAMING); - - /* send command */ - if (adap->ops->xfer_cmd) { - error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd, - sizeof(pcmd->body.start_streaming.req) - + HEADER_SIZE, (uint8_t *) prsp, - sizeof(prsp->body.start_streaming.rsp) - + HEADER_SIZE); - } else { - error = AS10X_CMD_ERROR; - } - - if (error < 0) - goto out; - - /* parse response */ - error = as10x_rsp_parse(prsp, CONTROL_PROC_START_STREAMING_RSP); - -out: - return error; -} - -/** - * as10x_cmd_stop_streaming - Send stop streaming command to AS10x - * @adap: pointer to AS10x bus adapter - * - * Return 0 on success or negative value in case of error. - */ -int as10x_cmd_stop_streaming(struct as10x_bus_adapter_t *adap) -{ - int8_t error; - struct as10x_cmd_t *pcmd, *prsp; - - pcmd = adap->cmd; - prsp = adap->rsp; - - /* prepare command */ - as10x_cmd_build(pcmd, (++adap->cmd_xid), - sizeof(pcmd->body.stop_streaming.req)); - - /* fill command */ - pcmd->body.stop_streaming.req.proc_id = - cpu_to_le16(CONTROL_PROC_STOP_STREAMING); - - /* send command */ - if (adap->ops->xfer_cmd) { - error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd, - sizeof(pcmd->body.stop_streaming.req) - + HEADER_SIZE, (uint8_t *) prsp, - sizeof(prsp->body.stop_streaming.rsp) - + HEADER_SIZE); - } else { - error = AS10X_CMD_ERROR; - } - - if (error < 0) - goto out; - - /* parse response */ - error = as10x_rsp_parse(prsp, CONTROL_PROC_STOP_STREAMING_RSP); - -out: - return error; -} diff --git a/drivers/staging/media/as102/as10x_handle.h b/drivers/staging/media/as102/as10x_handle.h deleted file mode 100644 index 5638b191b780..000000000000 --- a/drivers/staging/media/as102/as10x_handle.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Abilis Systems Single DVB-T Receiver - * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> - * - * 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, 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -#ifdef __KERNEL__ -struct as10x_bus_adapter_t; -struct as102_dev_t; - -#include "as10x_cmd.h" - -/* values for "mode" field */ -#define REGMODE8 8 -#define REGMODE16 16 -#define REGMODE32 32 - -struct as102_priv_ops_t { - int (*upload_fw_pkt)(struct as10x_bus_adapter_t *bus_adap, - unsigned char *buf, int buflen, int swap32); - - int (*send_cmd)(struct as10x_bus_adapter_t *bus_adap, - unsigned char *buf, int buflen); - - int (*xfer_cmd)(struct as10x_bus_adapter_t *bus_adap, - unsigned char *send_buf, int send_buf_len, - unsigned char *recv_buf, int recv_buf_len); - - int (*start_stream)(struct as102_dev_t *dev); - void (*stop_stream)(struct as102_dev_t *dev); - - int (*reset_target)(struct as10x_bus_adapter_t *bus_adap); - - int (*read_write)(struct as10x_bus_adapter_t *bus_adap, uint8_t mode, - uint32_t rd_addr, uint16_t rd_len, - uint32_t wr_addr, uint16_t wr_len); - - int (*as102_read_ep2)(struct as10x_bus_adapter_t *bus_adap, - unsigned char *recv_buf, - int recv_buf_len); -}; -#endif diff --git a/drivers/staging/media/as102/as10x_types.h b/drivers/staging/media/as102/as10x_types.h deleted file mode 100644 index af26e057d9a2..000000000000 --- a/drivers/staging/media/as102/as10x_types.h +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Abilis Systems Single DVB-T Receiver - * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com> - * - * 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, 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -#ifndef _AS10X_TYPES_H_ -#define _AS10X_TYPES_H_ - -#include "as10x_handle.h" - -/*********************************/ -/* MACRO DEFINITIONS */ -/*********************************/ - -/* bandwidth constant values */ -#define BW_5_MHZ 0x00 -#define BW_6_MHZ 0x01 -#define BW_7_MHZ 0x02 -#define BW_8_MHZ 0x03 - -/* hierarchy priority selection values */ -#define HIER_NO_PRIORITY 0x00 -#define HIER_LOW_PRIORITY 0x01 -#define HIER_HIGH_PRIORITY 0x02 - -/* constellation available values */ -#define CONST_QPSK 0x00 -#define CONST_QAM16 0x01 -#define CONST_QAM64 0x02 -#define CONST_UNKNOWN 0xFF - -/* hierarchy available values */ -#define HIER_NONE 0x00 -#define HIER_ALPHA_1 0x01 -#define HIER_ALPHA_2 0x02 -#define HIER_ALPHA_4 0x03 -#define HIER_UNKNOWN 0xFF - -/* interleaving available values */ -#define INTLV_NATIVE 0x00 -#define INTLV_IN_DEPTH 0x01 -#define INTLV_UNKNOWN 0xFF - -/* code rate available values */ -#define CODE_RATE_1_2 0x00 -#define CODE_RATE_2_3 0x01 -#define CODE_RATE_3_4 0x02 -#define CODE_RATE_5_6 0x03 -#define CODE_RATE_7_8 0x04 -#define CODE_RATE_UNKNOWN 0xFF - -/* guard interval available values */ -#define GUARD_INT_1_32 0x00 -#define GUARD_INT_1_16 0x01 -#define GUARD_INT_1_8 0x02 -#define GUARD_INT_1_4 0x03 -#define GUARD_UNKNOWN 0xFF - -/* transmission mode available values */ -#define TRANS_MODE_2K 0x00 -#define TRANS_MODE_8K 0x01 -#define TRANS_MODE_4K 0x02 -#define TRANS_MODE_UNKNOWN 0xFF - -/* DVBH signalling available values */ -#define TIMESLICING_PRESENT 0x01 -#define MPE_FEC_PRESENT 0x02 - -/* tune state available */ -#define TUNE_STATUS_NOT_TUNED 0x00 -#define TUNE_STATUS_IDLE 0x01 -#define TUNE_STATUS_LOCKING 0x02 -#define TUNE_STATUS_SIGNAL_DVB_OK 0x03 -#define TUNE_STATUS_STREAM_DETECTED 0x04 -#define TUNE_STATUS_STREAM_TUNED 0x05 -#define TUNE_STATUS_ERROR 0xFF - -/* available TS FID filter types */ -#define TS_PID_TYPE_TS 0 -#define TS_PID_TYPE_PSI_SI 1 -#define TS_PID_TYPE_MPE 2 - -/* number of echos available */ -#define MAX_ECHOS 15 - -/* Context types */ -#define CONTEXT_LNA 1010 -#define CONTEXT_ELNA_HYSTERESIS 4003 -#define CONTEXT_ELNA_GAIN 4004 -#define CONTEXT_MER_THRESHOLD 5005 -#define CONTEXT_MER_OFFSET 5006 -#define CONTEXT_IR_STATE 7000 -#define CONTEXT_TSOUT_MSB_FIRST 7004 -#define CONTEXT_TSOUT_FALLING_EDGE 7005 - -/* Configuration modes */ -#define CFG_MODE_ON 0 -#define CFG_MODE_OFF 1 -#define CFG_MODE_AUTO 2 - -struct as10x_tps { - uint8_t modulation; - uint8_t hierarchy; - uint8_t interleaving_mode; - uint8_t code_rate_HP; - uint8_t code_rate_LP; - uint8_t guard_interval; - uint8_t transmission_mode; - uint8_t DVBH_mask_HP; - uint8_t DVBH_mask_LP; - uint16_t cell_ID; -} __packed; - -struct as10x_tune_args { - /* frequency */ - uint32_t freq; - /* bandwidth */ - uint8_t bandwidth; - /* hierarchy selection */ - uint8_t hier_select; - /* constellation */ - uint8_t modulation; - /* hierarchy */ - uint8_t hierarchy; - /* interleaving mode */ - uint8_t interleaving_mode; - /* code rate */ - uint8_t code_rate; - /* guard interval */ - uint8_t guard_interval; - /* transmission mode */ - uint8_t transmission_mode; -} __packed; - -struct as10x_tune_status { - /* tune status */ - uint8_t tune_state; - /* signal strength */ - int16_t signal_strength; - /* packet error rate 10^-4 */ - uint16_t PER; - /* bit error rate 10^-4 */ - uint16_t BER; -} __packed; - -struct as10x_demod_stats { - /* frame counter */ - uint32_t frame_count; - /* Bad frame counter */ - uint32_t bad_frame_count; - /* Number of wrong bytes fixed by Reed-Solomon */ - uint32_t bytes_fixed_by_rs; - /* Averaged MER */ - uint16_t mer; - /* statistics calculation state indicator (started or not) */ - uint8_t has_started; -} __packed; - -struct as10x_ts_filter { - uint16_t pid; /* valid PID value 0x00 : 0x2000 */ - uint8_t type; /* Red TS_PID_TYPE_<N> values */ - uint8_t idx; /* index in filtering table */ -} __packed; - -struct as10x_register_value { - uint8_t mode; - union { - uint8_t value8; /* 8 bit value */ - uint16_t value16; /* 16 bit value */ - uint32_t value32; /* 32 bit value */ - } __packed u; -} __packed; - -struct as10x_register_addr { - /* register addr */ - uint32_t addr; - /* register mode access */ - uint8_t mode; -}; - -#endif diff --git a/drivers/staging/media/davinci_vpfe/Kconfig b/drivers/staging/media/davinci_vpfe/Kconfig index 12f321dd2399..4de2f082491d 100644 --- a/drivers/staging/media/davinci_vpfe/Kconfig +++ b/drivers/staging/media/davinci_vpfe/Kconfig @@ -1,6 +1,7 @@ config VIDEO_DM365_VPFE tristate "DM365 VPFE Media Controller Capture Driver" depends on VIDEO_V4L2 && ARCH_DAVINCI_DM365 && !VIDEO_DM365_ISIF + depends on HAS_DMA select VIDEOBUF2_DMA_CONTIG help Support for DM365 VPFE based Media Controller Capture driver. diff --git a/drivers/staging/media/dt3155v4l/Kconfig b/drivers/staging/media/dt3155v4l/Kconfig index 226a1ca90b3c..2d496001b6e8 100644 --- a/drivers/staging/media/dt3155v4l/Kconfig +++ b/drivers/staging/media/dt3155v4l/Kconfig @@ -1,6 +1,7 @@ config VIDEO_DT3155 tristate "DT3155 frame grabber, Video4Linux interface" depends on PCI && VIDEO_DEV && VIDEO_V4L2 + depends on HAS_DMA select VIDEOBUF2_DMA_CONTIG default n ---help--- diff --git a/drivers/staging/media/lirc/lirc_imon.c b/drivers/staging/media/lirc/lirc_imon.c index 726cc3a31856..7aca44f28c5a 100644 --- a/drivers/staging/media/lirc/lirc_imon.c +++ b/drivers/staging/media/lirc/lirc_imon.c @@ -414,6 +414,7 @@ static ssize_t vfd_write(struct file *file, const char __user *buf, data_buf = memdup_user(buf, n_bytes); if (IS_ERR(data_buf)) { retval = PTR_ERR(data_buf); + data_buf = NULL; goto exit; } diff --git a/drivers/staging/media/lirc/lirc_sasem.c b/drivers/staging/media/lirc/lirc_sasem.c index 86ad811fda24..c20ef56202bf 100644 --- a/drivers/staging/media/lirc/lirc_sasem.c +++ b/drivers/staging/media/lirc/lirc_sasem.c @@ -392,6 +392,7 @@ static ssize_t vfd_write(struct file *file, const char __user *buf, data_buf = memdup_user((void const __user *)buf, n_bytes); if (IS_ERR(data_buf)) { retval = PTR_ERR(data_buf); + data_buf = NULL; goto exit; } diff --git a/drivers/staging/media/omap4iss/Kconfig b/drivers/staging/media/omap4iss/Kconfig index 8afc6fee40c5..b78643f907e7 100644 --- a/drivers/staging/media/omap4iss/Kconfig +++ b/drivers/staging/media/omap4iss/Kconfig @@ -1,6 +1,7 @@ config VIDEO_OMAP4 bool "OMAP 4 Camera support" depends on VIDEO_V4L2=y && VIDEO_V4L2_SUBDEV_API && I2C=y && ARCH_OMAP4 + depends on HAS_DMA select VIDEOBUF2_DMA_CONTIG ---help--- Driver for an OMAP 4 ISS controller. |