From MythTV
--- linux/drivers/media/video/saa7134/saa7134-input.c.orig 2006-11-03 17:33:58.000000000 -0800
+++ linux/drivers/media/video/saa7134/saa7134-input.c 2007-02-11 02:19:51.000000000 -0800
@@ -46,6 +46,69 @@
#define i2cdprintk(fmt, arg...) if (ir_debug) \
printk(KERN_DEBUG "%s/ir: " fmt, ir->c.name , ## arg)
+ /*
+ Keycodes for remote on the MSI TV@nywhere Plus. The controller IC on the card
+ is marked "KS003". The controller is I2C at address 0x30, but does not seem to respond
+ to probes until a read is performed from a valid device. (I don't know why.)
+ Henry Wong <henry@xxxxxxxxxxxxxx>
+ */
+ static IR_KEYTAB_TYPE msi_tvanywhere_plus_codes[IR_KEYTAB_SIZE] = {
+
+ /*
+ POWER SOURCE SCAN MUTE
+ TV/FM 1 2 3
+ CH+ 4 5 6
+ CH- 7 8 9
+ >>(12) 0 +(16) RECALL(19)
+ <<(4) RECORD STOP PLAY
+
+ MINIMIZE(15) ZOOM(25)
+
+ CH+
+ VOL- VOL+
+ CH-
+
+ SNAPSHOT(26) MTS(13)
+
+ <<(4) FUNCTION >>(12) RESET(29)
+ */
+ [ 2 ] = KEY_KP0,
+ [ 1 ] = KEY_KP1,
+ [ 11 ] = KEY_KP2,
+ [ 27 ] = KEY_KP3,
+ [ 5 ] = KEY_KP4,
+ [ 9 ] = KEY_KP5,
+ [ 21 ] = KEY_KP6,
+ [ 6 ] = KEY_KP7,
+ [ 10 ] = KEY_KP8,
+ [ 18 ] = KEY_KP9,
+
+ [ 0 ] = KEY_RECORD,
+ [ 3 ] = KEY_RADIO, /* FM Radio */
+ [ 4 ] = KEY_BACK,
+ [ 7 ] = KEY_TUNER, /* Source */
+ [ 8 ] = KEY_STOP,
+ [ 12 ] = KEY_FORWARD,
+ [ 13 ] = KEY_LANGUAGE, /* MTS */
+ [ 14 ] = KEY_MENU, /* Function */
+ [ 15 ] = KEY_CLOSE, /* Minimize */
+ [ 16 ] = KEY_KPPLUS, /* + */
+ [ 17 ] = KEY_PLAY,
+ [ 19 ] = KEY_AGAIN, /* Recall */
+ [ 20 ] = KEY_VOLUMEDOWN,
+ [ 22 ] = KEY_VOLUMEUP,
+ [ 23 ] = KEY_CHANNELDOWN,
+ [ 24 ] = KEY_MUTE,
+ [ 25 ] = KEY_ZOOM,
+ [ 26 ] = KEY_SHUFFLE, /* Snapshot */
+ [ 28 ] = KEY_SEARCH, /* Scan */
+ [ 29 ] = KEY_RESTART, /* Reset */
+ [ 30 ] = KEY_POWER,
+ [ 31 ] = KEY_CHANNELUP
+ };
+
+
+
/* -------------------- GPIO generic keycode builder -------------------- */
static int build_key(struct saa7134_dev *dev)
@@ -88,6 +151,48 @@
}
/* --------------------- Chip specific I2C key builders ----------------- */
+static int get_key_msi_tvanywhere_plus(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
+{
+ unsigned char b;
+ int rc;
+ int gpio;
+
+ /* We need this to access GPIO. Used by the saa_readl macro. */
+ struct saa7134_dev *dev = ir->c.adapter->algo_data;
+ if (dev == NULL) {
+ dprintk ("ir->c.adapter->algo_data is NULL!\n");
+ return -EIO;
+ }
+
+ /* rising SAA7134_GPIO_GPRESCAN reads the status */
+ saa_clearb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
+ saa_setb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
+
+ gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
+
+ /* GPIO&0x40 is pulsed low when a button is pressed. Don't do
+ I2C receive if gpio&0x40 is not low. */
+ if (gpio & 0x40)
+ return 0; /* No button press */
+
+
+ /* GPIO says there is a button press. Get it. */
+ if (1 != (rc=i2c_master_recv(&ir->c,&b,1))) {
+ dprintk("read error %d\n", rc);
+ return -EIO;
+ }
+
+ /* No button press */
+ if (b == 0xFF)
+ return 0;
+
+ /* Button pressed */
+ dprintk ("get_key_msi_tvanywhere_plus key=0x%x\n", b);
+
+ *ir_key = b;
+ *ir_raw = b;
+ return 1;
+}
static int get_key_purpletv(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
{
@@ -333,6 +438,11 @@
ir->get_key = get_key_purpletv;
ir->ir_codes = ir_codes_purpletv;
break;
+ case SAA7134_BOARD_MSI_TVANYWHERE_PLUS:
+ snprintf(ir->c.name, sizeof(ir->c.name), "MSI TV@nywhere Plus");
+ ir->get_key = get_key_msi_tvanywhere_plus;
+ ir->ir_codes = msi_tvanywhere_plus_codes;
+ break;
default:
dprintk("Shouldn't get here: Unknown board %x for I2C IR?\n",dev->board);
break;