aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/cx88/cx88-cards.c
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@infradead.org>2008-04-22 13:46:10 -0400
committerMauro Carvalho Chehab <mchehab@infradead.org>2008-04-24 13:07:53 -0400
commit0be51b4671b3ae3ae544a0bb3d15b55478b55e72 (patch)
tree0de42232dc985bfa3d2e9490be89b870702880ff /drivers/media/video/cx88/cx88-cards.c
parent0fea03fbd3aeaa9b4a4de8409e5ef3aca43a6d0b (diff)
V4L/DVB (7398): Adds an error if priv argument of tuner_callback is NULL
Adds a consistency check to avoid OOPS, if tuner_callback priv argument is NULL. Also, simplifies callback codes on cx88. Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/cx88/cx88-cards.c')
-rw-r--r--drivers/media/video/cx88/cx88-cards.c55
1 files changed, 29 insertions, 26 deletions
diff --git a/drivers/media/video/cx88/cx88-cards.c b/drivers/media/video/cx88/cx88-cards.c
index 603b3664381a..6b83e3457b70 100644
--- a/drivers/media/video/cx88/cx88-cards.c
+++ b/drivers/media/video/cx88/cx88-cards.c
@@ -2090,11 +2090,9 @@ static void gdi_eeprom(struct cx88_core *core, u8 *eeprom_data)
2090 2090
2091/* ------------------------------------------------------------------- */ 2091/* ------------------------------------------------------------------- */
2092/* some Divco specific stuff */ 2092/* some Divco specific stuff */
2093static int cx88_dvico_xc2028_callback(void *priv, int command, int arg) 2093static int cx88_dvico_xc2028_callback(struct cx88_core *core,
2094 int command, int arg)
2094{ 2095{
2095 struct i2c_algo_bit_data *i2c_algo = priv;
2096 struct cx88_core *core = i2c_algo->data;
2097
2098 switch (command) { 2096 switch (command) {
2099 case XC2028_TUNER_RESET: 2097 case XC2028_TUNER_RESET:
2100 cx_write(MO_GP0_IO, 0x101000); 2098 cx_write(MO_GP0_IO, 0x101000);
@@ -2112,11 +2110,9 @@ static int cx88_dvico_xc2028_callback(void *priv, int command, int arg)
2112/* ----------------------------------------------------------------------- */ 2110/* ----------------------------------------------------------------------- */
2113/* some Geniatech specific stuff */ 2111/* some Geniatech specific stuff */
2114 2112
2115static int cx88_xc3028_geniatech_tuner_callback(void *priv, int command, int mode) 2113static int cx88_xc3028_geniatech_tuner_callback(struct cx88_core *core,
2114 int command, int mode)
2116{ 2115{
2117 struct i2c_algo_bit_data *i2c_algo = priv;
2118 struct cx88_core *core = i2c_algo->data;
2119
2120 switch (command) { 2116 switch (command) {
2121 case XC2028_TUNER_RESET: 2117 case XC2028_TUNER_RESET:
2122 switch (INPUT(core->input).type) { 2118 switch (INPUT(core->input).type) {
@@ -2143,11 +2139,9 @@ static int cx88_xc3028_geniatech_tuner_callback(void *priv, int command, int mod
2143 2139
2144/* ------------------------------------------------------------------- */ 2140/* ------------------------------------------------------------------- */
2145/* some Divco specific stuff */ 2141/* some Divco specific stuff */
2146static int cx88_pv_8000gt_callback(void *priv, int command, int arg) 2142static int cx88_pv_8000gt_callback(struct cx88_core *core,
2143 int command, int arg)
2147{ 2144{
2148 struct i2c_algo_bit_data *i2c_algo = priv;
2149 struct cx88_core *core = i2c_algo->data;
2150
2151 switch (command) { 2145 switch (command) {
2152 case XC2028_TUNER_RESET: 2146 case XC2028_TUNER_RESET:
2153 cx_write(MO_GP2_IO, 0xcf7); 2147 cx_write(MO_GP2_IO, 0xcf7);
@@ -2198,21 +2192,20 @@ static void dvico_fusionhdtv_hybrid_init(struct cx88_core *core)
2198 } 2192 }
2199} 2193}
2200 2194
2201static int cx88_xc2028_tuner_callback(void *priv, int command, int arg) 2195static int cx88_xc2028_tuner_callback(struct cx88_core *core,
2196 int command, int arg)
2202{ 2197{
2203 struct i2c_algo_bit_data *i2c_algo = priv;
2204 struct cx88_core *core = i2c_algo->data;
2205
2206 /* Board-specific callbacks */ 2198 /* Board-specific callbacks */
2207 switch (core->boardnr) { 2199 switch (core->boardnr) {
2208 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL: 2200 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
2209 case CX88_BOARD_POWERCOLOR_REAL_ANGEL: 2201 case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
2210 case CX88_BOARD_GENIATECH_X8000_MT: 2202 case CX88_BOARD_GENIATECH_X8000_MT:
2211 return cx88_xc3028_geniatech_tuner_callback(priv, command, arg); 2203 return cx88_xc3028_geniatech_tuner_callback(core,
2204 command, arg);
2212 case CX88_BOARD_PROLINK_PV_8000GT: 2205 case CX88_BOARD_PROLINK_PV_8000GT:
2213 return cx88_pv_8000gt_callback(priv, command, arg); 2206 return cx88_pv_8000gt_callback(core, command, arg);
2214 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: 2207 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
2215 return cx88_dvico_xc2028_callback(priv, command, arg); 2208 return cx88_dvico_xc2028_callback(core, command, arg);
2216 } 2209 }
2217 2210
2218 switch (command) { 2211 switch (command) {
@@ -2246,11 +2239,9 @@ static int cx88_xc2028_tuner_callback(void *priv, int command, int arg)
2246 * PCTV HD 800i with an xc5000 sillicon tuner. This is used for both * 2239 * PCTV HD 800i with an xc5000 sillicon tuner. This is used for both *
2247 * analog tuner attach (tuner-core.c) and dvb tuner attach (cx88-dvb.c) */ 2240 * analog tuner attach (tuner-core.c) and dvb tuner attach (cx88-dvb.c) */
2248 2241
2249static int cx88_xc5000_tuner_callback(void *priv, int command, int arg) 2242static int cx88_xc5000_tuner_callback(struct cx88_core *core,
2243 int command, int arg)
2250{ 2244{
2251 struct i2c_algo_bit_data *i2c_algo = priv;
2252 struct cx88_core *core = i2c_algo->data;
2253
2254 switch (core->boardnr) { 2245 switch (core->boardnr) {
2255 case CX88_BOARD_PINNACLE_PCTV_HD_800i: 2246 case CX88_BOARD_PINNACLE_PCTV_HD_800i:
2256 if (command == 0) { /* This is the reset command from xc5000 */ 2247 if (command == 0) { /* This is the reset command from xc5000 */
@@ -2284,15 +2275,27 @@ static int cx88_xc5000_tuner_callback(void *priv, int command, int arg)
2284int cx88_tuner_callback(void *priv, int command, int arg) 2275int cx88_tuner_callback(void *priv, int command, int arg)
2285{ 2276{
2286 struct i2c_algo_bit_data *i2c_algo = priv; 2277 struct i2c_algo_bit_data *i2c_algo = priv;
2287 struct cx88_core *core = i2c_algo->data; 2278 struct cx88_core *core;
2279
2280 if (!i2c_algo) {
2281 printk(KERN_ERR "cx88: Error - i2c private data undefined.\n");
2282 return -EINVAL;
2283 }
2284
2285 core = i2c_algo->data;
2286
2287 if (!core) {
2288 printk(KERN_ERR "cx88: Error - device struct undefined.\n");
2289 return -EINVAL;
2290 }
2288 2291
2289 switch (core->board.tuner_type) { 2292 switch (core->board.tuner_type) {
2290 case TUNER_XC2028: 2293 case TUNER_XC2028:
2291 info_printk(core, "Calling XC2028/3028 callback\n"); 2294 info_printk(core, "Calling XC2028/3028 callback\n");
2292 return cx88_xc2028_tuner_callback(priv, command, arg); 2295 return cx88_xc2028_tuner_callback(core, command, arg);
2293 case TUNER_XC5000: 2296 case TUNER_XC5000:
2294 info_printk(core, "Calling XC5000 callback\n"); 2297 info_printk(core, "Calling XC5000 callback\n");
2295 return cx88_xc5000_tuner_callback(priv, command, arg); 2298 return cx88_xc5000_tuner_callback(core, command, arg);
2296 } 2299 }
2297 err_printk(core, "Error: Calling callback for tuner %d\n", 2300 err_printk(core, "Error: Calling callback for tuner %d\n",
2298 core->board.tuner_type); 2301 core->board.tuner_type);