V4L/DVB (10014): gspca - m5602: Remove all sensor specific write functions.
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / gspca / m5602 / m5602_ov9650.c
1 /*
2  * Driver for the ov9650 sensor
3  *
4  * Copyright (C) 2008 Erik AndrĂ©n
5  * Copyright (C) 2007 Ilyes Gouta. Based on the m5603x Linux Driver Project.
6  * Copyright (C) 2005 m5603x Linux Driver Project <m5602@x3ng.com.br>
7  *
8  * Portions of code to USB interface and ALi driver software,
9  * Copyright (c) 2006 Willem Duinker
10  * v4l2 interface modeled after the V4L2 driver
11  * for SN9C10x PC Camera Controllers
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License as
15  * published by the Free Software Foundation, version 2.
16  *
17  */
18
19 #include "m5602_ov9650.h"
20
21 /* Vertically and horizontally flips the image if matched, needed for machines
22    where the sensor is mounted upside down */
23 static
24     const
25         struct dmi_system_id ov9650_flip_dmi_table[] = {
26         {
27                 .ident = "ASUS A6VC",
28                 .matches = {
29                         DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
30                         DMI_MATCH(DMI_PRODUCT_NAME, "A6VC")
31                 }
32         },
33         {
34                 .ident = "ASUS A6VM",
35                 .matches = {
36                         DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
37                         DMI_MATCH(DMI_PRODUCT_NAME, "A6VM")
38                 }
39         },
40         {
41                 .ident = "ASUS A6JC",
42                 .matches = {
43                         DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
44                         DMI_MATCH(DMI_PRODUCT_NAME, "A6JC")
45                 }
46         },
47         {
48                 .ident = "ASUS A6Ja",
49                 .matches = {
50                         DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
51                         DMI_MATCH(DMI_PRODUCT_NAME, "A6J")
52                 }
53         },
54         {
55                 .ident = "ASUS A6Kt",
56                 .matches = {
57                         DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
58                         DMI_MATCH(DMI_PRODUCT_NAME, "A6Kt")
59                 }
60         },
61         { }
62 };
63
64 static void ov9650_dump_registers(struct sd *sd);
65
66 int ov9650_read_sensor(struct sd *sd, const u8 address,
67                       u8 *i2c_data, const u8 len)
68 {
69         int err, i;
70
71         /* The ov9650 registers have a max depth of one byte */
72         if (len > 1 || !len)
73                 return -EINVAL;
74
75         do {
76                 err = m5602_read_bridge(sd, M5602_XB_I2C_STATUS, i2c_data);
77         } while ((*i2c_data & I2C_BUSY) && !err);
78
79         err = m5602_write_bridge(sd, M5602_XB_I2C_DEV_ADDR,
80                                  ov9650.i2c_slave_id);
81         if (err < 0)
82                 goto out;
83
84         err = m5602_write_bridge(sd, M5602_XB_I2C_REG_ADDR, address);
85         if (err < 0)
86                 goto out;
87
88         err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x10 + len);
89         if (err < 0)
90                 goto out;
91
92         err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x08);
93
94         for (i = 0; (i < len) && !err; i++) {
95                 err = m5602_read_bridge(sd, M5602_XB_I2C_DATA, &(i2c_data[i]));
96
97                 PDEBUG(D_CONF, "Reading sensor register "
98                                "0x%x containing 0x%x ", address, *i2c_data);
99         }
100
101 out:
102         return (err < 0) ? err : 0;
103 }
104
105 int ov9650_probe(struct sd *sd)
106 {
107         u8 prod_id = 0, ver_id = 0, i;
108
109         if (force_sensor) {
110                 if (force_sensor == OV9650_SENSOR) {
111                         info("Forcing an %s sensor", ov9650.name);
112                         goto sensor_found;
113                 }
114                 /* If we want to force another sensor,
115                    don't try to probe this one */
116                 return -ENODEV;
117         }
118
119         info("Probing for an ov9650 sensor");
120
121         /* Run the pre-init to actually probe the unit */
122         for (i = 0; i < ARRAY_SIZE(preinit_ov9650); i++) {
123                 u8 data = preinit_ov9650[i][2];
124                 if (preinit_ov9650[i][0] == SENSOR)
125                         m5602_write_sensor(sd,
126                                             preinit_ov9650[i][1], &data, 1);
127                 else
128                         m5602_write_bridge(sd, preinit_ov9650[i][1], data);
129         }
130
131         if (ov9650_read_sensor(sd, OV9650_PID, &prod_id, 1))
132                 return -ENODEV;
133
134         if (ov9650_read_sensor(sd, OV9650_VER, &ver_id, 1))
135                 return -ENODEV;
136
137         if ((prod_id == 0x96) && (ver_id == 0x52)) {
138                 info("Detected an ov9650 sensor");
139                 goto sensor_found;
140         }
141
142         return -ENODEV;
143
144 sensor_found:
145         sd->gspca_dev.cam.cam_mode = ov9650.modes;
146         sd->gspca_dev.cam.nmodes = ov9650.nmodes;
147         sd->desc->ctrls = ov9650.ctrls;
148         sd->desc->nctrls = ov9650.nctrls;
149         return 0;
150 }
151
152 int ov9650_init(struct sd *sd)
153 {
154         int i, err = 0;
155         u8 data;
156
157         if (dump_sensor)
158                 ov9650_dump_registers(sd);
159
160         for (i = 0; i < ARRAY_SIZE(init_ov9650) && !err; i++) {
161                 data = init_ov9650[i][2];
162                 if (init_ov9650[i][0] == SENSOR)
163                         err = m5602_write_sensor(sd, init_ov9650[i][1],
164                                                   &data, 1);
165                 else
166                         err = m5602_write_bridge(sd, init_ov9650[i][1], data);
167         }
168
169         if (dmi_check_system(ov9650_flip_dmi_table) && !err) {
170                 info("vflip quirk active");
171                 data = 0x30;
172                 err = m5602_write_sensor(sd, OV9650_MVFP, &data, 1);
173         }
174
175         return err;
176 }
177
178 int ov9650_power_down(struct sd *sd)
179 {
180         int i, err = 0;
181         for (i = 0; i < ARRAY_SIZE(power_down_ov9650) && !err; i++) {
182                 u8 data = power_down_ov9650[i][2];
183                 if (power_down_ov9650[i][0] == SENSOR)
184                         err = m5602_write_sensor(sd,
185                                             power_down_ov9650[i][1], &data, 1);
186                 else
187                         err = m5602_write_bridge(sd, power_down_ov9650[i][1],
188                                                  data);
189         }
190
191         return err;
192 }
193
194 int ov9650_get_exposure(struct gspca_dev *gspca_dev, __s32 *val)
195 {
196         struct sd *sd = (struct sd *) gspca_dev;
197         u8 i2c_data;
198         int err;
199
200         err = ov9650_read_sensor(sd, OV9650_COM1, &i2c_data, 1);
201         if (err < 0)
202                 goto out;
203         *val = i2c_data & 0x03;
204
205         err = ov9650_read_sensor(sd, OV9650_AECH, &i2c_data, 1);
206         if (err < 0)
207                 goto out;
208         *val |= (i2c_data << 2);
209
210         err = ov9650_read_sensor(sd, OV9650_AECHM, &i2c_data, 1);
211         if (err < 0)
212                 goto out;
213         *val |= (i2c_data & 0x3f) << 10;
214
215         PDEBUG(D_V4L2, "Read exposure %d", *val);
216 out:
217         return err;
218 }
219
220 int ov9650_set_exposure(struct gspca_dev *gspca_dev, __s32 val)
221 {
222         struct sd *sd = (struct sd *) gspca_dev;
223         u8 i2c_data;
224         int err;
225
226         PDEBUG(D_V4L2, "Set exposure to %d",
227                val & 0xffff);
228
229         /* The 6 MSBs */
230         i2c_data = (val >> 10) & 0x3f;
231         err = m5602_write_sensor(sd, OV9650_AECHM,
232                                   &i2c_data, 1);
233         if (err < 0)
234                 goto out;
235
236         /* The 8 middle bits */
237         i2c_data = (val >> 2) & 0xff;
238         err = m5602_write_sensor(sd, OV9650_AECH,
239                                   &i2c_data, 1);
240         if (err < 0)
241                 goto out;
242
243         /* The 2 LSBs */
244         i2c_data = val & 0x03;
245         err = m5602_write_sensor(sd, OV9650_COM1, &i2c_data, 1);
246
247 out:
248         return err;
249 }
250
251 int ov9650_get_gain(struct gspca_dev *gspca_dev, __s32 *val)
252 {
253         int err;
254         u8 i2c_data;
255         struct sd *sd = (struct sd *) gspca_dev;
256
257         ov9650_read_sensor(sd, OV9650_VREF, &i2c_data, 1);
258         *val = (i2c_data & 0x03) << 8;
259
260         err = ov9650_read_sensor(sd, OV9650_GAIN, &i2c_data, 1);
261         *val |= i2c_data;
262         PDEBUG(D_V4L2, "Read gain %d", *val);
263         return err;
264 }
265
266 int ov9650_set_gain(struct gspca_dev *gspca_dev, __s32 val)
267 {
268         int err;
269         u8 i2c_data;
270         struct sd *sd = (struct sd *) gspca_dev;
271
272         /* The 2 MSB */
273         /* Read the OV9650_VREF register first to avoid
274            corrupting the VREF high and low bits */
275         ov9650_read_sensor(sd, OV9650_VREF, &i2c_data, 1);
276         /* Mask away all uninteresting bits */
277         i2c_data = ((val & 0x0300) >> 2) |
278                         (i2c_data & 0x3F);
279         err = m5602_write_sensor(sd, OV9650_VREF, &i2c_data, 1);
280
281         /* The 8 LSBs */
282         i2c_data = val & 0xff;
283         err = m5602_write_sensor(sd, OV9650_GAIN, &i2c_data, 1);
284         return err;
285 }
286
287 int ov9650_get_red_balance(struct gspca_dev *gspca_dev, __s32 *val)
288 {
289         int err;
290         u8 i2c_data;
291         struct sd *sd = (struct sd *) gspca_dev;
292
293         err = ov9650_read_sensor(sd, OV9650_RED, &i2c_data, 1);
294         *val = i2c_data;
295
296         PDEBUG(D_V4L2, "Read red gain %d", *val);
297
298         return err;
299 }
300
301 int ov9650_set_red_balance(struct gspca_dev *gspca_dev, __s32 val)
302 {
303         int err;
304         u8 i2c_data;
305         struct sd *sd = (struct sd *) gspca_dev;
306
307         PDEBUG(D_V4L2, "Set red gain to %d",
308                              val & 0xff);
309
310         i2c_data = val & 0xff;
311         err = m5602_write_sensor(sd, OV9650_RED, &i2c_data, 1);
312
313         return err;
314 }
315
316 int ov9650_get_blue_balance(struct gspca_dev *gspca_dev, __s32 *val)
317 {
318         int err;
319         u8 i2c_data;
320         struct sd *sd = (struct sd *) gspca_dev;
321
322         err = ov9650_read_sensor(sd, OV9650_BLUE, &i2c_data, 1);
323         *val = i2c_data;
324
325         PDEBUG(D_V4L2, "Read blue gain %d", *val);
326
327         return err;
328 }
329
330 int ov9650_set_blue_balance(struct gspca_dev *gspca_dev, __s32 val)
331 {
332         int err;
333         u8 i2c_data;
334         struct sd *sd = (struct sd *) gspca_dev;
335
336         PDEBUG(D_V4L2, "Set blue gain to %d",
337                val & 0xff);
338
339         i2c_data = val & 0xff;
340         err = m5602_write_sensor(sd, OV9650_BLUE, &i2c_data, 1);
341
342         return err;
343 }
344
345 int ov9650_get_hflip(struct gspca_dev *gspca_dev, __s32 *val)
346 {
347         int err;
348         u8 i2c_data;
349         struct sd *sd = (struct sd *) gspca_dev;
350
351         err = ov9650_read_sensor(sd, OV9650_MVFP, &i2c_data, 1);
352         if (dmi_check_system(ov9650_flip_dmi_table))
353                 *val = ((i2c_data & OV9650_HFLIP) >> 5) ? 0 : 1;
354         else
355                 *val = (i2c_data & OV9650_HFLIP) >> 5;
356         PDEBUG(D_V4L2, "Read horizontal flip %d", *val);
357
358         return err;
359 }
360
361 int ov9650_set_hflip(struct gspca_dev *gspca_dev, __s32 val)
362 {
363         int err;
364         u8 i2c_data;
365         struct sd *sd = (struct sd *) gspca_dev;
366
367         PDEBUG(D_V4L2, "Set horizontal flip to %d", val);
368         err = ov9650_read_sensor(sd, OV9650_MVFP, &i2c_data, 1);
369         if (err < 0)
370                 goto out;
371
372         if (dmi_check_system(ov9650_flip_dmi_table))
373                 i2c_data = ((i2c_data & 0xdf) |
374                            (((val ? 0 : 1) & 0x01) << 5));
375         else
376                 i2c_data = ((i2c_data & 0xdf) |
377                            ((val & 0x01) << 5));
378
379         err = m5602_write_sensor(sd, OV9650_MVFP, &i2c_data, 1);
380 out:
381         return err;
382 }
383
384 int ov9650_get_vflip(struct gspca_dev *gspca_dev, __s32 *val)
385 {
386         int err;
387         u8 i2c_data;
388         struct sd *sd = (struct sd *) gspca_dev;
389
390         err = ov9650_read_sensor(sd, OV9650_MVFP, &i2c_data, 1);
391         if (dmi_check_system(ov9650_flip_dmi_table))
392                 *val = ((i2c_data & 0x10) >> 4) ? 0 : 1;
393         else
394                 *val = (i2c_data & 0x10) >> 4;
395         PDEBUG(D_V4L2, "Read vertical flip %d", *val);
396
397         return err;
398 }
399
400 int ov9650_set_vflip(struct gspca_dev *gspca_dev, __s32 val)
401 {
402         int err;
403         u8 i2c_data;
404         struct sd *sd = (struct sd *) gspca_dev;
405
406         PDEBUG(D_V4L2, "Set vertical flip to %d", val);
407         err = ov9650_read_sensor(sd, OV9650_MVFP, &i2c_data, 1);
408         if (err < 0)
409                 goto out;
410
411         if (dmi_check_system(ov9650_flip_dmi_table))
412                 i2c_data = ((i2c_data & 0xef) |
413                                 (((val ? 0 : 1) & 0x01) << 4));
414         else
415                 i2c_data = ((i2c_data & 0xef) |
416                                 ((val & 0x01) << 4));
417
418         err = m5602_write_sensor(sd, OV9650_MVFP, &i2c_data, 1);
419 out:
420         return err;
421 }
422
423 int ov9650_get_brightness(struct gspca_dev *gspca_dev, __s32 *val)
424 {
425         int err;
426         u8 i2c_data;
427         struct sd *sd = (struct sd *) gspca_dev;
428
429         err = ov9650_read_sensor(sd, OV9650_VREF, &i2c_data, 1);
430         if (err < 0)
431                 goto out;
432         *val = (i2c_data & 0x03) << 8;
433
434         err = ov9650_read_sensor(sd, OV9650_GAIN, &i2c_data, 1);
435         *val |= i2c_data;
436         PDEBUG(D_V4L2, "Read gain %d", *val);
437 out:
438         return err;
439 }
440
441 int ov9650_set_brightness(struct gspca_dev *gspca_dev, __s32 val)
442 {
443         int err;
444         u8 i2c_data;
445         struct sd *sd = (struct sd *) gspca_dev;
446
447         PDEBUG(D_V4L2, "Set gain to %d", val & 0x3ff);
448
449         /* Read the OV9650_VREF register first to avoid
450                 corrupting the VREF high and low bits */
451         err = ov9650_read_sensor(sd, OV9650_VREF, &i2c_data, 1);
452         if (err < 0)
453                 goto out;
454
455         /* Mask away all uninteresting bits */
456         i2c_data = ((val & 0x0300) >> 2) | (i2c_data & 0x3F);
457         err = m5602_write_sensor(sd, OV9650_VREF, &i2c_data, 1);
458         if (err < 0)
459                 goto out;
460
461         /* The 8 LSBs */
462         i2c_data = val & 0xff;
463         err = m5602_write_sensor(sd, OV9650_GAIN, &i2c_data, 1);
464
465 out:
466         return err;
467 }
468
469 int ov9650_get_auto_white_balance(struct gspca_dev *gspca_dev, __s32 *val)
470 {
471         int err;
472         u8 i2c_data;
473         struct sd *sd = (struct sd *) gspca_dev;
474
475         err = ov9650_read_sensor(sd, OV9650_COM8, &i2c_data, 1);
476         *val = (i2c_data & OV9650_AWB_EN) >> 1;
477         PDEBUG(D_V4L2, "Read auto white balance %d", *val);
478
479         return err;
480 }
481
482 int ov9650_set_auto_white_balance(struct gspca_dev *gspca_dev, __s32 val)
483 {
484         int err;
485         u8 i2c_data;
486         struct sd *sd = (struct sd *) gspca_dev;
487
488         PDEBUG(D_V4L2, "Set auto white balance to %d", val);
489         err = ov9650_read_sensor(sd, OV9650_COM8, &i2c_data, 1);
490         if (err < 0)
491                 goto out;
492
493         i2c_data = ((i2c_data & 0xfd) | ((val & 0x01) << 1));
494         err = m5602_write_sensor(sd, OV9650_COM8, &i2c_data, 1);
495 out:
496         return err;
497 }
498
499 int ov9650_get_auto_gain(struct gspca_dev *gspca_dev, __s32 *val)
500 {
501         int err;
502         u8 i2c_data;
503         struct sd *sd = (struct sd *) gspca_dev;
504
505         err = ov9650_read_sensor(sd, OV9650_COM8, &i2c_data, 1);
506         *val = (i2c_data & OV9650_AGC_EN) >> 2;
507         PDEBUG(D_V4L2, "Read auto gain control %d", *val);
508
509         return err;
510 }
511
512 int ov9650_set_auto_gain(struct gspca_dev *gspca_dev, __s32 val)
513 {
514         int err;
515         u8 i2c_data;
516         struct sd *sd = (struct sd *) gspca_dev;
517
518         PDEBUG(D_V4L2, "Set auto gain control to %d", val);
519         err = ov9650_read_sensor(sd, OV9650_COM8, &i2c_data, 1);
520         if (err < 0)
521                 goto out;
522
523         i2c_data = ((i2c_data & 0xfb) | ((val & 0x01) << 2));
524         err = m5602_write_sensor(sd, OV9650_COM8, &i2c_data, 1);
525 out:
526         return err;
527 }
528
529 static void ov9650_dump_registers(struct sd *sd)
530 {
531         int address;
532         info("Dumping the ov9650 register state");
533         for (address = 0; address < 0xa9; address++) {
534                 u8 value;
535                 ov9650_read_sensor(sd, address, &value, 1);
536                 info("register 0x%x contains 0x%x",
537                      address, value);
538         }
539
540         info("ov9650 register state dump complete");
541
542         info("Probing for which registers that are read/write");
543         for (address = 0; address < 0xff; address++) {
544                 u8 old_value, ctrl_value;
545                 u8 test_value[2] = {0xff, 0xff};
546
547                 ov9650_read_sensor(sd, address, &old_value, 1);
548                 m5602_write_sensor(sd, address, test_value, 1);
549                 ov9650_read_sensor(sd, address, &ctrl_value, 1);
550
551                 if (ctrl_value == test_value[0])
552                         info("register 0x%x is writeable", address);
553                 else
554                         info("register 0x%x is read only", address);
555
556                 /* Restore original value */
557                 m5602_write_sensor(sd, address, &old_value, 1);
558         }
559 }