Hi Sakari, On 22-Jan-25 11:43 AM, Sakari Ailus wrote: > The DT bindings for ov7251 specify "enable" GPIO (xshutdown in > documentation) but the int3472 indiscriminately provides this as a "reset" > GPIO to sensor drivers. Take this into account by assigning it as "enable" > with active high polarity for INT347E devices, i.e. ov7251. "reset" with > active low polarity remains the default GPIO name for other devices. > > Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx> > --- > since v2: > > - Implement a more generic GPIO mangling capability, as suggested by Hans > de Goede. > > - Include linux/array_size.h for ARRAY_SIZE(). Thank you for the new version. This looks good to me now: Reviewed-by: Hans de Goede <hdegoede@xxxxxxxxxx> Regards, Hans > > drivers/platform/x86/intel/int3472/discrete.c | 43 +++++++++++++++++-- > 1 file changed, 40 insertions(+), 3 deletions(-) > > diff --git a/drivers/platform/x86/intel/int3472/discrete.c b/drivers/platform/x86/intel/int3472/discrete.c > index d881b2cfcdfc..181675e57c39 100644 > --- a/drivers/platform/x86/intel/int3472/discrete.c > +++ b/drivers/platform/x86/intel/int3472/discrete.c > @@ -2,6 +2,7 @@ > /* Author: Dan Scally <djrscally@xxxxxxxxx> */ > > #include <linux/acpi.h> > +#include <linux/array_size.h> > #include <linux/bitfield.h> > #include <linux/device.h> > #include <linux/gpio/consumer.h> > @@ -122,9 +123,44 @@ skl_int3472_gpiod_get_from_temp_lookup(struct int3472_discrete_device *int3472, > return desc; > } > > -static void int3472_get_func_and_polarity(u8 type, const char **func, u32 *polarity) > +/** > + * struct int3472_gpio_map - Map GPIOs to whatever is expected by the > + * sensor driver (as in DT bindings) > + * @hid: The ACPI HID of the device without the instance number e.g. i2c-INT347E > + * @type_from: The GPIO type from ACPI ?SDT > + * @type_to: The assigned GPIO type, typically same as type_from > + * @func: The function, e.g. "enable" > + * @polarity: GPIO_ACTIVE_{HIGH,LOW} > + */ > +struct int3472_gpio_map { > + const char *hid; > + u8 type_from; > + u8 type_to; > + const char *func; > + unsigned int polarity; > +}; > + > +static const struct int3472_gpio_map int3472_gpio_map[] = { > + { "INT347E", INT3472_GPIO_TYPE_RESET, INT3472_GPIO_TYPE_RESET, "enable", GPIO_ACTIVE_HIGH }, > +}; > + > +static void int3472_get_func_and_polarity(struct acpi_device *adev, u8 *type, > + const char **func, u32 *polarity) > { > - switch (type) { > + unsigned int i; > + > + for (i = 0; i < ARRAY_SIZE(int3472_gpio_map); i++) { > + if (*type != int3472_gpio_map[i].type_from || > + !acpi_dev_hid_uid_match(adev, int3472_gpio_map[i].hid, NULL)) > + continue; > + > + *type = int3472_gpio_map[i].type_to; > + *func = int3472_gpio_map[i].func; > + *polarity = int3472_gpio_map[i].polarity; > + return; > + } > + > + switch (*type) { > case INT3472_GPIO_TYPE_RESET: > *func = "reset"; > *polarity = GPIO_ACTIVE_LOW; > @@ -217,7 +253,8 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares, > > type = FIELD_GET(INT3472_GPIO_DSM_TYPE, obj->integer.value); > > - int3472_get_func_and_polarity(type, &func, &polarity); > + int3472_get_func_and_polarity(int3472->sensor, &type, &func, > + &polarity); > > pin = FIELD_GET(INT3472_GPIO_DSM_PIN, obj->integer.value); > if (pin != agpio->pin_table[0])