Re: [PATCH v1 1/1] media: ov7251: Remap "reset" to "enable" for OV7251

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jan 20, 2025 at 06:05:05PM +0200, Laurent Pinchart wrote:
> On Mon, Jan 20, 2025 at 02:30:46PM +0100, Hans de Goede wrote:
> > On 20-Jan-25 10:39 AM, Sakari Ailus wrote:
> > > On Thu, Jan 16, 2025 at 04:48:12PM +0200, Andy Shevchenko wrote:
> > >> On Mon, Nov 11, 2024 at 10:46:32AM +0100, Hans de Goede wrote:
> > >>> On 11-Nov-24 8:55 AM, Sakari Ailus wrote:
> > >>>> On Fri, Nov 08, 2024 at 07:19:05PM +0100, Hans de Goede wrote:
> > >>>>> On 8-Nov-24 5:42 PM, Sakari Ailus wrote:
> > >>>>>> On Fri, Nov 08, 2024 at 06:28:05PM +0200, Andy Shevchenko wrote:
> > >>>>>>> On Fri, Nov 08, 2024 at 04:06:39PM +0000, Sakari Ailus wrote:
> > >>>>>>>> On Fri, Nov 08, 2024 at 04:50:24PM +0200, Andy Shevchenko wrote:
> > >>>>>>>>> The driver of OmniVision OV7251 expects "enable" pin instead of "reset".
> > >>>>>>>>> Remap "reset" to "enable" and update polarity.
> > >>>>>>>>>
> > >>>>>>>>> In particular, the Linux kernel can't load the camera sensor
> > >>>>>>>>> driver on Microsoft Surface Book without this change:
> > >>>>>>>>>
> > >>>>>>>>>  ov7251 i2c-INT347E:00: supply vdddo not found, using dummy regulator
> > >>>>>>>>>  ov7251 i2c-INT347E:00: supply vddd not found, using dummy regulator
> > >>>>>>>>>  ov7251 i2c-INT347E:00: supply vdda not found, using dummy regulator
> > >>>>>>>>>  ov7251 i2c-INT347E:00: cannot get enable gpio
> > >>>>>>>>>  ov7251 i2c-INT347E:00: probe with driver ov7251 failed with error -2

...

> > >>>>>>>> Should this be cc'd to stable? I guess it's not exactly a fix in the driver
> > >>>>>>>> but a BIOS bug, but it can be worked around in the driver. :-)
> > >>>>>>>
> > >>>>>>> It's everything, but a BIOS bug, it's DT bug and whoever first introduced that
> > >>>>>>> GPIO in the driver. Even in the DT present in kernel the pin was referred as
> > >>>>>>
> > >>>>>> How is that a DT (binding?) bug?
> > >>>>>
> > >>>>> Since it is not following the datasheet name for the pin,
> > >>>>> it arguably is a DT binding bug
> > >>>>>
> > >>>>> But whatever, the whole discussion about if it is a bug and whose
> > >>>>> bug it is is not useful. Since we cannot go back in time and change
> > >>>>> the DT binding DT and ACPI are simply going to disagree on the name
> > >>>>> and we will need something like this patch.
> > >>>>>
> > >>>>>>> CAM_RST_N, which is exactly how this patch names it.
> > >>>>>>>
> > >>>>>>> OTOH it's a fix to the driver that never worked for ACPI case, so there never
> > >>>>>>> was a regression to fix.
> > >>>>>>
> > >>>>>> It probably worked just fine, just not with that Surface Book.
> > >>>>>>
> > >>>>>> The polarity of the enable gpio appears to be set wrong in devm_gpiod_get()
> > >>>>>> call. I can post a patch but cannot test it.
> > >>>>>
> > >>>>> That is on purpose, at least the polarity if the devm_gpiod_get(..., "reset",
> > >>>>> ...) is inverted from the existing one for "enable" because reset needs
> > >>>>> to be inactive/disabled to enable the sensor.
> > >>>>>
> > >>>>>> Similarly, you should actually set the flags to GPIOD_OUT_HIGH as reset
> > >>>>>> should be enabled here -- it's disabled only in power_on() as part of the
> > >>>>>> power-on sequence.
> > >>>>>
> > >>>>> This seems to be a pre-existing bug in this driver, which currently
> > >>>>> starts driving enable high, enabling the sensor at gpiod_get() time.
> > >>>>>
> > >>>>> Note that fixing this is tricky-ish, if the pin was already high at
> > >>>>> gpiod_get() time then changing the gpiod_get() to drive it low
> > >>>>> will result in it only being driven low for a very short time since
> > >>>>> ov7251_set_power_on() will get called almost immediately after this
> > >>>>> and it will drive the pin high again without any delays.
> > >>>>
> > >>>> The question here is not about how long the hard reset is applied, but
> > >>>> whether or not the sensor's power-on sequence is followed. Currently it is
> > >>>> not.
> > >>>
> > >>> Right / agreed. The 2 points which I am trying to make are:
> > >>>
> > >>> 1. This is a pre-existing problem unrelated to this patch.
> > >>>
> > >>> So this should be fixed in a separate patch.
> > >>>
> > >>> 2. That separate patch should put a delay after requesting the GPIO
> > >>> to enforce that it is (logically) low (for "enable") for a minimum
> > >>> amount of time.
> > >>
> > >> Sakari, what's the status on this, please?
> > >> We have non-working camera just because of this small patch is absent.
> > > 
> > > Thanks for the ping.
> > > 
> > > I took a closer look at the problem, indeed the GPIO name comes from the
> > > int3472 driver and it's much better to work around this there than to ram
> > > Windows ACPI table specifics to sensor drivers. I'll post a patch for that
> > > shortly. Testing would be appreciated as the Surface Go 2 doesn't have a
> > > GPIO connected to this sensor.
> > 
> > Actually Andy wrote this patch after first writing a similar quirk patch
> > as yours from:
> > 
> > https://lore.kernel.org/platform-driver-x86/1cf93f61-9285-f2fe-fb92-8fb8a3f44201@xxxxxxxxxxxxxxx/T/#t
> > 
> > because I asked him to fix this in the sensor driver instead.
> > 
> > The problem is that we cannot fix this in the INT3472 driver without
> > that becoming one big mess of driver specific quirks.
> > 
> > The Windows code seems to have separate power-ctrl/sequence drivers
> > for the INT3472 device vs the rest of the sensor driver and this
> > power-sequence driver happily consumes whatever GPIOs the INT3472
> > device provides independent of the sensor.
> > 
> > So e.g. on some designs we are going to see a reset pin and on others
> > a powerdown pin.
> > 
> > But in this specific case things are actually more simple,
> > the datasheet describes the pin as:
> > 
> > XSHUTDOWN input reset (active low with internal pull down resistor)
> > 
> > So the devicetree binding calling it "enable" is just wrong and in
> > this case it is actually the DT binding which is buggy (there is no
> > "enable" pin anywhere in the datasheet) and not the ACPI tables.
> 
> There has never been a requirement for the GPIO in DT to match the pin
> name from the datasheet. It's actually quite the contrary, DT
> maintainers request GPIO names to be standardized. Using
> "xshutdown-gpios" wouldn't be appreciated, instead DT bindings are
> encouraged to use standard names such as "reset", "enable" and
> "powerdown". As the pin is called "XSHUTDOWN", "enable" is not
> necessarily a bad match. "reset" could have been picked too, but that
> wasn't the case and we can't change that.

This is very strange. I always thought that DT is about describing _hardware_
and not some abstractions like Linux ones. The HW is pretty much clear that
the pin is "reset" by semantics (if you want standardization), and not
"enable".

> The core of the issue here is that we have two firmware representations,
> DT and ACPI, and no coordination between the two. I don't expect that to
> change, and until Windows OEMs collaborate to standardize ACPI bindings,
> I'll consider this as a Windows-specific hack that I don't want to see
> being pushed to indidividual sensor drivers. This would be better
> handled in my opinion in the INT3472 driver.

Yeah and to me it's clearly the bug in DT schema for this pin. It had to be
"reset" from day 1 in accordance with datasheet.

> > Also since you match on the sensor-type for the remapping this clearly
> > is a per sensor thing and per sensor handling should be in the sensor
> > drivers, which gives us the per sensor mapping for free.
> > 
> > Yes needing to handle this in the sensor driver makes the sensor
> > driver slightly less pretty. But dealing with platform specifics
> > in drivers is done all over the kernel and I don't see why camera
> > sensor drivers are so special that they get to be excluded from
> > sometimes needing to deal with platform specifics.
> 
> The whole point of having standardized firmware descriptions is to avoid
> board-specific code in drivers. INT3472 is meant to handle board
> specificities.

Yes, but world is not ideal and people made mistakes...

-- 
With Best Regards,
Andy Shevchenko






[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux