diff --git a/drivers/media/i2c/os04a10.c b/drivers/media/i2c/os04a10.c index c2d7c09275b8..32e5e46a12d9 100644 --- a/drivers/media/i2c/os04a10.c +++ b/drivers/media/i2c/os04a10.c @@ -1731,7 +1731,7 @@ static int __os04a10_power_on(struct os04a10 *os04a10) return ret; } if (!IS_ERR(os04a10->reset_gpio)) - gpiod_set_value_cansleep(os04a10->reset_gpio, 0); + gpiod_set_value_cansleep(os04a10->reset_gpio, 1); ret = regulator_bulk_enable(OS04A10_NUM_SUPPLIES, os04a10->supplies); if (ret < 0) { @@ -1740,12 +1740,20 @@ static int __os04a10_power_on(struct os04a10 *os04a10) } if (!IS_ERR(os04a10->reset_gpio)) - gpiod_set_value_cansleep(os04a10->reset_gpio, 1); + gpiod_set_value_cansleep(os04a10->reset_gpio, 0); usleep_range(500, 1000); if (!IS_ERR(os04a10->pwdn_gpio)) gpiod_set_value_cansleep(os04a10->pwdn_gpio, 1); - usleep_range(12000, 16000); + /* + * There is no need to wait for the delay of RC circuit + * if the reset signal is directly controlled by GPIO. + */ + if (!IS_ERR(os04a10->reset_gpio)) + usleep_range(6000, 8000); + else + usleep_range(12000, 16000); + /* 8192 cycles prior to first SCCB transaction */ delay_us = os04a10_cal_delay(8192); usleep_range(delay_us, delay_us * 2);