Skip to content

Commit 2481af7

Browse files
sgruszkagregkh
authored andcommitted
usb: misc: ljca: set small runtime autosuspend delay
On some Lenovo platforms, the patch works around problems with ov2740 sensor initialization, which manifest themself like below: [ 4.540476] ov2740 i2c-INT3474:01: error -EIO: failed to find sensor [ 4.542066] ov2740 i2c-INT3474:01: probe with driver ov2740 failed with error -5 or [ 7.742633] ov2740 i2c-INT3474:01: chip id mismatch: 2740 != 0 [ 7.742638] ov2740 i2c-INT3474:01: error -ENXIO: failed to find sensor and also by random failures of video stream start. Issue can be reproduced by this script: n=0 k=0 while [ $n -lt 50 ] ; do sudo modprobe -r ov2740 sleep `expr $RANDOM % 5` sudo modprobe ov2740 if media-ctl -p | grep -q ov2740 ; then let k++ fi let n++ done echo Success rate $k/$n Without the patch, success rate is approximately 15 or 50 tries. With the patch it does not fail. This problem is some hardware or firmware malfunction, that can not be easy debug and fix. While setting small autosuspend delay is not perfect workaround as user can configure it to any value, it will prevent the failures by default. Additionally setting small autosuspend delay should have positive effect on power consumption as for most ljca workloads device is used for just a few milliseconds flowed by long periods of at least 100ms of inactivity (usually more). Fixes: acd6199 ("usb: Add support for Intel LJCA device") Cc: [email protected] Reviewed-by: Hans de Goede <[email protected]> Tested-by: Hans de Goede <[email protected]> # ThinkPad X1 Yoga Gen 8, ov2740 Acked-by: Sakari Ailus <[email protected]> Signed-off-by: Stanislaw Gruszka <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 5c5d8eb commit 2481af7

File tree

1 file changed

+8
-0
lines changed

1 file changed

+8
-0
lines changed

drivers/usb/misc/usb-ljca.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -811,6 +811,14 @@ static int ljca_probe(struct usb_interface *interface,
811811
if (ret)
812812
goto err_free;
813813

814+
/*
815+
* This works around problems with ov2740 initialization on some
816+
* Lenovo platforms. The autosuspend delay, has to be smaller than
817+
* the delay after setting the reset_gpio line in ov2740_resume().
818+
* Otherwise the sensor randomly fails to initialize.
819+
*/
820+
pm_runtime_set_autosuspend_delay(&usb_dev->dev, 10);
821+
814822
usb_enable_autosuspend(usb_dev);
815823

816824
return 0;

0 commit comments

Comments
 (0)