Message ID | 20241106123438.337117-2-stanislaw.gruszka@linux.intel.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [v2,1/3] usb: misc: ljca: move usb_autopm_put_interface() after wait for response | expand |
On Wed, Nov 06, 2024 at 01:34:37PM +0100, Stanislaw Gruszka wrote: > On some Lenovo platforms, the patch workarounds 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: acd6199f195d ("usb: Add support for Intel LJCA device") > Cc: stable@vger.kernel.org > Reviewed-by: Hans de Goede <hdegoede@redhat.com> > Tested-by: Hans de Goede <hdegoede@redhat.com> # ThinkPad X1 Yoga Gen 8, ov2740 > Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com> Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
diff --git a/drivers/usb/misc/usb-ljca.c b/drivers/usb/misc/usb-ljca.c index 8056c65e4548..d9c21f783055 100644 --- a/drivers/usb/misc/usb-ljca.c +++ b/drivers/usb/misc/usb-ljca.c @@ -811,6 +811,14 @@ static int ljca_probe(struct usb_interface *interface, if (ret) goto err_free; + /* + * This works around problems with ov2740 initialization on some + * Lenovo platforms. The autosuspend delay, has to be smaller than + * the delay after setting the reset_gpio line in ov2740_resume(). + * Otherwise the sensor randomly fails to initialize. + */ + pm_runtime_set_autosuspend_delay(&usb_dev->dev, 10); + usb_enable_autosuspend(usb_dev); return 0;