PM / sleep: Asynchronous threads for suspend_noirq
[linux/fpc-iii.git] / drivers / media / usb / gspca / m5602 / m5602_s5k83a.c
blob7cbc3a00bda87208cd65b5ad9e105b2aa54cf1a2
1 /*
2 * Driver for the s5k83a sensor
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>
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
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.
19 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
21 #include <linux/kthread.h>
22 #include "m5602_s5k83a.h"
24 static int s5k83a_s_ctrl(struct v4l2_ctrl *ctrl);
26 static const struct v4l2_ctrl_ops s5k83a_ctrl_ops = {
27 .s_ctrl = s5k83a_s_ctrl,
30 static struct v4l2_pix_format s5k83a_modes[] = {
32 640,
33 480,
34 V4L2_PIX_FMT_SBGGR8,
35 V4L2_FIELD_NONE,
36 .sizeimage =
37 640 * 480,
38 .bytesperline = 640,
39 .colorspace = V4L2_COLORSPACE_SRGB,
40 .priv = 0
44 static void s5k83a_dump_registers(struct sd *sd);
45 static int s5k83a_get_rotation(struct sd *sd, u8 *reg_data);
46 static int s5k83a_set_led_indication(struct sd *sd, u8 val);
47 static int s5k83a_set_flip_real(struct gspca_dev *gspca_dev,
48 __s32 vflip, __s32 hflip);
50 int s5k83a_probe(struct sd *sd)
52 u8 prod_id = 0, ver_id = 0;
53 int i, err = 0;
54 struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
56 if (force_sensor) {
57 if (force_sensor == S5K83A_SENSOR) {
58 pr_info("Forcing a %s sensor\n", s5k83a.name);
59 goto sensor_found;
61 /* If we want to force another sensor, don't try to probe this
62 * one */
63 return -ENODEV;
66 PDEBUG(D_PROBE, "Probing for a s5k83a sensor");
68 /* Preinit the sensor */
69 for (i = 0; i < ARRAY_SIZE(preinit_s5k83a) && !err; i++) {
70 u8 data[2] = {preinit_s5k83a[i][2], preinit_s5k83a[i][3]};
71 if (preinit_s5k83a[i][0] == SENSOR)
72 err = m5602_write_sensor(sd, preinit_s5k83a[i][1],
73 data, 2);
74 else
75 err = m5602_write_bridge(sd, preinit_s5k83a[i][1],
76 data[0]);
79 /* We don't know what register (if any) that contain the product id
80 * Just pick the first addresses that seem to produce the same results
81 * on multiple machines */
82 if (m5602_read_sensor(sd, 0x00, &prod_id, 1))
83 return -ENODEV;
85 if (m5602_read_sensor(sd, 0x01, &ver_id, 1))
86 return -ENODEV;
88 if ((prod_id == 0xff) || (ver_id == 0xff))
89 return -ENODEV;
90 else
91 pr_info("Detected a s5k83a sensor\n");
93 sensor_found:
94 sd->gspca_dev.cam.cam_mode = s5k83a_modes;
95 sd->gspca_dev.cam.nmodes = ARRAY_SIZE(s5k83a_modes);
97 /* null the pointer! thread is't running now */
98 sd->rotation_thread = NULL;
100 return 0;
103 int s5k83a_init(struct sd *sd)
105 int i, err = 0;
107 for (i = 0; i < ARRAY_SIZE(init_s5k83a) && !err; i++) {
108 u8 data[2] = {0x00, 0x00};
110 switch (init_s5k83a[i][0]) {
111 case BRIDGE:
112 err = m5602_write_bridge(sd,
113 init_s5k83a[i][1],
114 init_s5k83a[i][2]);
115 break;
117 case SENSOR:
118 data[0] = init_s5k83a[i][2];
119 err = m5602_write_sensor(sd,
120 init_s5k83a[i][1], data, 1);
121 break;
123 case SENSOR_LONG:
124 data[0] = init_s5k83a[i][2];
125 data[1] = init_s5k83a[i][3];
126 err = m5602_write_sensor(sd,
127 init_s5k83a[i][1], data, 2);
128 break;
129 default:
130 pr_info("Invalid stream command, exiting init\n");
131 return -EINVAL;
135 if (dump_sensor)
136 s5k83a_dump_registers(sd);
138 return err;
141 int s5k83a_init_controls(struct sd *sd)
143 struct v4l2_ctrl_handler *hdl = &sd->gspca_dev.ctrl_handler;
145 sd->gspca_dev.vdev.ctrl_handler = hdl;
146 v4l2_ctrl_handler_init(hdl, 6);
148 v4l2_ctrl_new_std(hdl, &s5k83a_ctrl_ops, V4L2_CID_BRIGHTNESS,
149 0, 255, 1, S5K83A_DEFAULT_BRIGHTNESS);
151 v4l2_ctrl_new_std(hdl, &s5k83a_ctrl_ops, V4L2_CID_EXPOSURE,
152 0, S5K83A_MAXIMUM_EXPOSURE, 1,
153 S5K83A_DEFAULT_EXPOSURE);
155 v4l2_ctrl_new_std(hdl, &s5k83a_ctrl_ops, V4L2_CID_GAIN,
156 0, 255, 1, S5K83A_DEFAULT_GAIN);
158 sd->hflip = v4l2_ctrl_new_std(hdl, &s5k83a_ctrl_ops, V4L2_CID_HFLIP,
159 0, 1, 1, 0);
160 sd->vflip = v4l2_ctrl_new_std(hdl, &s5k83a_ctrl_ops, V4L2_CID_VFLIP,
161 0, 1, 1, 0);
163 if (hdl->error) {
164 pr_err("Could not initialize controls\n");
165 return hdl->error;
168 v4l2_ctrl_cluster(2, &sd->hflip);
170 return 0;
173 static int rotation_thread_function(void *data)
175 struct sd *sd = (struct sd *) data;
176 u8 reg, previous_rotation = 0;
177 __s32 vflip, hflip;
179 set_current_state(TASK_INTERRUPTIBLE);
180 while (!schedule_timeout(100)) {
181 if (mutex_lock_interruptible(&sd->gspca_dev.usb_lock))
182 break;
184 s5k83a_get_rotation(sd, &reg);
185 if (previous_rotation != reg) {
186 previous_rotation = reg;
187 pr_info("Camera was flipped\n");
189 hflip = sd->hflip->val;
190 vflip = sd->vflip->val;
192 if (reg) {
193 vflip = !vflip;
194 hflip = !hflip;
196 s5k83a_set_flip_real((struct gspca_dev *) sd,
197 vflip, hflip);
200 mutex_unlock(&sd->gspca_dev.usb_lock);
201 set_current_state(TASK_INTERRUPTIBLE);
204 /* return to "front" flip */
205 if (previous_rotation) {
206 hflip = sd->hflip->val;
207 vflip = sd->vflip->val;
208 s5k83a_set_flip_real((struct gspca_dev *) sd, vflip, hflip);
211 sd->rotation_thread = NULL;
212 return 0;
215 int s5k83a_start(struct sd *sd)
217 int i, err = 0;
219 /* Create another thread, polling the GPIO ports of the camera to check
220 if it got rotated. This is how the windows driver does it so we have
221 to assume that there is no better way of accomplishing this */
222 sd->rotation_thread = kthread_create(rotation_thread_function,
223 sd, "rotation thread");
224 wake_up_process(sd->rotation_thread);
226 /* Preinit the sensor */
227 for (i = 0; i < ARRAY_SIZE(start_s5k83a) && !err; i++) {
228 u8 data[2] = {start_s5k83a[i][2], start_s5k83a[i][3]};
229 if (start_s5k83a[i][0] == SENSOR)
230 err = m5602_write_sensor(sd, start_s5k83a[i][1],
231 data, 2);
232 else
233 err = m5602_write_bridge(sd, start_s5k83a[i][1],
234 data[0]);
236 if (err < 0)
237 return err;
239 return s5k83a_set_led_indication(sd, 1);
242 int s5k83a_stop(struct sd *sd)
244 if (sd->rotation_thread)
245 kthread_stop(sd->rotation_thread);
247 return s5k83a_set_led_indication(sd, 0);
250 void s5k83a_disconnect(struct sd *sd)
252 s5k83a_stop(sd);
254 sd->sensor = NULL;
257 static int s5k83a_set_gain(struct gspca_dev *gspca_dev, __s32 val)
259 int err;
260 u8 data[2];
261 struct sd *sd = (struct sd *) gspca_dev;
263 data[0] = 0x00;
264 data[1] = 0x20;
265 err = m5602_write_sensor(sd, 0x14, data, 2);
266 if (err < 0)
267 return err;
269 data[0] = 0x01;
270 data[1] = 0x00;
271 err = m5602_write_sensor(sd, 0x0d, data, 2);
272 if (err < 0)
273 return err;
275 /* FIXME: This is not sane, we need to figure out the composition
276 of these registers */
277 data[0] = val >> 3; /* gain, high 5 bits */
278 data[1] = val >> 1; /* gain, high 7 bits */
279 err = m5602_write_sensor(sd, S5K83A_GAIN, data, 2);
281 return err;
284 static int s5k83a_set_brightness(struct gspca_dev *gspca_dev, __s32 val)
286 int err;
287 u8 data[1];
288 struct sd *sd = (struct sd *) gspca_dev;
290 data[0] = val;
291 err = m5602_write_sensor(sd, S5K83A_BRIGHTNESS, data, 1);
292 return err;
295 static int s5k83a_set_exposure(struct gspca_dev *gspca_dev, __s32 val)
297 int err;
298 u8 data[2];
299 struct sd *sd = (struct sd *) gspca_dev;
301 data[0] = 0;
302 data[1] = val;
303 err = m5602_write_sensor(sd, S5K83A_EXPOSURE, data, 2);
304 return err;
307 static int s5k83a_set_flip_real(struct gspca_dev *gspca_dev,
308 __s32 vflip, __s32 hflip)
310 int err;
311 u8 data[1];
312 struct sd *sd = (struct sd *) gspca_dev;
314 data[0] = 0x05;
315 err = m5602_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
316 if (err < 0)
317 return err;
319 /* six bit is vflip, seven is hflip */
320 data[0] = S5K83A_FLIP_MASK;
321 data[0] = (vflip) ? data[0] | 0x40 : data[0];
322 data[0] = (hflip) ? data[0] | 0x80 : data[0];
324 err = m5602_write_sensor(sd, S5K83A_FLIP, data, 1);
325 if (err < 0)
326 return err;
328 data[0] = (vflip) ? 0x0b : 0x0a;
329 err = m5602_write_sensor(sd, S5K83A_VFLIP_TUNE, data, 1);
330 if (err < 0)
331 return err;
333 data[0] = (hflip) ? 0x0a : 0x0b;
334 err = m5602_write_sensor(sd, S5K83A_HFLIP_TUNE, data, 1);
335 return err;
338 static int s5k83a_set_hvflip(struct gspca_dev *gspca_dev)
340 int err;
341 u8 reg;
342 struct sd *sd = (struct sd *) gspca_dev;
343 int hflip = sd->hflip->val;
344 int vflip = sd->vflip->val;
346 err = s5k83a_get_rotation(sd, &reg);
347 if (err < 0)
348 return err;
349 if (reg) {
350 hflip = !hflip;
351 vflip = !vflip;
354 err = s5k83a_set_flip_real(gspca_dev, vflip, hflip);
355 return err;
358 static int s5k83a_s_ctrl(struct v4l2_ctrl *ctrl)
360 struct gspca_dev *gspca_dev =
361 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
362 int err;
364 if (!gspca_dev->streaming)
365 return 0;
367 switch (ctrl->id) {
368 case V4L2_CID_BRIGHTNESS:
369 err = s5k83a_set_brightness(gspca_dev, ctrl->val);
370 break;
371 case V4L2_CID_EXPOSURE:
372 err = s5k83a_set_exposure(gspca_dev, ctrl->val);
373 break;
374 case V4L2_CID_GAIN:
375 err = s5k83a_set_gain(gspca_dev, ctrl->val);
376 break;
377 case V4L2_CID_HFLIP:
378 err = s5k83a_set_hvflip(gspca_dev);
379 break;
380 default:
381 return -EINVAL;
384 return err;
387 static int s5k83a_set_led_indication(struct sd *sd, u8 val)
389 int err = 0;
390 u8 data[1];
392 err = m5602_read_bridge(sd, M5602_XB_GPIO_DAT, data);
393 if (err < 0)
394 return err;
396 if (val)
397 data[0] = data[0] | S5K83A_GPIO_LED_MASK;
398 else
399 data[0] = data[0] & ~S5K83A_GPIO_LED_MASK;
401 err = m5602_write_bridge(sd, M5602_XB_GPIO_DAT, data[0]);
403 return err;
406 /* Get camera rotation on Acer notebooks */
407 static int s5k83a_get_rotation(struct sd *sd, u8 *reg_data)
409 int err = m5602_read_bridge(sd, M5602_XB_GPIO_DAT, reg_data);
410 *reg_data = (*reg_data & S5K83A_GPIO_ROTATION_MASK) ? 0 : 1;
411 return err;
414 static void s5k83a_dump_registers(struct sd *sd)
416 int address;
417 u8 page, old_page;
418 m5602_read_sensor(sd, S5K83A_PAGE_MAP, &old_page, 1);
420 for (page = 0; page < 16; page++) {
421 m5602_write_sensor(sd, S5K83A_PAGE_MAP, &page, 1);
422 pr_info("Dumping the s5k83a register state for page 0x%x\n",
423 page);
424 for (address = 0; address <= 0xff; address++) {
425 u8 val = 0;
426 m5602_read_sensor(sd, address, &val, 1);
427 pr_info("register 0x%x contains 0x%x\n", address, val);
430 pr_info("s5k83a register state dump complete\n");
432 for (page = 0; page < 16; page++) {
433 m5602_write_sensor(sd, S5K83A_PAGE_MAP, &page, 1);
434 pr_info("Probing for which registers that are read/write for page 0x%x\n",
435 page);
436 for (address = 0; address <= 0xff; address++) {
437 u8 old_val, ctrl_val, test_val = 0xff;
439 m5602_read_sensor(sd, address, &old_val, 1);
440 m5602_write_sensor(sd, address, &test_val, 1);
441 m5602_read_sensor(sd, address, &ctrl_val, 1);
443 if (ctrl_val == test_val)
444 pr_info("register 0x%x is writeable\n",
445 address);
446 else
447 pr_info("register 0x%x is read only\n",
448 address);
450 /* Restore original val */
451 m5602_write_sensor(sd, address, &old_val, 1);
454 pr_info("Read/write register probing complete\n");
455 m5602_write_sensor(sd, S5K83A_PAGE_MAP, &old_page, 1);