mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-23 04:34:11 +08:00
[media] hdpvr: fix up i2c device registration
We have to actually call i2c_new_device() once for each of the rx and tx addresses. Also improve error-handling and device remove i2c cleanup. Reviewed-by: Andy Walls <awalls@md.metrocast.net> Signed-off-by: Jarod Wilson <jarod@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
86ee659488
commit
7f2a06deaa
@ -283,6 +283,7 @@ static int hdpvr_probe(struct usb_interface *interface,
|
|||||||
struct hdpvr_device *dev;
|
struct hdpvr_device *dev;
|
||||||
struct usb_host_interface *iface_desc;
|
struct usb_host_interface *iface_desc;
|
||||||
struct usb_endpoint_descriptor *endpoint;
|
struct usb_endpoint_descriptor *endpoint;
|
||||||
|
struct i2c_client *client;
|
||||||
size_t buffer_size;
|
size_t buffer_size;
|
||||||
int i;
|
int i;
|
||||||
int retval = -ENOMEM;
|
int retval = -ENOMEM;
|
||||||
@ -381,13 +382,21 @@ static int hdpvr_probe(struct usb_interface *interface,
|
|||||||
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
||||||
retval = hdpvr_register_i2c_adapter(dev);
|
retval = hdpvr_register_i2c_adapter(dev);
|
||||||
if (retval < 0) {
|
if (retval < 0) {
|
||||||
v4l2_err(&dev->v4l2_dev, "registering i2c adapter failed\n");
|
v4l2_err(&dev->v4l2_dev, "i2c adapter register failed\n");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = hdpvr_register_i2c_ir(dev);
|
client = hdpvr_register_ir_rx_i2c(dev);
|
||||||
if (retval < 0)
|
if (!client) {
|
||||||
v4l2_err(&dev->v4l2_dev, "registering i2c IR devices failed\n");
|
v4l2_err(&dev->v4l2_dev, "i2c IR RX device register failed\n");
|
||||||
|
goto reg_fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
client = hdpvr_register_ir_tx_i2c(dev);
|
||||||
|
if (!client) {
|
||||||
|
v4l2_err(&dev->v4l2_dev, "i2c IR TX device register failed\n");
|
||||||
|
goto reg_fail;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* let the user know what node this device is now attached to */
|
/* let the user know what node this device is now attached to */
|
||||||
@ -395,6 +404,10 @@ static int hdpvr_probe(struct usb_interface *interface,
|
|||||||
video_device_node_name(dev->video_dev));
|
video_device_node_name(dev->video_dev));
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
reg_fail:
|
||||||
|
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
||||||
|
i2c_del_adapter(&dev->i2c_adapter);
|
||||||
|
#endif
|
||||||
error:
|
error:
|
||||||
if (dev) {
|
if (dev) {
|
||||||
/* Destroy single thread */
|
/* Destroy single thread */
|
||||||
@ -424,6 +437,9 @@ static void hdpvr_disconnect(struct usb_interface *interface)
|
|||||||
mutex_lock(&dev->io_mutex);
|
mutex_lock(&dev->io_mutex);
|
||||||
hdpvr_cancel_queue(dev);
|
hdpvr_cancel_queue(dev);
|
||||||
mutex_unlock(&dev->io_mutex);
|
mutex_unlock(&dev->io_mutex);
|
||||||
|
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
||||||
|
i2c_del_adapter(&dev->i2c_adapter);
|
||||||
|
#endif
|
||||||
video_unregister_device(dev->video_dev);
|
video_unregister_device(dev->video_dev);
|
||||||
atomic_dec(&dev_nr);
|
atomic_dec(&dev_nr);
|
||||||
}
|
}
|
||||||
|
@ -31,26 +31,34 @@
|
|||||||
#define Z8F0811_IR_RX_I2C_ADDR 0x71
|
#define Z8F0811_IR_RX_I2C_ADDR 0x71
|
||||||
|
|
||||||
|
|
||||||
static struct i2c_board_info hdpvr_i2c_board_info = {
|
struct i2c_client *hdpvr_register_ir_tx_i2c(struct hdpvr_device *dev)
|
||||||
I2C_BOARD_INFO("ir_tx_z8f0811_hdpvr", Z8F0811_IR_TX_I2C_ADDR),
|
|
||||||
I2C_BOARD_INFO("ir_rx_z8f0811_hdpvr", Z8F0811_IR_RX_I2C_ADDR),
|
|
||||||
};
|
|
||||||
|
|
||||||
int hdpvr_register_i2c_ir(struct hdpvr_device *dev)
|
|
||||||
{
|
{
|
||||||
struct i2c_client *c;
|
|
||||||
struct IR_i2c_init_data *init_data = &dev->ir_i2c_init_data;
|
struct IR_i2c_init_data *init_data = &dev->ir_i2c_init_data;
|
||||||
|
struct i2c_board_info hdpvr_ir_tx_i2c_board_info = {
|
||||||
|
I2C_BOARD_INFO("ir_tx_z8f0811_hdpvr", Z8F0811_IR_TX_I2C_ADDR),
|
||||||
|
};
|
||||||
|
|
||||||
|
init_data->name = "HD-PVR";
|
||||||
|
hdpvr_ir_tx_i2c_board_info.platform_data = init_data;
|
||||||
|
|
||||||
|
return i2c_new_device(&dev->i2c_adapter, &hdpvr_ir_tx_i2c_board_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev)
|
||||||
|
{
|
||||||
|
struct IR_i2c_init_data *init_data = &dev->ir_i2c_init_data;
|
||||||
|
struct i2c_board_info hdpvr_ir_rx_i2c_board_info = {
|
||||||
|
I2C_BOARD_INFO("ir_rx_z8f0811_hdpvr", Z8F0811_IR_RX_I2C_ADDR),
|
||||||
|
};
|
||||||
|
|
||||||
/* Our default information for ir-kbd-i2c.c to use */
|
/* Our default information for ir-kbd-i2c.c to use */
|
||||||
init_data->ir_codes = RC_MAP_HAUPPAUGE_NEW;
|
init_data->ir_codes = RC_MAP_HAUPPAUGE_NEW;
|
||||||
init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
|
init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
|
||||||
init_data->type = RC_TYPE_RC5;
|
init_data->type = RC_TYPE_RC5;
|
||||||
init_data->name = "HD PVR";
|
init_data->name = "HD-PVR";
|
||||||
hdpvr_i2c_board_info.platform_data = init_data;
|
hdpvr_ir_rx_i2c_board_info.platform_data = init_data;
|
||||||
|
|
||||||
c = i2c_new_device(&dev->i2c_adapter, &hdpvr_i2c_board_info);
|
return i2c_new_device(&dev->i2c_adapter, &hdpvr_ir_rx_i2c_board_info);
|
||||||
|
|
||||||
return (c == NULL) ? -ENODEV : 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hdpvr_i2c_read(struct hdpvr_device *dev, int bus,
|
static int hdpvr_i2c_read(struct hdpvr_device *dev, int bus,
|
||||||
|
@ -313,7 +313,8 @@ int hdpvr_cancel_queue(struct hdpvr_device *dev);
|
|||||||
/* i2c adapter registration */
|
/* i2c adapter registration */
|
||||||
int hdpvr_register_i2c_adapter(struct hdpvr_device *dev);
|
int hdpvr_register_i2c_adapter(struct hdpvr_device *dev);
|
||||||
|
|
||||||
int hdpvr_register_i2c_ir(struct hdpvr_device *dev);
|
struct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev);
|
||||||
|
struct i2c_client *hdpvr_register_ir_tx_i2c(struct hdpvr_device *dev);
|
||||||
|
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
/* buffer management */
|
/* buffer management */
|
||||||
|
Loading…
Reference in New Issue
Block a user