mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 09:04:39 +02:00
platform/x86: int3472: Rework regulator enable-time handling
Instead of hardcoding the regulator enable-time for INT3472_GPIO_TYPE- POWER_ENABLE and -HANDSHAKE, make int3472_get_con_id_and_polarity() set the enable-time. This will allow overriding the enable time through quirks in the int3472_gpio_map[]. Signed-off-by: Hans de Goede <hansg@kernel.org> Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com> Reviewed-by: Andy Shevchenko <andy@kernel.org> Link: https://lore.kernel.org/r/20250725215259.402796-3-hansg@kernel.org Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
This commit is contained in:
parent
b33b696f86
commit
f11f8948a8
|
|
@ -129,6 +129,7 @@ skl_int3472_gpiod_get_from_temp_lookup(struct int3472_discrete_device *int3472,
|
|||
* @hid: The ACPI HID of the device without the instance number e.g. INT347E
|
||||
* @type_from: The GPIO type from ACPI ?SDT
|
||||
* @type_to: The assigned GPIO type, typically same as @type_from
|
||||
* @enable_time_us: Enable time in usec for GPIOs mapped to regulators
|
||||
* @con_id: The name of the GPIO for the device
|
||||
* @polarity_low: GPIO_ACTIVE_LOW true if the @polarity_low is true,
|
||||
* GPIO_ACTIVE_HIGH otherwise
|
||||
|
|
@ -138,6 +139,7 @@ struct int3472_gpio_map {
|
|||
u8 type_from;
|
||||
u8 type_to;
|
||||
bool polarity_low;
|
||||
unsigned int enable_time_us;
|
||||
const char *con_id;
|
||||
};
|
||||
|
||||
|
|
@ -147,6 +149,7 @@ static const struct int3472_gpio_map int3472_gpio_map[] = {
|
|||
.type_from = INT3472_GPIO_TYPE_POWERDOWN,
|
||||
.type_to = INT3472_GPIO_TYPE_POWER_ENABLE,
|
||||
.con_id = "vdd",
|
||||
.enable_time_us = GPIO_REGULATOR_ENABLE_TIME,
|
||||
},
|
||||
{ /* ov7251 driver / DT-bindings expect "enable" as con_id for reset */
|
||||
.hid = "INT347E",
|
||||
|
|
@ -157,7 +160,8 @@ static const struct int3472_gpio_map int3472_gpio_map[] = {
|
|||
};
|
||||
|
||||
static void int3472_get_con_id_and_polarity(struct int3472_discrete_device *int3472, u8 *type,
|
||||
const char **con_id, unsigned long *gpio_flags)
|
||||
const char **con_id, unsigned long *gpio_flags,
|
||||
unsigned int *enable_time_us)
|
||||
{
|
||||
struct acpi_device *adev = int3472->sensor;
|
||||
unsigned int i;
|
||||
|
|
@ -181,9 +185,12 @@ static void int3472_get_con_id_and_polarity(struct int3472_discrete_device *int3
|
|||
*gpio_flags = int3472_gpio_map[i].polarity_low ?
|
||||
GPIO_ACTIVE_LOW : GPIO_ACTIVE_HIGH;
|
||||
*con_id = int3472_gpio_map[i].con_id;
|
||||
*enable_time_us = int3472_gpio_map[i].enable_time_us;
|
||||
return;
|
||||
}
|
||||
|
||||
*enable_time_us = GPIO_REGULATOR_ENABLE_TIME;
|
||||
|
||||
switch (*type) {
|
||||
case INT3472_GPIO_TYPE_RESET:
|
||||
*con_id = "reset";
|
||||
|
|
@ -208,6 +215,8 @@ static void int3472_get_con_id_and_polarity(struct int3472_discrete_device *int3
|
|||
case INT3472_GPIO_TYPE_HANDSHAKE:
|
||||
*con_id = "dvdd";
|
||||
*gpio_flags = GPIO_ACTIVE_HIGH;
|
||||
/* Setups using a handshake pin need 25 ms enable delay */
|
||||
*enable_time_us = 25 * USEC_PER_MSEC;
|
||||
break;
|
||||
default:
|
||||
*con_id = "unknown";
|
||||
|
|
@ -252,13 +261,15 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,
|
|||
void *data)
|
||||
{
|
||||
struct int3472_discrete_device *int3472 = data;
|
||||
const char *second_sensor = NULL;
|
||||
struct acpi_resource_gpio *agpio;
|
||||
unsigned int enable_time_us;
|
||||
u8 active_value, pin, type;
|
||||
unsigned long gpio_flags;
|
||||
union acpi_object *obj;
|
||||
struct gpio_desc *gpio;
|
||||
const char *err_msg;
|
||||
const char *con_id;
|
||||
unsigned long gpio_flags;
|
||||
int ret;
|
||||
|
||||
if (!acpi_gpio_get_io_resource(ares, &agpio))
|
||||
|
|
@ -281,7 +292,7 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,
|
|||
|
||||
type = FIELD_GET(INT3472_GPIO_DSM_TYPE, obj->integer.value);
|
||||
|
||||
int3472_get_con_id_and_polarity(int3472, &type, &con_id, &gpio_flags);
|
||||
int3472_get_con_id_and_polarity(int3472, &type, &con_id, &gpio_flags, &enable_time_us);
|
||||
|
||||
pin = FIELD_GET(INT3472_GPIO_DSM_PIN, obj->integer.value);
|
||||
/* Pin field is not really used under Windows and wraps around at 8 bits */
|
||||
|
|
@ -330,21 +341,13 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,
|
|||
|
||||
break;
|
||||
case INT3472_GPIO_TYPE_POWER_ENABLE:
|
||||
ret = skl_int3472_register_regulator(int3472, gpio,
|
||||
GPIO_REGULATOR_ENABLE_TIME,
|
||||
con_id,
|
||||
int3472->quirks.avdd_second_sensor);
|
||||
if (ret)
|
||||
err_msg = "Failed to map power-enable to sensor\n";
|
||||
|
||||
break;
|
||||
second_sensor = int3472->quirks.avdd_second_sensor;
|
||||
fallthrough;
|
||||
case INT3472_GPIO_TYPE_HANDSHAKE:
|
||||
/* Setups using a handshake pin need 25 ms enable delay */
|
||||
ret = skl_int3472_register_regulator(int3472, gpio,
|
||||
25 * USEC_PER_MSEC,
|
||||
con_id, NULL);
|
||||
ret = skl_int3472_register_regulator(int3472, gpio, enable_time_us,
|
||||
con_id, second_sensor);
|
||||
if (ret)
|
||||
err_msg = "Failed to map handshake to sensor\n";
|
||||
err_msg = "Failed to register regulator\n";
|
||||
|
||||
break;
|
||||
default: /* Never reached */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user