diff options
| author | Mauro Carvalho Chehab <mchehab@brturbo.com.br> | 2005-06-24 01:05:07 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-24 03:06:39 -0400 |
| commit | 56fc08ca375491b965cb76fad65bfb98973e80d8 (patch) | |
| tree | d19bb1d6e1d139dda8989188fae49cf124f3aaac | |
| parent | b45009b0288a96a3458f4f8e93cb776678d41875 (diff) | |
[PATCH] v4l: update for tuner cards and some V4L chips
Tuner improvements and additions. TEA5767 FM tuner added. Several small
fixes.
Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
Signed-off-by: Nickolay V Shmyrev <nshmyrev@yandex.ru>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | drivers/media/common/ir-common.c | 39 | ||||
| -rw-r--r-- | drivers/media/video/bt832.c | 50 | ||||
| -rw-r--r-- | drivers/media/video/bt832.h | 36 | ||||
| -rw-r--r-- | drivers/media/video/msp3400.c | 13 | ||||
| -rw-r--r-- | drivers/media/video/msp3400.h | 4 | ||||
| -rw-r--r-- | drivers/media/video/tda7432.c | 1 | ||||
| -rw-r--r-- | drivers/media/video/tda9875.c | 1 | ||||
| -rw-r--r-- | drivers/media/video/tda9887.c | 41 | ||||
| -rw-r--r-- | drivers/media/video/tuner-core.c | 212 | ||||
| -rw-r--r-- | drivers/media/video/tuner-simple.c | 52 | ||||
| -rw-r--r-- | drivers/media/video/tvaudio.c | 2 | ||||
| -rw-r--r-- | drivers/media/video/tvmixer.c | 4 | ||||
| -rw-r--r-- | include/media/audiochip.h | 4 | ||||
| -rw-r--r-- | include/media/id.h | 4 | ||||
| -rw-r--r-- | include/media/ir-common.h | 2 | ||||
| -rw-r--r-- | include/media/tuner.h | 23 |
16 files changed, 333 insertions, 155 deletions
diff --git a/drivers/media/common/ir-common.c b/drivers/media/common/ir-common.c index e5636ef181bb..4adb2843f8be 100644 --- a/drivers/media/common/ir-common.c +++ b/drivers/media/common/ir-common.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * $Id: ir-common.c,v 1.8 2005/02/22 12:28:40 kraxel Exp $ | 2 | * $Id: ir-common.c,v 1.10 2005/05/22 19:23:39 nsh Exp $ |
| 3 | * | 3 | * |
| 4 | * some common structs and functions to handle infrared remotes via | 4 | * some common structs and functions to handle infrared remotes via |
| 5 | * input layer ... | 5 | * input layer ... |
| @@ -131,10 +131,10 @@ IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = { | |||
| 131 | [ 18 ] = KEY_KP0, | 131 | [ 18 ] = KEY_KP0, |
| 132 | 132 | ||
| 133 | [ 0 ] = KEY_POWER, | 133 | [ 0 ] = KEY_POWER, |
| 134 | [ 27 ] = KEY_LANGUAGE, //MTS button | 134 | // [ 27 ] = MTS button |
| 135 | [ 2 ] = KEY_TUNER, // TV/FM | 135 | [ 2 ] = KEY_TUNER, // TV/FM |
| 136 | [ 30 ] = KEY_VIDEO, | 136 | [ 30 ] = KEY_VIDEO, |
| 137 | [ 22 ] = KEY_INFO, //display button | 137 | // [ 22 ] = display button |
| 138 | [ 4 ] = KEY_VOLUMEUP, | 138 | [ 4 ] = KEY_VOLUMEUP, |
| 139 | [ 8 ] = KEY_VOLUMEDOWN, | 139 | [ 8 ] = KEY_VOLUMEDOWN, |
| 140 | [ 12 ] = KEY_CHANNELUP, | 140 | [ 12 ] = KEY_CHANNELUP, |
| @@ -142,7 +142,7 @@ IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = { | |||
| 142 | [ 3 ] = KEY_ZOOM, // fullscreen | 142 | [ 3 ] = KEY_ZOOM, // fullscreen |
| 143 | [ 31 ] = KEY_SUBTITLE, // closed caption/teletext | 143 | [ 31 ] = KEY_SUBTITLE, // closed caption/teletext |
| 144 | [ 32 ] = KEY_SLEEP, | 144 | [ 32 ] = KEY_SLEEP, |
| 145 | [ 41 ] = KEY_SEARCH, //boss key | 145 | // [ 41 ] = boss key |
| 146 | [ 20 ] = KEY_MUTE, | 146 | [ 20 ] = KEY_MUTE, |
| 147 | [ 43 ] = KEY_RED, | 147 | [ 43 ] = KEY_RED, |
| 148 | [ 44 ] = KEY_GREEN, | 148 | [ 44 ] = KEY_GREEN, |
| @@ -150,17 +150,17 @@ IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = { | |||
| 150 | [ 46 ] = KEY_BLUE, | 150 | [ 46 ] = KEY_BLUE, |
| 151 | [ 24 ] = KEY_KPPLUS, //fine tune + | 151 | [ 24 ] = KEY_KPPLUS, //fine tune + |
| 152 | [ 25 ] = KEY_KPMINUS, //fine tune - | 152 | [ 25 ] = KEY_KPMINUS, //fine tune - |
| 153 | [ 42 ] = KEY_ANGLE, //picture in picture | 153 | // [ 42 ] = picture in picture |
| 154 | [ 33 ] = KEY_KPDOT, | 154 | [ 33 ] = KEY_KPDOT, |
| 155 | [ 19 ] = KEY_KPENTER, | 155 | [ 19 ] = KEY_KPENTER, |
| 156 | [ 17 ] = KEY_AGAIN, //recall | 156 | // [ 17 ] = recall |
| 157 | [ 34 ] = KEY_BACK, | 157 | [ 34 ] = KEY_BACK, |
| 158 | [ 35 ] = KEY_PLAYPAUSE, | 158 | [ 35 ] = KEY_PLAYPAUSE, |
| 159 | [ 36 ] = KEY_NEXT, | 159 | [ 36 ] = KEY_NEXT, |
| 160 | [ 37 ] = KEY_T, //time shifting | 160 | // [ 37 ] = time shifting |
| 161 | [ 38 ] = KEY_STOP, | 161 | [ 38 ] = KEY_STOP, |
| 162 | [ 39 ] = KEY_RECORD, | 162 | [ 39 ] = KEY_RECORD |
| 163 | [ 40 ] = KEY_SHUFFLE //snapshot | 163 | // [ 40 ] = snapshot |
| 164 | }; | 164 | }; |
| 165 | EXPORT_SYMBOL_GPL(ir_codes_winfast); | 165 | EXPORT_SYMBOL_GPL(ir_codes_winfast); |
| 166 | 166 | ||
| @@ -184,18 +184,30 @@ IR_KEYTAB_TYPE ir_codes_hauppauge_new[IR_KEYTAB_SIZE] = { | |||
| 184 | [ 0x07 ] = KEY_KP7, // 7 | 184 | [ 0x07 ] = KEY_KP7, // 7 |
| 185 | [ 0x08 ] = KEY_KP8, // 8 | 185 | [ 0x08 ] = KEY_KP8, // 8 |
| 186 | [ 0x09 ] = KEY_KP9, // 9 | 186 | [ 0x09 ] = KEY_KP9, // 9 |
| 187 | [ 0x0a ] = KEY_TEXT, // keypad asterisk as well | ||
| 187 | [ 0x0b ] = KEY_RED, // red button | 188 | [ 0x0b ] = KEY_RED, // red button |
| 188 | [ 0x0c ] = KEY_OPTION, // black key without text | 189 | [ 0x0c ] = KEY_RADIO, // radio |
| 189 | [ 0x0d ] = KEY_MENU, // menu | 190 | [ 0x0d ] = KEY_MENU, // menu |
| 191 | [ 0x0e ] = KEY_SUBTITLE, // also the # key | ||
| 190 | [ 0x0f ] = KEY_MUTE, // mute | 192 | [ 0x0f ] = KEY_MUTE, // mute |
| 191 | [ 0x10 ] = KEY_VOLUMEUP, // volume + | 193 | [ 0x10 ] = KEY_VOLUMEUP, // volume + |
| 192 | [ 0x11 ] = KEY_VOLUMEDOWN, // volume - | 194 | [ 0x11 ] = KEY_VOLUMEDOWN, // volume - |
| 193 | [ 0x1e ] = KEY_NEXT, // skip >| | 195 | [ 0x12 ] = KEY_PREVIOUS, // previous channel |
| 196 | [ 0x14 ] = KEY_UP, // up | ||
| 197 | [ 0x15 ] = KEY_DOWN, // down | ||
| 198 | [ 0x16 ] = KEY_LEFT, // left | ||
| 199 | [ 0x17 ] = KEY_RIGHT, // right | ||
| 200 | [ 0x18 ] = KEY_VIDEO, // Videos | ||
| 201 | [ 0x19 ] = KEY_AUDIO, // Music | ||
| 202 | [ 0x1a ] = KEY_MHP, // Pictures - presume this means "Multimedia Home Platform"- no "PICTURES" key in input.h | ||
| 203 | [ 0x1b ] = KEY_EPG, // Guide | ||
| 204 | [ 0x1c ] = KEY_TV, // TV | ||
| 205 | [ 0x1e ] = KEY_NEXTSONG, // skip >| | ||
| 194 | [ 0x1f ] = KEY_EXIT, // back/exit | 206 | [ 0x1f ] = KEY_EXIT, // back/exit |
| 195 | [ 0x20 ] = KEY_CHANNELUP, // channel / program + | 207 | [ 0x20 ] = KEY_CHANNELUP, // channel / program + |
| 196 | [ 0x21 ] = KEY_CHANNELDOWN, // channel / program - | 208 | [ 0x21 ] = KEY_CHANNELDOWN, // channel / program - |
| 197 | [ 0x22 ] = KEY_CHANNEL, // source (old black remote) | 209 | [ 0x22 ] = KEY_CHANNEL, // source (old black remote) |
| 198 | [ 0x24 ] = KEY_PREVIOUS, // replay |< | 210 | [ 0x24 ] = KEY_PREVIOUSSONG, // replay |< |
| 199 | [ 0x25 ] = KEY_ENTER, // OK | 211 | [ 0x25 ] = KEY_ENTER, // OK |
| 200 | [ 0x26 ] = KEY_SLEEP, // minimize (old black remote) | 212 | [ 0x26 ] = KEY_SLEEP, // minimize (old black remote) |
| 201 | [ 0x29 ] = KEY_BLUE, // blue key | 213 | [ 0x29 ] = KEY_BLUE, // blue key |
| @@ -412,3 +424,4 @@ EXPORT_SYMBOL_GPL(ir_decode_biphase); | |||
| 412 | * c-basic-offset: 8 | 424 | * c-basic-offset: 8 |
| 413 | * End: | 425 | * End: |
| 414 | */ | 426 | */ |
| 427 | |||
diff --git a/drivers/media/video/bt832.c b/drivers/media/video/bt832.c index 07f72f64c5f7..3bb347d93b9b 100644 --- a/drivers/media/video/bt832.c +++ b/drivers/media/video/bt832.c | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | It outputs an 8-bit 4:2:2 YUV or YCrCb video signal which can be directly | 6 | It outputs an 8-bit 4:2:2 YUV or YCrCb video signal which can be directly |
| 7 | connected to bt848/bt878 GPIO pins on this purpose. | 7 | connected to bt848/bt878 GPIO pins on this purpose. |
| 8 | (see: VLSI Vision Ltd. www.vvl.co.uk for camera datasheets) | 8 | (see: VLSI Vision Ltd. www.vvl.co.uk for camera datasheets) |
| 9 | 9 | ||
| 10 | Supported Cards: | 10 | Supported Cards: |
| 11 | - Pixelview Rev.4E: 0x8a | 11 | - Pixelview Rev.4E: 0x8a |
| 12 | GPIO 0x400000 toggles Bt832 RESET, and the chip changes to i2c 0x88 ! | 12 | GPIO 0x400000 toggles Bt832 RESET, and the chip changes to i2c 0x88 ! |
| @@ -31,16 +31,16 @@ | |||
| 31 | #include <linux/errno.h> | 31 | #include <linux/errno.h> |
| 32 | #include <linux/slab.h> | 32 | #include <linux/slab.h> |
| 33 | 33 | ||
| 34 | #include "id.h" | 34 | #include <media/audiochip.h> |
| 35 | #include "audiochip.h" | 35 | #include <media/id.h> |
| 36 | #include "bttv.h" | 36 | #include "bttv.h" |
| 37 | #include "bt832.h" | 37 | #include "bt832.h" |
| 38 | 38 | ||
| 39 | MODULE_LICENSE("GPL"); | 39 | MODULE_LICENSE("GPL"); |
| 40 | 40 | ||
| 41 | /* Addresses to scan */ | 41 | /* Addresses to scan */ |
| 42 | static unsigned short normal_i2c[] = { I2C_BT832_ALT1>>1, I2C_BT832_ALT2>>1, | 42 | static unsigned short normal_i2c[] = {I2C_CLIENT_END}; |
| 43 | I2C_CLIENT_END }; | 43 | static unsigned short normal_i2c_range[] = {I2C_BT832_ALT1>>1,I2C_BT832_ALT2>>1,I2C_CLIENT_END}; |
| 44 | I2C_CLIENT_INSMOD; | 44 | I2C_CLIENT_INSMOD; |
| 45 | 45 | ||
| 46 | /* ---------------------------------------------------------------------- */ | 46 | /* ---------------------------------------------------------------------- */ |
| @@ -95,7 +95,7 @@ int bt832_init(struct i2c_client *i2c_client_s) | |||
| 95 | 95 | ||
| 96 | buf=kmalloc(65,GFP_KERNEL); | 96 | buf=kmalloc(65,GFP_KERNEL); |
| 97 | bt832_hexdump(i2c_client_s,buf); | 97 | bt832_hexdump(i2c_client_s,buf); |
| 98 | 98 | ||
| 99 | if(buf[0x40] != 0x31) { | 99 | if(buf[0x40] != 0x31) { |
| 100 | printk("bt832: this i2c chip is no bt832 (id=%02x). Detaching.\n",buf[0x40]); | 100 | printk("bt832: this i2c chip is no bt832 (id=%02x). Detaching.\n",buf[0x40]); |
| 101 | kfree(buf); | 101 | kfree(buf); |
| @@ -135,7 +135,7 @@ int bt832_init(struct i2c_client *i2c_client_s) | |||
| 135 | buf[1]= 0x27 & (~0x01); // Default | !skip | 135 | buf[1]= 0x27 & (~0x01); // Default | !skip |
| 136 | if (2 != (rc = i2c_master_send(i2c_client_s,buf,2))) | 136 | if (2 != (rc = i2c_master_send(i2c_client_s,buf,2))) |
| 137 | printk("bt832: i2c i/o error EO: rc == %d (should be 2)\n",rc); | 137 | printk("bt832: i2c i/o error EO: rc == %d (should be 2)\n",rc); |
| 138 | 138 | ||
| 139 | bt832_hexdump(i2c_client_s,buf); | 139 | bt832_hexdump(i2c_client_s,buf); |
| 140 | 140 | ||
| 141 | #if 0 | 141 | #if 0 |
| @@ -168,8 +168,7 @@ int bt832_init(struct i2c_client *i2c_client_s) | |||
| 168 | 168 | ||
| 169 | 169 | ||
| 170 | 170 | ||
| 171 | static int bt832_attach(struct i2c_adapter *adap, int addr, | 171 | static int bt832_attach(struct i2c_adapter *adap, int addr, int kind) |
| 172 | unsigned short flags, int kind) | ||
| 173 | { | 172 | { |
| 174 | struct bt832 *t; | 173 | struct bt832 *t; |
| 175 | 174 | ||
| @@ -184,27 +183,32 @@ static int bt832_attach(struct i2c_adapter *adap, int addr, | |||
| 184 | return -ENOMEM; | 183 | return -ENOMEM; |
| 185 | memset(t,0,sizeof(*t)); | 184 | memset(t,0,sizeof(*t)); |
| 186 | t->client = client_template; | 185 | t->client = client_template; |
| 187 | t->client.data = t; | 186 | i2c_set_clientdata(&t->client, t); |
| 188 | i2c_attach_client(&t->client); | 187 | i2c_attach_client(&t->client); |
| 189 | 188 | ||
| 190 | if(! bt832_init(&t->client)) { | 189 | if(! bt832_init(&t->client)) { |
| 191 | bt832_detach(&t->client); | 190 | bt832_detach(&t->client); |
| 192 | return -1; | 191 | return -1; |
| 193 | } | 192 | } |
| 194 | 193 | ||
| 195 | return 0; | 194 | return 0; |
| 196 | } | 195 | } |
| 197 | 196 | ||
| 198 | static int bt832_probe(struct i2c_adapter *adap) | 197 | static int bt832_probe(struct i2c_adapter *adap) |
| 199 | { | 198 | { |
| 199 | #ifdef I2C_CLASS_TV_ANALOG | ||
| 200 | if (adap->class & I2C_CLASS_TV_ANALOG) | 200 | if (adap->class & I2C_CLASS_TV_ANALOG) |
| 201 | return i2c_probe(adap, &addr_data, bt832_attach); | 201 | return i2c_probe(adap, &addr_data, bt832_attach); |
| 202 | #else | ||
| 203 | if (adap->id == (I2C_ALGO_BIT | I2C_HW_B_BT848)) | ||
| 204 | return i2c_probe(adap, &addr_data, bt832_attach); | ||
| 205 | #endif | ||
| 202 | return 0; | 206 | return 0; |
| 203 | } | 207 | } |
| 204 | 208 | ||
| 205 | static int bt832_detach(struct i2c_client *client) | 209 | static int bt832_detach(struct i2c_client *client) |
| 206 | { | 210 | { |
| 207 | struct bt832 *t = (struct bt832*)client->data; | 211 | struct bt832 *t = i2c_get_clientdata(client); |
| 208 | 212 | ||
| 209 | printk("bt832: detach.\n"); | 213 | printk("bt832: detach.\n"); |
| 210 | i2c_detach_client(client); | 214 | i2c_detach_client(client); |
| @@ -215,7 +219,7 @@ static int bt832_detach(struct i2c_client *client) | |||
| 215 | static int | 219 | static int |
| 216 | bt832_command(struct i2c_client *client, unsigned int cmd, void *arg) | 220 | bt832_command(struct i2c_client *client, unsigned int cmd, void *arg) |
| 217 | { | 221 | { |
| 218 | struct bt832 *t = (struct bt832*)client->data; | 222 | struct bt832 *t = i2c_get_clientdata(client); |
| 219 | 223 | ||
| 220 | printk("bt832: command %x\n",cmd); | 224 | printk("bt832: command %x\n",cmd); |
| 221 | 225 | ||
| @@ -249,19 +253,18 @@ static struct i2c_driver driver = { | |||
| 249 | }; | 253 | }; |
| 250 | static struct i2c_client client_template = | 254 | static struct i2c_client client_template = |
| 251 | { | 255 | { |
| 252 | .name = "bt832", | 256 | I2C_DEVNAME("bt832"), |
| 253 | .flags = I2C_CLIENT_ALLOW_USE, | 257 | .flags = I2C_CLIENT_ALLOW_USE, |
| 254 | .driver = &driver, | 258 | .driver = &driver, |
| 255 | }; | 259 | }; |
| 256 | 260 | ||
| 257 | 261 | ||
| 258 | int bt832_init_module(void) | 262 | static int __init bt832_init_module(void) |
| 259 | { | 263 | { |
| 260 | i2c_add_driver(&driver); | 264 | return i2c_add_driver(&driver); |
| 261 | return 0; | ||
| 262 | } | 265 | } |
| 263 | 266 | ||
| 264 | static void bt832_cleanup_module(void) | 267 | static void __exit bt832_cleanup_module(void) |
| 265 | { | 268 | { |
| 266 | i2c_del_driver(&driver); | 269 | i2c_del_driver(&driver); |
| 267 | } | 270 | } |
| @@ -269,3 +272,10 @@ static void bt832_cleanup_module(void) | |||
| 269 | module_init(bt832_init_module); | 272 | module_init(bt832_init_module); |
| 270 | module_exit(bt832_cleanup_module); | 273 | module_exit(bt832_cleanup_module); |
| 271 | 274 | ||
| 275 | /* | ||
| 276 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
| 277 | * --------------------------------------------------------------------------- | ||
| 278 | * Local variables: | ||
| 279 | * c-basic-offset: 8 | ||
| 280 | * End: | ||
| 281 | */ | ||
diff --git a/drivers/media/video/bt832.h b/drivers/media/video/bt832.h index 7a98c06e0e34..9b6a8d2c96b5 100644 --- a/drivers/media/video/bt832.h +++ b/drivers/media/video/bt832.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* Bt832 CMOS Camera Video Processor (VP) | 1 | /* Bt832 CMOS Camera Video Processor (VP) |
| 2 | 2 | ||
| 3 | The Bt832 CMOS Camera Video Processor chip connects a Quartsight CMOS | 3 | The Bt832 CMOS Camera Video Processor chip connects a Quartsight CMOS |
| 4 | color digital camera directly to video capture devices via an 8-bit, | 4 | color digital camera directly to video capture devices via an 8-bit, |
| 5 | 4:2:2 YUV or YCrCb video interface. | 5 | 4:2:2 YUV or YCrCb video interface. |
| 6 | 6 | ||
| @@ -85,7 +85,7 @@ | |||
| 85 | #define BT832_DEVICE_ID 63 | 85 | #define BT832_DEVICE_ID 63 |
| 86 | # define BT832_DEVICE_ID__31 0x31 // Bt832 has ID 0x31 | 86 | # define BT832_DEVICE_ID__31 0x31 // Bt832 has ID 0x31 |
| 87 | 87 | ||
| 88 | /* STMicroelectronivcs VV5404 camera module | 88 | /* STMicroelectronivcs VV5404 camera module |
| 89 | i2c: 0x20: sensor address | 89 | i2c: 0x20: sensor address |
| 90 | i2c: 0xa0: eeprom for ccd defect map | 90 | i2c: 0xa0: eeprom for ccd defect map |
| 91 | */ | 91 | */ |
| @@ -256,26 +256,26 @@ For the CCIR-601 standards, the sampling is based on a static orthogonal samplin | |||
| 256 | //=========================================================================== | 256 | //=========================================================================== |
| 257 | // Timing generator SRAM table values for CCIR601 720x480 NTSC | 257 | // Timing generator SRAM table values for CCIR601 720x480 NTSC |
| 258 | //=========================================================================== | 258 | //=========================================================================== |
| 259 | // For NTSC CCIR656 | 259 | // For NTSC CCIR656 |
| 260 | BYTE BtCard::SRAMTable_NTSC[] = | 260 | BYTE BtCard::SRAMTable_NTSC[] = |
| 261 | { | 261 | { |
| 262 | // SRAM Timing Table for NTSC | 262 | // SRAM Timing Table for NTSC |
| 263 | 0x0c, 0xc0, 0x00, | 263 | 0x0c, 0xc0, 0x00, |
| 264 | 0x00, 0x90, 0xc2, | 264 | 0x00, 0x90, 0xc2, |
| 265 | 0x03, 0x10, 0x03, | 265 | 0x03, 0x10, 0x03, |
| 266 | 0x06, 0x10, 0x34, | 266 | 0x06, 0x10, 0x34, |
| 267 | 0x12, 0x12, 0x65, | 267 | 0x12, 0x12, 0x65, |
| 268 | 0x02, 0x13, 0x24, | 268 | 0x02, 0x13, 0x24, |
| 269 | 0x19, 0x00, 0x24, | 269 | 0x19, 0x00, 0x24, |
| 270 | 0x39, 0x00, 0x96, | 270 | 0x39, 0x00, 0x96, |
| 271 | 0x59, 0x08, 0x93, | 271 | 0x59, 0x08, 0x93, |
| 272 | 0x83, 0x08, 0x97, | 272 | 0x83, 0x08, 0x97, |
| 273 | 0x03, 0x50, 0x30, | 273 | 0x03, 0x50, 0x30, |
| 274 | 0xc0, 0x40, 0x30, | 274 | 0xc0, 0x40, 0x30, |
| 275 | 0x86, 0x01, 0x01, | 275 | 0x86, 0x01, 0x01, |
| 276 | 0xa6, 0x0d, 0x62, | 276 | 0xa6, 0x0d, 0x62, |
| 277 | 0x03, 0x11, 0x61, | 277 | 0x03, 0x11, 0x61, |
| 278 | 0x05, 0x37, 0x30, | 278 | 0x05, 0x37, 0x30, |
| 279 | 0xac, 0x21, 0x50 | 279 | 0xac, 0x21, 0x50 |
| 280 | }; | 280 | }; |
| 281 | 281 | ||
diff --git a/drivers/media/video/msp3400.c b/drivers/media/video/msp3400.c index 09464d624a6b..05b83faa9a02 100644 --- a/drivers/media/video/msp3400.c +++ b/drivers/media/video/msp3400.c | |||
| @@ -147,6 +147,7 @@ static unsigned short normal_i2c[] = { | |||
| 147 | I2C_MSP3400C_ALT >> 1, | 147 | I2C_MSP3400C_ALT >> 1, |
| 148 | I2C_CLIENT_END | 148 | I2C_CLIENT_END |
| 149 | }; | 149 | }; |
| 150 | static unsigned short normal_i2c_range[] = {I2C_CLIENT_END,I2C_CLIENT_END}; | ||
| 150 | I2C_CLIENT_INSMOD; | 151 | I2C_CLIENT_INSMOD; |
| 151 | 152 | ||
| 152 | /* ----------------------------------------------------------------------- */ | 153 | /* ----------------------------------------------------------------------- */ |
| @@ -735,7 +736,6 @@ static int msp34xx_sleep(struct msp3400c *msp, int timeout) | |||
| 735 | { | 736 | { |
| 736 | DECLARE_WAITQUEUE(wait, current); | 737 | DECLARE_WAITQUEUE(wait, current); |
| 737 | 738 | ||
| 738 | again: | ||
| 739 | add_wait_queue(&msp->wq, &wait); | 739 | add_wait_queue(&msp->wq, &wait); |
| 740 | if (!kthread_should_stop()) { | 740 | if (!kthread_should_stop()) { |
| 741 | if (timeout < 0) { | 741 | if (timeout < 0) { |
| @@ -751,12 +751,9 @@ again: | |||
| 751 | #endif | 751 | #endif |
| 752 | } | 752 | } |
| 753 | } | 753 | } |
| 754 | 754 | if (current->flags & PF_FREEZE) | |
| 755 | refrigerator(PF_FREEZE); | ||
| 755 | remove_wait_queue(&msp->wq, &wait); | 756 | remove_wait_queue(&msp->wq, &wait); |
| 756 | |||
| 757 | if (try_to_freeze(PF_FREEZE)) | ||
| 758 | goto again; | ||
| 759 | |||
| 760 | return msp->restart; | 757 | return msp->restart; |
| 761 | } | 758 | } |
| 762 | 759 | ||
| @@ -1436,7 +1433,7 @@ static int msp_detach(struct i2c_client *client); | |||
| 1436 | static int msp_probe(struct i2c_adapter *adap); | 1433 | static int msp_probe(struct i2c_adapter *adap); |
| 1437 | static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg); | 1434 | static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg); |
| 1438 | 1435 | ||
| 1439 | static int msp_suspend(struct device * dev, pm_message_t state, u32 level); | 1436 | static int msp_suspend(struct device * dev, u32 state, u32 level); |
| 1440 | static int msp_resume(struct device * dev, u32 level); | 1437 | static int msp_resume(struct device * dev, u32 level); |
| 1441 | 1438 | ||
| 1442 | static void msp_wake_thread(struct i2c_client *client); | 1439 | static void msp_wake_thread(struct i2c_client *client); |
| @@ -1841,7 +1838,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 1841 | return 0; | 1838 | return 0; |
| 1842 | } | 1839 | } |
| 1843 | 1840 | ||
| 1844 | static int msp_suspend(struct device * dev, pm_message_t state, u32 level) | 1841 | static int msp_suspend(struct device * dev, u32 state, u32 level) |
| 1845 | { | 1842 | { |
| 1846 | struct i2c_client *c = container_of(dev, struct i2c_client, dev); | 1843 | struct i2c_client *c = container_of(dev, struct i2c_client, dev); |
| 1847 | 1844 | ||
diff --git a/drivers/media/video/msp3400.h b/drivers/media/video/msp3400.h index d70a954e13aa..023f33056a4f 100644 --- a/drivers/media/video/msp3400.h +++ b/drivers/media/video/msp3400.h | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | /* | ||
| 2 | * $Id: msp3400.h,v 1.3 2005/06/12 04:19:19 mchehab Exp $ | ||
| 3 | */ | ||
| 4 | |||
| 1 | #ifndef MSP3400_H | 5 | #ifndef MSP3400_H |
| 2 | #define MSP3400_H | 6 | #define MSP3400_H |
| 3 | 7 | ||
diff --git a/drivers/media/video/tda7432.c b/drivers/media/video/tda7432.c index 07ba6d3ed08c..376a4a439e9b 100644 --- a/drivers/media/video/tda7432.c +++ b/drivers/media/video/tda7432.c | |||
| @@ -74,6 +74,7 @@ static unsigned short normal_i2c[] = { | |||
| 74 | I2C_TDA7432 >> 1, | 74 | I2C_TDA7432 >> 1, |
| 75 | I2C_CLIENT_END, | 75 | I2C_CLIENT_END, |
| 76 | }; | 76 | }; |
| 77 | static unsigned short normal_i2c_range[] = { I2C_CLIENT_END, I2C_CLIENT_END }; | ||
| 77 | I2C_CLIENT_INSMOD; | 78 | I2C_CLIENT_INSMOD; |
| 78 | 79 | ||
| 79 | /* Structure of address and subaddresses for the tda7432 */ | 80 | /* Structure of address and subaddresses for the tda7432 */ |
diff --git a/drivers/media/video/tda9875.c b/drivers/media/video/tda9875.c index 97b113e070f3..4f1114c033a1 100644 --- a/drivers/media/video/tda9875.c +++ b/drivers/media/video/tda9875.c | |||
| @@ -44,6 +44,7 @@ static unsigned short normal_i2c[] = { | |||
| 44 | I2C_TDA9875 >> 1, | 44 | I2C_TDA9875 >> 1, |
| 45 | I2C_CLIENT_END | 45 | I2C_CLIENT_END |
| 46 | }; | 46 | }; |
| 47 | static unsigned short normal_i2c_range[] = {I2C_CLIENT_END}; | ||
| 47 | I2C_CLIENT_INSMOD; | 48 | I2C_CLIENT_INSMOD; |
| 48 | 49 | ||
| 49 | /* This is a superset of the TDA9875 */ | 50 | /* This is a superset of the TDA9875 */ |
diff --git a/drivers/media/video/tda9887.c b/drivers/media/video/tda9887.c index 7e6e6dd966a2..33d6ee6cde48 100644 --- a/drivers/media/video/tda9887.c +++ b/drivers/media/video/tda9887.c | |||
| @@ -33,6 +33,7 @@ static unsigned short normal_i2c[] = { | |||
| 33 | 0x96 >>1, | 33 | 0x96 >>1, |
| 34 | I2C_CLIENT_END, | 34 | I2C_CLIENT_END, |
| 35 | }; | 35 | }; |
| 36 | static unsigned short normal_i2c_range[] = {I2C_CLIENT_END,I2C_CLIENT_END}; | ||
| 36 | I2C_CLIENT_INSMOD; | 37 | I2C_CLIENT_INSMOD; |
| 37 | 38 | ||
| 38 | /* insmod options */ | 39 | /* insmod options */ |
| @@ -53,6 +54,7 @@ struct tda9887 { | |||
| 53 | unsigned int config; | 54 | unsigned int config; |
| 54 | unsigned int pinnacle_id; | 55 | unsigned int pinnacle_id; |
| 55 | unsigned int using_v4l2; | 56 | unsigned int using_v4l2; |
| 57 | unsigned int radio_mode; | ||
| 56 | }; | 58 | }; |
| 57 | 59 | ||
| 58 | struct tvnorm { | 60 | struct tvnorm { |
| @@ -212,12 +214,22 @@ static struct tvnorm tvnorms[] = { | |||
| 212 | } | 214 | } |
| 213 | }; | 215 | }; |
| 214 | 216 | ||
| 215 | static struct tvnorm radio = { | 217 | static struct tvnorm radio_stereo = { |
| 216 | .name = "radio", | 218 | .name = "Radio Stereo", |
| 219 | .b = ( cFmRadio | | ||
| 220 | cQSS ), | ||
| 221 | .c = ( cDeemphasisOFF | | ||
| 222 | cAudioGain6 ), | ||
| 223 | .e = ( cAudioIF_5_5 | | ||
| 224 | cRadioIF_38_90 ), | ||
| 225 | }; | ||
| 226 | |||
| 227 | static struct tvnorm radio_mono = { | ||
| 228 | .name = "Radio Mono", | ||
| 217 | .b = ( cFmRadio | | 229 | .b = ( cFmRadio | |
| 218 | cQSS ), | 230 | cQSS ), |
| 219 | .c = ( cDeemphasisON | | 231 | .c = ( cDeemphasisON | |
| 220 | cDeemphasis50 ), | 232 | cDeemphasis50), |
| 221 | .e = ( cAudioIF_5_5 | | 233 | .e = ( cAudioIF_5_5 | |
| 222 | cRadioIF_38_90 ), | 234 | cRadioIF_38_90 ), |
| 223 | }; | 235 | }; |
| @@ -354,7 +366,10 @@ static int tda9887_set_tvnorm(struct tda9887 *t, char *buf) | |||
| 354 | int i; | 366 | int i; |
| 355 | 367 | ||
| 356 | if (t->radio) { | 368 | if (t->radio) { |
| 357 | norm = &radio; | 369 | if (t->radio_mode == V4L2_TUNER_MODE_MONO) |
| 370 | norm = &radio_mono; | ||
| 371 | else | ||
| 372 | norm = &radio_stereo; | ||
| 358 | } else { | 373 | } else { |
| 359 | for (i = 0; i < ARRAY_SIZE(tvnorms); i++) { | 374 | for (i = 0; i < ARRAY_SIZE(tvnorms); i++) { |
| 360 | if (tvnorms[i].std & t->std) { | 375 | if (tvnorms[i].std & t->std) { |
| @@ -545,11 +560,14 @@ static int tda9887_configure(struct tda9887 *t) | |||
| 545 | 560 | ||
| 546 | memset(buf,0,sizeof(buf)); | 561 | memset(buf,0,sizeof(buf)); |
| 547 | tda9887_set_tvnorm(t,buf); | 562 | tda9887_set_tvnorm(t,buf); |
| 563 | |||
| 548 | buf[1] |= cOutputPort1Inactive; | 564 | buf[1] |= cOutputPort1Inactive; |
| 549 | buf[1] |= cOutputPort2Inactive; | 565 | buf[1] |= cOutputPort2Inactive; |
| 566 | |||
| 550 | if (UNSET != t->pinnacle_id) { | 567 | if (UNSET != t->pinnacle_id) { |
| 551 | tda9887_set_pinnacle(t,buf); | 568 | tda9887_set_pinnacle(t,buf); |
| 552 | } | 569 | } |
| 570 | |||
| 553 | tda9887_set_config(t,buf); | 571 | tda9887_set_config(t,buf); |
| 554 | tda9887_set_insmod(t,buf); | 572 | tda9887_set_insmod(t,buf); |
| 555 | 573 | ||
| @@ -592,9 +610,12 @@ static int tda9887_attach(struct i2c_adapter *adap, int addr, int kind) | |||
| 592 | if (NULL == (t = kmalloc(sizeof(*t), GFP_KERNEL))) | 610 | if (NULL == (t = kmalloc(sizeof(*t), GFP_KERNEL))) |
| 593 | return -ENOMEM; | 611 | return -ENOMEM; |
| 594 | memset(t,0,sizeof(*t)); | 612 | memset(t,0,sizeof(*t)); |
| 613 | |||
| 595 | t->client = client_template; | 614 | t->client = client_template; |
| 596 | t->std = 0; | 615 | t->std = 0; |
| 597 | t->pinnacle_id = UNSET; | 616 | t->pinnacle_id = UNSET; |
| 617 | t->radio_mode = V4L2_TUNER_MODE_STEREO; | ||
| 618 | |||
| 598 | i2c_set_clientdata(&t->client, t); | 619 | i2c_set_clientdata(&t->client, t); |
| 599 | i2c_attach_client(&t->client); | 620 | i2c_attach_client(&t->client); |
| 600 | 621 | ||
| @@ -733,6 +754,16 @@ tda9887_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 733 | } | 754 | } |
| 734 | break; | 755 | break; |
| 735 | } | 756 | } |
| 757 | case VIDIOC_S_TUNER: | ||
| 758 | { | ||
| 759 | struct v4l2_tuner* tuner = arg; | ||
| 760 | |||
| 761 | if (t->radio) { | ||
| 762 | t->radio_mode = tuner->audmode; | ||
| 763 | tda9887_configure (t); | ||
| 764 | } | ||
| 765 | break; | ||
| 766 | } | ||
| 736 | default: | 767 | default: |
| 737 | /* nothing */ | 768 | /* nothing */ |
| 738 | break; | 769 | break; |
| @@ -740,7 +771,7 @@ tda9887_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 740 | return 0; | 771 | return 0; |
| 741 | } | 772 | } |
| 742 | 773 | ||
| 743 | static int tda9887_suspend(struct device * dev, pm_message_t state, u32 level) | 774 | static int tda9887_suspend(struct device * dev, u32 state, u32 level) |
| 744 | { | 775 | { |
| 745 | dprintk("tda9887: suspend\n"); | 776 | dprintk("tda9887: suspend\n"); |
| 746 | return 0; | 777 | return 0; |
diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c index 71423ae3b4dd..ba13bfadb523 100644 --- a/drivers/media/video/tuner-core.c +++ b/drivers/media/video/tuner-core.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * $Id: tuner-core.c,v 1.7 2005/05/30 02:02:47 mchehab Exp $ | 2 | * $Id: tuner-core.c,v 1.15 2005/06/12 01:36:14 mchehab Exp $ |
| 3 | * | 3 | * |
| 4 | * i2c tv tuner chip device driver | 4 | * i2c tv tuner chip device driver |
| 5 | * core core, i.e. kernel interfaces, registering and so on | 5 | * core core, i.e. kernel interfaces, registering and so on |
| @@ -26,15 +26,17 @@ | |||
| 26 | /* | 26 | /* |
| 27 | * comment line bellow to return to old behavor, where only one I2C device is supported | 27 | * comment line bellow to return to old behavor, where only one I2C device is supported |
| 28 | */ | 28 | */ |
| 29 | /* #define CONFIG_TUNER_MULTI_I2C */ | 29 | #define CONFIG_TUNER_MULTI_I2C /**/ |
| 30 | 30 | ||
| 31 | #define UNSET (-1U) | 31 | #define UNSET (-1U) |
| 32 | 32 | ||
| 33 | /* standard i2c insmod options */ | 33 | /* standard i2c insmod options */ |
| 34 | static unsigned short normal_i2c[] = { | 34 | static unsigned short normal_i2c[] = { |
| 35 | 0x4b, /* tda8290 */ | 35 | 0x4b, /* tda8290 */ |
| 36 | 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, | 36 | I2C_CLIENT_END |
| 37 | 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, | 37 | }; |
| 38 | static unsigned short normal_i2c_range[] = { | ||
| 39 | 0x60, 0x6f, | ||
| 38 | I2C_CLIENT_END | 40 | I2C_CLIENT_END |
| 39 | }; | 41 | }; |
| 40 | I2C_CLIENT_INSMOD; | 42 | I2C_CLIENT_INSMOD; |
| @@ -59,7 +61,7 @@ MODULE_LICENSE("GPL"); | |||
| 59 | 61 | ||
| 60 | static int this_adap; | 62 | static int this_adap; |
| 61 | #ifdef CONFIG_TUNER_MULTI_I2C | 63 | #ifdef CONFIG_TUNER_MULTI_I2C |
| 62 | static unsigned short tv_tuner, radio_tuner; | 64 | static unsigned short first_tuner, tv_tuner, radio_tuner; |
| 63 | #endif | 65 | #endif |
| 64 | 66 | ||
| 65 | static struct i2c_driver driver; | 67 | static struct i2c_driver driver; |
| @@ -67,7 +69,7 @@ static struct i2c_client client_template; | |||
| 67 | 69 | ||
| 68 | /* ---------------------------------------------------------------------- */ | 70 | /* ---------------------------------------------------------------------- */ |
| 69 | 71 | ||
| 70 | // Set tuner frequency, freq in Units of 62.5kHz = 1/16MHz | 72 | /* Set tuner frequency, freq in Units of 62.5kHz = 1/16MHz */ |
| 71 | static void set_tv_freq(struct i2c_client *c, unsigned int freq) | 73 | static void set_tv_freq(struct i2c_client *c, unsigned int freq) |
| 72 | { | 74 | { |
| 73 | struct tuner *t = i2c_get_clientdata(c); | 75 | struct tuner *t = i2c_get_clientdata(c); |
| @@ -81,14 +83,26 @@ static void set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
| 81 | return; | 83 | return; |
| 82 | } | 84 | } |
| 83 | if (freq < tv_range[0]*16 || freq > tv_range[1]*16) { | 85 | if (freq < tv_range[0]*16 || freq > tv_range[1]*16) { |
| 84 | /* FIXME: better do that chip-specific, but | 86 | |
| 85 | right now we don't have that in the config | 87 | if (freq >= tv_range[0]*16364 && freq <= tv_range[1]*16384) { |
| 86 | struct and this way is still better than no | 88 | /* V4L2_TUNER_CAP_LOW frequency */ |
| 87 | check at all */ | 89 | |
| 88 | tuner_info("TV freq (%d.%02d) out of range (%d-%d)\n", | 90 | tuner_dbg("V4L2_TUNER_CAP_LOW freq selected for TV. Tuners yet doesn't support converting it to valid freq.\n"); |
| 89 | freq/16,freq%16*100/16,tv_range[0],tv_range[1]); | 91 | |
| 90 | return; | 92 | t->tv_freq(c,freq>>10); |
| 93 | |||
| 94 | return; | ||
| 95 | } else { | ||
| 96 | /* FIXME: better do that chip-specific, but | ||
| 97 | right now we don't have that in the config | ||
| 98 | struct and this way is still better than no | ||
| 99 | check at all */ | ||
| 100 | tuner_info("TV freq (%d.%02d) out of range (%d-%d)\n", | ||
| 101 | freq/16,freq%16*100/16,tv_range[0],tv_range[1]); | ||
| 102 | return; | ||
| 103 | } | ||
| 91 | } | 104 | } |
| 105 | tuner_dbg("62.5 Khz freq step selected for TV.\n"); | ||
| 92 | t->tv_freq(c,freq); | 106 | t->tv_freq(c,freq); |
| 93 | } | 107 | } |
| 94 | 108 | ||
| @@ -105,11 +119,29 @@ static void set_radio_freq(struct i2c_client *c, unsigned int freq) | |||
| 105 | return; | 119 | return; |
| 106 | } | 120 | } |
| 107 | if (freq < radio_range[0]*16 || freq > radio_range[1]*16) { | 121 | if (freq < radio_range[0]*16 || freq > radio_range[1]*16) { |
| 108 | tuner_info("radio freq (%d.%02d) out of range (%d-%d)\n", | 122 | if (freq >= tv_range[0]*16364 && freq <= tv_range[1]*16384) { |
| 123 | /* V4L2_TUNER_CAP_LOW frequency */ | ||
| 124 | if (t->type == TUNER_TEA5767) { | ||
| 125 | tuner_info("radio freq step 62.5Hz (%d.%06d)\n",(freq>>14),freq%(1<<14)*10000); | ||
| 126 | t->radio_freq(c,freq>>10); | ||
| 127 | return; | ||
| 128 | } | ||
| 129 | |||
| 130 | tuner_dbg("V4L2_TUNER_CAP_LOW freq selected for Radio. Tuners yet doesn't support converting it to valid freq.\n"); | ||
| 131 | |||
| 132 | tuner_info("radio freq (%d.%06d)\n",(freq>>14),freq%(1<<14)*10000); | ||
| 133 | |||
| 134 | t->radio_freq(c,freq>>10); | ||
| 135 | return; | ||
| 136 | |||
| 137 | } else { | ||
| 138 | tuner_info("radio freq (%d.%02d) out of range (%d-%d)\n", | ||
| 109 | freq/16,freq%16*100/16, | 139 | freq/16,freq%16*100/16, |
| 110 | radio_range[0],radio_range[1]); | 140 | radio_range[0],radio_range[1]); |
| 111 | return; | 141 | return; |
| 142 | } | ||
| 112 | } | 143 | } |
| 144 | tuner_dbg("62.5 Khz freq step selected for Radio.\n"); | ||
| 113 | t->radio_freq(c,freq); | 145 | t->radio_freq(c,freq); |
| 114 | } | 146 | } |
| 115 | 147 | ||
| @@ -133,34 +165,13 @@ static void set_freq(struct i2c_client *c, unsigned long freq) | |||
| 133 | t->freq = freq; | 165 | t->freq = freq; |
| 134 | } | 166 | } |
| 135 | 167 | ||
| 136 | #ifdef CONFIG_TUNER_MULTI_I2C | ||
| 137 | static void set_addr(struct i2c_client *c, struct tuner_addr *tun_addr) | ||
| 138 | { | ||
| 139 | struct tuner *t = i2c_get_clientdata(c); | ||
| 140 | |||
| 141 | switch (tun_addr->type) { | ||
| 142 | case V4L2_TUNER_RADIO: | ||
| 143 | radio_tuner=tun_addr->addr; | ||
| 144 | tuner_dbg("radio tuner set to I2C address 0x%02x\n",radio_tuner<<1); | ||
| 145 | |||
| 146 | break; | ||
| 147 | default: | ||
| 148 | tv_tuner=tun_addr->addr; | ||
| 149 | tuner_dbg("TV tuner set to I2C address 0x%02x\n",tv_tuner<<1); | ||
| 150 | break; | ||
| 151 | } | ||
| 152 | } | ||
| 153 | #else | ||
| 154 | #define set_addr(c,tun_addr) \ | ||
| 155 | tuner_warn("It is recommended to enable CONFIG_TUNER_MULTI_I2C for this card.\n"); | ||
| 156 | #endif | ||
| 157 | |||
| 158 | static void set_type(struct i2c_client *c, unsigned int type) | 168 | static void set_type(struct i2c_client *c, unsigned int type) |
| 159 | { | 169 | { |
| 160 | struct tuner *t = i2c_get_clientdata(c); | 170 | struct tuner *t = i2c_get_clientdata(c); |
| 161 | 171 | ||
| 172 | tuner_dbg ("I2C addr 0x%02x with type %d\n",c->addr<<1,type); | ||
| 162 | /* sanity check */ | 173 | /* sanity check */ |
| 163 | if (type == UNSET || type == TUNER_ABSENT) | 174 | if (type == UNSET || type == TUNER_ABSENT) |
| 164 | return; | 175 | return; |
| 165 | if (type >= tuner_count) | 176 | if (type >= tuner_count) |
| 166 | return; | 177 | return; |
| @@ -175,6 +186,7 @@ static void set_type(struct i2c_client *c, unsigned int type) | |||
| 175 | return; | 186 | return; |
| 176 | 187 | ||
| 177 | t->initialized = 1; | 188 | t->initialized = 1; |
| 189 | |||
| 178 | t->type = type; | 190 | t->type = type; |
| 179 | switch (t->type) { | 191 | switch (t->type) { |
| 180 | case TUNER_MT2032: | 192 | case TUNER_MT2032: |
| @@ -189,6 +201,53 @@ static void set_type(struct i2c_client *c, unsigned int type) | |||
| 189 | } | 201 | } |
| 190 | } | 202 | } |
| 191 | 203 | ||
| 204 | #ifdef CONFIG_TUNER_MULTI_I2C | ||
| 205 | #define CHECK_ADDR(tp,cmd,tun) if (client->addr!=tp) { \ | ||
| 206 | return 0; } else \ | ||
| 207 | tuner_info ("Cmd %s accepted to "tun"\n",cmd); | ||
| 208 | #define CHECK_MODE(cmd) if (t->mode == V4L2_TUNER_RADIO) { \ | ||
| 209 | CHECK_ADDR(radio_tuner,cmd,"radio") } else \ | ||
| 210 | { CHECK_ADDR(tv_tuner,cmd,"TV"); } | ||
| 211 | #else | ||
| 212 | #define CHECK_ADDR(tp,cmd,tun) tuner_info ("Cmd %s accepted to "tun"\n",cmd); | ||
| 213 | #define CHECK_MODE(cmd) tuner_info ("Cmd %s accepted\n",cmd); | ||
| 214 | #endif | ||
| 215 | |||
| 216 | #ifdef CONFIG_TUNER_MULTI_I2C | ||
| 217 | |||
| 218 | static void set_addr(struct i2c_client *c, struct tuner_addr *tun_addr) | ||
| 219 | { | ||
| 220 | /* ADDR_UNSET defaults to first available tuner */ | ||
| 221 | if ( tun_addr->addr == ADDR_UNSET ) { | ||
| 222 | if (first_tuner != c->addr) | ||
| 223 | return; | ||
| 224 | switch (tun_addr->v4l2_tuner) { | ||
| 225 | case V4L2_TUNER_RADIO: | ||
| 226 | radio_tuner=c->addr; | ||
| 227 | break; | ||
| 228 | default: | ||
| 229 | tv_tuner=c->addr; | ||
| 230 | break; | ||
| 231 | } | ||
| 232 | } else { | ||
| 233 | /* Sets tuner to its configured value */ | ||
| 234 | switch (tun_addr->v4l2_tuner) { | ||
| 235 | case V4L2_TUNER_RADIO: | ||
| 236 | radio_tuner=tun_addr->addr; | ||
| 237 | if ( tun_addr->addr == c->addr ) set_type(c,tun_addr->type); | ||
| 238 | return; | ||
| 239 | default: | ||
| 240 | tv_tuner=tun_addr->addr; | ||
| 241 | if ( tun_addr->addr == c->addr ) set_type(c,tun_addr->type); | ||
| 242 | return; | ||
| 243 | } | ||
| 244 | } | ||
| 245 | set_type(c,tun_addr->type); | ||
| 246 | } | ||
| 247 | #else | ||
| 248 | #define set_addr(c,tun_addr) set_type(c,(tun_addr)->type) | ||
| 249 | #endif | ||
| 250 | |||
| 192 | static char pal[] = "-"; | 251 | static char pal[] = "-"; |
| 193 | module_param_string(pal, pal, sizeof(pal), 0644); | 252 | module_param_string(pal, pal, sizeof(pal), 0644); |
| 194 | 253 | ||
| @@ -233,6 +292,7 @@ static int tuner_attach(struct i2c_adapter *adap, int addr, int kind) | |||
| 233 | #else | 292 | #else |
| 234 | /* by default, first I2C card is both tv and radio tuner */ | 293 | /* by default, first I2C card is both tv and radio tuner */ |
| 235 | if (this_adap == 0) { | 294 | if (this_adap == 0) { |
| 295 | first_tuner = addr; | ||
| 236 | tv_tuner = addr; | 296 | tv_tuner = addr; |
| 237 | radio_tuner = addr; | 297 | radio_tuner = addr; |
| 238 | } | 298 | } |
| @@ -249,11 +309,12 @@ static int tuner_attach(struct i2c_adapter *adap, int addr, int kind) | |||
| 249 | memcpy(&t->i2c,&client_template,sizeof(struct i2c_client)); | 309 | memcpy(&t->i2c,&client_template,sizeof(struct i2c_client)); |
| 250 | i2c_set_clientdata(&t->i2c, t); | 310 | i2c_set_clientdata(&t->i2c, t); |
| 251 | t->type = UNSET; | 311 | t->type = UNSET; |
| 252 | t->radio_if2 = 10700*1000; // 10.7MHz - FM radio | 312 | t->radio_if2 = 10700*1000; /* 10.7MHz - FM radio */ |
| 253 | 313 | ||
| 254 | i2c_attach_client(&t->i2c); | 314 | i2c_attach_client(&t->i2c); |
| 255 | tuner_info("chip found @ 0x%x (%s)\n", | 315 | tuner_info("chip found @ 0x%x (%s)\n", |
| 256 | addr << 1, adap->name); | 316 | addr << 1, adap->name); |
| 317 | |||
| 257 | set_type(&t->i2c, t->type); | 318 | set_type(&t->i2c, t->type); |
| 258 | return 0; | 319 | return 0; |
| 259 | } | 320 | } |
| @@ -261,12 +322,14 @@ static int tuner_attach(struct i2c_adapter *adap, int addr, int kind) | |||
| 261 | static int tuner_probe(struct i2c_adapter *adap) | 322 | static int tuner_probe(struct i2c_adapter *adap) |
| 262 | { | 323 | { |
| 263 | if (0 != addr) { | 324 | if (0 != addr) { |
| 264 | normal_i2c[0] = addr; | 325 | normal_i2c[0] = addr; |
| 265 | normal_i2c[1] = I2C_CLIENT_END; | 326 | normal_i2c_range[0] = addr; |
| 327 | normal_i2c_range[1] = addr; | ||
| 266 | } | 328 | } |
| 267 | this_adap = 0; | 329 | this_adap = 0; |
| 268 | 330 | ||
| 269 | #ifdef CONFIG_TUNER_MULTI_I2C | 331 | #ifdef CONFIG_TUNER_MULTI_I2C |
| 332 | first_tuner = 0; | ||
| 270 | tv_tuner = 0; | 333 | tv_tuner = 0; |
| 271 | radio_tuner = 0; | 334 | radio_tuner = 0; |
| 272 | #endif | 335 | #endif |
| @@ -298,17 +361,6 @@ static int tuner_detach(struct i2c_client *client) | |||
| 298 | tuner_info("ignore v4l1 call\n"); \ | 361 | tuner_info("ignore v4l1 call\n"); \ |
| 299 | return 0; } | 362 | return 0; } |
| 300 | 363 | ||
| 301 | #ifdef CONFIG_TUNER_MULTI_I2C | ||
| 302 | #define CHECK_ADDR(tp,cmd) if (client->addr!=tp) { \ | ||
| 303 | tuner_info ("Cmd %s to addr 0x%02x rejected.\n",cmd,client->addr<<1); \ | ||
| 304 | return 0; } | ||
| 305 | #define CHECK_MODE(cmd) if (t->mode == V4L2_TUNER_RADIO) { \ | ||
| 306 | CHECK_ADDR(radio_tuner,cmd) } else { CHECK_ADDR(tv_tuner,cmd); } | ||
| 307 | #else | ||
| 308 | #define CHECK_ADDR(tp,cmd) | ||
| 309 | #define CHECK_MODE(cmd) | ||
| 310 | #endif | ||
| 311 | |||
| 312 | static int | 364 | static int |
| 313 | tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | 365 | tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) |
| 314 | { | 366 | { |
| @@ -320,19 +372,19 @@ tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 320 | case TUNER_SET_TYPE: | 372 | case TUNER_SET_TYPE: |
| 321 | set_type(client,*iarg); | 373 | set_type(client,*iarg); |
| 322 | break; | 374 | break; |
| 323 | case TUNER_SET_ADDR: | 375 | case TUNER_SET_TYPE_ADDR: |
| 324 | set_addr(client,(struct tuner_addr *)arg); | 376 | set_addr(client,(struct tuner_addr *)arg); |
| 325 | break; | 377 | break; |
| 326 | case AUDC_SET_RADIO: | 378 | case AUDC_SET_RADIO: |
| 327 | CHECK_ADDR(radio_tuner,"AUDC_SET_RADIO"); | 379 | t->mode = V4L2_TUNER_RADIO; |
| 380 | CHECK_ADDR(tv_tuner,"AUDC_SET_RADIO","TV"); | ||
| 328 | 381 | ||
| 329 | if (V4L2_TUNER_RADIO != t->mode) { | 382 | if (V4L2_TUNER_RADIO != t->mode) { |
| 330 | set_tv_freq(client,400 * 16); | 383 | set_tv_freq(client,400 * 16); |
| 331 | t->mode = V4L2_TUNER_RADIO; | ||
| 332 | } | 384 | } |
| 333 | break; | 385 | break; |
| 334 | case AUDC_CONFIG_PINNACLE: | 386 | case AUDC_CONFIG_PINNACLE: |
| 335 | CHECK_ADDR(tv_tuner,"AUDC_CONFIG_PINNACLE"); | 387 | CHECK_ADDR(tv_tuner,"AUDC_CONFIG_PINNACLE","TV"); |
| 336 | switch (*iarg) { | 388 | switch (*iarg) { |
| 337 | case 2: | 389 | case 2: |
| 338 | tuner_dbg("pinnacle pal\n"); | 390 | tuner_dbg("pinnacle pal\n"); |
| @@ -360,9 +412,10 @@ tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 360 | }; | 412 | }; |
| 361 | struct video_channel *vc = arg; | 413 | struct video_channel *vc = arg; |
| 362 | 414 | ||
| 363 | CHECK_ADDR(tv_tuner,"VIDIOCSCHAN"); | ||
| 364 | CHECK_V4L2; | 415 | CHECK_V4L2; |
| 365 | t->mode = V4L2_TUNER_ANALOG_TV; | 416 | t->mode = V4L2_TUNER_ANALOG_TV; |
| 417 | CHECK_ADDR(tv_tuner,"VIDIOCSCHAN","TV"); | ||
| 418 | |||
| 366 | if (vc->norm < ARRAY_SIZE(map)) | 419 | if (vc->norm < ARRAY_SIZE(map)) |
| 367 | t->std = map[vc->norm]; | 420 | t->std = map[vc->norm]; |
| 368 | tuner_fixup_std(t); | 421 | tuner_fixup_std(t); |
| @@ -383,17 +436,27 @@ tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 383 | { | 436 | { |
| 384 | struct video_tuner *vt = arg; | 437 | struct video_tuner *vt = arg; |
| 385 | 438 | ||
| 386 | CHECK_ADDR(radio_tuner,"VIDIOCGTUNER:"); | 439 | CHECK_ADDR(radio_tuner,"VIDIOCGTUNER","radio"); |
| 387 | CHECK_V4L2; | 440 | CHECK_V4L2; |
| 388 | if (V4L2_TUNER_RADIO == t->mode && t->has_signal) | 441 | if (V4L2_TUNER_RADIO == t->mode) { |
| 389 | vt->signal = t->has_signal(client); | 442 | if (t->has_signal) |
| 443 | vt->signal = t->has_signal(client); | ||
| 444 | if (t->is_stereo) { | ||
| 445 | if (t->is_stereo(client)) | ||
| 446 | vt-> flags |= VIDEO_TUNER_STEREO_ON; | ||
| 447 | else | ||
| 448 | vt-> flags &= 0xffff ^ VIDEO_TUNER_STEREO_ON; | ||
| 449 | } | ||
| 450 | vt->flags |= V4L2_TUNER_CAP_LOW; /* Allow freqs at 62.5 Hz */ | ||
| 451 | } | ||
| 452 | |||
| 390 | return 0; | 453 | return 0; |
| 391 | } | 454 | } |
| 392 | case VIDIOCGAUDIO: | 455 | case VIDIOCGAUDIO: |
| 393 | { | 456 | { |
| 394 | struct video_audio *va = arg; | 457 | struct video_audio *va = arg; |
| 395 | 458 | ||
| 396 | CHECK_ADDR(radio_tuner,"VIDIOCGAUDIO"); | 459 | CHECK_ADDR(radio_tuner,"VIDIOCGAUDIO","radio"); |
| 397 | CHECK_V4L2; | 460 | CHECK_V4L2; |
| 398 | if (V4L2_TUNER_RADIO == t->mode && t->is_stereo) | 461 | if (V4L2_TUNER_RADIO == t->mode && t->is_stereo) |
| 399 | va->mode = t->is_stereo(client) | 462 | va->mode = t->is_stereo(client) |
| @@ -406,9 +469,10 @@ tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 406 | { | 469 | { |
| 407 | v4l2_std_id *id = arg; | 470 | v4l2_std_id *id = arg; |
| 408 | 471 | ||
| 409 | CHECK_ADDR(tv_tuner,"VIDIOC_S_STD"); | ||
| 410 | SWITCH_V4L2; | 472 | SWITCH_V4L2; |
| 411 | t->mode = V4L2_TUNER_ANALOG_TV; | 473 | t->mode = V4L2_TUNER_ANALOG_TV; |
| 474 | CHECK_ADDR(tv_tuner,"VIDIOC_S_STD","TV"); | ||
| 475 | |||
| 412 | t->std = *id; | 476 | t->std = *id; |
| 413 | tuner_fixup_std(t); | 477 | tuner_fixup_std(t); |
| 414 | if (t->freq) | 478 | if (t->freq) |
| @@ -444,13 +508,27 @@ tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 444 | 508 | ||
| 445 | CHECK_MODE("VIDIOC_G_TUNER"); | 509 | CHECK_MODE("VIDIOC_G_TUNER"); |
| 446 | SWITCH_V4L2; | 510 | SWITCH_V4L2; |
| 447 | if (V4L2_TUNER_RADIO == t->mode && t->has_signal) | 511 | if (V4L2_TUNER_RADIO == t->mode) { |
| 448 | tuner->signal = t->has_signal(client); | 512 | if (t->has_signal) |
| 513 | tuner -> signal = t->has_signal(client); | ||
| 514 | if (t->is_stereo) { | ||
| 515 | if (t->is_stereo(client)) { | ||
| 516 | tuner -> capability |= V4L2_TUNER_CAP_STEREO; | ||
| 517 | tuner -> rxsubchans |= V4L2_TUNER_SUB_STEREO; | ||
| 518 | } else { | ||
| 519 | tuner -> rxsubchans &= 0xffff ^ V4L2_TUNER_SUB_STEREO; | ||
| 520 | } | ||
| 521 | } | ||
| 522 | } | ||
| 523 | /* Wow to deal with V4L2_TUNER_CAP_LOW ? For now, it accepts from low at 62.5KHz step to high at 62.5 Hz */ | ||
| 449 | tuner->rangelow = tv_range[0] * 16; | 524 | tuner->rangelow = tv_range[0] * 16; |
| 450 | tuner->rangehigh = tv_range[1] * 16; | 525 | // tuner->rangehigh = tv_range[1] * 16; |
| 526 | // tuner->rangelow = tv_range[0] * 16384; | ||
| 527 | tuner->rangehigh = tv_range[1] * 16384; | ||
| 451 | break; | 528 | break; |
| 452 | } | 529 | } |
| 453 | default: | 530 | default: |
| 531 | tuner_dbg ("Unimplemented IOCTL 0x%08x called to tuner.\n", cmd); | ||
| 454 | /* nothing */ | 532 | /* nothing */ |
| 455 | break; | 533 | break; |
| 456 | } | 534 | } |
| @@ -458,7 +536,7 @@ tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 458 | return 0; | 536 | return 0; |
| 459 | } | 537 | } |
| 460 | 538 | ||
| 461 | static int tuner_suspend(struct device * dev, pm_message_t state, u32 level) | 539 | static int tuner_suspend(struct device * dev, u32 state, u32 level) |
| 462 | { | 540 | { |
| 463 | struct i2c_client *c = container_of(dev, struct i2c_client, dev); | 541 | struct i2c_client *c = container_of(dev, struct i2c_client, dev); |
| 464 | struct tuner *t = i2c_get_clientdata(c); | 542 | struct tuner *t = i2c_get_clientdata(c); |
diff --git a/drivers/media/video/tuner-simple.c b/drivers/media/video/tuner-simple.c index 866f18dc5b58..539f30557317 100644 --- a/drivers/media/video/tuner-simple.c +++ b/drivers/media/video/tuner-simple.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * $Id: tuner-simple.c,v 1.14 2005/05/30 02:02:47 mchehab Exp $ | 2 | * $Id: tuner-simple.c,v 1.21 2005/06/10 19:53:26 nsh Exp $ |
| 3 | * | 3 | * |
| 4 | * i2c tv tuner chip device driver | 4 | * i2c tv tuner chip device driver |
| 5 | * controls all those simple 4-control-bytes style tuners. | 5 | * controls all those simple 4-control-bytes style tuners. |
| @@ -220,7 +220,17 @@ static struct tunertype tuners[] = { | |||
| 220 | 220 | ||
| 221 | { "Thomson DDT 7611 (ATSC/NTSC)", THOMSON, ATSC, | 221 | { "Thomson DDT 7611 (ATSC/NTSC)", THOMSON, ATSC, |
| 222 | 16*157.25,16*454.00,0x39,0x3a,0x3c,0x8e,732}, | 222 | 16*157.25,16*454.00,0x39,0x3a,0x3c,0x8e,732}, |
| 223 | { "Tena TNF9533-D/IF", LGINNOTEK, PAL, | ||
| 224 | 16*160.25, 16*464.25, 0x01,0x02,0x08,0x8e,623}, | ||
| 225 | |||
| 226 | /* | ||
| 227 | * This entry is for TEA5767 FM radio only chip used on several boards | ||
| 228 | * w/TV tuner | ||
| 229 | */ | ||
| 230 | { TEA5767_TUNER_NAME, Philips, RADIO, | ||
| 231 | -1, -1, 0, 0, 0, TEA5767_LOW_LO_32768,0}, | ||
| 223 | }; | 232 | }; |
| 233 | |||
| 224 | unsigned const int tuner_count = ARRAY_SIZE(tuners); | 234 | unsigned const int tuner_count = ARRAY_SIZE(tuners); |
| 225 | 235 | ||
| 226 | /* ---------------------------------------------------------------------- */ | 236 | /* ---------------------------------------------------------------------- */ |
| @@ -231,6 +241,7 @@ static int tuner_getstatus(struct i2c_client *c) | |||
| 231 | 241 | ||
| 232 | if (1 != i2c_master_recv(c,&byte,1)) | 242 | if (1 != i2c_master_recv(c,&byte,1)) |
| 233 | return 0; | 243 | return 0; |
| 244 | |||
| 234 | return byte; | 245 | return byte; |
| 235 | } | 246 | } |
| 236 | 247 | ||
| @@ -239,17 +250,33 @@ static int tuner_getstatus(struct i2c_client *c) | |||
| 239 | #define TUNER_MODE 0x38 | 250 | #define TUNER_MODE 0x38 |
| 240 | #define TUNER_AFC 0x07 | 251 | #define TUNER_AFC 0x07 |
| 241 | 252 | ||
| 242 | #define TUNER_STEREO 0x10 /* radio mode */ | 253 | #define TUNER_STEREO 0x10 /* radio mode */ |
| 243 | #define TUNER_SIGNAL 0x07 /* radio mode */ | 254 | #define TUNER_STEREO_MK3 0x04 /* radio mode */ |
| 255 | #define TUNER_SIGNAL 0x07 /* radio mode */ | ||
| 244 | 256 | ||
| 245 | static int tuner_signal(struct i2c_client *c) | 257 | static int tuner_signal(struct i2c_client *c) |
| 246 | { | 258 | { |
| 247 | return (tuner_getstatus(c) & TUNER_SIGNAL)<<13; | 259 | return (tuner_getstatus(c) & TUNER_SIGNAL) << 13; |
| 248 | } | 260 | } |
| 249 | 261 | ||
| 250 | static int tuner_stereo(struct i2c_client *c) | 262 | static int tuner_stereo(struct i2c_client *c) |
| 251 | { | 263 | { |
| 252 | return (tuner_getstatus (c) & TUNER_STEREO); | 264 | int stereo, status; |
| 265 | struct tuner *t = i2c_get_clientdata(c); | ||
| 266 | |||
| 267 | status = tuner_getstatus (c); | ||
| 268 | |||
| 269 | switch (t->type) { | ||
| 270 | case TUNER_PHILIPS_FM1216ME_MK3: | ||
| 271 | case TUNER_PHILIPS_FM1236_MK3: | ||
| 272 | case TUNER_PHILIPS_FM1256_IH3: | ||
| 273 | stereo = ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3); | ||
| 274 | break; | ||
| 275 | default: | ||
| 276 | stereo = status & TUNER_STEREO; | ||
| 277 | } | ||
| 278 | |||
| 279 | return stereo; | ||
| 253 | } | 280 | } |
| 254 | 281 | ||
| 255 | #if 0 /* unused */ | 282 | #if 0 /* unused */ |
| @@ -432,6 +459,7 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq) | |||
| 432 | buffer[2] = tun->config; | 459 | buffer[2] = tun->config; |
| 433 | 460 | ||
| 434 | switch (t->type) { | 461 | switch (t->type) { |
| 462 | case TUNER_TENA_9533_DI: | ||
| 435 | case TUNER_YMEC_TVF_5533MF: | 463 | case TUNER_YMEC_TVF_5533MF: |
| 436 | 464 | ||
| 437 | /*These values are empirically determinated */ | 465 | /*These values are empirically determinated */ |
| @@ -473,20 +501,6 @@ int default_tuner_init(struct i2c_client *c) | |||
| 473 | t->type, tuners[t->type].name); | 501 | t->type, tuners[t->type].name); |
| 474 | strlcpy(c->name, tuners[t->type].name, sizeof(c->name)); | 502 | strlcpy(c->name, tuners[t->type].name, sizeof(c->name)); |
| 475 | 503 | ||
| 476 | switch (t->type) { | ||
| 477 | case TUNER_YMEC_TVF_5533MF: | ||
| 478 | { | ||
| 479 | struct tuner_addr tun_addr = { V4L2_TUNER_ANALOG_TV, 0xc2>>1 }; | ||
| 480 | |||
| 481 | if (c->driver->command) { | ||
| 482 | c->driver->command(c, TUNER_SET_ADDR, &tun_addr); | ||
| 483 | } else { | ||
| 484 | tuner_warn("Couldn't set TV tuner I2C address to 0x%02x\n",tun_addr.addr<<1); | ||
| 485 | } | ||
| 486 | break; | ||
| 487 | } | ||
| 488 | } | ||
| 489 | |||
| 490 | t->tv_freq = default_set_tv_freq; | 504 | t->tv_freq = default_set_tv_freq; |
| 491 | t->radio_freq = default_set_radio_freq; | 505 | t->radio_freq = default_set_radio_freq; |
| 492 | t->has_signal = tuner_signal; | 506 | t->has_signal = tuner_signal; |
diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c index 41b635e0d3c6..6f5828a9b80c 100644 --- a/drivers/media/video/tvaudio.c +++ b/drivers/media/video/tvaudio.c | |||
| @@ -148,6 +148,7 @@ static unsigned short normal_i2c[] = { | |||
| 148 | I2C_TDA9874 >> 1, | 148 | I2C_TDA9874 >> 1, |
| 149 | I2C_PIC16C54 >> 1, | 149 | I2C_PIC16C54 >> 1, |
| 150 | I2C_CLIENT_END }; | 150 | I2C_CLIENT_END }; |
| 151 | static unsigned short normal_i2c_range[2] = { I2C_CLIENT_END, I2C_CLIENT_END }; | ||
| 151 | I2C_CLIENT_INSMOD; | 152 | I2C_CLIENT_INSMOD; |
| 152 | 153 | ||
| 153 | static struct i2c_driver driver; | 154 | static struct i2c_driver driver; |
| @@ -285,7 +286,6 @@ static int chip_thread(void *data) | |||
| 285 | schedule(); | 286 | schedule(); |
| 286 | } | 287 | } |
| 287 | remove_wait_queue(&chip->wq, &wait); | 288 | remove_wait_queue(&chip->wq, &wait); |
| 288 | try_to_freeze(PF_FREEZE); | ||
| 289 | if (chip->done || signal_pending(current)) | 289 | if (chip->done || signal_pending(current)) |
| 290 | break; | 290 | break; |
| 291 | dprintk("%s: thread wakeup\n", i2c_clientname(&chip->c)); | 291 | dprintk("%s: thread wakeup\n", i2c_clientname(&chip->c)); |
diff --git a/drivers/media/video/tvmixer.c b/drivers/media/video/tvmixer.c index eafd7061b310..51b99cdbf29e 100644 --- a/drivers/media/video/tvmixer.c +++ b/drivers/media/video/tvmixer.c | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | /* | ||
| 2 | * $Id: tvmixer.c,v 1.8 2005/06/12 04:19:19 mchehab Exp $ | ||
| 3 | */ | ||
| 4 | |||
| 1 | #include <linux/module.h> | 5 | #include <linux/module.h> |
| 2 | #include <linux/moduleparam.h> | 6 | #include <linux/moduleparam.h> |
| 3 | #include <linux/kernel.h> | 7 | #include <linux/kernel.h> |
diff --git a/include/media/audiochip.h b/include/media/audiochip.h index d3e9e30608dc..f345a61c3bdb 100644 --- a/include/media/audiochip.h +++ b/include/media/audiochip.h | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | /* | ||
| 2 | * $Id: audiochip.h,v 1.3 2005/06/12 04:19:19 mchehab Exp $ | ||
| 3 | */ | ||
| 4 | |||
| 1 | #ifndef AUDIOCHIP_H | 5 | #ifndef AUDIOCHIP_H |
| 2 | #define AUDIOCHIP_H | 6 | #define AUDIOCHIP_H |
| 3 | 7 | ||
diff --git a/include/media/id.h b/include/media/id.h index 1b0320dc8f73..a39a6423914b 100644 --- a/include/media/id.h +++ b/include/media/id.h | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | /* | ||
| 2 | * $Id: id.h,v 1.4 2005/06/12 04:19:19 mchehab Exp $ | ||
| 3 | */ | ||
| 4 | |||
| 1 | /* FIXME: this temporarely, until these are included in linux/i2c-id.h */ | 5 | /* FIXME: this temporarely, until these are included in linux/i2c-id.h */ |
| 2 | 6 | ||
| 3 | /* drivers */ | 7 | /* drivers */ |
diff --git a/include/media/ir-common.h b/include/media/ir-common.h index b5fa6c585e2d..698670547f16 100644 --- a/include/media/ir-common.h +++ b/include/media/ir-common.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * $Id: ir-common.h,v 1.8 2005/02/22 12:28:40 kraxel Exp $ | 2 | * $Id: ir-common.h,v 1.9 2005/05/15 19:01:26 mchehab Exp $ |
| 3 | * | 3 | * |
| 4 | * some common structs and functions to handle infrared remotes via | 4 | * some common structs and functions to handle infrared remotes via |
| 5 | * input layer ... | 5 | * input layer ... |
diff --git a/include/media/tuner.h b/include/media/tuner.h index cb75f4809c4d..2dd8310901e8 100644 --- a/include/media/tuner.h +++ b/include/media/tuner.h | |||
| @@ -25,6 +25,8 @@ | |||
| 25 | 25 | ||
| 26 | #include "id.h" | 26 | #include "id.h" |
| 27 | 27 | ||
| 28 | #define ADDR_UNSET (255) | ||
| 29 | |||
| 28 | #define TUNER_TEMIC_PAL 0 /* 4002 FH5 (3X 7756, 9483) */ | 30 | #define TUNER_TEMIC_PAL 0 /* 4002 FH5 (3X 7756, 9483) */ |
| 29 | #define TUNER_PHILIPS_PAL_I 1 | 31 | #define TUNER_PHILIPS_PAL_I 1 |
| 30 | #define TUNER_PHILIPS_NTSC 2 | 32 | #define TUNER_PHILIPS_NTSC 2 |
| @@ -100,6 +102,11 @@ | |||
| 100 | 102 | ||
| 101 | #define TUNER_YMEC_TVF_8531MF 58 | 103 | #define TUNER_YMEC_TVF_8531MF 58 |
| 102 | #define TUNER_YMEC_TVF_5533MF 59 /* Pixelview Pro Ultra NTSC */ | 104 | #define TUNER_YMEC_TVF_5533MF 59 /* Pixelview Pro Ultra NTSC */ |
| 105 | #define TUNER_THOMSON_DTT7611 60 | ||
| 106 | #define TUNER_TENA_9533_DI 61 | ||
| 107 | #define TUNER_TEA5767 62 /* Only FM Radio Tuner */ | ||
| 108 | |||
| 109 | #define TEA5767_TUNER_NAME "Philips TEA5767HN FM Radio" | ||
| 103 | 110 | ||
| 104 | #define TUNER_THOMSON_DTT7611 60 | 111 | #define TUNER_THOMSON_DTT7611 60 |
| 105 | 112 | ||
| @@ -109,6 +116,7 @@ | |||
| 109 | #define NTSC 3 | 116 | #define NTSC 3 |
| 110 | #define SECAM 4 | 117 | #define SECAM 4 |
| 111 | #define ATSC 5 | 118 | #define ATSC 5 |
| 119 | #define RADIO 6 | ||
| 112 | 120 | ||
| 113 | #define NoTuner 0 | 121 | #define NoTuner 0 |
| 114 | #define Philips 1 | 122 | #define Philips 1 |
| @@ -124,9 +132,17 @@ | |||
| 124 | #define TCL 11 | 132 | #define TCL 11 |
| 125 | #define THOMSON 12 | 133 | #define THOMSON 12 |
| 126 | 134 | ||
| 135 | enum v4l_radio_tuner { | ||
| 136 | TEA5767_LOW_LO_32768 = 0, | ||
| 137 | TEA5767_HIGH_LO_32768 = 1, | ||
| 138 | TEA5767_LOW_LO_13MHz = 2, | ||
| 139 | TEA5767_HIGH_LO_13MHz = 3, | ||
| 140 | }; | ||
| 141 | |||
| 142 | |||
| 127 | #define TUNER_SET_TYPE _IOW('t',1,int) /* set tuner type */ | 143 | #define TUNER_SET_TYPE _IOW('t',1,int) /* set tuner type */ |
| 128 | #define TUNER_SET_TVFREQ _IOW('t',2,int) /* set tv freq */ | 144 | #define TUNER_SET_TVFREQ _IOW('t',2,int) /* set tv freq */ |
| 129 | #define TUNER_SET_ADDR _IOW('T',3,int) /* Chooses tuner I2C address */ | 145 | #define TUNER_SET_TYPE_ADDR _IOW('T',3,int) /* set tuner type and I2C addr */ |
| 130 | 146 | ||
| 131 | #define TDA9887_SET_CONFIG _IOW('t',5,int) | 147 | #define TDA9887_SET_CONFIG _IOW('t',5,int) |
| 132 | 148 | ||
| @@ -151,8 +167,9 @@ | |||
| 151 | #define I2C_ADDR_TDA8275 0x61 | 167 | #define I2C_ADDR_TDA8275 0x61 |
| 152 | 168 | ||
| 153 | struct tuner_addr { | 169 | struct tuner_addr { |
| 154 | enum v4l2_tuner_type type; | 170 | enum v4l2_tuner_type v4l2_tuner; |
| 155 | unsigned short addr; | 171 | unsigned int type; |
| 172 | unsigned short addr; | ||
| 156 | }; | 173 | }; |
| 157 | 174 | ||
| 158 | struct tuner { | 175 | struct tuner { |
