diff options
author | Andy Walls <awalls@radix.net> | 2009-09-05 09:58:37 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-09-12 11:20:15 -0400 |
commit | 78f2e672b37ae8935ec0b97cedbc2d877ffa0c5f (patch) | |
tree | 1adcd5ce3515fd003d7336db668c27db3b0c53b5 /drivers/media/video/cx18 | |
parent | d2ebd0f806fdb6104903365e355675934eec22b2 (diff) |
V4L/DVB (12699): cx18: ir-kbd-i2c initialization data should point to a persistent object
ir-kbd-i2c's ir_probe() function can be called much later (i.e. at ir-kbd-i2c
module load), than the lifetime of a struct IR_i2c_init_data allocated off of
the stack in cx18_i2c_new_ir() at registration time. Make sure we pass
a pointer to a persistent IR_i2c_init_data object at i2c registration time.
Thanks to Brian Rogers for pointing out a solution, and Dustin Mitchell for
testing against a 2.6.30 kernel.
Reported-by: Dustin Mitchell <soxslayer@gmail.com>
Reported-by: Brian Rogers <brian@xyzw.org>
Tested-by: Dustin Mitchell <soxslayer@gmail.com>
Signed-off-by: Andy Walls <awalls@radix.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/cx18')
-rw-r--r-- | drivers/media/video/cx18/cx18-i2c.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/media/video/cx18/cx18-i2c.c b/drivers/media/video/cx18/cx18-i2c.c index 766ddce5780f..da395fef50df 100644 --- a/drivers/media/video/cx18/cx18-i2c.c +++ b/drivers/media/video/cx18/cx18-i2c.c | |||
@@ -97,11 +97,17 @@ static const char * const hw_devicenames[] = { | |||
97 | "ir_rx_z8f0811_haup", | 97 | "ir_rx_z8f0811_haup", |
98 | }; | 98 | }; |
99 | 99 | ||
100 | static const struct IR_i2c_init_data z8f0811_ir_init_data = { | ||
101 | .ir_codes = &ir_codes_hauppauge_new_table, | ||
102 | .internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR, | ||
103 | .type = IR_TYPE_RC5, | ||
104 | .name = "CX23418 Z8F0811 Hauppauge", | ||
105 | }; | ||
106 | |||
100 | static int cx18_i2c_new_ir(struct i2c_adapter *adap, u32 hw, const char *type, | 107 | static int cx18_i2c_new_ir(struct i2c_adapter *adap, u32 hw, const char *type, |
101 | u8 addr) | 108 | u8 addr) |
102 | { | 109 | { |
103 | struct i2c_board_info info; | 110 | struct i2c_board_info info; |
104 | struct IR_i2c_init_data ir_init_data; | ||
105 | unsigned short addr_list[2] = { addr, I2C_CLIENT_END }; | 111 | unsigned short addr_list[2] = { addr, I2C_CLIENT_END }; |
106 | 112 | ||
107 | memset(&info, 0, sizeof(struct i2c_board_info)); | 113 | memset(&info, 0, sizeof(struct i2c_board_info)); |
@@ -110,12 +116,7 @@ static int cx18_i2c_new_ir(struct i2c_adapter *adap, u32 hw, const char *type, | |||
110 | /* Our default information for ir-kbd-i2c.c to use */ | 116 | /* Our default information for ir-kbd-i2c.c to use */ |
111 | switch (hw) { | 117 | switch (hw) { |
112 | case CX18_HW_Z8F0811_IR_RX_HAUP: | 118 | case CX18_HW_Z8F0811_IR_RX_HAUP: |
113 | memset(&ir_init_data, 0, sizeof(struct IR_i2c_init_data)); | 119 | info.platform_data = &z8f0811_ir_init_data; |
114 | ir_init_data.ir_codes = &ir_codes_hauppauge_new_table; | ||
115 | ir_init_data.internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; | ||
116 | ir_init_data.type = IR_TYPE_RC5; | ||
117 | ir_init_data.name = "CX23418 Z8F0811 Hauppauge"; | ||
118 | info.platform_data = &ir_init_data; | ||
119 | break; | 120 | break; |
120 | default: | 121 | default: |
121 | break; | 122 | break; |