Lines Matching +full:max +full:- +full:speed
1 // SPDX-License-Identifier: GPL-2.0
24 #include <media/v4l2-subdev.h>
25 #include <media/v4l2-ctrls.h>
26 #include <media/v4l2-device.h>
29 #include <linux/rk-camera-module.h>
136 if (motor->move_status != MOTOR_STATUS_STOPPED) in set_motor_running_status()
137 wait_for_completion(&motor->complete); in set_motor_running_status()
139 motor->cur_ext_dev = cur_ext_dev; in set_motor_running_status()
140 if (!IS_ERR(cur_ext_dev->en_gpio)) in set_motor_running_status()
141 gpiod_set_value_cansleep(cur_ext_dev->en_gpio, 1); in set_motor_running_status()
143 motor->move_status = status; in set_motor_running_status()
144 step_cnt = pos * cur_ext_dev->step_per_pos; in set_motor_running_status()
145 if (cur_ext_dev->speed_queue_num > 1 && in set_motor_running_status()
146 step_cnt >= cur_ext_dev->ths_speeded_up) { in set_motor_running_status()
147 motor->run_queue = &cur_ext_dev->speed_que; in set_motor_running_status()
148 motor->run_queue->speed_p[cur_ext_dev->length_up - 1].count = in set_motor_running_status()
149 step_cnt - cur_ext_dev->speed_up_step_cnt; in set_motor_running_status()
151 motor->run_queue = &cur_ext_dev->one_speed_que; in set_motor_running_status()
152 motor->run_queue->speed_p[0].count = step_cnt; in set_motor_running_status()
154 motor->move_cnt = motor->run_queue->count; in set_motor_running_status()
155 reinit_completion(&motor->complete); in set_motor_running_status()
157 cur_ext_dev->mv_tim.vcm_start_t = ns_to_timeval(ktime_get_ns()); in set_motor_running_status()
158 for (i = 0; i < motor->run_queue->count; i++) { in set_motor_running_status()
159 move_time += (u64)motor->run_queue->speed_p[i].count * in set_motor_running_status()
160 (u64)motor->run_queue->speed_p[i].phase_interval_ns; in set_motor_running_status()
161 dev_dbg(motor->dev, "speed_que.speed[%d], count %d, phase_interval_ns %llu\n", in set_motor_running_status()
163 motor->run_queue->speed_p[i].count, in set_motor_running_status()
164 motor->run_queue->speed_p[i].phase_interval_ns); in set_motor_running_status()
168 dev_dbg(motor->dev, "motor move needs %lld us\n", mv_us); in set_motor_running_status()
169 mv_us += cur_ext_dev->mv_tim.vcm_start_t.tv_usec; in set_motor_running_status()
172 cur_ext_dev->mv_tim.vcm_end_t.tv_sec = in set_motor_running_status()
173 cur_ext_dev->mv_tim.vcm_start_t.tv_sec + mv_s; in set_motor_running_status()
174 cur_ext_dev->mv_tim.vcm_end_t.tv_usec = mv_us - (mv_s * 1000000); in set_motor_running_status()
176 cur_ext_dev->mv_tim.vcm_end_t.tv_sec = in set_motor_running_status()
177 cur_ext_dev->mv_tim.vcm_start_t.tv_sec; in set_motor_running_status()
178 cur_ext_dev->mv_tim.vcm_end_t.tv_usec = mv_us; in set_motor_running_status()
180 hrtimer_start(&motor->timer, ktime_set(0, 0), HRTIMER_MODE_REL); in set_motor_running_status()
186 struct device_node *node = dev->of_node; in fill_speed_squeue()
198 ext_dev->ths_speeded_up = 0; in fill_speed_squeue()
199 size = sizeof(*ext_dev->one_speed_que.speed_p); in fill_speed_squeue()
200 ext_dev->one_speed_que.speed_p = devm_kzalloc(dev, size, GFP_KERNEL); in fill_speed_squeue()
201 if (!ext_dev->one_speed_que.speed_p) in fill_speed_squeue()
202 return -ENOMEM; in fill_speed_squeue()
203 ext_dev->one_speed_que.count = 1; in fill_speed_squeue()
204 ext_dev->one_speed_que.speed_p[0].count = ext_dev->first_speed_step; in fill_speed_squeue()
205 ext_dev->one_speed_que.speed_p[0].phase_interval_ns = in fill_speed_squeue()
206 div_u64(NSEC_PER_SEC, ext_dev->start_up_speed); in fill_speed_squeue()
207 switch (ext_dev->type) { in fill_speed_squeue()
209 //max step is 80, needn't speed-up in fill_speed_squeue()
212 prop = of_find_property(node, "focus-speed-up-table", &length_up); in fill_speed_squeue()
219 return -ENOMEM; in fill_speed_squeue()
220 ret = of_property_read_u32_array(node, "focus-speed-up-table", in fill_speed_squeue()
225 "fail to get speed table, used default speed!\n"); in fill_speed_squeue()
228 ext_dev->speed_queue_num = 1; in fill_speed_squeue()
232 "dev tpype %d, speed-up table length %d, buf size %u\n", in fill_speed_squeue()
233 ext_dev->type, in fill_speed_squeue()
237 prop = of_find_property(node, "focus-speed-down-table", &length_down); in fill_speed_squeue()
244 return -ENOMEM; in fill_speed_squeue()
245 ret = of_property_read_u32_array(node, "focus-speed-down-table", in fill_speed_squeue()
250 "fail to get speed table, used default speed!\n"); in fill_speed_squeue()
255 "dev tpype %d, speed-down table length %d, buf size %u\n", in fill_speed_squeue()
256 ext_dev->type, in fill_speed_squeue()
263 prop = of_find_property(node, "zoom-speed-up-table", &length_up); in fill_speed_squeue()
270 return -ENOMEM; in fill_speed_squeue()
271 ret = of_property_read_u32_array(node, "zoom-speed-up-table", in fill_speed_squeue()
276 "fail to get speed table, used default speed!\n"); in fill_speed_squeue()
277 ext_dev->speed_queue_num = 1; in fill_speed_squeue()
283 "dev tpype %d, speed-up table length %d, buf size %u\n", in fill_speed_squeue()
284 ext_dev->type, in fill_speed_squeue()
288 prop = of_find_property(node, "zoom-speed-down-table", &length_down); in fill_speed_squeue()
295 return -ENOMEM; in fill_speed_squeue()
296 ret = of_property_read_u32_array(node, "zoom-speed-down-table", in fill_speed_squeue()
301 "fail to get speed table, used default speed!\n"); in fill_speed_squeue()
306 "dev tpype %d, speed-down table length %d, buf size %u\n", in fill_speed_squeue()
307 ext_dev->type, in fill_speed_squeue()
314 return -EINVAL; in fill_speed_squeue()
316 if (speed_up_table == NULL || speed_up_table[0] > ext_dev->start_up_speed || in fill_speed_squeue()
317 speed_up_table[length_up - 1] > ext_dev->max_speed) { in fill_speed_squeue()
320 ext_dev->speed_queue_num = 1; in fill_speed_squeue()
322 ext_dev->length_up = length_up; in fill_speed_squeue()
324 ext_dev->speed_queue_num = length_up + length_down; in fill_speed_squeue()
326 ext_dev->speed_queue_num = length_up * 2 - 1; in fill_speed_squeue()
327 size = sizeof(*ext_dev->speed_que.speed_p) * ext_dev->speed_queue_num; in fill_speed_squeue()
328 ext_dev->speed_que.speed_p = devm_kzalloc(dev, size, GFP_KERNEL); in fill_speed_squeue()
329 if (!ext_dev->speed_que.speed_p) in fill_speed_squeue()
330 return -ENOMEM; in fill_speed_squeue()
331 for (i = 0; i < length_up - 1; i++) { in fill_speed_squeue()
333 step_cnt = ext_dev->first_speed_step; in fill_speed_squeue()
336 ext_dev->first_speed_step * in fill_speed_squeue()
339 ext_dev->speed_que.speed_p[i].count = step_cnt; in fill_speed_squeue()
340 ext_dev->speed_que.speed_p[i].phase_interval_ns = in fill_speed_squeue()
344 speed_down_table[0] > speed_up_table[length_up - 1]) { in fill_speed_squeue()
347 ext_dev->speed_que.speed_p[ext_dev->speed_queue_num - i - 1].count = in fill_speed_squeue()
349 ext_dev->speed_que.speed_p[ext_dev->speed_queue_num - i - 1].phase_interval_ns = in fill_speed_squeue()
354 "index %d, speed %d, count %d\n", in fill_speed_squeue()
355 i, speed_up_table[i], ext_dev->speed_que.speed_p[i].count); in fill_speed_squeue()
357 ext_dev->speed_up_table = speed_up_table; in fill_speed_squeue()
360 speed_down_table[0] <= speed_up_table[length_up - 1]) { in fill_speed_squeue()
363 ext_dev->first_speed_step * in fill_speed_squeue()
366 ext_dev->speed_que.speed_p[length_up + i].count = in fill_speed_squeue()
368 ext_dev->speed_que.speed_p[length_up + i].phase_interval_ns = in fill_speed_squeue()
372 ext_dev->speed_down_table = speed_down_table; in fill_speed_squeue()
373 ext_dev->length_down = length_down; in fill_speed_squeue()
375 ext_dev->speed_up_step_cnt = step_total; in fill_speed_squeue()
378 ext_dev->first_speed_step * in fill_speed_squeue()
379 speed_up_table[length_up - 1] / speed_up_table[0]; in fill_speed_squeue()
381 ext_dev->speed_que.speed_p[length_up - 1].count = step_cnt; in fill_speed_squeue()
382 ext_dev->speed_que.speed_p[length_up - 1].phase_interval_ns = in fill_speed_squeue()
383 div_u64(NSEC_PER_SEC, speed_up_table[length_up - 1]); in fill_speed_squeue()
386 ext_dev->ths_speeded_up = step_total; in fill_speed_squeue()
387 ext_dev->speed_que.count = ext_dev->speed_queue_num; in fill_speed_squeue()
394 struct device_node *node = motor->dev->of_node; in motor_dev_parse_dt()
398 motor->pwm_a1 = devm_pwm_get(motor->dev, "ain1"); in motor_dev_parse_dt()
399 motor->pwm_a2 = devm_pwm_get(motor->dev, "ain2"); in motor_dev_parse_dt()
400 motor->pwm_b1 = devm_pwm_get(motor->dev, "bin1"); in motor_dev_parse_dt()
401 motor->pwm_b2 = devm_pwm_get(motor->dev, "bin2"); in motor_dev_parse_dt()
403 if (IS_ERR(motor->pwm_a1)) { in motor_dev_parse_dt()
404 error = PTR_ERR(motor->pwm_a1); in motor_dev_parse_dt()
405 if (error != -EPROBE_DEFER) in motor_dev_parse_dt()
406 dev_err(motor->dev, "Failed to request PWM a1 device: %d\n", error); in motor_dev_parse_dt()
409 if (IS_ERR(motor->pwm_a2)) { in motor_dev_parse_dt()
410 error = PTR_ERR(motor->pwm_a2); in motor_dev_parse_dt()
411 if (error != -EPROBE_DEFER) in motor_dev_parse_dt()
412 dev_err(motor->dev, "Failed to request PWM a2 device: %d\n", error); in motor_dev_parse_dt()
415 if (IS_ERR(motor->pwm_b1)) { in motor_dev_parse_dt()
416 error = PTR_ERR(motor->pwm_b1); in motor_dev_parse_dt()
417 if (error != -EPROBE_DEFER) in motor_dev_parse_dt()
418 dev_err(motor->dev, "Failed to request PWM b1 device: %d\n", error); in motor_dev_parse_dt()
421 if (IS_ERR(motor->pwm_b2)) { in motor_dev_parse_dt()
422 error = PTR_ERR(motor->pwm_b2); in motor_dev_parse_dt()
423 if (error != -EPROBE_DEFER) in motor_dev_parse_dt()
424 dev_err(motor->dev, "Failed to request PWM b2 device: %d\n", error); in motor_dev_parse_dt()
429 motor->iris.en_gpio = devm_gpiod_get(motor->dev, in motor_dev_parse_dt()
431 if (IS_ERR(motor->iris.en_gpio)) in motor_dev_parse_dt()
432 dev_err(motor->dev, "Failed to get iris_en-gpios\n"); in motor_dev_parse_dt()
435 motor->focus.en_gpio = devm_gpiod_get(motor->dev, in motor_dev_parse_dt()
437 if (IS_ERR(motor->focus.en_gpio)) in motor_dev_parse_dt()
438 dev_err(motor->dev, "Failed to get focus_en-gpios\n"); in motor_dev_parse_dt()
441 motor->zoom.en_gpio = devm_gpiod_get(motor->dev, in motor_dev_parse_dt()
443 if (IS_ERR(motor->zoom.en_gpio)) in motor_dev_parse_dt()
444 dev_err(motor->dev, "Failed to get zoom_en-gpios\n"); in motor_dev_parse_dt()
447 "iris-step-max", in motor_dev_parse_dt()
448 &motor->iris.step_max); in motor_dev_parse_dt()
450 motor->iris.step_max = IRIS_MAX_STEP_DEF; in motor_dev_parse_dt()
451 dev_err(motor->dev, in motor_dev_parse_dt()
456 "focus-step-max", in motor_dev_parse_dt()
457 &motor->focus.step_max); in motor_dev_parse_dt()
459 motor->focus.step_max = FOCUS_MAX_STEP_DEF; in motor_dev_parse_dt()
460 dev_err(motor->dev, in motor_dev_parse_dt()
465 "zoom-step-max", in motor_dev_parse_dt()
466 &motor->zoom.step_max); in motor_dev_parse_dt()
468 motor->zoom.step_max = ZOOM_MAX_STEP_DEF; in motor_dev_parse_dt()
469 dev_err(motor->dev, in motor_dev_parse_dt()
474 "iris-start-up-speed", in motor_dev_parse_dt()
475 &motor->iris.start_up_speed); in motor_dev_parse_dt()
477 motor->iris.start_up_speed = MAX_START_UP_HZ; in motor_dev_parse_dt()
478 dev_err(motor->dev, in motor_dev_parse_dt()
479 "failed get motor start up speed,use dafult value\n"); in motor_dev_parse_dt()
482 "iris-max-speed", in motor_dev_parse_dt()
483 &motor->iris.max_speed); in motor_dev_parse_dt()
485 motor->iris.max_speed = MOTOR_MAX_HZ; in motor_dev_parse_dt()
486 dev_err(motor->dev, in motor_dev_parse_dt()
487 "failed get motor max speed,use dafult value\n"); in motor_dev_parse_dt()
491 "focus-start-up-speed", in motor_dev_parse_dt()
492 &motor->focus.start_up_speed); in motor_dev_parse_dt()
494 motor->focus.start_up_speed = MAX_START_UP_HZ; in motor_dev_parse_dt()
495 dev_err(motor->dev, in motor_dev_parse_dt()
496 "failed get motor start up speed,use dafult value\n"); in motor_dev_parse_dt()
499 "focus-max-speed", in motor_dev_parse_dt()
500 &motor->focus.max_speed); in motor_dev_parse_dt()
502 motor->focus.max_speed = MOTOR_MAX_HZ; in motor_dev_parse_dt()
503 dev_err(motor->dev, in motor_dev_parse_dt()
504 "failed get motor max speed,use dafult value\n"); in motor_dev_parse_dt()
508 "zoom-start-up-speed", in motor_dev_parse_dt()
509 &motor->zoom.start_up_speed); in motor_dev_parse_dt()
511 motor->zoom.start_up_speed = MAX_START_UP_HZ; in motor_dev_parse_dt()
512 dev_err(motor->dev, in motor_dev_parse_dt()
513 "failed get motor start up speed,use dafult value\n"); in motor_dev_parse_dt()
516 "zoom-max-speed", in motor_dev_parse_dt()
517 &motor->zoom.max_speed); in motor_dev_parse_dt()
519 motor->zoom.max_speed = MOTOR_MAX_HZ; in motor_dev_parse_dt()
520 dev_err(motor->dev, in motor_dev_parse_dt()
521 "failed get motor max speed,use dafult value\n"); in motor_dev_parse_dt()
525 "focus-first-speed-step", in motor_dev_parse_dt()
526 &motor->focus.first_speed_step); in motor_dev_parse_dt()
528 motor->focus.first_speed_step = STEP_PER_SPEED_DEF; in motor_dev_parse_dt()
529 dev_err(motor->dev, in motor_dev_parse_dt()
530 "failed get motor step of first speed,use dafult value\n"); in motor_dev_parse_dt()
533 "zoom-first-speed-step", in motor_dev_parse_dt()
534 &motor->zoom.first_speed_step); in motor_dev_parse_dt()
536 motor->zoom.first_speed_step = STEP_PER_SPEED_DEF; in motor_dev_parse_dt()
537 dev_err(motor->dev, in motor_dev_parse_dt()
538 "failed get motor step of first speed,use dafult value\n"); in motor_dev_parse_dt()
541 motor->iris.type = TYPE_IRIS; in motor_dev_parse_dt()
542 ret = fill_speed_squeue(motor->dev, &motor->iris); in motor_dev_parse_dt()
543 motor->focus.type = TYPE_FOCUS; in motor_dev_parse_dt()
544 ret |= fill_speed_squeue(motor->dev, &motor->focus); in motor_dev_parse_dt()
545 motor->zoom.type = TYPE_ZOOM; in motor_dev_parse_dt()
546 ret |= fill_speed_squeue(motor->dev, &motor->zoom); in motor_dev_parse_dt()
549 &motor->module_index); in motor_dev_parse_dt()
551 &motor->module_facing); in motor_dev_parse_dt()
553 dev_err(motor->dev, in motor_dev_parse_dt()
555 return -EINVAL; in motor_dev_parse_dt()
568 pwm_state = &motor->pwm_state; in motor_timer_func()
569 if (motor->move_cnt < 1 || motor->move_status == MOTOR_STATUS_STOPPED) { in motor_timer_func()
570 pwm_state->enabled = false; in motor_timer_func()
571 pwm_apply_state(motor->pwm_b1, pwm_state); in motor_timer_func()
572 pwm_apply_state(motor->pwm_b2, pwm_state); in motor_timer_func()
573 pwm_apply_state(motor->pwm_a1, pwm_state); in motor_timer_func()
574 pwm_apply_state(motor->pwm_a2, pwm_state); in motor_timer_func()
575 if (!IS_ERR(motor->cur_ext_dev->en_gpio)) in motor_timer_func()
576 gpiod_set_value(motor->cur_ext_dev->en_gpio, 0); in motor_timer_func()
577 motor->move_status = MOTOR_STATUS_STOPPED; in motor_timer_func()
578 motor->resched = false; in motor_timer_func()
579 complete(&motor->complete); in motor_timer_func()
580 dev_dbg(motor->dev, "motor stop\n"); in motor_timer_func()
584 switch (motor->move_status) { in motor_timer_func()
586 if (motor->resched == true) { in motor_timer_func()
587 pwm_state->enabled = false; in motor_timer_func()
588 pwm_apply_state(motor->pwm_b1, pwm_state); in motor_timer_func()
589 pwm_apply_state(motor->pwm_b2, pwm_state); in motor_timer_func()
590 pwm_apply_state(motor->pwm_a1, pwm_state); in motor_timer_func()
591 pwm_apply_state(motor->pwm_a2, pwm_state); in motor_timer_func()
593 idx = motor->run_queue->count - motor->move_cnt; in motor_timer_func()
594 pwm_state->polarity = PWM_POLARITY_INVERSED; in motor_timer_func()
595 pwm_state->enabled = true; in motor_timer_func()
596 pwm_state->period = in motor_timer_func()
597 motor->run_queue->speed_p[idx].phase_interval_ns * 4; in motor_timer_func()
598 pwm_state->duty_cycle = in motor_timer_func()
599 motor->run_queue->speed_p[idx].phase_interval_ns * 2; in motor_timer_func()
600 pwm_apply_state(motor->pwm_b1, pwm_state); in motor_timer_func()
601 pwm_state->enabled = true; in motor_timer_func()
602 pwm_state->polarity = PWM_POLARITY_NORMAL; in motor_timer_func()
603 pwm_apply_state(motor->pwm_b2, pwm_state); in motor_timer_func()
604 pwm_state->polarity = PWM_POLARITY_NORMAL; in motor_timer_func()
605 pwm_state->enabled = true; in motor_timer_func()
606 pwm_apply_state(motor->pwm_a1, pwm_state); in motor_timer_func()
607 pwm_state->polarity = PWM_POLARITY_INVERSED; in motor_timer_func()
608 pwm_state->enabled = true; in motor_timer_func()
609 pwm_apply_state(motor->pwm_a2, pwm_state); in motor_timer_func()
612 if (motor->resched == true) { in motor_timer_func()
613 pwm_state->enabled = false; in motor_timer_func()
614 pwm_apply_state(motor->pwm_b1, pwm_state); in motor_timer_func()
615 pwm_apply_state(motor->pwm_b2, pwm_state); in motor_timer_func()
616 pwm_apply_state(motor->pwm_a1, pwm_state); in motor_timer_func()
617 pwm_apply_state(motor->pwm_a2, pwm_state); in motor_timer_func()
619 idx = motor->run_queue->count - motor->move_cnt; in motor_timer_func()
620 pwm_state->polarity = PWM_POLARITY_INVERSED; in motor_timer_func()
621 pwm_state->enabled = true; in motor_timer_func()
622 pwm_state->period = in motor_timer_func()
623 motor->run_queue->speed_p[idx].phase_interval_ns * 4; in motor_timer_func()
624 pwm_state->duty_cycle = in motor_timer_func()
625 motor->run_queue->speed_p[idx].phase_interval_ns * 2; in motor_timer_func()
626 pwm_apply_state(motor->pwm_b1, pwm_state); in motor_timer_func()
627 pwm_state->polarity = PWM_POLARITY_NORMAL; in motor_timer_func()
628 pwm_state->enabled = true; in motor_timer_func()
629 pwm_apply_state(motor->pwm_b2, pwm_state); in motor_timer_func()
630 pwm_state->polarity = PWM_POLARITY_INVERSED; in motor_timer_func()
631 pwm_state->enabled = true; in motor_timer_func()
632 pwm_apply_state(motor->pwm_a1, pwm_state); in motor_timer_func()
633 pwm_state->polarity = PWM_POLARITY_NORMAL; in motor_timer_func()
634 pwm_state->enabled = true; in motor_timer_func()
635 pwm_apply_state(motor->pwm_a2, pwm_state); in motor_timer_func()
640 if (motor->resched == false) in motor_timer_func()
641 motor->resched = true; in motor_timer_func()
642 motor->move_cnt--; in motor_timer_func()
644 if (motor->resched) { in motor_timer_func()
645 time_cnt = ((u64)motor->run_queue->speed_p[idx].phase_interval_ns * in motor_timer_func()
646 motor->run_queue->speed_p[idx].count); in motor_timer_func()
648 ns_to_ktime(time_cnt - 80000)); in motor_timer_func()
657 struct motor_dev *motor = container_of(ctrl->handler, in motor_s_ctrl()
660 switch (ctrl->id) { in motor_s_ctrl()
662 if (ctrl->val > motor->iris.cur_pos) in motor_s_ctrl()
664 &motor->iris, in motor_s_ctrl()
666 abs(ctrl->val - motor->iris.cur_pos)); in motor_s_ctrl()
669 &motor->iris, in motor_s_ctrl()
671 abs(ctrl->val - motor->iris.cur_pos)); in motor_s_ctrl()
672 motor->iris.cur_pos = ctrl->val; in motor_s_ctrl()
673 dev_dbg(motor->dev, "set iris pos %d\n", ctrl->val); in motor_s_ctrl()
676 if (ctrl->val > motor->focus.cur_pos) in motor_s_ctrl()
678 &motor->focus, in motor_s_ctrl()
680 abs(ctrl->val - motor->focus.cur_pos)); in motor_s_ctrl()
683 &motor->focus, in motor_s_ctrl()
685 abs(ctrl->val - motor->focus.cur_pos)); in motor_s_ctrl()
686 motor->focus.cur_pos = ctrl->val; in motor_s_ctrl()
687 dev_dbg(motor->dev, "set focus pos %d\n", ctrl->val); in motor_s_ctrl()
690 if (ctrl->val > motor->zoom.cur_pos) in motor_s_ctrl()
692 &motor->zoom, in motor_s_ctrl()
694 abs(ctrl->val - motor->zoom.cur_pos)); in motor_s_ctrl()
697 &motor->zoom, in motor_s_ctrl()
699 abs(ctrl->val - motor->zoom.cur_pos)); in motor_s_ctrl()
700 motor->zoom.cur_pos = ctrl->val; in motor_s_ctrl()
701 dev_dbg(motor->dev, "set zoom pos %d\n", ctrl->val); in motor_s_ctrl()
704 dev_err(motor->dev, "not support cmd %d\n", ctrl->id); in motor_s_ctrl()
714 ret = set_motor_running_status(motor, &motor->iris, in motor_init_iris_status()
716 motor->iris.cur_pos = IRIS_MAX_LOG; in motor_init_iris_status()
717 __v4l2_ctrl_modify_range(motor->iris_ctrl, in motor_init_iris_status()
721 motor->iris.cur_pos); in motor_init_iris_status()
729 ret = set_motor_running_status(motor, &motor->focus, in motor_init_focus_status()
731 motor->focus.cur_pos = 0; in motor_init_focus_status()
732 __v4l2_ctrl_modify_range(motor->focus_ctrl, in motor_init_focus_status()
736 motor->focus.cur_pos); in motor_init_focus_status()
744 ret = set_motor_running_status(motor, &motor->zoom, in motor_init_zoom_status()
746 motor->zoom.cur_pos = 0; in motor_init_zoom_status()
747 __v4l2_ctrl_modify_range(motor->zoom_ctrl, in motor_init_zoom_status()
751 motor->zoom.cur_pos); in motor_init_zoom_status()
763 memcpy(mv_tim, &motor->focus.mv_tim, sizeof(*mv_tim)); in motor_ioctl()
765 dev_dbg(motor->dev, "get_focus_move_tim 0x%lx, 0x%lx, 0x%lx, 0x%lx\n", in motor_ioctl()
766 mv_tim->vcm_start_t.tv_sec, in motor_ioctl()
767 mv_tim->vcm_start_t.tv_usec, in motor_ioctl()
768 mv_tim->vcm_end_t.tv_sec, in motor_ioctl()
769 mv_tim->vcm_end_t.tv_usec); in motor_ioctl()
773 memcpy(mv_tim, &motor->iris.mv_tim, sizeof(*mv_tim)); in motor_ioctl()
775 dev_dbg(motor->dev, "get_iris_move_tim 0x%lx, 0x%lx, 0x%lx, 0x%lx\n", in motor_ioctl()
776 mv_tim->vcm_start_t.tv_sec, in motor_ioctl()
777 mv_tim->vcm_start_t.tv_usec, in motor_ioctl()
778 mv_tim->vcm_end_t.tv_sec, in motor_ioctl()
779 mv_tim->vcm_end_t.tv_usec); in motor_ioctl()
783 memcpy(mv_tim, &motor->zoom.mv_tim, sizeof(*mv_tim)); in motor_ioctl()
785 dev_dbg(motor->dev, "get_zoom_move_tim 0x%lx, 0x%lx, 0x%lx, 0x%lx\n", in motor_ioctl()
786 mv_tim->vcm_start_t.tv_sec, in motor_ioctl()
787 mv_tim->vcm_start_t.tv_usec, in motor_ioctl()
788 mv_tim->vcm_end_t.tv_sec, in motor_ioctl()
789 mv_tim->vcm_end_t.tv_usec); in motor_ioctl()
823 handler = &motor->ctrl_handler; in motor_initialize_controls()
827 handler->lock = &motor->mutex; in motor_initialize_controls()
828 if (!IS_ERR(motor->iris.en_gpio)) { in motor_initialize_controls()
829 motor->iris_ctrl = v4l2_ctrl_new_std(handler, &motor_ctrl_ops, in motor_initialize_controls()
834 if (!IS_ERR(motor->focus.en_gpio)) { in motor_initialize_controls()
835 motor->focus_ctrl = v4l2_ctrl_new_std(handler, &motor_ctrl_ops, in motor_initialize_controls()
839 if (!IS_ERR(motor->zoom.en_gpio)) { in motor_initialize_controls()
840 motor->zoom_ctrl = v4l2_ctrl_new_std(handler, &motor_ctrl_ops, in motor_initialize_controls()
844 if (handler->error) { in motor_initialize_controls()
845 ret = handler->error; in motor_initialize_controls()
846 dev_err(motor->dev, in motor_initialize_controls()
851 motor->sd.ctrl_handler = handler; in motor_initialize_controls()
931 for (i--; i >= 0 ; i--) in add_sysfs_interfaces()
934 return -ENODEV; in add_sysfs_interfaces()
941 motor->iris.step_per_pos = motor->iris.step_max / IRIS_MAX_LOG; in dev_param_init()
942 motor->iris.mv_tim.vcm_start_t = ns_to_timeval(ktime_get_ns()); in dev_param_init()
943 motor->iris.mv_tim.vcm_end_t = ns_to_timeval(ktime_get_ns()); in dev_param_init()
945 motor->focus.step_per_pos = motor->focus.step_max / FOCUS_MAX_LOG; in dev_param_init()
946 motor->focus.mv_tim.vcm_start_t = ns_to_timeval(ktime_get_ns()); in dev_param_init()
947 motor->focus.mv_tim.vcm_end_t = ns_to_timeval(ktime_get_ns()); in dev_param_init()
949 motor->zoom.step_per_pos = motor->zoom.step_max / ZOOM_MAX_LOG; in dev_param_init()
950 motor->zoom.mv_tim.vcm_start_t = ns_to_timeval(ktime_get_ns()); in dev_param_init()
951 motor->zoom.mv_tim.vcm_end_t = ns_to_timeval(ktime_get_ns()); in dev_param_init()
953 motor->move_status = MOTOR_STATUS_STOPPED; in dev_param_init()
954 motor->resched = false; in dev_param_init()
964 dev_info(&pdev->dev, "driver version: %02x.%02x.%02x", in motor_dev_probe()
968 motor = devm_kzalloc(&pdev->dev, sizeof(*motor), GFP_KERNEL); in motor_dev_probe()
970 return -ENOMEM; in motor_dev_probe()
971 motor->dev = &pdev->dev; in motor_dev_probe()
972 dev_set_name(motor->dev, "motor"); in motor_dev_probe()
973 dev_set_drvdata(motor->dev, motor); in motor_dev_probe()
975 dev_err(motor->dev, "parse dt error\n"); in motor_dev_probe()
976 return -EINVAL; in motor_dev_probe()
979 mutex_init(&motor->mutex); in motor_dev_probe()
980 hrtimer_init(&motor->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); in motor_dev_probe()
981 motor->timer.function = motor_timer_func; in motor_dev_probe()
982 init_completion(&motor->complete); in motor_dev_probe()
983 v4l2_subdev_init(&motor->sd, &motor_subdev_ops); in motor_dev_probe()
984 motor->sd.owner = pdev->dev.driver->owner; in motor_dev_probe()
985 motor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in motor_dev_probe()
986 motor->sd.dev = &pdev->dev; in motor_dev_probe()
987 v4l2_set_subdevdata(&motor->sd, pdev); in motor_dev_probe()
988 platform_set_drvdata(pdev, &motor->sd); in motor_dev_probe()
992 ret = media_entity_pads_init(&motor->sd.entity, 0, NULL); in motor_dev_probe()
995 sd = &motor->sd; in motor_dev_probe()
996 sd->entity.function = MEDIA_ENT_F_LENS; in motor_dev_probe()
997 sd->entity.flags = 0; in motor_dev_probe()
1000 if (strcmp(motor->module_facing, "back") == 0) in motor_dev_probe()
1004 snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s", in motor_dev_probe()
1005 motor->module_index, facing, in motor_dev_probe()
1009 dev_err(&pdev->dev, "v4l2 async register subdev failed\n"); in motor_dev_probe()
1011 add_sysfs_interfaces(&pdev->dev); in motor_dev_probe()
1013 dev_info(motor->dev, "gpio motor driver probe success\n"); in motor_dev_probe()
1016 v4l2_ctrl_handler_free(&motor->ctrl_handler); in motor_dev_probe()
1017 v4l2_device_unregister_subdev(&motor->sd); in motor_dev_probe()
1018 media_entity_cleanup(&motor->sd.entity); in motor_dev_probe()
1030 return -ENODEV; in motor_dev_remove()
1031 hrtimer_cancel(&motor->timer); in motor_dev_remove()
1034 v4l2_ctrl_handler_free(&motor->ctrl_handler); in motor_dev_remove()
1035 media_entity_cleanup(&motor->sd.entity); in motor_dev_remove()