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: 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>
This commit is contained in:
parent
1b6e59e3f4
commit
8ca955689a
3 changed files with 64 additions and 17 deletions
|
@ -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 = {
|
||||||
.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 },
|
||||||
|
|
|
@ -22,13 +22,17 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* hardware flags */
|
/* hardware flags */
|
||||||
#define CX18_HW_TUNER (1 << 0)
|
#define CX18_HW_TUNER (1 << 0)
|
||||||
#define CX18_HW_TVEEPROM (1 << 1)
|
#define CX18_HW_TVEEPROM (1 << 1)
|
||||||
#define CX18_HW_CS5345 (1 << 2)
|
#define CX18_HW_CS5345 (1 << 2)
|
||||||
#define CX18_HW_DVB (1 << 3)
|
#define CX18_HW_DVB (1 << 3)
|
||||||
#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 @@
|
||||||
#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,16 +41,20 @@
|
||||||
#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[] = {
|
||||||
0, /* CX18_HW_TUNER */
|
0, /* CX18_HW_TUNER */
|
||||||
0, /* CX18_HW_TVEEPROM */
|
0, /* CX18_HW_TVEEPROM */
|
||||||
CX18_CS5345_I2C_ADDR, /* CX18_HW_CS5345 */
|
CX18_CS5345_I2C_ADDR, /* CX18_HW_CS5345 */
|
||||||
0, /* CX18_HW_DVB */
|
0, /* CX18_HW_DVB */
|
||||||
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[] = {
|
||||||
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[] = {
|
||||||
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[] = {
|
||||||
"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)
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue