From: Hans de Goede hdegoede@redhat.com
[ Upstream commit 99f2211a9d89fe34b3fa847fd7a4475171406cd0 ]
probe() requests the reset GPIO to be set to high when getting it. Immeditately after this hi556_resume() is called and sets the GPIO low.
If the GPIO was low before requesting it this will result in the GPIO only very briefly spiking high and the sensor not being properly reset. The same problem also happens on back to back runtime suspend + resume.
Fix this by adding a sleep of 2 ms in hi556_resume() before setting the GPIO low (if there is a reset GPIO).
The final sleep is kept unconditional, because if there is e.g. no reset GPIO but a controllable clock then the sensor also needs some time after enabling the clock.
Signed-off-by: Hans de Goede hdegoede@redhat.com Signed-off-by: Sakari Ailus sakari.ailus@linux.intel.com Signed-off-by: Hans Verkuil hverkuil@xs4all.nl Signed-off-by: Sasha Levin sashal@kernel.org ---
LLM Generated explanations, may be completely bogus:
## Analysis
**Backport Status: YES**
This commit should be backported to stable kernel trees for the following reasons:
### 1. **Fixes a Real Hardware Initialization Bug** The commit addresses a timing race condition in the hi556 camera sensor driver where: - In `hi556_probe()`, the reset GPIO is requested with `GPIOD_OUT_HIGH` (line 1352-1353) - Immediately after, `hi556_resume()` is called (line 1376) which sets the GPIO low - This results in the GPIO only briefly spiking high, preventing proper sensor reset
### 2. **Clear User-Visible Impact** The bug causes: - Sensor initialization failures when the GPIO was previously low - Runtime suspend/resume failures on back-to-back operations - Camera sensor not working properly due to inadequate reset timing
### 3. **Small and Contained Fix** The change is minimal and surgical: - Adds only 3 lines of code (a conditional check and a 2ms delay) - Changes are confined to the `hi556_resume()` function - No architectural changes or new features introduced
### 4. **Low Risk of Regression** - The fix only adds a delay when a reset GPIO is present - The unconditional 5ms delay at the end is preserved - The change follows standard practice for hardware reset timing requirements - Only affects systems with the hi556 sensor that have a reset GPIO configured
### 5. **Affects Recently Added Functionality** The reset GPIO support was added relatively recently (commit 860f262dd0dd from April 2024), and this fix corrects a bug in that implementation. Systems using this feature would benefit from the fix.
### 6. **Follows Stable Kernel Rules** The commit: - Fixes a real bug that affects users - Is small (under 100 lines) - Has been tested (signed off by multiple maintainers) - Doesn't add new features - Has minimal risk of causing new issues
The timing issue this fixes is a classic hardware initialization race condition that would cause sporadic camera failures, making it an important fix for systems using the hi556 sensor with GPIO reset control.
drivers/media/i2c/hi556.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/media/i2c/hi556.c b/drivers/media/i2c/hi556.c index aed258211b8a..d3cc65b67855 100644 --- a/drivers/media/i2c/hi556.c +++ b/drivers/media/i2c/hi556.c @@ -1321,7 +1321,12 @@ static int hi556_resume(struct device *dev) return ret; }
- gpiod_set_value_cansleep(hi556->reset_gpio, 0); + if (hi556->reset_gpio) { + /* Assert reset for at least 2ms on back to back off-on */ + usleep_range(2000, 2200); + gpiod_set_value_cansleep(hi556->reset_gpio, 0); + } + usleep_range(5000, 5500); return 0; }