V4L/DVB (12367): cx18: Add i2c initialization for Z8F0811/Hauppage IR transceivers
authorAndy Walls <awalls@radix.net>
Tue, 28 Jul 2009 14:48:18 +0000 (11:48 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 12 Sep 2009 15:18:25 +0000 (12:18 -0300)
This patch add support to the cx18 driver for setting up the
Z8F0811/Hauppauge IR Tx/Rx chip with the i2c binding model in newer
kernels.

Signed-off-by: Andy Walls <awalls@radix.net>
Reviewed-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Douglas Schilling Landgraf <dougsland@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/cx18/cx18-cards.c
drivers/media/video/cx18/cx18-cards.h
drivers/media/video/cx18/cx18-i2c.c

index 96b687b..f11e47a 100644 (file)
@@ -56,7 +56,8 @@ static const struct cx18_card cx18_card_hvr1600_esmt = {
        .hw_audio_ctrl = CX18_HW_418_AV,
        .hw_muxer = CX18_HW_CS5345,
        .hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER |
-                 CX18_HW_CS5345 | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL,
+                 CX18_HW_CS5345 | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL |
+                 CX18_HW_Z8F0811_IR_HAUP,
        .video_inputs = {
                { CX18_CARD_INPUT_VID_TUNER,  0, CX18_AV_COMPOSITE7 },
                { CX18_CARD_INPUT_SVIDEO1,    1, CX18_AV_SVIDEO1    },
@@ -102,7 +103,8 @@ static const struct cx18_card cx18_card_hvr1600_samsung = {
        .hw_audio_ctrl = CX18_HW_418_AV,
        .hw_muxer = CX18_HW_CS5345,
        .hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER |
-                 CX18_HW_CS5345 | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL,
+                 CX18_HW_CS5345 | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL |
+                 CX18_HW_Z8F0811_IR_HAUP,
        .video_inputs = {
                { CX18_CARD_INPUT_VID_TUNER,  0, CX18_AV_COMPOSITE7 },
                { CX18_CARD_INPUT_SVIDEO1,    1, CX18_AV_SVIDEO1    },
index 3c552b6..444e3c7 100644 (file)
  */
 
 /* hardware flags */
-#define CX18_HW_TUNER          (1 << 0)
-#define CX18_HW_TVEEPROM       (1 << 1)
-#define CX18_HW_CS5345         (1 << 2)
-#define CX18_HW_DVB            (1 << 3)
-#define CX18_HW_418_AV         (1 << 4)
-#define CX18_HW_GPIO_MUX       (1 << 5)
-#define CX18_HW_GPIO_RESET_CTRL        (1 << 6)
+#define CX18_HW_TUNER                  (1 << 0)
+#define CX18_HW_TVEEPROM               (1 << 1)
+#define CX18_HW_CS5345                 (1 << 2)
+#define CX18_HW_DVB                    (1 << 3)
+#define CX18_HW_418_AV                 (1 << 4)
+#define CX18_HW_GPIO_MUX               (1 << 5)
+#define CX18_HW_GPIO_RESET_CTRL                (1 << 6)
+#define CX18_HW_Z8F0811_IR_TX_HAUP     (1 << 7)
+#define CX18_HW_Z8F0811_IR_RX_HAUP     (1 << 8)
+#define CX18_HW_Z8F0811_IR_HAUP        (CX18_HW_Z8F0811_IR_RX_HAUP | \
+                                CX18_HW_Z8F0811_IR_TX_HAUP)
 
 /* video inputs */
 #define        CX18_CARD_INPUT_VID_TUNER       1
index 237d848..ba754e8 100644 (file)
@@ -28,6 +28,7 @@
 #include "cx18-gpio.h"
 #include "cx18-i2c.h"
 #include "cx18-irq.h"
+#include <media/ir-kbd-i2c.h>
 
 #define CX18_REG_I2C_1_WR   0xf15000
 #define CX18_REG_I2C_1_RD   0xf15008
 #define GETSDL_BIT      0x0008
 
 #define CX18_CS5345_I2C_ADDR           0x4c
+#define CX18_Z8F0811_IR_TX_I2C_ADDR    0x70
+#define CX18_Z8F0811_IR_RX_I2C_ADDR    0x71
 
 /* This array should match the CX18_HW_ defines */
 static const u8 hw_addrs[] = {
-       0,                      /* CX18_HW_TUNER */
-       0,                      /* CX18_HW_TVEEPROM */
-       CX18_CS5345_I2C_ADDR,   /* CX18_HW_CS5345 */
-       0,                      /* CX18_HW_DVB */
-       0,                      /* CX18_HW_418_AV */
-       0,                      /* CX18_HW_GPIO_MUX */
-       0,                      /* CX18_HW_GPIO_RESET_CTRL */
+       0,                              /* CX18_HW_TUNER */
+       0,                              /* CX18_HW_TVEEPROM */
+       CX18_CS5345_I2C_ADDR,           /* CX18_HW_CS5345 */
+       0,                              /* CX18_HW_DVB */
+       0,                              /* CX18_HW_418_AV */
+       0,                              /* CX18_HW_GPIO_MUX */
+       0,                              /* CX18_HW_GPIO_RESET_CTRL */
+       CX18_Z8F0811_IR_TX_I2C_ADDR,    /* CX18_HW_Z8F0811_IR_TX_HAUP */
+       CX18_Z8F0811_IR_RX_I2C_ADDR,    /* CX18_HW_Z8F0811_IR_RX_HAUP */
 };
 
 /* This array should match the CX18_HW_ defines */
@@ -62,6 +67,8 @@ static const u8 hw_bus[] = {
        0,      /* CX18_HW_418_AV */
        0,      /* CX18_HW_GPIO_MUX */
        0,      /* CX18_HW_GPIO_RESET_CTRL */
+       0,      /* CX18_HW_Z8F0811_IR_TX_HAUP */
+       0,      /* CX18_HW_Z8F0811_IR_RX_HAUP */
 };
 
 /* This array should match the CX18_HW_ defines */
@@ -73,6 +80,8 @@ static const char * const hw_modules[] = {
        NULL,           /* CX18_HW_418_AV */
        NULL,           /* CX18_HW_GPIO_MUX */
        NULL,           /* CX18_HW_GPIO_RESET_CTRL */
+       NULL,           /* CX18_HW_Z8F0811_IR_TX_HAUP */
+       NULL,           /* CX18_HW_Z8F0811_IR_RX_HAUP */
 };
 
 /* This array should match the CX18_HW_ defines */
@@ -84,8 +93,37 @@ static const char * const hw_devicenames[] = {
        "cx23418_AV",
        "gpio_mux",
        "gpio_reset_ctrl",
+       "ir_tx_z8f0811_haup",
+       "ir_rx_z8f0811_haup",
 };
 
+static int cx18_i2c_new_ir(struct i2c_adapter *adap, u32 hw, const char *type,
+                          u8 addr)
+{
+       struct i2c_board_info info;
+       struct IR_i2c_init_data ir_init_data;
+       unsigned short addr_list[2] = { addr, I2C_CLIENT_END };
+
+       memset(&info, 0, sizeof(struct i2c_board_info));
+       strlcpy(info.type, type, I2C_NAME_SIZE);
+
+       /* Our default information for ir-kbd-i2c.c to use */
+       switch (hw) {
+       case CX18_HW_Z8F0811_IR_RX_HAUP:
+               memset(&ir_init_data, 0, sizeof(struct IR_i2c_init_data));
+               ir_init_data.ir_codes = ir_codes_hauppauge_new;
+               ir_init_data.internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
+               ir_init_data.type = IR_TYPE_RC5;
+               ir_init_data.name = "CX23418 Z8F0811 Hauppauge";
+               info.platform_data = &ir_init_data;
+               break;
+       default:
+               break;
+       }
+
+       return i2c_new_probed_device(adap, &info, addr_list) == NULL ? -1 : 0;
+}
+
 int cx18_i2c_register(struct cx18 *cx, unsigned idx)
 {
        struct v4l2_subdev *sd;
@@ -115,11 +153,14 @@ int cx18_i2c_register(struct cx18 *cx, unsigned idx)
                return sd != NULL ? 0 : -1;
        }
 
+       if (hw & CX18_HW_Z8F0811_IR_HAUP)
+               return cx18_i2c_new_ir(adap, hw, type, hw_addrs[idx]);
+
        /* Is it not an I2C device or one we do not wish to register? */
        if (!hw_addrs[idx])
                return -1;
 
-       /* It's an I2C device other than an analog tuner */
+       /* It's an I2C device other than an analog tuner or IR chip */
        sd = v4l2_i2c_new_subdev(&cx->v4l2_dev, adap, mod, type, hw_addrs[idx]);
        if (sd != NULL)
                sd->grp_id = hw;