Skip to content

Commit a57f93b

Browse files
charleskeepaxlag-linaro
authored andcommitted
mfd: cs42l43: Use gpiod_set_raw for GPIO operations
The GPIO framework supports specifying if a GPIO is active low or high and will invert accordingly. Whilst specifying this is part of the normal GPIO definition flow on device tree systems, it is a DSD extension under ACPI, that Windows doesn't really use. This means most ACPI systems do not set the polarity of the pin. The current cs42l43 driver assumes it is setting the level of the line directly, which is actually the case on all current systems and likely most future ones. However if the part was used in a device tree system or an ACPI system that actually used the DSD extensions this would get inverted, causing the driver to fail probe. As the driver always knows the polarity of its own reset line, use the raw set API making the intention to set the level directly clear and to avoid any such future issues. Signed-off-by: Charles Keepax <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Lee Jones <[email protected]>
1 parent d496ad3 commit a57f93b

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

drivers/mfd/cs42l43.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -984,7 +984,7 @@ static int cs42l43_power_up(struct cs42l43 *cs42l43)
984984
/* vdd-p must be on for 50uS before any other supply */
985985
usleep_range(CS42L43_VDDP_DELAY_US, 2 * CS42L43_VDDP_DELAY_US);
986986

987-
gpiod_set_value_cansleep(cs42l43->reset, 1);
987+
gpiod_set_raw_value_cansleep(cs42l43->reset, 1);
988988

989989
ret = regulator_bulk_enable(CS42L43_N_SUPPLIES, cs42l43->core_supplies);
990990
if (ret) {
@@ -1005,7 +1005,7 @@ static int cs42l43_power_up(struct cs42l43 *cs42l43)
10051005
err_core_supplies:
10061006
regulator_bulk_disable(CS42L43_N_SUPPLIES, cs42l43->core_supplies);
10071007
err_reset:
1008-
gpiod_set_value_cansleep(cs42l43->reset, 0);
1008+
gpiod_set_raw_value_cansleep(cs42l43->reset, 0);
10091009
regulator_disable(cs42l43->vdd_p);
10101010

10111011
return ret;
@@ -1027,7 +1027,7 @@ static int cs42l43_power_down(struct cs42l43 *cs42l43)
10271027
return ret;
10281028
}
10291029

1030-
gpiod_set_value_cansleep(cs42l43->reset, 0);
1030+
gpiod_set_raw_value_cansleep(cs42l43->reset, 0);
10311031

10321032
ret = regulator_disable(cs42l43->vdd_p);
10331033
if (ret) {
@@ -1052,11 +1052,13 @@ int cs42l43_dev_probe(struct cs42l43 *cs42l43)
10521052

10531053
regcache_cache_only(cs42l43->regmap, true);
10541054

1055-
cs42l43->reset = devm_gpiod_get_optional(cs42l43->dev, "reset", GPIOD_OUT_LOW);
1055+
cs42l43->reset = devm_gpiod_get_optional(cs42l43->dev, "reset", GPIOD_OUT_HIGH);
10561056
if (IS_ERR(cs42l43->reset))
10571057
return dev_err_probe(cs42l43->dev, PTR_ERR(cs42l43->reset),
10581058
"Failed to get reset\n");
10591059

1060+
gpiod_set_raw_value_cansleep(cs42l43->reset, 0);
1061+
10601062
cs42l43->vdd_p = devm_regulator_get(cs42l43->dev, "vdd-p");
10611063
if (IS_ERR(cs42l43->vdd_p))
10621064
return dev_err_probe(cs42l43->dev, PTR_ERR(cs42l43->vdd_p),

0 commit comments

Comments
 (0)