Lines Matching +full:1 +full:- +full:sd

1 // SPDX-License-Identifier: GPL-2.0-only
164 static void s5k83a_dump_registers(struct sd *sd);
165 static int s5k83a_get_rotation(struct sd *sd, u8 *reg_data);
166 static int s5k83a_set_led_indication(struct sd *sd, u8 val);
170 int s5k83a_probe(struct sd *sd) in s5k83a_probe() argument
174 struct gspca_dev *gspca_dev = (struct gspca_dev *)sd; in s5k83a_probe()
183 return -ENODEV; in s5k83a_probe()
192 err = m5602_write_sensor(sd, preinit_s5k83a[i][1], in s5k83a_probe()
195 err = m5602_write_bridge(sd, preinit_s5k83a[i][1], in s5k83a_probe()
202 if (m5602_read_sensor(sd, 0x00, &prod_id, 1)) in s5k83a_probe()
203 return -ENODEV; in s5k83a_probe()
205 if (m5602_read_sensor(sd, 0x01, &ver_id, 1)) in s5k83a_probe()
206 return -ENODEV; in s5k83a_probe()
209 return -ENODEV; in s5k83a_probe()
214 sd->gspca_dev.cam.cam_mode = s5k83a_modes; in s5k83a_probe()
215 sd->gspca_dev.cam.nmodes = ARRAY_SIZE(s5k83a_modes); in s5k83a_probe()
218 sd->rotation_thread = NULL; in s5k83a_probe()
223 int s5k83a_init(struct sd *sd) in s5k83a_init() argument
232 err = m5602_write_bridge(sd, in s5k83a_init()
233 init_s5k83a[i][1], in s5k83a_init()
239 err = m5602_write_sensor(sd, in s5k83a_init()
240 init_s5k83a[i][1], data, 1); in s5k83a_init()
245 data[1] = init_s5k83a[i][3]; in s5k83a_init()
246 err = m5602_write_sensor(sd, in s5k83a_init()
247 init_s5k83a[i][1], data, 2); in s5k83a_init()
251 return -EINVAL; in s5k83a_init()
256 s5k83a_dump_registers(sd); in s5k83a_init()
261 int s5k83a_init_controls(struct sd *sd) in s5k83a_init_controls() argument
263 struct v4l2_ctrl_handler *hdl = &sd->gspca_dev.ctrl_handler; in s5k83a_init_controls()
265 sd->gspca_dev.vdev.ctrl_handler = hdl; in s5k83a_init_controls()
269 0, 255, 1, S5K83A_DEFAULT_BRIGHTNESS); in s5k83a_init_controls()
272 0, S5K83A_MAXIMUM_EXPOSURE, 1, in s5k83a_init_controls()
276 0, 255, 1, S5K83A_DEFAULT_GAIN); in s5k83a_init_controls()
278 sd->hflip = v4l2_ctrl_new_std(hdl, &s5k83a_ctrl_ops, V4L2_CID_HFLIP, in s5k83a_init_controls()
279 0, 1, 1, 0); in s5k83a_init_controls()
280 sd->vflip = v4l2_ctrl_new_std(hdl, &s5k83a_ctrl_ops, V4L2_CID_VFLIP, in s5k83a_init_controls()
281 0, 1, 1, 0); in s5k83a_init_controls()
283 if (hdl->error) { in s5k83a_init_controls()
285 return hdl->error; in s5k83a_init_controls()
288 v4l2_ctrl_cluster(2, &sd->hflip); in s5k83a_init_controls()
295 struct sd *sd = (struct sd *) data; in rotation_thread_function() local
301 if (mutex_lock_interruptible(&sd->gspca_dev.usb_lock)) in rotation_thread_function()
304 s5k83a_get_rotation(sd, &reg); in rotation_thread_function()
309 hflip = sd->hflip->val; in rotation_thread_function()
310 vflip = sd->vflip->val; in rotation_thread_function()
316 s5k83a_set_flip_real((struct gspca_dev *) sd, in rotation_thread_function()
320 mutex_unlock(&sd->gspca_dev.usb_lock); in rotation_thread_function()
326 hflip = sd->hflip->val; in rotation_thread_function()
327 vflip = sd->vflip->val; in rotation_thread_function()
328 s5k83a_set_flip_real((struct gspca_dev *) sd, vflip, hflip); in rotation_thread_function()
331 sd->rotation_thread = NULL; in rotation_thread_function()
335 int s5k83a_start(struct sd *sd) in s5k83a_start() argument
342 sd->rotation_thread = kthread_create(rotation_thread_function, in s5k83a_start()
343 sd, "rotation thread"); in s5k83a_start()
344 if (IS_ERR(sd->rotation_thread)) { in s5k83a_start()
345 err = PTR_ERR(sd->rotation_thread); in s5k83a_start()
346 sd->rotation_thread = NULL; in s5k83a_start()
349 wake_up_process(sd->rotation_thread); in s5k83a_start()
355 err = m5602_write_sensor(sd, start_s5k83a[i][1], in s5k83a_start()
358 err = m5602_write_bridge(sd, start_s5k83a[i][1], in s5k83a_start()
364 return s5k83a_set_led_indication(sd, 1); in s5k83a_start()
367 int s5k83a_stop(struct sd *sd) in s5k83a_stop() argument
369 if (sd->rotation_thread) in s5k83a_stop()
370 kthread_stop(sd->rotation_thread); in s5k83a_stop()
372 return s5k83a_set_led_indication(sd, 0); in s5k83a_stop()
375 void s5k83a_disconnect(struct sd *sd) in s5k83a_disconnect() argument
377 s5k83a_stop(sd); in s5k83a_disconnect()
379 sd->sensor = NULL; in s5k83a_disconnect()
386 struct sd *sd = (struct sd *) gspca_dev; in s5k83a_set_gain() local
389 data[1] = 0x20; in s5k83a_set_gain()
390 err = m5602_write_sensor(sd, 0x14, data, 2); in s5k83a_set_gain()
395 data[1] = 0x00; in s5k83a_set_gain()
396 err = m5602_write_sensor(sd, 0x0d, data, 2); in s5k83a_set_gain()
403 data[1] = val >> 1; /* gain, high 7 bits */ in s5k83a_set_gain()
404 err = m5602_write_sensor(sd, S5K83A_GAIN, data, 2); in s5k83a_set_gain()
412 u8 data[1]; in s5k83a_set_brightness()
413 struct sd *sd = (struct sd *) gspca_dev; in s5k83a_set_brightness() local
416 err = m5602_write_sensor(sd, S5K83A_BRIGHTNESS, data, 1); in s5k83a_set_brightness()
424 struct sd *sd = (struct sd *) gspca_dev; in s5k83a_set_exposure() local
427 data[1] = val; in s5k83a_set_exposure()
428 err = m5602_write_sensor(sd, S5K83A_EXPOSURE, data, 2); in s5k83a_set_exposure()
436 u8 data[1]; in s5k83a_set_flip_real()
437 struct sd *sd = (struct sd *) gspca_dev; in s5k83a_set_flip_real() local
440 err = m5602_write_sensor(sd, S5K83A_PAGE_MAP, data, 1); in s5k83a_set_flip_real()
449 err = m5602_write_sensor(sd, S5K83A_FLIP, data, 1); in s5k83a_set_flip_real()
454 err = m5602_write_sensor(sd, S5K83A_VFLIP_TUNE, data, 1); in s5k83a_set_flip_real()
459 err = m5602_write_sensor(sd, S5K83A_HFLIP_TUNE, data, 1); in s5k83a_set_flip_real()
467 struct sd *sd = (struct sd *) gspca_dev; in s5k83a_set_hvflip() local
468 int hflip = sd->hflip->val; in s5k83a_set_hvflip()
469 int vflip = sd->vflip->val; in s5k83a_set_hvflip()
471 err = s5k83a_get_rotation(sd, &reg); in s5k83a_set_hvflip()
486 container_of(ctrl->handler, struct gspca_dev, ctrl_handler); in s5k83a_s_ctrl()
489 if (!gspca_dev->streaming) in s5k83a_s_ctrl()
492 switch (ctrl->id) { in s5k83a_s_ctrl()
494 err = s5k83a_set_brightness(gspca_dev, ctrl->val); in s5k83a_s_ctrl()
497 err = s5k83a_set_exposure(gspca_dev, ctrl->val); in s5k83a_s_ctrl()
500 err = s5k83a_set_gain(gspca_dev, ctrl->val); in s5k83a_s_ctrl()
506 return -EINVAL; in s5k83a_s_ctrl()
512 static int s5k83a_set_led_indication(struct sd *sd, u8 val) in s5k83a_set_led_indication() argument
515 u8 data[1]; in s5k83a_set_led_indication()
517 err = m5602_read_bridge(sd, M5602_XB_GPIO_DAT, data); in s5k83a_set_led_indication()
526 err = m5602_write_bridge(sd, M5602_XB_GPIO_DAT, data[0]); in s5k83a_set_led_indication()
532 static int s5k83a_get_rotation(struct sd *sd, u8 *reg_data) in s5k83a_get_rotation() argument
534 int err = m5602_read_bridge(sd, M5602_XB_GPIO_DAT, reg_data); in s5k83a_get_rotation()
535 *reg_data = (*reg_data & S5K83A_GPIO_ROTATION_MASK) ? 0 : 1; in s5k83a_get_rotation()
539 static void s5k83a_dump_registers(struct sd *sd) in s5k83a_dump_registers() argument
543 m5602_read_sensor(sd, S5K83A_PAGE_MAP, &old_page, 1); in s5k83a_dump_registers()
546 m5602_write_sensor(sd, S5K83A_PAGE_MAP, &page, 1); in s5k83a_dump_registers()
551 m5602_read_sensor(sd, address, &val, 1); in s5k83a_dump_registers()
558 m5602_write_sensor(sd, S5K83A_PAGE_MAP, &page, 1); in s5k83a_dump_registers()
564 m5602_read_sensor(sd, address, &old_val, 1); in s5k83a_dump_registers()
565 m5602_write_sensor(sd, address, &test_val, 1); in s5k83a_dump_registers()
566 m5602_read_sensor(sd, address, &ctrl_val, 1); in s5k83a_dump_registers()
576 m5602_write_sensor(sd, address, &old_val, 1); in s5k83a_dump_registers()
580 m5602_write_sensor(sd, S5K83A_PAGE_MAP, &old_page, 1); in s5k83a_dump_registers()