aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOldřich Jedlička <oldium.pro@seznam.cz>2009-02-12 01:43:11 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-03-30 11:42:49 -0400
commitcb3bf504f7c875070d56e84ce1e28aff8c3b6790 (patch)
treea128df79e322523966aea8eefcc8e7620219aae3
parent995a65285bde47bbb2a0c3dadc0b8822d47d78f4 (diff)
V4L/DVB (10632): Added support for AVerMedia Cardbus Hybrid remote control
Added support for I2C device at address 0x40 and subaddress 0x0d/0x0b that provides remote control key reading support for AVerMedia Cardbus Hybrid card, possibly for other AVerMedia Cardbus cards. The I2C address 0x40 doesn't like the SAA7134's 0xfd quirk, so it was disabled. [mchehab@redhat.com: CodingStyle fixes] Signed-off-by: Oldřich Jedlička <oldium.pro@seznam.cz> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/common/ir-keymaps.c59
-rw-r--r--drivers/media/video/ir-kbd-i2c.c64
-rw-r--r--drivers/media/video/saa7134/saa7134-cards.c5
-rw-r--r--drivers/media/video/saa7134/saa7134-i2c.c2
-rw-r--r--include/media/ir-common.h1
5 files changed, 130 insertions, 1 deletions
diff --git a/drivers/media/common/ir-keymaps.c b/drivers/media/common/ir-keymaps.c
index d7b205472e1c..97e78f71c60d 100644
--- a/drivers/media/common/ir-keymaps.c
+++ b/drivers/media/common/ir-keymaps.c
@@ -153,6 +153,65 @@ IR_KEYTAB_TYPE ir_codes_avermedia_m135a[IR_KEYTAB_SIZE] = {
153}; 153};
154EXPORT_SYMBOL_GPL(ir_codes_avermedia_m135a); 154EXPORT_SYMBOL_GPL(ir_codes_avermedia_m135a);
155 155
156/* Oldrich Jedlicka <oldium.pro@seznam.cz> */
157IR_KEYTAB_TYPE ir_codes_avermedia_cardbus[IR_KEYTAB_SIZE] = {
158 [0x00] = KEY_POWER,
159 [0x01] = KEY_TUNER, /* TV/FM */
160 [0x03] = KEY_TEXT, /* Teletext */
161 [0x04] = KEY_EPG,
162 [0x05] = KEY_1,
163 [0x06] = KEY_2,
164 [0x07] = KEY_3,
165 [0x08] = KEY_AUDIO,
166 [0x09] = KEY_4,
167 [0x0a] = KEY_5,
168 [0x0b] = KEY_6,
169 [0x0c] = KEY_ZOOM, /* Full screen */
170 [0x0d] = KEY_7,
171 [0x0e] = KEY_8,
172 [0x0f] = KEY_9,
173 [0x10] = KEY_PAGEUP, /* 16-CH PREV */
174 [0x11] = KEY_0,
175 [0x12] = KEY_INFO,
176 [0x13] = KEY_AGAIN, /* CH RTN - channel return */
177 [0x14] = KEY_MUTE,
178 [0x15] = KEY_EDIT, /* Autoscan */
179 [0x17] = KEY_SAVE, /* Screenshot */
180 [0x18] = KEY_PLAYPAUSE,
181 [0x19] = KEY_RECORD,
182 [0x1a] = KEY_PLAY,
183 [0x1b] = KEY_STOP,
184 [0x1c] = KEY_FASTFORWARD,
185 [0x1d] = KEY_REWIND,
186 [0x1e] = KEY_VOLUMEDOWN,
187 [0x1f] = KEY_VOLUMEUP,
188 [0x22] = KEY_SLEEP, /* Sleep */
189 [0x23] = KEY_ZOOM, /* Aspect */
190 [0x26] = KEY_SCREEN, /* Pos */
191 [0x27] = KEY_ANGLE, /* Size */
192 [0x28] = KEY_SELECT, /* Select */
193 [0x29] = KEY_BLUE, /* Blue/Picture */
194 [0x2a] = KEY_BACKSPACE, /* Back */
195 [0x2b] = KEY_MEDIA, /* PIP (Picture-in-picture) */
196 [0x2c] = KEY_DOWN,
197 [0x2e] = KEY_DOT,
198 [0x2f] = KEY_TV, /* Live TV */
199 [0x32] = KEY_LEFT,
200 [0x33] = KEY_CLEAR, /* Clear */
201 [0x35] = KEY_RED, /* Red/TV */
202 [0x36] = KEY_UP,
203 [0x37] = KEY_HOME, /* Home */
204 [0x39] = KEY_GREEN, /* Green/Video */
205 [0x3d] = KEY_YELLOW, /* Yellow/Music */
206 [0x3e] = KEY_OK, /* Ok */
207 [0x3f] = KEY_RIGHT,
208 [0x40] = KEY_NEXT, /* Next */
209 [0x41] = KEY_PREVIOUS, /* Previous */
210 [0x42] = KEY_CHANNELDOWN, /* Channel down */
211 [0x43] = KEY_CHANNELUP /* Channel up */
212};
213EXPORT_SYMBOL_GPL(ir_codes_avermedia_cardbus);
214
156/* Attila Kondoros <attila.kondoros@chello.hu> */ 215/* Attila Kondoros <attila.kondoros@chello.hu> */
157IR_KEYTAB_TYPE ir_codes_apac_viewcomp[IR_KEYTAB_SIZE] = { 216IR_KEYTAB_TYPE ir_codes_apac_viewcomp[IR_KEYTAB_SIZE] = {
158 217
diff --git a/drivers/media/video/ir-kbd-i2c.c b/drivers/media/video/ir-kbd-i2c.c
index d4658c56eddc..2ee49b7ddcf0 100644
--- a/drivers/media/video/ir-kbd-i2c.c
+++ b/drivers/media/video/ir-kbd-i2c.c
@@ -16,6 +16,8 @@
16 * Henry Wong <henry@stuffedcow.net> 16 * Henry Wong <henry@stuffedcow.net>
17 * Mark Schultz <n9xmj@yahoo.com> 17 * Mark Schultz <n9xmj@yahoo.com>
18 * Brian Rogers <brian_rogers@comcast.net> 18 * Brian Rogers <brian_rogers@comcast.net>
19 * modified for AVerMedia Cardbus by
20 * Oldrich Jedlicka <oldium.pro@seznam.cz>
19 * 21 *
20 * This program is free software; you can redistribute it and/or modify 22 * This program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License as published by 23 * it under the terms of the GNU General Public License as published by
@@ -216,6 +218,46 @@ static int get_key_knc1(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
216 return 1; 218 return 1;
217} 219}
218 220
221static int get_key_avermedia_cardbus(struct IR_i2c *ir,
222 u32 *ir_key, u32 *ir_raw)
223{
224 unsigned char subaddr, key, keygroup;
225 struct i2c_msg msg[] = { { .addr = ir->c.addr, .flags = 0,
226 .buf = &subaddr, .len = 1},
227 { .addr = ir->c.addr, .flags = I2C_M_RD,
228 .buf = &key, .len = 1} };
229 subaddr = 0x0d;
230 if (2 != i2c_transfer(ir->c.adapter, msg, 2)) {
231 dprintk(1, "read error\n");
232 return -EIO;
233 }
234
235 if (key == 0xff)
236 return 0;
237
238 subaddr = 0x0b;
239 msg[1].buf = &keygroup;
240 if (2 != i2c_transfer(ir->c.adapter, msg, 2)) {
241 dprintk(1, "read error\n");
242 return -EIO;
243 }
244
245 if (keygroup == 0xff)
246 return 0;
247
248 dprintk(1, "read key 0x%02x/0x%02x\n", key, keygroup);
249 if (keygroup < 2 || keygroup > 3) {
250 /* Only a warning */
251 dprintk(1, "warning: invalid key group 0x%02x for key 0x%02x\n",
252 keygroup, key);
253 }
254 key |= (keygroup & 1) << 6;
255
256 *ir_key = key;
257 *ir_raw = key;
258 return 1;
259}
260
219/* ----------------------------------------------------------------------- */ 261/* ----------------------------------------------------------------------- */
220 262
221static void ir_key_poll(struct IR_i2c *ir) 263static void ir_key_poll(struct IR_i2c *ir)
@@ -360,6 +402,12 @@ static int ir_attach(struct i2c_adapter *adap, int addr,
360 ir_type = IR_TYPE_OTHER; 402 ir_type = IR_TYPE_OTHER;
361 } 403 }
362 break; 404 break;
405 case 0x40:
406 name = "AVerMedia Cardbus remote";
407 ir->get_key = get_key_avermedia_cardbus;
408 ir_type = IR_TYPE_OTHER;
409 ir_codes = ir_codes_avermedia_cardbus;
410 break;
363 default: 411 default:
364 /* shouldn't happen */ 412 /* shouldn't happen */
365 printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n", addr); 413 printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n", addr);
@@ -524,6 +572,22 @@ static int ir_probe(struct i2c_adapter *adap)
524 ir_attach(adap, msg.addr, 0, 0); 572 ir_attach(adap, msg.addr, 0, 0);
525 } 573 }
526 574
575 /* Special case for AVerMedia Cardbus remote */
576 if (adap->id == I2C_HW_SAA7134) {
577 unsigned char subaddr, data;
578 struct i2c_msg msg[] = { { .addr = 0x40, .flags = 0,
579 .buf = &subaddr, .len = 1},
580 { .addr = 0x40, .flags = I2C_M_RD,
581 .buf = &data, .len = 1} };
582 subaddr = 0x0d;
583 rc = i2c_transfer(adap, msg, 2);
584 dprintk(1, "probe 0x%02x/0x%02x @ %s: %s\n",
585 msg[0].addr, subaddr, adap->name,
586 (2 == rc) ? "yes" : "no");
587 if (2 == rc)
588 ir_attach(adap, msg[0].addr, 0, 0);
589 }
590
527 return 0; 591 return 0;
528} 592}
529 593
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c
index 107f6d30d007..67c223cc867f 100644
--- a/drivers/media/video/saa7134/saa7134-cards.c
+++ b/drivers/media/video/saa7134/saa7134-cards.c
@@ -6019,6 +6019,11 @@ int saa7134_board_init1(struct saa7134_dev *dev)
6019 msleep(10); 6019 msleep(10);
6020 break; 6020 break;
6021 case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: 6021 case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
6022 saa7134_set_gpio(dev, 23, 0);
6023 msleep(10);
6024 saa7134_set_gpio(dev, 23, 1);
6025 dev->has_remote = SAA7134_REMOTE_I2C;
6026 break;
6022 case SAA7134_BOARD_AVERMEDIA_M103: 6027 case SAA7134_BOARD_AVERMEDIA_M103:
6023 saa7134_set_gpio(dev, 23, 0); 6028 saa7134_set_gpio(dev, 23, 0);
6024 msleep(10); 6029 msleep(10);
diff --git a/drivers/media/video/saa7134/saa7134-i2c.c b/drivers/media/video/saa7134/saa7134-i2c.c
index 2e15f43d26ec..f3e285aa2fb4 100644
--- a/drivers/media/video/saa7134/saa7134-i2c.c
+++ b/drivers/media/video/saa7134/saa7134-i2c.c
@@ -255,7 +255,7 @@ static int saa7134_i2c_xfer(struct i2c_adapter *i2c_adap,
255 addr = msgs[i].addr << 1; 255 addr = msgs[i].addr << 1;
256 if (msgs[i].flags & I2C_M_RD) 256 if (msgs[i].flags & I2C_M_RD)
257 addr |= 1; 257 addr |= 1;
258 if (i > 0 && msgs[i].flags & I2C_M_RD) { 258 if (i > 0 && msgs[i].flags & I2C_M_RD && msgs[i].addr != 0x40) {
259 /* workaround for a saa7134 i2c bug 259 /* workaround for a saa7134 i2c bug
260 * needed to talk to the mt352 demux 260 * needed to talk to the mt352 demux
261 * thanks to pinnacle for the hint */ 261 * thanks to pinnacle for the hint */
diff --git a/include/media/ir-common.h b/include/media/ir-common.h
index 31e62abb59ad..135e02270c9b 100644
--- a/include/media/ir-common.h
+++ b/include/media/ir-common.h
@@ -111,6 +111,7 @@ extern IR_KEYTAB_TYPE ir_codes_empty[IR_KEYTAB_SIZE];
111extern IR_KEYTAB_TYPE ir_codes_avermedia[IR_KEYTAB_SIZE]; 111extern IR_KEYTAB_TYPE ir_codes_avermedia[IR_KEYTAB_SIZE];
112extern IR_KEYTAB_TYPE ir_codes_avermedia_dvbt[IR_KEYTAB_SIZE]; 112extern IR_KEYTAB_TYPE ir_codes_avermedia_dvbt[IR_KEYTAB_SIZE];
113extern IR_KEYTAB_TYPE ir_codes_avermedia_m135a[IR_KEYTAB_SIZE]; 113extern IR_KEYTAB_TYPE ir_codes_avermedia_m135a[IR_KEYTAB_SIZE];
114extern IR_KEYTAB_TYPE ir_codes_avermedia_cardbus[IR_KEYTAB_SIZE];
114extern IR_KEYTAB_TYPE ir_codes_apac_viewcomp[IR_KEYTAB_SIZE]; 115extern IR_KEYTAB_TYPE ir_codes_apac_viewcomp[IR_KEYTAB_SIZE];
115extern IR_KEYTAB_TYPE ir_codes_pixelview[IR_KEYTAB_SIZE]; 116extern IR_KEYTAB_TYPE ir_codes_pixelview[IR_KEYTAB_SIZE];
116extern IR_KEYTAB_TYPE ir_codes_pixelview_new[IR_KEYTAB_SIZE]; 117extern IR_KEYTAB_TYPE ir_codes_pixelview_new[IR_KEYTAB_SIZE];