diff options
author | Andy Walls <awalls@md.metrocast.net> | 2010-12-28 20:46:13 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-12-30 09:17:14 -0500 |
commit | ea6c06033f01216df504b0f337a350778a3bc80e (patch) | |
tree | 3ec9ca9904c3aeff17f4a3b85f7294850c4175e8 /drivers/media/video/hdpvr | |
parent | 41ca2b1ac269e2ed64e2562b91fa61cab0b19e7a (diff) |
[media] hdpvr: Add I2C and ir-kdb-i2c registration of the Zilog Z8 IR chip
Adds I2C registration of the Zilog Z8F0811 IR microcontroller for either
lirc_zilog or ir-kbd-i2c to use. This is a required step in removing
lirc_zilog's use of the deprecated struct i2c_adapter.id field.
Signed-off-by: Andy Walls <awalls@md.metrocast.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/hdpvr')
-rw-r--r-- | drivers/media/video/hdpvr/hdpvr-core.c | 5 | ||||
-rw-r--r-- | drivers/media/video/hdpvr/hdpvr-i2c.c | 53 | ||||
-rw-r--r-- | drivers/media/video/hdpvr/hdpvr.h | 6 |
3 files changed, 64 insertions, 0 deletions
diff --git a/drivers/media/video/hdpvr/hdpvr-core.c b/drivers/media/video/hdpvr/hdpvr-core.c index b70d6afc9fec..f7d1ee55185a 100644 --- a/drivers/media/video/hdpvr/hdpvr-core.c +++ b/drivers/media/video/hdpvr/hdpvr-core.c | |||
@@ -385,6 +385,11 @@ static int hdpvr_probe(struct usb_interface *interface, | |||
385 | v4l2_err(&dev->v4l2_dev, "registering i2c adapter failed\n"); | 385 | v4l2_err(&dev->v4l2_dev, "registering i2c adapter failed\n"); |
386 | goto error; | 386 | goto error; |
387 | } | 387 | } |
388 | |||
389 | /* until i2c is working properly */ | ||
390 | retval = 0; /* hdpvr_register_i2c_ir(dev); */ | ||
391 | if (retval < 0) | ||
392 | v4l2_err(&dev->v4l2_dev, "registering i2c IR devices failed\n"); | ||
388 | #endif /* CONFIG_I2C */ | 393 | #endif /* CONFIG_I2C */ |
389 | 394 | ||
390 | /* let the user know what node this device is now attached to */ | 395 | /* let the user know what node this device is now attached to */ |
diff --git a/drivers/media/video/hdpvr/hdpvr-i2c.c b/drivers/media/video/hdpvr/hdpvr-i2c.c index 409de11096d4..24966aa02a70 100644 --- a/drivers/media/video/hdpvr/hdpvr-i2c.c +++ b/drivers/media/video/hdpvr/hdpvr-i2c.c | |||
@@ -4,6 +4,9 @@ | |||
4 | * | 4 | * |
5 | * Copyright (C) 2008 Janne Grunau (j@jannau.net) | 5 | * Copyright (C) 2008 Janne Grunau (j@jannau.net) |
6 | * | 6 | * |
7 | * IR device registration code is | ||
8 | * Copyright (C) 2010 Andy Walls <awalls@md.metrocast.net> | ||
9 | * | ||
7 | * This program is free software; you can redistribute it and/or | 10 | * This program is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU General Public License as | 11 | * modify it under the terms of the GNU General Public License as |
9 | * published by the Free Software Foundation, version 2. | 12 | * published by the Free Software Foundation, version 2. |
@@ -22,6 +25,56 @@ | |||
22 | #define REQTYPE_I2C_WRITE 0xb0 | 25 | #define REQTYPE_I2C_WRITE 0xb0 |
23 | #define REQTYPE_I2C_WRITE_STATT 0xd0 | 26 | #define REQTYPE_I2C_WRITE_STATT 0xd0 |
24 | 27 | ||
28 | #define Z8F0811_IR_TX_I2C_ADDR 0x70 | ||
29 | #define Z8F0811_IR_RX_I2C_ADDR 0x71 | ||
30 | |||
31 | static const u8 ir_i2c_addrs[] = { | ||
32 | Z8F0811_IR_TX_I2C_ADDR, | ||
33 | Z8F0811_IR_RX_I2C_ADDR, | ||
34 | }; | ||
35 | |||
36 | static const char * const ir_devicenames[] = { | ||
37 | "ir_tx_z8f0811_hdpvr", | ||
38 | "ir_rx_z8f0811_hdpvr", | ||
39 | }; | ||
40 | |||
41 | static int hdpvr_new_i2c_ir(struct hdpvr_device *dev, struct i2c_adapter *adap, | ||
42 | const char *type, u8 addr) | ||
43 | { | ||
44 | struct i2c_board_info info; | ||
45 | struct IR_i2c_init_data *init_data = &dev->ir_i2c_init_data; | ||
46 | unsigned short addr_list[2] = { addr, I2C_CLIENT_END }; | ||
47 | |||
48 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
49 | strlcpy(info.type, type, I2C_NAME_SIZE); | ||
50 | |||
51 | /* Our default information for ir-kbd-i2c.c to use */ | ||
52 | switch (addr) { | ||
53 | case Z8F0811_IR_RX_I2C_ADDR: | ||
54 | init_data->ir_codes = RC_MAP_HAUPPAUGE_NEW; | ||
55 | init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; | ||
56 | init_data->type = RC_TYPE_RC5; | ||
57 | init_data->name = "HD PVR"; | ||
58 | info.platform_data = init_data; | ||
59 | break; | ||
60 | } | ||
61 | |||
62 | return i2c_new_probed_device(adap, &info, addr_list, NULL) == NULL ? | ||
63 | -1 : 0; | ||
64 | } | ||
65 | |||
66 | int hdpvr_register_i2c_ir(struct hdpvr_device *dev) | ||
67 | { | ||
68 | int i; | ||
69 | int ret = 0; | ||
70 | |||
71 | for (i = 0; i < ARRAY_SIZE(ir_i2c_addrs); i++) | ||
72 | ret += hdpvr_new_i2c_ir(dev, dev->i2c_adapter, | ||
73 | ir_devicenames[i], ir_i2c_addrs[i]); | ||
74 | |||
75 | return ret; | ||
76 | } | ||
77 | |||
25 | static int hdpvr_i2c_read(struct hdpvr_device *dev, unsigned char addr, | 78 | static int hdpvr_i2c_read(struct hdpvr_device *dev, unsigned char addr, |
26 | char *data, int len) | 79 | char *data, int len) |
27 | { | 80 | { |
diff --git a/drivers/media/video/hdpvr/hdpvr.h b/drivers/media/video/hdpvr/hdpvr.h index 5efc963f9164..37f1e4c7675d 100644 --- a/drivers/media/video/hdpvr/hdpvr.h +++ b/drivers/media/video/hdpvr/hdpvr.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/videodev2.h> | 16 | #include <linux/videodev2.h> |
17 | 17 | ||
18 | #include <media/v4l2-device.h> | 18 | #include <media/v4l2-device.h> |
19 | #include <media/ir-kbd-i2c.h> | ||
19 | 20 | ||
20 | #define HDPVR_MAJOR_VERSION 0 | 21 | #define HDPVR_MAJOR_VERSION 0 |
21 | #define HDPVR_MINOR_VERSION 2 | 22 | #define HDPVR_MINOR_VERSION 2 |
@@ -109,6 +110,9 @@ struct hdpvr_device { | |||
109 | /* I2C lock */ | 110 | /* I2C lock */ |
110 | struct mutex i2c_mutex; | 111 | struct mutex i2c_mutex; |
111 | 112 | ||
113 | /* For passing data to ir-kbd-i2c */ | ||
114 | struct IR_i2c_init_data ir_i2c_init_data; | ||
115 | |||
112 | /* usb control transfer buffer and lock */ | 116 | /* usb control transfer buffer and lock */ |
113 | struct mutex usbc_mutex; | 117 | struct mutex usbc_mutex; |
114 | u8 *usbc_buf; | 118 | u8 *usbc_buf; |
@@ -306,6 +310,8 @@ int hdpvr_cancel_queue(struct hdpvr_device *dev); | |||
306 | /* i2c adapter registration */ | 310 | /* i2c adapter registration */ |
307 | int hdpvr_register_i2c_adapter(struct hdpvr_device *dev); | 311 | int hdpvr_register_i2c_adapter(struct hdpvr_device *dev); |
308 | 312 | ||
313 | int hdpvr_register_i2c_ir(struct hdpvr_device *dev); | ||
314 | |||
309 | /*========================================================================*/ | 315 | /*========================================================================*/ |
310 | /* buffer management */ | 316 | /* buffer management */ |
311 | int hdpvr_free_buffers(struct hdpvr_device *dev); | 317 | int hdpvr_free_buffers(struct hdpvr_device *dev); |