diff options
Diffstat (limited to 'drivers/media/pci/tw68/tw68.h')
-rw-r--r-- | drivers/media/pci/tw68/tw68.h | 435 |
1 files changed, 39 insertions, 396 deletions
diff --git a/drivers/media/pci/tw68/tw68.h b/drivers/media/pci/tw68/tw68.h index e723efb5e623..2c8abe26b13b 100644 --- a/drivers/media/pci/tw68/tw68.h +++ b/drivers/media/pci/tw68/tw68.h @@ -8,7 +8,11 @@ * acknowledged. Full credit goes to them - any problems within this code * are mine. * - * Copyright (C) 2009 William M. Brack <wbrack@mmm.com.hk> + * Copyright (C) 2009 William M. Brack + * + * Refactored and updated to the latest v4l core frameworks: + * + * Copyright (C) 2014 Hans Verkuil <hverkuil@xs4all.nl> * * 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 @@ -19,54 +23,26 @@ * 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., 59 Temple Place, Suite 330, Boston, MA - * 02111-1307 USA */ #include <linux/version.h> -#define TW68_VERSION_CODE KERNEL_VERSION(0, 0, 8) - #include <linux/pci.h> -#include <linux/i2c.h> -#include <linux/i2c-algo-bit.h> #include <linux/videodev2.h> -#include <linux/kdev_t.h> -#include <linux/input.h> #include <linux/notifier.h> #include <linux/delay.h> #include <linux/mutex.h> - -#include <asm/io.h> +#include <linux/io.h> #include <media/v4l2-common.h> #include <media/v4l2-ioctl.h> +#include <media/v4l2-ctrls.h> #include <media/v4l2-device.h> +#include <media/videobuf2-dma-sg.h> -#include <media/tuner.h> -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38) -# include <media/ir-common.h> -#endif -#include <media/ir-kbd-i2c.h> -#include <media/videobuf-dma-sg.h> - -#include "btcx-risc.h" #include "tw68-reg.h" #define UNSET (-1U) -/* - * dprintk statement within the code use a 'level' argument. For - * our purposes, we use the following levels: - */ -#define DBG_UNEXPECTED (1 << 0) -#define DBG_UNUSUAL (1 << 1) -#define DBG_TESTING (1 << 2) -#define DBG_BUFF (1 << 3) -#define DBG_FLOW (1 << 15) - /* system vendor and device ID's */ #define PCI_VENDOR_ID_TECHWELL 0x1797 #define PCI_DEVICE_ID_6800 0x6800 @@ -83,15 +59,9 @@ #define PCI_DEVICE_ID_6816_3 0x6812 #define PCI_DEVICE_ID_6816_4 0x6813 -/* subsystem vendor ID's */ -#define TW68_PCI_ID_TECHWELL 0x1797 - -#define TW68_NORMS (\ - V4L2_STD_NTSC | V4L2_STD_PAL | V4L2_STD_SECAM | \ - V4L2_STD_PAL_BG | V4L2_STD_PAL_DK | V4L2_STD_PAL_I | \ - V4L2_STD_PAL_M | V4L2_STD_PAL_Nc | V4L2_STD_PAL_60 | \ - V4L2_STD_525_60 | V4L2_STD_625_50 | \ - V4L2_STD_SECAM_L| V4L2_STD_SECAM_LC | V4L2_STD_SECAM_DK) +#define TW68_NORMS ( \ + V4L2_STD_NTSC | V4L2_STD_PAL | V4L2_STD_SECAM | \ + V4L2_STD_PAL_M | V4L2_STD_PAL_Nc | V4L2_STD_PAL_60) #define TW68_VID_INTS (TW68_FFERR | TW68_PABORT | TW68_DMAPERR | \ TW68_FFOF | TW68_DMAPI) @@ -101,12 +71,13 @@ #define TW68_I2C_INTS (TW68_SBERR | TW68_SBDONE | TW68_SBERR2 | \ TW68_SBDONE2) -typedef enum { +enum tw68_decoder_type { TW6800, TW6801, TW6804, TWXXXX, -} TW68_DECODER_TYPE; +}; + /* ----------------------------------------------------------- */ /* static data */ @@ -153,164 +124,24 @@ struct tw68_format { #define TW68_BOARD_GENERIC_6802 1 #define TW68_MAXBOARDS 16 -#define TW68_INPUT_MAX 8 - -/* ----------------------------------------------------------- */ -/* enums */ - -enum tw68_mpeg_type { - TW68_MPEG_UNUSED, - TW68_MPEG_EMPRESS, - TW68_MPEG_DVB, -}; - -enum tw68_audio_in { - TV = 1, - LINE1 = 2, - LINE2 = 3, - LINE2_LEFT, -}; - -enum tw68_video_out { - CCIR656 = 1, -}; - -/* Structs for card definition */ -struct tw68_input { - char *name; /* text description */ - unsigned int vmux; /* mux value */ - enum tw68_audio_in mux; - unsigned int gpio; - unsigned int tv:1; -}; - -struct tw68_board { - char *name; - unsigned int audio_clock; - - /* input switching */ - unsigned int gpiomask; - struct tw68_input inputs[TW68_INPUT_MAX]; - struct tw68_input radio; - struct tw68_input mute; - - /* i2c chip info */ - unsigned int tuner_type; - unsigned int radio_type; - unsigned char tuner_addr; - unsigned char radio_addr; - - unsigned int tda9887_conf; - unsigned int tuner_config; - - enum tw68_video_out video_out; - enum tw68_mpeg_type mpeg; - unsigned int vid_port_opts; -}; - -#define card_has_radio(dev) (NULL != tw68_boards[dev->board].radio.name) -#define card_has_mpeg(dev) (TW68_MPEG_UNUSED != \ - tw68_boards[dev->board].mpeg) -#define card_in(dev, n) (tw68_boards[dev->board].inputs[n]) -#define card(dev) (tw68_boards[dev->board]) +#define TW68_INPUT_MAX 4 /* ----------------------------------------------------------- */ /* device / file handle status */ -#define RESOURCE_VIDEO 1 -#define RESOURCE_VBI 2 - -#define INTERLACE_AUTO 0 -#define INTERLACE_ON 1 -#define INTERLACE_OFF 2 - #define BUFFER_TIMEOUT msecs_to_jiffies(500) /* 0.5 seconds */ struct tw68_dev; /* forward delclaration */ -/* tvaudio thread status */ -struct tw68_thread { - struct task_struct *thread; - unsigned int scan1; - unsigned int scan2; - unsigned int mode; - unsigned int stopped; -}; - /* buffer for one video/vbi/ts frame */ struct tw68_buf { - /* common v4l buffer stuff -- must be first */ - struct videobuf_buffer vb; - - /* tw68 specific */ - struct tw68_format *fmt; - struct tw68_input *input; - unsigned int top_seen; - int (*activate)(struct tw68_dev *dev, - struct tw68_buf *buf, - struct tw68_buf *next); - struct btcx_riscmem risc; - unsigned int bpl; -}; + struct vb2_buffer vb; + struct list_head list; -struct tw68_dmaqueue { - struct tw68_dev *dev; - struct list_head active; - struct list_head queued; - struct timer_list timeout; - struct btcx_riscmem stopper; - int (*buf_compat)(struct tw68_buf *prev, - struct tw68_buf *buf); - int (*start_dma)(struct tw68_dev *dev, - struct tw68_dmaqueue *q, - struct tw68_buf *buf); -}; - -/* video filehandle status */ -struct tw68_fh { - struct tw68_dev *dev; - unsigned int radio; - enum v4l2_buf_type type; - unsigned int resources; - enum v4l2_priority prio; - - /* video capture */ - struct tw68_format *fmt; - unsigned int width, height; - struct videobuf_queue cap; /* also used for overlay */ - - /* vbi capture */ - struct videobuf_queue vbi; -}; - -/* dmasound dsp status */ -struct tw68_dmasound { - struct mutex lock; - int minor_mixer; - int minor_dsp; - unsigned int users_dsp; - - /* mixer */ - enum tw68_audio_in input; - unsigned int count; - unsigned int line1; - unsigned int line2; - - /* dsp */ - unsigned int afmt; - unsigned int rate; - unsigned int channels; - unsigned int recording_on; - unsigned int dma_running; - unsigned int blocks; - unsigned int blksize; - unsigned int bufsize; - struct videobuf_dmabuf dma; - unsigned int dma_blk; - unsigned int read_offset; - unsigned int read_count; - void *priv_data; - struct snd_pcm_substream *substream; + unsigned int size; + __le32 *cpu; + __le32 *jmp; + dma_addr_t dma; }; struct tw68_fmt { @@ -321,58 +152,20 @@ struct tw68_fmt { u32 twformat; }; -/* ts/mpeg status */ -struct tw68_ts { - /* TS capture */ - int nr_packets; - int nr_bufs; -}; - -/* ts/mpeg ops */ -struct tw68_mpeg_ops { - enum tw68_mpeg_type type; - struct list_head next; - int (*init)(struct tw68_dev *dev); - int (*fini)(struct tw68_dev *dev); - void (*signal_change)(struct tw68_dev *dev); -}; - -enum tw68_ts_status { - TW68_TS_STOPPED, - TW68_TS_BUFF_DONE, - TW68_TS_STARTED, -}; - /* global device status */ struct tw68_dev { - struct list_head devlist; struct mutex lock; spinlock_t slock; - struct v4l2_prio_state prio; + u16 instance; struct v4l2_device v4l2_dev; - /* workstruct for loading modules */ - struct work_struct request_module_wk; - - /* insmod option/autodetected */ - int autodetected; /* various device info */ - TW68_DECODER_TYPE vdecoder; - unsigned int resources; - struct video_device *video_dev; - struct video_device *radio_dev; - struct video_device *vbi_dev; - struct tw68_dmasound dmasound; - -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) - /* infrared remote */ - int has_remote; - struct card_ir *remote; -#endif + enum tw68_decoder_type vdecoder; + struct video_device vdev; + struct v4l2_ctrl_handler hdl; /* pci i/o */ - char name[32]; - int nr; + char *name; struct pci_dev *pci; unsigned char pci_rev, pci_lat; u32 __iomem *lmmio; @@ -381,75 +174,18 @@ struct tw68_dev { /* The irq mask to be used will depend upon the chip type */ u32 board_virqmask; - /* config info */ - unsigned int board; - unsigned int tuner_type; - unsigned int radio_type; - unsigned char tuner_addr; - unsigned char radio_addr; - - unsigned int tda9887_conf; - unsigned int gpio_value; - - /* i2c i/o */ - struct i2c_algo_bit_data i2c_algo; - struct i2c_adapter i2c_adap; - struct i2c_client i2c_client; - u32 i2c_state; - u32 i2c_done; - wait_queue_head_t i2c_queue; - int i2c_rc; - unsigned char eedata[256]; - - /* video+ts+vbi capture */ - struct tw68_dmaqueue video_q; - struct tw68_dmaqueue vbi_q; - unsigned int video_fieldcount; - unsigned int vbi_fieldcount; + /* video capture */ + const struct tw68_format *fmt; + unsigned width, height; + unsigned seqnr; + unsigned field; + struct vb2_queue vidq; + struct list_head active; /* various v4l controls */ - struct tw68_tvnorm *tvnorm; /* video */ - struct tw68_tvaudio *tvaudio; -#if 0 - unsigned int ctl_input; - int ctl_bright; - int ctl_contrast; - int ctl_hue; - int ctl_saturation; - int ctl_freq; - int ctl_mute; /* audio */ - int ctl_volume; - int ctl_invert; /* private */ - int ctl_mirror; - int ctl_y_odd; - int ctl_y_even; - int ctl_automute; -#endif - - /* crop */ - struct v4l2_rect crop_bounds; - struct v4l2_rect crop_defrect; - struct v4l2_rect crop_current; - - /* other global state info */ - unsigned int automute; - struct tw68_thread thread; - /* input is latest requested by app, hw_input is current hw setting */ - struct tw68_input *input; - struct tw68_input *hw_input; - unsigned int hw_mute; - int last_carrier; - int nosignal; - unsigned int insuspend; - - /* TW68_MPEG_* */ - struct tw68_ts ts; - struct tw68_dmaqueue ts_q; - enum tw68_ts_status ts_state; - unsigned int buff_cnt; - struct tw68_mpeg_ops *mops; - - void (*gate_ctrl)(struct tw68_dev *dev, int open); + const struct tw68_tvnorm *tvnorm; /* video */ + + int input; }; /* ----------------------------------------------------------- */ @@ -473,116 +209,23 @@ struct tw68_dev { #define tw_clearb(reg, bit) \ writeb((readb(dev->bmmio+(reg)) & ~(bit)), \ dev->bmmio + (reg)) -#define tw_call_all(dev, o, f, args...) do { \ - if (dev->gate_ctrl) \ - dev->gate_ctrl(dev, 1); \ - v4l2_device_call_all(&(dev)->v4l2_dev, 0, o, f , ##args); \ - if (dev->gate_ctrl) \ - dev->gate_ctrl(dev, 0); \ -} while (0) #define tw_wait(us) { udelay(us); } -static inline struct tw68_dev *to_tw68_dev(struct v4l2_device *v4l2_dev) -{ - return container_of(v4l2_dev, struct tw68_dev, v4l2_dev); -} - -/* ----------------------------------------------------------- */ -/* tw68-core.c */ - -extern struct list_head tw68_devlist; -extern struct mutex tw68_devlist_lock; -extern unsigned int irq_debug; - -int tw68_buffer_count(unsigned int size, unsigned int count); -void tw68_buffer_queue(struct tw68_dev *dev, struct tw68_dmaqueue *q, - struct tw68_buf *buf); -void tw68_buffer_timeout(unsigned long data); -int tw68_set_dmabits(struct tw68_dev *dev); -void tw68_dma_free(struct videobuf_queue *q, struct tw68_buf *buf); -void tw68_wakeup(struct tw68_dmaqueue *q, unsigned int *field_count); -int tw68_buffer_requeue(struct tw68_dev *dev, struct tw68_dmaqueue *q); - -/* ----------------------------------------------------------- */ -/* tw68-cards.c */ - -extern struct tw68_board tw68_boards[]; -extern const unsigned int tw68_bcount; -extern struct pci_device_id __devinitdata tw68_pci_tbl[]; - -int tw68_board_init1(struct tw68_dev *dev); -int tw68_board_init2(struct tw68_dev *dev); -int tw68_tuner_callback(void *priv, int component, int command, int arg); - -/* ----------------------------------------------------------- */ -/* tw68-i2c.c */ - -int tw68_i2c_register(struct tw68_dev *dev); -int tw68_i2c_unregister(struct tw68_dev *dev); -void tw68_irq_i2c(struct tw68_dev *dev, int status); - /* ----------------------------------------------------------- */ /* tw68-video.c */ -extern unsigned int video_debug; -extern struct video_device tw68_video_template; -extern struct video_device tw68_radio_template; - -int tw68_videoport_init(struct tw68_dev *dev); void tw68_set_tvnorm_hw(struct tw68_dev *dev); int tw68_video_init1(struct tw68_dev *dev); -int tw68_video_init2(struct tw68_dev *dev); -void tw68_irq_video_signalchange(struct tw68_dev *dev); +int tw68_video_init2(struct tw68_dev *dev, int video_nr); void tw68_irq_video_done(struct tw68_dev *dev, unsigned long status); - -/* ----------------------------------------------------------- */ -/* tw68-ts.c */ - -int tw68_ts_init1(struct tw68_dev *dev); -int tw68_ts_fini(struct tw68_dev *dev); -void tw68_irq_ts_done(struct tw68_dev *dev, unsigned long status); - -int tw68_ts_register(struct tw68_mpeg_ops *ops); -void tw68_ts_unregister(struct tw68_mpeg_ops *ops); - -int tw68_ts_init_hw(struct tw68_dev *dev); - -/* ----------------------------------------------------------- */ -/* tw68-vbi.c */ - -extern struct videobuf_queue_ops tw68_vbi_qops; -extern struct video_device tw68_vbi_template; - -int tw68_vbi_init1(struct tw68_dev *dev); -int tw68_vbi_fini(struct tw68_dev *dev); -void tw68_irq_vbi_done(struct tw68_dev *dev, unsigned long status); - -/* ----------------------------------------------------------- */ -/* tw68-tvaudio.c */ - -int tw68_tvaudio_rx2mode(u32 rx); - -void tw68_tvaudio_setmute(struct tw68_dev *dev); -void tw68_tvaudio_setinput(struct tw68_dev *dev, - struct tw68_input *in); -void tw68_tvaudio_setvolume(struct tw68_dev *dev, int level); -int tw68_tvaudio_getstereo(struct tw68_dev *dev); -void tw68_tvaudio_init(struct tw68_dev *dev); -int tw68_tvaudio_init2(struct tw68_dev *dev); -int tw68_tvaudio_fini(struct tw68_dev *dev); -int tw68_tvaudio_do_scan(struct tw68_dev *dev); -int tw_dsp_writel(struct tw68_dev *dev, int reg, u32 value); -void tw68_enable_i2s(struct tw68_dev *dev); +int tw68_video_start_dma(struct tw68_dev *dev, struct tw68_buf *buf); /* ----------------------------------------------------------- */ /* tw68-risc.c */ -int tw68_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc, +int tw68_risc_buffer(struct pci_dev *pci, struct tw68_buf *buf, struct scatterlist *sglist, unsigned int top_offset, unsigned int bottom_offset, unsigned int bpl, unsigned int padding, unsigned int lines); -int tw68_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc); -int tw68_risc_overlay(struct tw68_fh *fh, struct btcx_riscmem *risc, - int field_type); |