Skip to content

Commit ff75332

Browse files
Jacopo Mondimchehab
authored andcommitted
media: i2c: rdacm21: Fix OV10640 powerup
The OV10640 image sensor powerdown signal is controlled by the first line of the OV490 GPIO pad Rust-for-Linux#1, but the pad #0 identifier OV490_GPIO_OUTPUT_VALUE0 was erroneously used. As a result the image sensor powerdown signal was never asserted but was left floating and kept high by an internal pull-up resistor, causing sporadic failures during the image sensor startup phase. Fix this by using the correct GPIO pad identifier and wait the mandatory 1.5 millisecond delay after the powerup lane is asserted. The reset delay is not characterized in the chip manual if not as "255 XVCLK + initialization". Wait for at least 3 milliseconds to guarantee the SCCB bus is available. While at it also fix the reset sequence, as the reset line was released before the powerdown one, and the line was not cycled. This commit fixes a sporadic start-up error triggered by a failure to read the OV10640 chip ID: rdacm21 8-0054: OV10640 ID mismatch: (0x01) Fixes: a59f853 ("media: i2c: Add driver for RDACM21 camera module") Signed-off-by: Jacopo Mondi <[email protected]> Reviewed-by: Kieran Bingham <[email protected]> Reviewed-by: Laurent Pinchart <[email protected]> Signed-off-by: Hans Verkuil <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]>
1 parent 7028772 commit ff75332

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

drivers/media/i2c/rdacm21.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,13 +333,19 @@ static int ov10640_initialize(struct rdacm21_device *dev)
333333
{
334334
u8 val;
335335

336-
/* Power-up OV10640 by setting RESETB and PWDNB pins high. */
336+
/* Enable GPIO0#0 (reset) and GPIO1#0 (pwdn) as output lines. */
337337
ov490_write_reg(dev, OV490_GPIO_SEL0, OV490_GPIO0);
338338
ov490_write_reg(dev, OV490_GPIO_SEL1, OV490_SPWDN0);
339339
ov490_write_reg(dev, OV490_GPIO_DIRECTION0, OV490_GPIO0);
340340
ov490_write_reg(dev, OV490_GPIO_DIRECTION1, OV490_SPWDN0);
341+
342+
/* Power up OV10640 and then reset it. */
343+
ov490_write_reg(dev, OV490_GPIO_OUTPUT_VALUE1, OV490_SPWDN0);
344+
usleep_range(1500, 3000);
345+
346+
ov490_write_reg(dev, OV490_GPIO_OUTPUT_VALUE0, 0x00);
347+
usleep_range(1500, 3000);
341348
ov490_write_reg(dev, OV490_GPIO_OUTPUT_VALUE0, OV490_GPIO0);
342-
ov490_write_reg(dev, OV490_GPIO_OUTPUT_VALUE0, OV490_SPWDN0);
343349
usleep_range(3000, 5000);
344350

345351
/* Read OV10640 ID to test communications. */

0 commit comments

Comments
 (0)