v4l: #7 - saa7134 driver update
PATCH 1/1 v4l: #7 - saa7134 driver update
Hi,
Yet another big one (due to not being updated for a long time) -- saa7134 driver update. Changes:
* various bugfixes / cleanups.
* new cards added to the cardlist.
* started support for saa7133/35 chips.
* make the driver check pci quirks.
Please apply,
Gerd
drivers/media/video/saa7134/saa7134-cards.c +191 -11
@@ -29,6 +29,7 @@static char name_mute[] ="mute" ;static char name_radio[] ="Radio" ;static char name_tv[] ="Television" ; +static char name_tv_mono[] ="TV (mono only)" ;static char name_comp1[] ="Composite1" ;static char name_comp2[] ="Composite2" ;static char name_svideo[] ="S-Video" ;
@@ -61,6 +62,11 @@ .vmux = 1, .amux = TV, .tv = 1, + },{ + .name = name_tv_mono, + .vmux = 1, + .amux = LINE2, + .tv = 1, }}, }, [SAA7134_BOARD_FLYVIDEO3000] = {
@@ -68,27 +74,39 @@ .name = "LifeView FlyVIDEO3000", .audio_clock = 0x00200000, .tuner_type = TUNER_PHILIPS_PAL, + .gpiomask = 0xe000, .inputs = {{ .name = name_tv, .vmux = 1, .amux = TV, + .gpio = 0x8000, + .tv = 1, + },{ + .name = name_tv_mono, + .vmux = 1, + .amux = LINE2, + .gpio = 0x0000, .tv = 1, },{ .name = name_comp1, .vmux = 0, - .amux = LINE1, + .amux = LINE2, + .gpio = 0x4000, },{ .name = name_comp2, .vmux = 3, - .amux = LINE1, + .amux = LINE2, + .gpio = 0x4000, },{ .name = name_svideo, .vmux = 8, - .amux = LINE1, + .amux = LINE2, + .gpio = 0x4000, }}, .radio = { .name = name_radio, .amux = LINE2, + .gpio = 0x2000, }, }, [SAA7134_BOARD_FLYVIDEO2000] = {
@@ -96,7 +114,7 @@ .name = "LifeView FlyVIDEO2000", .audio_clock = 0x00200000, .tuner_type = TUNER_LG_PAL_NEW_TAPC, - .gpiomask = 0x6000, + .gpiomask = 0xe000, .inputs = {{ .name = name_tv, .vmux = 1,
@@ -122,10 +140,12 @@ .radio = { .name = name_radio, .amux = LINE2, + .gpio =0x2000 , }, .mute = { .name = name_mute, - .amux = LINE1, + .amux = LINE2, + .gpio = 0x8000, }, }, [SAA7134_BOARD_EMPRESS] = {
@@ -190,7 +210,7 @@ .tv = 1, },{/* workaround for problems with normal TV sound */ - .name = "TV (mono only)", + .name = name_tv_mono, .vmux = 1, .amux = LINE2, .tv = 1,
@@ -270,6 +290,12 @@ .amux = TV, .tv = 1, },{ +/* workaround for problems with normal TV sound */ + .name = name_tv_mono, + .vmux = 1, + .amux = LINE2, + .tv = 1, + },{ .name = name_comp1, .vmux = 0, .amux = LINE2,
@@ -302,7 +328,7 @@ },{ .name = name_tv, .vmux = 1, - .amux = TV, + .amux = LINE2, .tv = 1, }}, },
@@ -332,7 +358,6 @@ .name = name_radio, .amux = LINE2, }, - }, [SAA7134_BOARD_MD7134 ] = { .name ="Medion 7134" ,
@@ -343,7 +368,7 @@ .name = name_tv, .vmux = 1, .amux = LINE2, - .tv = 1, + .tv = 1, },{ .name = name_comp1, .vmux = 0,
@@ -361,9 +386,67 @@ .name = name_radio, .amux = LINE2, }, - }, + }, + [SAA7134_BOARD_TYPHOON_90031 ] = { + .name ="Typhoon TV+Radio 90031" , + .audio_clock =0x00200000 , + .tuner_type =TUNER_PHILIPS_PAL , + .inputs = {{ + .name = name_tv, + .vmux =1 , + .amux =TV , + .tv =1 , + },{ + .name = name_comp1, + .vmux =3 , + .amux =LINE1 , + },{ + .name = name_svideo, + .vmux =8 , + .amux =LINE1 , + }}, + .radio = { + .name = name_radio, + .amux =LINE2 , + }, + }, + [SAA7134_BOARD_ELSA ] = { + .name ="ELSA EX-VISION 300TV" , + .audio_clock =0x00187de7 , + .tuner_type =TUNER_HITACHI_NTSC , + .inputs = {{ + .name = name_svideo, + .vmux =8 , + .amux =LINE1 , + },{ + .name = name_comp1, + .vmux =0 , + .amux =LINE1 , + },{ + .name = name_tv, + .vmux =4 , + .amux =LINE2 , + .tv =1 , + }}, + }, + [SAA7134_BOARD_ELSA_500TV ] = { + .name ="ELSA EX-VISION 500TV" , + .audio_clock =0x00187de7 , + .tuner_type =TUNER_HITACHI_NTSC , + .inputs = {{ + .name = name_svideo, + .vmux =7 , + .amux =LINE1 , + },{ + .name = name_tv, + .vmux =8 , + .amux =TV , + .tv =1 , + }}, + }, + }; -const int saa7134_bcount = (sizeof (saa7134_boards)/sizeof (struct saa7134_board )); +const unsigned int saa7134_bcount =ARRAY_SIZE (saa7134_boards);/* ------------------------------------------------------------------ */ /* PCI ids + subsystem IDs */
@@ -377,6 +460,12 @@ .driver_data = SAA7134_BOARD_PROTEUS_PRO, },{ .vendor = PCI_VENDOR_ID_PHILIPS, + .device = PCI_DEVICE_ID_PHILIPS_SAA7133, + .subvendor = PCI_VENDOR_ID_PHILIPS, + .subdevice = 0x2001, + .driver_data = SAA7134_BOARD_PROTEUS_PRO, + },{ + .vendor = PCI_VENDOR_ID_PHILIPS, .device = PCI_DEVICE_ID_PHILIPS_SAA7134, .subvendor = PCI_VENDOR_ID_PHILIPS, .subdevice = 0x6752,
@@ -407,11 +496,29 @@ .driver_data = SAA7134_BOARD_FLYVIDEO3000, },{ .vendor = PCI_VENDOR_ID_PHILIPS, + .device = PCI_DEVICE_ID_PHILIPS_SAA7130, + .subvendor = 0x5168, + .subdevice = 0x0138, + .driver_data = SAA7134_BOARD_FLYVIDEO2000, + },{ + .vendor = PCI_VENDOR_ID_PHILIPS, .device = PCI_DEVICE_ID_PHILIPS_SAA7134, .subvendor = 0x16be, .subdevice = 0x0003, .driver_data = SAA7134_BOARD_MD7134, },{ + .vendor = PCI_VENDOR_ID_PHILIPS, + .device = PCI_DEVICE_ID_PHILIPS_SAA7130, + .subvendor = 0x1048, + .subdevice = 0x226b, + .driver_data = SAA7134_BOARD_ELSA, + },{ + .vendor = PCI_VENDOR_ID_PHILIPS, + .device = PCI_DEVICE_ID_PHILIPS_SAA7130, + .subvendor = 0x1048, + .subdevice = 0x226b, + .driver_data = SAA7134_BOARD_ELSA_500TV, + },{ /* --- boards without eeprom + subsystem ID --- */ .vendor = PCI_VENDOR_ID_PHILIPS,
@@ -435,10 +542,22 @@ .driver_data = SAA7134_BOARD_UNKNOWN, },{ .vendor = PCI_VENDOR_ID_PHILIPS, + .device = PCI_DEVICE_ID_PHILIPS_SAA7133, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = SAA7134_BOARD_UNKNOWN, + },{ + .vendor = PCI_VENDOR_ID_PHILIPS, .device = PCI_DEVICE_ID_PHILIPS_SAA7134, .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, .driver_data = SAA7134_BOARD_UNKNOWN, + },{ + .vendor = PCI_VENDOR_ID_PHILIPS, + .device = PCI_DEVICE_ID_PHILIPS_SAA7135, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = SAA7134_BOARD_UNKNOWN, },{ /* --- end of list --- */ }
@@ -446,6 +565,67 @@MODULE_DEVICE_TABLE (pci, saa7134_pci_tbl);/* ----------------------------------------------------------- */ +/* flyvideo tweaks */ + +#if 0 +static struct { +char *model; +int tuner_type; +} fly_list[0x20 ] = { +/* default catch ... */ + [0 ...0x1f ] = { + .model ="UNKNOWN" , + .tuner_type =TUNER_ABSENT , + }, +/* ... the ones known so far */ + [0x05 ] = { + .model ="PAL-BG" , + .tuner_type =TUNER_LG_PAL_NEW_TAPC , + }, + [0x10 ] = { + .model ="PAL-BG / PAL-DK" , + .tuner_type =TUNER_PHILIPS_PAL , + }, + [0x15 ] = { + .model ="NTSC" , + .tuner_type =TUNER_ABSENT /* FIXME */ , + }, +}; +#endif + +static void board_flyvideo (struct saa7134_dev *dev) +{ +u32 value; +int index; + +saa_writel (SAA7134_GPIO_GPMODE0 >>2 ,0 ); + value =saa_readl (SAA7134_GPIO_GPSTATUS0 >>2 ); +#if 0 + index = (value &0x1f00 ) >>8 ; +printk (KERN_INFO "%s: flyvideo: gpio is 0x%x [model=%s,tuner=%d]\n" , + dev->name, value, fly_list[index].model, + fly_list[index].tuner_type); + dev->tuner_type = fly_list[index].tuner_type; +#else +printk (KERN_INFO "%s: flyvideo: gpio is 0x%x\n" , + dev->name, value); +#endif +} + +/* ----------------------------------------------------------- */ + +int saa7134_board_init (struct saa7134_dev *dev) +{ +switch (dev->board) { +case SAA7134_BOARD_FLYVIDEO2000 : +case SAA7134_BOARD_FLYVIDEO3000 : +board_flyvideo (dev); +break ; + } +return 0 ; +} + +/* ----------------------------------------------------------- */ /* * Local variables: * c-basic-offset: 8
drivers/media/video/saa7134/saa7134-core.c +156 -61
450 lines not on this page · raw message
drivers/media/video/saa7134/saa7134-i2c.c +3 -6
@@ -153,10 +153,7 @@ status =i2c_get_status (dev);if (!i2c_is_busy (status))break ; -if (need_resched ()) -schedule (); -else -udelay (I2C_WAIT_DELAY ); +saa_wait (I2C_WAIT_DELAY ); }if (I2C_WAIT_RETRY == count)return FALSE;
@@ -318,7 +315,7 @@static int attach_inform (struct i2c_client *client) {struct saa7134_dev *dev = client->adapter->algo_data; -int tuner =card (dev).tuner_type; +int tuner = dev->tuner_type;saa7134_i2c_call_clients (dev,TUNER_SET_TYPE ,&tuner);return 0 ;
@@ -334,9 +331,9 @@static struct i2c_adapter saa7134_adap_template = { .owner =THIS_MODULE , + .class =I2C_ADAP_CLASS_TV_ANALOG ,I2C_DEVNAME ("saa7134" ), .id =I2C_ALGO_SAA7134 , - .class =I2C_ADAP_CLASS_TV_ANALOG , .algo = &saa7134_algo, .client_register = attach_inform, };
drivers/media/video/saa7134/saa7134-oss.c +127 -61
291 lines not on this page · raw message
drivers/media/video/saa7134/saa7134-reg.h +13 -0
@@ -9,9 +9,15 @@#ifndef PCI_DEVICE_ID_PHILIPS_SAA7130 # define PCI_DEVICE_ID_PHILIPS_SAA7130 0x7130#endif +#ifndef PCI_DEVICE_ID_PHILIPS_SAA7133 +# define PCI_DEVICE_ID_PHILIPS_SAA7133 0x7133 +#endif #ifndef PCI_DEVICE_ID_PHILIPS_SAA7134 # define PCI_DEVICE_ID_PHILIPS_SAA7134 0x7134#endif +#ifndef PCI_DEVICE_ID_PHILIPS_SAA7135 +# define PCI_DEVICE_ID_PHILIPS_SAA7135 0x7135 +#endif /* ------------------------------------------------------------------ */ /*
@@ -329,6 +335,13 @@/* test modes */ #define SAA7134_SPECIAL_MODE 0x1d0 +/* audio -- saa7133 + saa7135 only */ +#define SAA7135_DSP_RWSTATE 0x580 +#define SAA7135_DSP_RWSTATE_ERR (1 << 3) +#define SAA7135_DSP_RWSTATE_IDA (1 << 2) +#define SAA7135_DSP_RWSTATE_RDB (1 << 1) +#define SAA7135_DSP_RWSTATE_WRR (1 << 0) +/* ------------------------------------------------------------------ */ /* * Local variables:
drivers/media/video/saa7134/saa7134-ts.c +11 -7
@@ -52,8 +52,9 @@ {u32 control; -dprintk ("buffer_activate [%p]\n" ,buf); +dprintk ("buffer_activate [%p]" ,buf); buf->vb.state =STATE_ACTIVE ; + buf->top_seen =0 ;/* dma: setup channel 5 (= TS) */ control = SAA7134_RS_CONTROL_BURST_16 |
@@ -63,11 +64,11 @@if (NULL == next) next = buf;if (V4L2_FIELD_TOP == buf->vb.field) { -dprintk ("[top] buf=%p next=%p" ,buf,next); +dprintk ("- [top] buf=%p next=%p\n" ,buf,next);saa_writel (SAA7134_RS_BA1 (5 ),saa7134_buffer_base (buf));saa_writel (SAA7134_RS_BA2 (5 ),saa7134_buffer_base (next)); }else { -dprintk ("[bottom] buf=%p next=%p" ,buf,next); +dprintk ("- [bottom] buf=%p next=%p\n" ,buf,next);saa_writel (SAA7134_RS_BA1 (5 ),saa7134_buffer_base (next));saa_writel (SAA7134_RS_BA2 (5 ),saa7134_buffer_base (buf)); }
@@ -86,8 +87,11 @@ {struct saa7134_dev *dev = file->private_data;struct saa7134_buf *buf = (struct saa7134_buf *)vb; -int lines, llength, size, err; +unsigned int lines, llength, size; +int err; +dprintk ("buffer_prepare [%p,%s]\n" ,buf,v4l2_field_names[field]); + llength =TS_PACKET_SIZE ; lines =TS_NR_PACKETS ;
@@ -116,7 +120,6 @@ goto oops; } buf->vb.state =STATE_PREPARED ; - buf->top_seen =0 ; buf->activate = buffer_activate; buf->vb.field = field;return 0 ;
@@ -163,7 +166,7 @@static int ts_open (struct inode *inode,struct file *file) { -unsigned int minor =minor (inode->i_rdev); +int minor =minor (inode->i_rdev);struct saa7134_dev *h,*dev =NULL ;struct list_head *list;int err;
@@ -414,6 +417,7 @@ dev->ts_q.timeout.function = saa7134_buffer_timeout; dev->ts_q.timeout.data = (unsigned long )(&dev->ts_q); dev->ts_q.dev = dev; + dev->ts_q.need_two =1 ; videobuf_queue_init(&dev->ts.ts, &ts_qops, dev->pci, &dev->slock, V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_ALTERNATE,
@@ -445,7 +449,7 @@spin_lock (&dev->slock);if (dev->ts_q.curr) { - field = dev->video_q.curr->vb.field; + field = dev->ts_q.curr->vb.field;if (field ==V4L2_FIELD_TOP ) {if ((status &0x100000 ) !=0x100000 ) goto done;
drivers/media/video/saa7134/saa7134-tvaudio.c +477 -114
745 lines not on this page · raw message
drivers/media/video/saa7134/saa7134-vbi.c +5 -4
@@ -85,6 +85,7 @@dprintk ("buffer_activate [%p]\n" ,buf); buf->vb.state =STATE_ACTIVE ; + buf->top_seen =0 ;task_init (dev,buf,TASK_A );task_init (dev,buf,TASK_B );
@@ -119,7 +120,8 @@struct saa7134_dev *dev = fh->dev;struct saa7134_buf *buf = (struct saa7134_buf *)vb;struct saa7134_tvnorm *norm = dev->tvnorm; -int lines, llength, size, err; +unsigned int lines, llength, size; +int err; lines = norm->vbi_v_stop - norm->vbi_v_start +1 ;if (lines >VBI_LINE_COUNT )
@@ -155,7 +157,6 @@ goto oops; } buf->vb.state =STATE_PREPARED ; - buf->top_seen =0 ; buf->activate = buffer_activate; buf->vb.field = field;return 0 ;
@@ -166,7 +167,7 @@ }static int -buffer_setup (struct file *file,int *count,int *size) +buffer_setup (struct file *file,unsigned int *count,unsigned int *size) {struct saa7134_fh *fh = file->private_data;struct saa7134_dev *dev = fh->dev;
@@ -241,7 +242,7 @@if (dev->vbi_q.curr) { dev->vbi_fieldcount++;/* make sure we have seen both fields */ -if ((status &0x10 ) ==0x10 ) { +if ((status &0x10 ) ==0x00 ) { dev->vbi_q.curr->top_seen =1 ; goto done; }
drivers/media/video/saa7134/saa7134-video.c +156 -81
542 lines not on this page · raw message
drivers/media/video/saa7134/saa7134.h +91 -79
366 lines not on this page · raw message
Signature · 1 line
sigfault