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[] = {
39 .colorspace = V4L2_COLORSPACE_SRGB,
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;
56 if (force_sensor == S5K83A_SENSOR) {
57 pr_info("Forcing a %s sensor\n", s5k83a.name);
60 /* If we want to force another sensor, don't try to probe this
65 PDEBUG(D_PROBE, "Probing for a s5k83a sensor");
67 /* Preinit the sensor */
68 for (i = 0; i < ARRAY_SIZE(preinit_s5k83a) && !err; i++) {
69 u8 data[2] = {preinit_s5k83a[i][2], preinit_s5k83a[i][3]};
70 if (preinit_s5k83a[i][0] == SENSOR)
71 err = m5602_write_sensor(sd, preinit_s5k83a[i][1],
74 err = m5602_write_bridge(sd, preinit_s5k83a[i][1],
78 /* We don't know what register (if any) that contain the product id
79 * Just pick the first addresses that seem to produce the same results
80 * on multiple machines */
81 if (m5602_read_sensor(sd, 0x00, &prod_id, 1))
84 if (m5602_read_sensor(sd, 0x01, &ver_id, 1))
87 if ((prod_id == 0xff) || (ver_id == 0xff))
90 pr_info("Detected a s5k83a sensor\n");
93 sd->gspca_dev.cam.cam_mode = s5k83a_modes;
94 sd->gspca_dev.cam.nmodes = ARRAY_SIZE(s5k83a_modes);
96 /* null the pointer! thread is't running now */
97 sd->rotation_thread = NULL;
102 int s5k83a_init(struct sd *sd)
106 for (i = 0; i < ARRAY_SIZE(init_s5k83a) && !err; i++) {
107 u8 data[2] = {0x00, 0x00};
109 switch (init_s5k83a[i][0]) {
111 err = m5602_write_bridge(sd,
117 data[0] = init_s5k83a[i][2];
118 err = m5602_write_sensor(sd,
119 init_s5k83a[i][1], data, 1);
123 data[0] = init_s5k83a[i][2];
124 data[1] = init_s5k83a[i][3];
125 err = m5602_write_sensor(sd,
126 init_s5k83a[i][1], data, 2);
129 pr_info("Invalid stream command, exiting init\n");
135 s5k83a_dump_registers(sd);
140 int s5k83a_init_controls(struct sd *sd)
142 struct v4l2_ctrl_handler *hdl = &sd->gspca_dev.ctrl_handler;
144 sd->gspca_dev.vdev.ctrl_handler = hdl;
145 v4l2_ctrl_handler_init(hdl, 6);
147 v4l2_ctrl_new_std(hdl, &s5k83a_ctrl_ops, V4L2_CID_BRIGHTNESS,
148 0, 255, 1, S5K83A_DEFAULT_BRIGHTNESS);
150 v4l2_ctrl_new_std(hdl, &s5k83a_ctrl_ops, V4L2_CID_EXPOSURE,
151 0, S5K83A_MAXIMUM_EXPOSURE, 1,
152 S5K83A_DEFAULT_EXPOSURE);
154 v4l2_ctrl_new_std(hdl, &s5k83a_ctrl_ops, V4L2_CID_GAIN,
155 0, 255, 1, S5K83A_DEFAULT_GAIN);
157 sd->hflip = v4l2_ctrl_new_std(hdl, &s5k83a_ctrl_ops, V4L2_CID_HFLIP,
159 sd->vflip = v4l2_ctrl_new_std(hdl, &s5k83a_ctrl_ops, V4L2_CID_VFLIP,
163 pr_err("Could not initialize controls\n");
167 v4l2_ctrl_cluster(2, &sd->hflip);
172 static int rotation_thread_function(void *data)
174 struct sd *sd = (struct sd *) data;
175 u8 reg, previous_rotation = 0;
178 set_current_state(TASK_INTERRUPTIBLE);
179 while (!schedule_timeout(100)) {
180 if (mutex_lock_interruptible(&sd->gspca_dev.usb_lock))
183 s5k83a_get_rotation(sd, ®);
184 if (previous_rotation != reg) {
185 previous_rotation = reg;
186 pr_info("Camera was flipped\n");
188 hflip = sd->hflip->val;
189 vflip = sd->vflip->val;
195 s5k83a_set_flip_real((struct gspca_dev *) sd,
199 mutex_unlock(&sd->gspca_dev.usb_lock);
200 set_current_state(TASK_INTERRUPTIBLE);
203 /* return to "front" flip */
204 if (previous_rotation) {
205 hflip = sd->hflip->val;
206 vflip = sd->vflip->val;
207 s5k83a_set_flip_real((struct gspca_dev *) sd, vflip, hflip);
210 sd->rotation_thread = NULL;
214 int s5k83a_start(struct sd *sd)
218 /* Create another thread, polling the GPIO ports of the camera to check
219 if it got rotated. This is how the windows driver does it so we have
220 to assume that there is no better way of accomplishing this */
221 sd->rotation_thread = kthread_create(rotation_thread_function,
222 sd, "rotation thread");
223 wake_up_process(sd->rotation_thread);
225 /* Preinit the sensor */
226 for (i = 0; i < ARRAY_SIZE(start_s5k83a) && !err; i++) {
227 u8 data[2] = {start_s5k83a[i][2], start_s5k83a[i][3]};
228 if (start_s5k83a[i][0] == SENSOR)
229 err = m5602_write_sensor(sd, start_s5k83a[i][1],
232 err = m5602_write_bridge(sd, start_s5k83a[i][1],
238 return s5k83a_set_led_indication(sd, 1);
241 int s5k83a_stop(struct sd *sd)
243 if (sd->rotation_thread)
244 kthread_stop(sd->rotation_thread);
246 return s5k83a_set_led_indication(sd, 0);
249 void s5k83a_disconnect(struct sd *sd)
256 static int s5k83a_set_gain(struct gspca_dev *gspca_dev, __s32 val)
260 struct sd *sd = (struct sd *) gspca_dev;
264 err = m5602_write_sensor(sd, 0x14, data, 2);
270 err = m5602_write_sensor(sd, 0x0d, data, 2);
274 /* FIXME: This is not sane, we need to figure out the composition
275 of these registers */
276 data[0] = val >> 3; /* gain, high 5 bits */
277 data[1] = val >> 1; /* gain, high 7 bits */
278 err = m5602_write_sensor(sd, S5K83A_GAIN, data, 2);
283 static int s5k83a_set_brightness(struct gspca_dev *gspca_dev, __s32 val)
287 struct sd *sd = (struct sd *) gspca_dev;
290 err = m5602_write_sensor(sd, S5K83A_BRIGHTNESS, data, 1);
294 static int s5k83a_set_exposure(struct gspca_dev *gspca_dev, __s32 val)
298 struct sd *sd = (struct sd *) gspca_dev;
302 err = m5602_write_sensor(sd, S5K83A_EXPOSURE, data, 2);
306 static int s5k83a_set_flip_real(struct gspca_dev *gspca_dev,
307 __s32 vflip, __s32 hflip)
311 struct sd *sd = (struct sd *) gspca_dev;
314 err = m5602_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
318 /* six bit is vflip, seven is hflip */
319 data[0] = S5K83A_FLIP_MASK;
320 data[0] = (vflip) ? data[0] | 0x40 : data[0];
321 data[0] = (hflip) ? data[0] | 0x80 : data[0];
323 err = m5602_write_sensor(sd, S5K83A_FLIP, data, 1);
327 data[0] = (vflip) ? 0x0b : 0x0a;
328 err = m5602_write_sensor(sd, S5K83A_VFLIP_TUNE, data, 1);
332 data[0] = (hflip) ? 0x0a : 0x0b;
333 err = m5602_write_sensor(sd, S5K83A_HFLIP_TUNE, data, 1);
337 static int s5k83a_set_hvflip(struct gspca_dev *gspca_dev)
341 struct sd *sd = (struct sd *) gspca_dev;
342 int hflip = sd->hflip->val;
343 int vflip = sd->vflip->val;
345 err = s5k83a_get_rotation(sd, ®);
353 err = s5k83a_set_flip_real(gspca_dev, vflip, hflip);
357 static int s5k83a_s_ctrl(struct v4l2_ctrl *ctrl)
359 struct gspca_dev *gspca_dev =
360 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
363 if (!gspca_dev->streaming)
367 case V4L2_CID_BRIGHTNESS:
368 err = s5k83a_set_brightness(gspca_dev, ctrl->val);
370 case V4L2_CID_EXPOSURE:
371 err = s5k83a_set_exposure(gspca_dev, ctrl->val);
374 err = s5k83a_set_gain(gspca_dev, ctrl->val);
377 err = s5k83a_set_hvflip(gspca_dev);
386 static int s5k83a_set_led_indication(struct sd *sd, u8 val)
391 err = m5602_read_bridge(sd, M5602_XB_GPIO_DAT, data);
396 data[0] = data[0] | S5K83A_GPIO_LED_MASK;
398 data[0] = data[0] & ~S5K83A_GPIO_LED_MASK;
400 err = m5602_write_bridge(sd, M5602_XB_GPIO_DAT, data[0]);
405 /* Get camera rotation on Acer notebooks */
406 static int s5k83a_get_rotation(struct sd *sd, u8 *reg_data)
408 int err = m5602_read_bridge(sd, M5602_XB_GPIO_DAT, reg_data);
409 *reg_data = (*reg_data & S5K83A_GPIO_ROTATION_MASK) ? 0 : 1;
413 static void s5k83a_dump_registers(struct sd *sd)
417 m5602_read_sensor(sd, S5K83A_PAGE_MAP, &old_page, 1);
419 for (page = 0; page < 16; page++) {
420 m5602_write_sensor(sd, S5K83A_PAGE_MAP, &page, 1);
421 pr_info("Dumping the s5k83a register state for page 0x%x\n",
423 for (address = 0; address <= 0xff; address++) {
425 m5602_read_sensor(sd, address, &val, 1);
426 pr_info("register 0x%x contains 0x%x\n", address, val);
429 pr_info("s5k83a register state dump complete\n");
431 for (page = 0; page < 16; page++) {
432 m5602_write_sensor(sd, S5K83A_PAGE_MAP, &page, 1);
433 pr_info("Probing for which registers that are read/write for page 0x%x\n",
435 for (address = 0; address <= 0xff; address++) {
436 u8 old_val, ctrl_val, test_val = 0xff;
438 m5602_read_sensor(sd, address, &old_val, 1);
439 m5602_write_sensor(sd, address, &test_val, 1);
440 m5602_read_sensor(sd, address, &ctrl_val, 1);
442 if (ctrl_val == test_val)
443 pr_info("register 0x%x is writeable\n",
446 pr_info("register 0x%x is read only\n",
449 /* Restore original val */
450 m5602_write_sensor(sd, address, &old_val, 1);
453 pr_info("Read/write register probing complete\n");
454 m5602_write_sensor(sd, S5K83A_PAGE_MAP, &old_page, 1);