From 90ab8d66265a2a411ae49785d87ac0430254845f Mon Sep 17 00:00:00 2001 From: Hu Kejun Date: Mon, 12 Jul 2021 11:49:06 +0800 Subject: [PATCH] media: spi: ms41908: support focus/zoom reinit run simultaneously Signed-off-by: Hu Kejun Change-Id: Ic18db2b2b5ad7f9c12ad80276c4605695711a210 --- drivers/media/spi/ms41908.c | 61 ++++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/drivers/media/spi/ms41908.c b/drivers/media/spi/ms41908.c index 1b135b93ec70..c363ba04523f 100644 --- a/drivers/media/spi/ms41908.c +++ b/drivers/media/spi/ms41908.c @@ -172,6 +172,7 @@ struct motor_dev { struct dciris_dev *dciris; int id; int wait_cnt; + int pi_gpio_usecnt; }; struct motor_work_s { @@ -1581,11 +1582,16 @@ static int motor_reinit_focus(struct motor_dev *motor) int ret = 0; if (!IS_ERR(motor->focus->pic_gpio)) { - if (!IS_ERR(motor->focus->pia_gpio)) - gpiod_set_value(motor->focus->pia_gpio, 1); - if (!IS_ERR(motor->focus->pie_gpio)) - gpiod_set_value(motor->focus->pie_gpio, 0); - msleep(250); + mutex_lock(&motor->mutex); + if (motor->pi_gpio_usecnt == 0) { + if (!IS_ERR(motor->focus->pia_gpio)) + gpiod_set_value(motor->focus->pia_gpio, 1); + if (!IS_ERR(motor->focus->pie_gpio)) + gpiod_set_value(motor->focus->pie_gpio, 0); + msleep(250); + } + motor->pi_gpio_usecnt++; + mutex_unlock(&motor->mutex); #ifdef PI_TEST motor->focus->last_pos = motor->focus->step_max; ret = set_motor_running_status(motor, @@ -1610,10 +1616,16 @@ static int motor_reinit_focus(struct motor_dev *motor) motor->focus->min_pos = min; motor->focus->max_pos = max; #endif - if (!IS_ERR(motor->focus->pia_gpio)) - gpiod_set_value(motor->focus->pia_gpio, 0); - if (!IS_ERR(motor->focus->pie_gpio)) - gpiod_set_value(motor->focus->pie_gpio, 0); + + mutex_lock(&motor->mutex); + if (motor->pi_gpio_usecnt == 1) { + if (!IS_ERR(motor->focus->pia_gpio)) + gpiod_set_value(motor->focus->pia_gpio, 0); + if (!IS_ERR(motor->focus->pie_gpio)) + gpiod_set_value(motor->focus->pie_gpio, 0); + } + motor->pi_gpio_usecnt--; + mutex_unlock(&motor->mutex); } else { motor->focus->last_pos = motor->focus->step_max; ret = set_motor_running_status(motor, @@ -1646,11 +1658,17 @@ static int motor_reinit_zoom(struct motor_dev *motor) int ret = 0; if (!IS_ERR(motor->zoom->pic_gpio)) { - if (!IS_ERR(motor->focus->pia_gpio)) - gpiod_set_value(motor->focus->pia_gpio, 1); - if (!IS_ERR(motor->focus->pie_gpio)) - gpiod_set_value(motor->focus->pie_gpio, 0); - msleep(250); + mutex_lock(&motor->mutex); + if (motor->pi_gpio_usecnt == 0) { + if (!IS_ERR(motor->focus->pia_gpio)) + gpiod_set_value(motor->focus->pia_gpio, 1); + if (!IS_ERR(motor->focus->pie_gpio)) + gpiod_set_value(motor->focus->pie_gpio, 0); + msleep(250); + } + motor->pi_gpio_usecnt++; + mutex_unlock(&motor->mutex); + #ifdef PI_TEST motor->zoom->last_pos = motor->zoom->step_max; ret = set_motor_running_status(motor, @@ -1675,10 +1693,16 @@ static int motor_reinit_zoom(struct motor_dev *motor) motor->zoom->min_pos = min; motor->zoom->max_pos = max; #endif - if (!IS_ERR(motor->focus->pia_gpio)) - gpiod_set_value(motor->focus->pia_gpio, 0); - if (!IS_ERR(motor->focus->pie_gpio)) - gpiod_set_value(motor->focus->pie_gpio, 0); + + mutex_lock(&motor->mutex); + if (motor->pi_gpio_usecnt == 1) { + if (!IS_ERR(motor->focus->pia_gpio)) + gpiod_set_value(motor->focus->pia_gpio, 0); + if (!IS_ERR(motor->focus->pie_gpio)) + gpiod_set_value(motor->focus->pie_gpio, 0); + } + motor->pi_gpio_usecnt--; + mutex_unlock(&motor->mutex); } else { motor->zoom->last_pos = motor->zoom->step_max; ret = set_motor_running_status(motor, @@ -2562,6 +2586,7 @@ static void dev_param_init(struct motor_dev *motor) motor->is_should_wait = false; motor->is_timer_restart = false; motor->wait_cnt = 0; + motor->pi_gpio_usecnt = 0; } static void dev_reg_init(struct motor_dev *motor)