V4L/DVB: media: dvb/af9015, refactor remote setting
[safe/jmp/linux-2.6] / drivers / media / dvb / dvb-usb / dibusb-common.c
index b95b1eb..9143b56 100644 (file)
@@ -133,14 +133,22 @@ static int dibusb_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num
 
        for (i = 0; i < num; i++) {
                /* write/read request */
-               if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) {
+               if (i+1 < num && (msg[i].flags & I2C_M_RD) == 0
+                                         && (msg[i+1].flags & I2C_M_RD)) {
                        if (dibusb_i2c_msg(d, msg[i].addr, msg[i].buf,msg[i].len,
                                                msg[i+1].buf,msg[i+1].len) < 0)
                                break;
                        i++;
-               } else
+               } else if ((msg[i].flags & I2C_M_RD) == 0) {
                        if (dibusb_i2c_msg(d, msg[i].addr, msg[i].buf,msg[i].len,NULL,0) < 0)
                                break;
+               } else if (msg[i].addr != 0x50) {
+                       /* 0x50 is the address of the eeprom - we need to protect it
+                        * from dibusb's bad i2c implementation: reads without
+                        * writing the offset before are forbidden */
+                       if (dibusb_i2c_msg(d, msg[i].addr, NULL, 0, msg[i].buf, msg[i].len) < 0)
+                               break;
+               }
        }
 
        mutex_unlock(&d->i2c_mutex);
@@ -223,7 +231,9 @@ static struct dibx000_agc_config dib3000p_panasonic_agc_config = {
        .agc2_slope2 = 0x1e,
 };
 
-#ifdef CONFIG_DVB_DIB3000MC
+#if defined(CONFIG_DVB_DIB3000MC) ||                                   \
+       (defined(CONFIG_DVB_DIB3000MC_MODULE) && defined(MODULE))
+
 static struct dib3000mc_config mod3000p_dib3000p_config = {
        &dib3000p_panasonic_agc_config,
 
@@ -238,6 +248,12 @@ static struct dib3000mc_config mod3000p_dib3000p_config = {
 
 int dibusb_dib3000mc_frontend_attach(struct dvb_usb_adapter *adap)
 {
+       if (adap->dev->udev->descriptor.idVendor  == USB_VID_LITEON &&
+                       adap->dev->udev->descriptor.idProduct ==
+                       USB_PID_LITEON_DVB_T_WARM) {
+               msleep(1000);
+       }
+
        if ((adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000P_I2C_ADDRESS,  &mod3000p_dib3000p_config)) != NULL ||
                (adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap, DEFAULT_DIB3000MC_I2C_ADDRESS, &mod3000p_dib3000p_config)) != NULL) {
                if (adap->priv != NULL) {
@@ -313,132 +329,132 @@ EXPORT_SYMBOL(dibusb_dib3000mc_tuner_attach);
  */
 struct dvb_usb_rc_key dibusb_rc_keys[] = {
        /* Key codes for the little Artec T1/Twinhan/HAMA/ remote. */
-       { 0x00, 0x16, KEY_POWER },
-       { 0x00, 0x10, KEY_MUTE },
-       { 0x00, 0x03, KEY_1 },
-       { 0x00, 0x01, KEY_2 },
-       { 0x00, 0x06, KEY_3 },
-       { 0x00, 0x09, KEY_4 },
-       { 0x00, 0x1d, KEY_5 },
-       { 0x00, 0x1f, KEY_6 },
-       { 0x00, 0x0d, KEY_7 },
-       { 0x00, 0x19, KEY_8 },
-       { 0x00, 0x1b, KEY_9 },
-       { 0x00, 0x15, KEY_0 },
-       { 0x00, 0x05, KEY_CHANNELUP },
-       { 0x00, 0x02, KEY_CHANNELDOWN },
-       { 0x00, 0x1e, KEY_VOLUMEUP },
-       { 0x00, 0x0a, KEY_VOLUMEDOWN },
-       { 0x00, 0x11, KEY_RECORD },
-       { 0x00, 0x17, KEY_FAVORITES }, /* Heart symbol - Channel list. */
-       { 0x00, 0x14, KEY_PLAY },
-       { 0x00, 0x1a, KEY_STOP },
-       { 0x00, 0x40, KEY_REWIND },
-       { 0x00, 0x12, KEY_FASTFORWARD },
-       { 0x00, 0x0e, KEY_PREVIOUS }, /* Recall - Previous channel. */
-       { 0x00, 0x4c, KEY_PAUSE },
-       { 0x00, 0x4d, KEY_SCREEN }, /* Full screen mode. */
-       { 0x00, 0x54, KEY_AUDIO }, /* MTS - Switch to secondary audio. */
+       { 0x0016, KEY_POWER },
+       { 0x0010, KEY_MUTE },
+       { 0x0003, KEY_1 },
+       { 0x0001, KEY_2 },
+       { 0x0006, KEY_3 },
+       { 0x0009, KEY_4 },
+       { 0x001d, KEY_5 },
+       { 0x001f, KEY_6 },
+       { 0x000d, KEY_7 },
+       { 0x0019, KEY_8 },
+       { 0x001b, KEY_9 },
+       { 0x0015, KEY_0 },
+       { 0x0005, KEY_CHANNELUP },
+       { 0x0002, KEY_CHANNELDOWN },
+       { 0x001e, KEY_VOLUMEUP },
+       { 0x000a, KEY_VOLUMEDOWN },
+       { 0x0011, KEY_RECORD },
+       { 0x0017, KEY_FAVORITES }, /* Heart symbol - Channel list. */
+       { 0x0014, KEY_PLAY },
+       { 0x001a, KEY_STOP },
+       { 0x0040, KEY_REWIND },
+       { 0x0012, KEY_FASTFORWARD },
+       { 0x000e, KEY_PREVIOUS }, /* Recall - Previous channel. */
+       { 0x004c, KEY_PAUSE },
+       { 0x004d, KEY_SCREEN }, /* Full screen mode. */
+       { 0x0054, KEY_AUDIO }, /* MTS - Switch to secondary audio. */
        /* additional keys TwinHan VisionPlus, the Artec seemingly not have */
-       { 0x00, 0x0c, KEY_CANCEL }, /* Cancel */
-       { 0x00, 0x1c, KEY_EPG }, /* EPG */
-       { 0x00, 0x00, KEY_TAB }, /* Tab */
-       { 0x00, 0x48, KEY_INFO }, /* Preview */
-       { 0x00, 0x04, KEY_LIST }, /* RecordList */
-       { 0x00, 0x0f, KEY_TEXT }, /* Teletext */
+       { 0x000c, KEY_CANCEL }, /* Cancel */
+       { 0x001c, KEY_EPG }, /* EPG */
+       { 0x0000, KEY_TAB }, /* Tab */
+       { 0x0048, KEY_INFO }, /* Preview */
+       { 0x0004, KEY_LIST }, /* RecordList */
+       { 0x000f, KEY_TEXT }, /* Teletext */
        /* Key codes for the KWorld/ADSTech/JetWay remote. */
-       { 0x86, 0x12, KEY_POWER },
-       { 0x86, 0x0f, KEY_SELECT }, /* source */
-       { 0x86, 0x0c, KEY_UNKNOWN }, /* scan */
-       { 0x86, 0x0b, KEY_EPG },
-       { 0x86, 0x10, KEY_MUTE },
-       { 0x86, 0x01, KEY_1 },
-       { 0x86, 0x02, KEY_2 },
-       { 0x86, 0x03, KEY_3 },
-       { 0x86, 0x04, KEY_4 },
-       { 0x86, 0x05, KEY_5 },
-       { 0x86, 0x06, KEY_6 },
-       { 0x86, 0x07, KEY_7 },
-       { 0x86, 0x08, KEY_8 },
-       { 0x86, 0x09, KEY_9 },
-       { 0x86, 0x0a, KEY_0 },
-       { 0x86, 0x18, KEY_ZOOM },
-       { 0x86, 0x1c, KEY_UNKNOWN }, /* preview */
-       { 0x86, 0x13, KEY_UNKNOWN }, /* snap */
-       { 0x86, 0x00, KEY_UNDO },
-       { 0x86, 0x1d, KEY_RECORD },
-       { 0x86, 0x0d, KEY_STOP },
-       { 0x86, 0x0e, KEY_PAUSE },
-       { 0x86, 0x16, KEY_PLAY },
-       { 0x86, 0x11, KEY_BACK },
-       { 0x86, 0x19, KEY_FORWARD },
-       { 0x86, 0x14, KEY_UNKNOWN }, /* pip */
-       { 0x86, 0x15, KEY_ESC },
-       { 0x86, 0x1a, KEY_UP },
-       { 0x86, 0x1e, KEY_DOWN },
-       { 0x86, 0x1f, KEY_LEFT },
-       { 0x86, 0x1b, KEY_RIGHT },
+       { 0x8612, KEY_POWER },
+       { 0x860f, KEY_SELECT }, /* source */
+       { 0x860c, KEY_UNKNOWN }, /* scan */
+       { 0x860b, KEY_EPG },
+       { 0x8610, KEY_MUTE },
+       { 0x8601, KEY_1 },
+       { 0x8602, KEY_2 },
+       { 0x8603, KEY_3 },
+       { 0x8604, KEY_4 },
+       { 0x8605, KEY_5 },
+       { 0x8606, KEY_6 },
+       { 0x8607, KEY_7 },
+       { 0x8608, KEY_8 },
+       { 0x8609, KEY_9 },
+       { 0x860a, KEY_0 },
+       { 0x8618, KEY_ZOOM },
+       { 0x861c, KEY_UNKNOWN }, /* preview */
+       { 0x8613, KEY_UNKNOWN }, /* snap */
+       { 0x8600, KEY_UNDO },
+       { 0x861d, KEY_RECORD },
+       { 0x860d, KEY_STOP },
+       { 0x860e, KEY_PAUSE },
+       { 0x8616, KEY_PLAY },
+       { 0x8611, KEY_BACK },
+       { 0x8619, KEY_FORWARD },
+       { 0x8614, KEY_UNKNOWN }, /* pip */
+       { 0x8615, KEY_ESC },
+       { 0x861a, KEY_UP },
+       { 0x861e, KEY_DOWN },
+       { 0x861f, KEY_LEFT },
+       { 0x861b, KEY_RIGHT },
 
        /* Key codes for the DiBcom MOD3000 remote. */
-       { 0x80, 0x00, KEY_MUTE },
-       { 0x80, 0x01, KEY_TEXT },
-       { 0x80, 0x02, KEY_HOME },
-       { 0x80, 0x03, KEY_POWER },
-
-       { 0x80, 0x04, KEY_RED },
-       { 0x80, 0x05, KEY_GREEN },
-       { 0x80, 0x06, KEY_YELLOW },
-       { 0x80, 0x07, KEY_BLUE },
-
-       { 0x80, 0x08, KEY_DVD },
-       { 0x80, 0x09, KEY_AUDIO },
-       { 0x80, 0x0a, KEY_MEDIA },      /* Pictures */
-       { 0x80, 0x0b, KEY_VIDEO },
-
-       { 0x80, 0x0c, KEY_BACK },
-       { 0x80, 0x0d, KEY_UP },
-       { 0x80, 0x0e, KEY_RADIO },
-       { 0x80, 0x0f, KEY_EPG },
-
-       { 0x80, 0x10, KEY_LEFT },
-       { 0x80, 0x11, KEY_OK },
-       { 0x80, 0x12, KEY_RIGHT },
-       { 0x80, 0x13, KEY_UNKNOWN },    /* SAP */
-
-       { 0x80, 0x14, KEY_TV },
-       { 0x80, 0x15, KEY_DOWN },
-       { 0x80, 0x16, KEY_MENU },       /* DVD Menu */
-       { 0x80, 0x17, KEY_LAST },
-
-       { 0x80, 0x18, KEY_RECORD },
-       { 0x80, 0x19, KEY_STOP },
-       { 0x80, 0x1a, KEY_PAUSE },
-       { 0x80, 0x1b, KEY_PLAY },
-
-       { 0x80, 0x1c, KEY_PREVIOUS },
-       { 0x80, 0x1d, KEY_REWIND },
-       { 0x80, 0x1e, KEY_FASTFORWARD },
-       { 0x80, 0x1f, KEY_NEXT},
-
-       { 0x80, 0x40, KEY_1 },
-       { 0x80, 0x41, KEY_2 },
-       { 0x80, 0x42, KEY_3 },
-       { 0x80, 0x43, KEY_CHANNELUP },
-
-       { 0x80, 0x44, KEY_4 },
-       { 0x80, 0x45, KEY_5 },
-       { 0x80, 0x46, KEY_6 },
-       { 0x80, 0x47, KEY_CHANNELDOWN },
-
-       { 0x80, 0x48, KEY_7 },
-       { 0x80, 0x49, KEY_8 },
-       { 0x80, 0x4a, KEY_9 },
-       { 0x80, 0x4b, KEY_VOLUMEUP },
-
-       { 0x80, 0x4c, KEY_CLEAR },
-       { 0x80, 0x4d, KEY_0 },
-       { 0x80, 0x4e, KEY_ENTER },
-       { 0x80, 0x4f, KEY_VOLUMEDOWN },
+       { 0x8000, KEY_MUTE },
+       { 0x8001, KEY_TEXT },
+       { 0x8002, KEY_HOME },
+       { 0x8003, KEY_POWER },
+
+       { 0x8004, KEY_RED },
+       { 0x8005, KEY_GREEN },
+       { 0x8006, KEY_YELLOW },
+       { 0x8007, KEY_BLUE },
+
+       { 0x8008, KEY_DVD },
+       { 0x8009, KEY_AUDIO },
+       { 0x800a, KEY_MEDIA },      /* Pictures */
+       { 0x800b, KEY_VIDEO },
+
+       { 0x800c, KEY_BACK },
+       { 0x800d, KEY_UP },
+       { 0x800e, KEY_RADIO },
+       { 0x800f, KEY_EPG },
+
+       { 0x8010, KEY_LEFT },
+       { 0x8011, KEY_OK },
+       { 0x8012, KEY_RIGHT },
+       { 0x8013, KEY_UNKNOWN },    /* SAP */
+
+       { 0x8014, KEY_TV },
+       { 0x8015, KEY_DOWN },
+       { 0x8016, KEY_MENU },       /* DVD Menu */
+       { 0x8017, KEY_LAST },
+
+       { 0x8018, KEY_RECORD },
+       { 0x8019, KEY_STOP },
+       { 0x801a, KEY_PAUSE },
+       { 0x801b, KEY_PLAY },
+
+       { 0x801c, KEY_PREVIOUS },
+       { 0x801d, KEY_REWIND },
+       { 0x801e, KEY_FASTFORWARD },
+       { 0x801f, KEY_NEXT},
+
+       { 0x8040, KEY_1 },
+       { 0x8041, KEY_2 },
+       { 0x8042, KEY_3 },
+       { 0x8043, KEY_CHANNELUP },
+
+       { 0x8044, KEY_4 },
+       { 0x8045, KEY_5 },
+       { 0x8046, KEY_6 },
+       { 0x8047, KEY_CHANNELDOWN },
+
+       { 0x8048, KEY_7 },
+       { 0x8049, KEY_8 },
+       { 0x804a, KEY_9 },
+       { 0x804b, KEY_VOLUMEUP },
+
+       { 0x804c, KEY_CLEAR },
+       { 0x804d, KEY_0 },
+       { 0x804e, KEY_ENTER },
+       { 0x804f, KEY_VOLUMEDOWN },
 };
 EXPORT_SYMBOL(dibusb_rc_keys);