Commit 8ca95568 authored by Andy Walls's avatar Andy Walls Committed by Mauro Carvalho Chehab

V4L/DVB (12367): cx18: Add i2c initialization for Z8F0811/Hauppage IR transceivers

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: default avatarAndy Walls <awalls@radix.net>
Reviewed-by: default avatarJean Delvare <khali@linux-fr.org>
Signed-off-by: default avatarDouglas Schilling Landgraf <dougsland@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 1b6e59e3
...@@ -56,7 +56,8 @@ static const struct cx18_card cx18_card_hvr1600_esmt = { ...@@ -56,7 +56,8 @@ static const struct cx18_card cx18_card_hvr1600_esmt = {
.hw_audio_ctrl = CX18_HW_418_AV, .hw_audio_ctrl = CX18_HW_418_AV,
.hw_muxer = CX18_HW_CS5345, .hw_muxer = CX18_HW_CS5345,
.hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER | .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 = { .video_inputs = {
{ CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE7 }, { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE7 },
{ CX18_CARD_INPUT_SVIDEO1, 1, CX18_AV_SVIDEO1 }, { CX18_CARD_INPUT_SVIDEO1, 1, CX18_AV_SVIDEO1 },
...@@ -102,7 +103,8 @@ static const struct cx18_card cx18_card_hvr1600_samsung = { ...@@ -102,7 +103,8 @@ static const struct cx18_card cx18_card_hvr1600_samsung = {
.hw_audio_ctrl = CX18_HW_418_AV, .hw_audio_ctrl = CX18_HW_418_AV,
.hw_muxer = CX18_HW_CS5345, .hw_muxer = CX18_HW_CS5345,
.hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER | .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 = { .video_inputs = {
{ CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE7 }, { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE7 },
{ CX18_CARD_INPUT_SVIDEO1, 1, CX18_AV_SVIDEO1 }, { CX18_CARD_INPUT_SVIDEO1, 1, CX18_AV_SVIDEO1 },
......
...@@ -29,6 +29,10 @@ ...@@ -29,6 +29,10 @@
#define CX18_HW_418_AV (1 << 4) #define CX18_HW_418_AV (1 << 4)
#define CX18_HW_GPIO_MUX (1 << 5) #define CX18_HW_GPIO_MUX (1 << 5)
#define CX18_HW_GPIO_RESET_CTRL (1 << 6) #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 */ /* video inputs */
#define CX18_CARD_INPUT_VID_TUNER 1 #define CX18_CARD_INPUT_VID_TUNER 1
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "cx18-gpio.h" #include "cx18-gpio.h"
#include "cx18-i2c.h" #include "cx18-i2c.h"
#include "cx18-irq.h" #include "cx18-irq.h"
#include <media/ir-kbd-i2c.h>
#define CX18_REG_I2C_1_WR 0xf15000 #define CX18_REG_I2C_1_WR 0xf15000
#define CX18_REG_I2C_1_RD 0xf15008 #define CX18_REG_I2C_1_RD 0xf15008
...@@ -40,6 +41,8 @@ ...@@ -40,6 +41,8 @@
#define GETSDL_BIT 0x0008 #define GETSDL_BIT 0x0008
#define CX18_CS5345_I2C_ADDR 0x4c #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 */ /* This array should match the CX18_HW_ defines */
static const u8 hw_addrs[] = { static const u8 hw_addrs[] = {
...@@ -50,6 +53,8 @@ static const u8 hw_addrs[] = { ...@@ -50,6 +53,8 @@ static const u8 hw_addrs[] = {
0, /* CX18_HW_418_AV */ 0, /* CX18_HW_418_AV */
0, /* CX18_HW_GPIO_MUX */ 0, /* CX18_HW_GPIO_MUX */
0, /* CX18_HW_GPIO_RESET_CTRL */ 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 */ /* This array should match the CX18_HW_ defines */
...@@ -62,6 +67,8 @@ static const u8 hw_bus[] = { ...@@ -62,6 +67,8 @@ static const u8 hw_bus[] = {
0, /* CX18_HW_418_AV */ 0, /* CX18_HW_418_AV */
0, /* CX18_HW_GPIO_MUX */ 0, /* CX18_HW_GPIO_MUX */
0, /* CX18_HW_GPIO_RESET_CTRL */ 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 */ /* This array should match the CX18_HW_ defines */
...@@ -73,6 +80,8 @@ static const char * const hw_modules[] = { ...@@ -73,6 +80,8 @@ static const char * const hw_modules[] = {
NULL, /* CX18_HW_418_AV */ NULL, /* CX18_HW_418_AV */
NULL, /* CX18_HW_GPIO_MUX */ NULL, /* CX18_HW_GPIO_MUX */
NULL, /* CX18_HW_GPIO_RESET_CTRL */ 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 */ /* This array should match the CX18_HW_ defines */
...@@ -84,8 +93,37 @@ static const char * const hw_devicenames[] = { ...@@ -84,8 +93,37 @@ static const char * const hw_devicenames[] = {
"cx23418_AV", "cx23418_AV",
"gpio_mux", "gpio_mux",
"gpio_reset_ctrl", "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) int cx18_i2c_register(struct cx18 *cx, unsigned idx)
{ {
struct v4l2_subdev *sd; struct v4l2_subdev *sd;
...@@ -115,11 +153,14 @@ int cx18_i2c_register(struct cx18 *cx, unsigned idx) ...@@ -115,11 +153,14 @@ int cx18_i2c_register(struct cx18 *cx, unsigned idx)
return sd != NULL ? 0 : -1; 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? */ /* Is it not an I2C device or one we do not wish to register? */
if (!hw_addrs[idx]) if (!hw_addrs[idx])
return -1; 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]); sd = v4l2_i2c_new_subdev(&cx->v4l2_dev, adap, mod, type, hw_addrs[idx]);
if (sd != NULL) if (sd != NULL)
sd->grp_id = hw; sd->grp_id = hw;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment