diff options
author | Erik Andrén <erik.andren@gmail.com> | 2008-11-20 01:59:02 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2008-12-30 06:39:47 -0500 |
commit | 7b9f246738869e6a55bf180441598e8daa72a99e (patch) | |
tree | 7a220246f13aeb101ffc2d26ec96e61f6a299403 | |
parent | e07b14e80be3d93807a6dc01edb80e0cc38040ad (diff) |
V4L/DVB (10004): m5602: Cleanup the po1030 sensor error handling
Signed-off-by: Erik Andrén <erik.andren@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/media/video/gspca/m5602/m5602_po1030.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/drivers/media/video/gspca/m5602/m5602_po1030.c b/drivers/media/video/gspca/m5602/m5602_po1030.c index d17ac52566e6..739f2df55e0d 100644 --- a/drivers/media/video/gspca/m5602/m5602_po1030.c +++ b/drivers/media/video/gspca/m5602/m5602_po1030.c | |||
@@ -73,19 +73,28 @@ int po1030_read_sensor(struct sd *sd, const u8 address, | |||
73 | err = m5602_read_bridge(sd, M5602_XB_I2C_STATUS, i2c_data); | 73 | err = m5602_read_bridge(sd, M5602_XB_I2C_STATUS, i2c_data); |
74 | } while ((*i2c_data & I2C_BUSY) && !err); | 74 | } while ((*i2c_data & I2C_BUSY) && !err); |
75 | 75 | ||
76 | m5602_write_bridge(sd, M5602_XB_I2C_DEV_ADDR, | 76 | err = m5602_write_bridge(sd, M5602_XB_I2C_DEV_ADDR, |
77 | sd->sensor->i2c_slave_id); | 77 | sd->sensor->i2c_slave_id); |
78 | m5602_write_bridge(sd, M5602_XB_I2C_REG_ADDR, address); | 78 | if (err < 0) |
79 | m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x10 + len); | 79 | goto out; |
80 | m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x08); | 80 | err = m5602_write_bridge(sd, M5602_XB_I2C_REG_ADDR, address); |
81 | if (err < 0) | ||
82 | goto out; | ||
83 | err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x10 + len); | ||
84 | if (err < 0) | ||
85 | goto out; | ||
86 | err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x08); | ||
87 | if (err < 0) | ||
88 | goto out; | ||
81 | 89 | ||
82 | for (i = 0; i < len; i++) { | 90 | for (i = 0; (i < len) && !err; i++) { |
83 | err = m5602_read_bridge(sd, M5602_XB_I2C_DATA, &(i2c_data[i])); | 91 | err = m5602_read_bridge(sd, M5602_XB_I2C_DATA, &(i2c_data[i])); |
84 | 92 | ||
85 | PDEBUG(D_CONF, "Reading sensor register " | 93 | PDEBUG(D_CONF, "Reading sensor register " |
86 | "0x%x containing 0x%x ", address, *i2c_data); | 94 | "0x%x containing 0x%x ", address, *i2c_data); |
87 | } | 95 | } |
88 | return (err < 0) ? err : 0; | 96 | out: |
97 | return err; | ||
89 | } | 98 | } |
90 | 99 | ||
91 | int po1030_write_sensor(struct sd *sd, const u8 address, | 100 | int po1030_write_sensor(struct sd *sd, const u8 address, |
@@ -135,7 +144,7 @@ int po1030_init(struct sd *sd) | |||
135 | int i, err = 0; | 144 | int i, err = 0; |
136 | 145 | ||
137 | /* Init the sensor */ | 146 | /* Init the sensor */ |
138 | for (i = 0; i < ARRAY_SIZE(init_po1030); i++) { | 147 | for (i = 0; i < ARRAY_SIZE(init_po1030) && !err; i++) { |
139 | u8 data[2] = {0x00, 0x00}; | 148 | u8 data[2] = {0x00, 0x00}; |
140 | 149 | ||
141 | switch (init_po1030[i][0]) { | 150 | switch (init_po1030[i][0]) { |
@@ -166,7 +175,7 @@ int po1030_init(struct sd *sd) | |||
166 | if (dump_sensor) | 175 | if (dump_sensor) |
167 | po1030_dump_registers(sd); | 176 | po1030_dump_registers(sd); |
168 | 177 | ||
169 | return (err < 0) ? err : 0; | 178 | return err; |
170 | } | 179 | } |
171 | 180 | ||
172 | int po1030_get_exposure(struct gspca_dev *gspca_dev, __s32 *val) | 181 | int po1030_get_exposure(struct gspca_dev *gspca_dev, __s32 *val) |
@@ -187,7 +196,7 @@ int po1030_get_exposure(struct gspca_dev *gspca_dev, __s32 *val) | |||
187 | 196 | ||
188 | PDEBUG(D_V4L2, "Exposure read as %d", *val); | 197 | PDEBUG(D_V4L2, "Exposure read as %d", *val); |
189 | out: | 198 | out: |
190 | return (err < 0) ? err : 0; | 199 | return err; |
191 | } | 200 | } |
192 | 201 | ||
193 | int po1030_set_exposure(struct gspca_dev *gspca_dev, __s32 val) | 202 | int po1030_set_exposure(struct gspca_dev *gspca_dev, __s32 val) |
@@ -214,7 +223,7 @@ int po1030_set_exposure(struct gspca_dev *gspca_dev, __s32 val) | |||
214 | &i2c_data, 1); | 223 | &i2c_data, 1); |
215 | 224 | ||
216 | out: | 225 | out: |
217 | return (err < 0) ? err : 0; | 226 | return err; |
218 | } | 227 | } |
219 | 228 | ||
220 | int po1030_get_gain(struct gspca_dev *gspca_dev, __s32 *val) | 229 | int po1030_get_gain(struct gspca_dev *gspca_dev, __s32 *val) |
@@ -228,7 +237,7 @@ int po1030_get_gain(struct gspca_dev *gspca_dev, __s32 *val) | |||
228 | *val = i2c_data; | 237 | *val = i2c_data; |
229 | PDEBUG(D_V4L2, "Read global gain %d", *val); | 238 | PDEBUG(D_V4L2, "Read global gain %d", *val); |
230 | 239 | ||
231 | return (err < 0) ? err : 0; | 240 | return err; |
232 | } | 241 | } |
233 | 242 | ||
234 | int po1030_get_hflip(struct gspca_dev *gspca_dev, __s32 *val) | 243 | int po1030_get_hflip(struct gspca_dev *gspca_dev, __s32 *val) |
@@ -244,7 +253,7 @@ int po1030_get_hflip(struct gspca_dev *gspca_dev, __s32 *val) | |||
244 | 253 | ||
245 | PDEBUG(D_V4L2, "Read hflip %d", *val); | 254 | PDEBUG(D_V4L2, "Read hflip %d", *val); |
246 | 255 | ||
247 | return (err < 0) ? err : 0; | 256 | return err; |
248 | } | 257 | } |
249 | 258 | ||
250 | int po1030_set_hflip(struct gspca_dev *gspca_dev, __s32 val) | 259 | int po1030_set_hflip(struct gspca_dev *gspca_dev, __s32 val) |
@@ -260,7 +269,7 @@ int po1030_set_hflip(struct gspca_dev *gspca_dev, __s32 val) | |||
260 | err = po1030_write_sensor(sd, PO1030_REG_CONTROL2, | 269 | err = po1030_write_sensor(sd, PO1030_REG_CONTROL2, |
261 | &i2c_data, 1); | 270 | &i2c_data, 1); |
262 | 271 | ||
263 | return (err < 0) ? err : 0; | 272 | return err; |
264 | } | 273 | } |
265 | 274 | ||
266 | int po1030_get_vflip(struct gspca_dev *gspca_dev, __s32 *val) | 275 | int po1030_get_vflip(struct gspca_dev *gspca_dev, __s32 *val) |
@@ -276,7 +285,7 @@ int po1030_get_vflip(struct gspca_dev *gspca_dev, __s32 *val) | |||
276 | 285 | ||
277 | PDEBUG(D_V4L2, "Read vflip %d", *val); | 286 | PDEBUG(D_V4L2, "Read vflip %d", *val); |
278 | 287 | ||
279 | return (err < 0) ? err : 0; | 288 | return err; |
280 | } | 289 | } |
281 | 290 | ||
282 | int po1030_set_vflip(struct gspca_dev *gspca_dev, __s32 val) | 291 | int po1030_set_vflip(struct gspca_dev *gspca_dev, __s32 val) |
@@ -292,7 +301,7 @@ int po1030_set_vflip(struct gspca_dev *gspca_dev, __s32 val) | |||
292 | err = po1030_write_sensor(sd, PO1030_REG_CONTROL2, | 301 | err = po1030_write_sensor(sd, PO1030_REG_CONTROL2, |
293 | &i2c_data, 1); | 302 | &i2c_data, 1); |
294 | 303 | ||
295 | return (err < 0) ? err : 0; | 304 | return err; |
296 | } | 305 | } |
297 | 306 | ||
298 | int po1030_set_gain(struct gspca_dev *gspca_dev, __s32 val) | 307 | int po1030_set_gain(struct gspca_dev *gspca_dev, __s32 val) |
@@ -305,7 +314,7 @@ int po1030_set_gain(struct gspca_dev *gspca_dev, __s32 val) | |||
305 | PDEBUG(D_V4L2, "Set global gain to %d", i2c_data); | 314 | PDEBUG(D_V4L2, "Set global gain to %d", i2c_data); |
306 | err = po1030_write_sensor(sd, PO1030_REG_GLOBALGAIN, | 315 | err = po1030_write_sensor(sd, PO1030_REG_GLOBALGAIN, |
307 | &i2c_data, 1); | 316 | &i2c_data, 1); |
308 | return (err < 0) ? err : 0; | 317 | return err; |
309 | } | 318 | } |
310 | 319 | ||
311 | int po1030_get_red_balance(struct gspca_dev *gspca_dev, __s32 *val) | 320 | int po1030_get_red_balance(struct gspca_dev *gspca_dev, __s32 *val) |
@@ -318,7 +327,7 @@ int po1030_get_red_balance(struct gspca_dev *gspca_dev, __s32 *val) | |||
318 | &i2c_data, 1); | 327 | &i2c_data, 1); |
319 | *val = i2c_data; | 328 | *val = i2c_data; |
320 | PDEBUG(D_V4L2, "Read red gain %d", *val); | 329 | PDEBUG(D_V4L2, "Read red gain %d", *val); |
321 | return (err < 0) ? err : 0; | 330 | return err; |
322 | } | 331 | } |
323 | 332 | ||
324 | int po1030_set_red_balance(struct gspca_dev *gspca_dev, __s32 val) | 333 | int po1030_set_red_balance(struct gspca_dev *gspca_dev, __s32 val) |
@@ -331,7 +340,7 @@ int po1030_set_red_balance(struct gspca_dev *gspca_dev, __s32 val) | |||
331 | PDEBUG(D_V4L2, "Set red gain to %d", i2c_data); | 340 | PDEBUG(D_V4L2, "Set red gain to %d", i2c_data); |
332 | err = po1030_write_sensor(sd, PO1030_REG_RED_GAIN, | 341 | err = po1030_write_sensor(sd, PO1030_REG_RED_GAIN, |
333 | &i2c_data, 1); | 342 | &i2c_data, 1); |
334 | return (err < 0) ? err : 0; | 343 | return err; |
335 | } | 344 | } |
336 | 345 | ||
337 | int po1030_get_blue_balance(struct gspca_dev *gspca_dev, __s32 *val) | 346 | int po1030_get_blue_balance(struct gspca_dev *gspca_dev, __s32 *val) |
@@ -345,7 +354,7 @@ int po1030_get_blue_balance(struct gspca_dev *gspca_dev, __s32 *val) | |||
345 | *val = i2c_data; | 354 | *val = i2c_data; |
346 | PDEBUG(D_V4L2, "Read blue gain %d", *val); | 355 | PDEBUG(D_V4L2, "Read blue gain %d", *val); |
347 | 356 | ||
348 | return (err < 0) ? err : 0; | 357 | return err; |
349 | } | 358 | } |
350 | 359 | ||
351 | int po1030_set_blue_balance(struct gspca_dev *gspca_dev, __s32 val) | 360 | int po1030_set_blue_balance(struct gspca_dev *gspca_dev, __s32 val) |
@@ -358,7 +367,7 @@ int po1030_set_blue_balance(struct gspca_dev *gspca_dev, __s32 val) | |||
358 | err = po1030_write_sensor(sd, PO1030_REG_BLUE_GAIN, | 367 | err = po1030_write_sensor(sd, PO1030_REG_BLUE_GAIN, |
359 | &i2c_data, 1); | 368 | &i2c_data, 1); |
360 | 369 | ||
361 | return (err < 0) ? err : 0; | 370 | return err; |
362 | } | 371 | } |
363 | 372 | ||
364 | int po1030_power_down(struct sd *sd) | 373 | int po1030_power_down(struct sd *sd) |