regulator: fixed/gpio: Pull inversion/OD into gpiolib
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 29 Jan 2019 10:31:53 +0000 (11:31 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 6 Feb 2019 15:58:29 +0000 (15:58 +0000)
This pushes the handling of inversion semantics and open drain
settings to the GPIO descriptor and gpiolib. All affected board
files are also augmented.

This is especially nice since we don't have to have any
confusing flags passed around to the left and right littering
the fixed and GPIO regulator drivers and the regulator core.
It is all just very straight-forward: the core asks the GPIO
line to be asserted or deasserted and gpiolib deals with the
rest depending on how the platform is configured: if the line
is active low, it deals with that, if the line is open drain,
it deals with that too.

Cc: Alexander Shiyan <shc_work@mail.ru> # i.MX boards user
Cc: Haojian Zhuang <haojian.zhuang@gmail.com> # MMP2 maintainer
Cc: Aaro Koskinen <aaro.koskinen@iki.fi> # OMAP1 maintainer
Cc: Tony Lindgren <tony@atomide.com> # OMAP1,2,3 maintainer
Cc: Mike Rapoport <rppt@linux.vnet.ibm.com> # EM-X270 maintainer
Cc: Robert Jarzmik <robert.jarzmik@free.fr> # EZX maintainer
Cc: Philipp Zabel <philipp.zabel@gmail.com> # Magician maintainer
Cc: Petr Cvek <petr.cvek@tul.cz> # Magician
Cc: Robert Jarzmik <robert.jarzmik@free.fr> # PXA
Cc: Paul Parsons <lost.distance@yahoo.com> # hx4700
Cc: Daniel Mack <zonque@gmail.com> # Raumfeld maintainer
Cc: Marc Zyngier <marc.zyngier@arm.com> # Zeus maintainer
Cc: Geert Uytterhoeven <geert+renesas@glider.be> # SuperH pinctrl/GPIO maintainer
Cc: Russell King <rmk+kernel@armlinux.org.uk> # SA1100
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Tested-by: Janusz Krzysztofik <jmkrzyszt@gmail.com> #OMAP1 Amstrad Delta
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
17 files changed:
arch/arm/mach-imx/mach-mx21ads.c
arch/arm/mach-imx/mach-mx27ads.c
arch/arm/mach-mmp/brownstone.c
arch/arm/mach-omap1/board-ams-delta.c
arch/arm/mach-omap2/pdata-quirks.c
arch/arm/mach-pxa/em-x270.c
arch/arm/mach-pxa/ezx.c
arch/arm/mach-pxa/raumfeld.c
arch/arm/mach-pxa/zeus.c
arch/arm/mach-sa1100/assabet.c
arch/sh/boards/mach-ecovec24/setup.c
arch/x86/platform/intel-mid/device_libs/platform_bcm43xx.c
drivers/regulator/core.c
drivers/regulator/da9055-regulator.c
drivers/regulator/fixed.c
include/linux/regulator/fixed.h
include/linux/regulator/gpio-regulator.h

index 2e1e540f2e5a55c14bc2998b5e3e2b3d9532a035..d278fb672d401deae2f056fa8dffebd45a82bf65 100644 (file)
@@ -205,7 +205,6 @@ static struct regulator_init_data mx21ads_lcd_regulator_init_data = {
 static struct fixed_voltage_config mx21ads_lcd_regulator_pdata = {
        .supply_name    = "LCD",
        .microvolts     = 3300000,
-       .enable_high    = 1,
        .init_data      = &mx21ads_lcd_regulator_init_data,
 };
 
index f5e04047ed13d2dcbec8e8e3cc48346538e03fbe..6dd7f57c332f4bebc38dbaaa4ec851e8023913d8 100644 (file)
@@ -237,7 +237,7 @@ static struct fixed_voltage_config mx27ads_lcd_regulator_pdata = {
 static struct gpiod_lookup_table mx27ads_lcd_regulator_gpiod_table = {
        .dev_id = "reg-fixed-voltage.0", /* Let's hope ID 0 is what we get */
        .table = {
-               GPIO_LOOKUP("LCD", 0, NULL, GPIO_ACTIVE_HIGH),
+               GPIO_LOOKUP("LCD", 0, NULL, GPIO_ACTIVE_LOW),
                { },
        },
 };
index a04e249c654bc59b7c15033033a4d81f93a80fff..d2560fb1e835a93f472d5fc5e1f7577bf091462d 100644 (file)
@@ -149,7 +149,6 @@ static struct regulator_init_data brownstone_v_5vp_data = {
 static struct fixed_voltage_config brownstone_v_5vp = {
        .supply_name            = "v_5vp",
        .microvolts             = 5000000,
-       .enable_high            = 1,
        .enabled_at_boot        = 1,
        .init_data              = &brownstone_v_5vp_data,
 };
index c4c0a8ea11e4d0efea0026c8668619ac1c03648f..be30c3c061b46ee0c1adf3ce55a872eb7bc9c9c0 100644 (file)
@@ -267,7 +267,6 @@ static struct fixed_voltage_config modem_nreset_config = {
        .supply_name            = "modem_nreset",
        .microvolts             = 3300000,
        .startup_delay          = 25000,
-       .enable_high            = 1,
        .enabled_at_boot        = 1,
        .init_data              = &modem_nreset_data,
 };
@@ -533,7 +532,6 @@ static struct regulator_init_data keybrd_pwr_initdata = {
 static struct fixed_voltage_config keybrd_pwr_config = {
        .supply_name            = "keybrd_pwr",
        .microvolts             = 5000000,
-       .enable_high            = 1,
        .init_data              = &keybrd_pwr_initdata,
 };
 
index 8a5b6ed4ec3602a92707d86cdabf5e8dae01d612..a2ecc5e69abb24068385644447860f27197ded54 100644 (file)
@@ -330,7 +330,6 @@ static struct fixed_voltage_config pandora_vwlan = {
        .supply_name            = "vwlan",
        .microvolts             = 1800000, /* 1.8V */
        .startup_delay          = 50000, /* 50ms */
-       .enable_high            = 1,
        .init_data              = &pandora_vmmc3,
 };
 
index 32c1edeb3f1423ca5eeb7177c5e40a7a25d40f0a..5ba7bb7f7d51a2554e33a0e7b14dbd0959efafc6 100644 (file)
@@ -976,7 +976,6 @@ static struct fixed_voltage_config camera_dummy_config = {
        .supply_name            = "camera_vdd",
        .input_supply           = "vcc cam",
        .microvolts             = 2800000,
-       .enable_high            = 0,
        .init_data              = &camera_dummy_initdata,
 };
 
index 565965e9acc7e807079919243877d300df344a65..5e110e70ce5a0ff2e47d6449d7ddd18235770b27 100644 (file)
@@ -714,7 +714,6 @@ static struct regulator_init_data camera_regulator_initdata = {
 static struct fixed_voltage_config camera_regulator_config = {
        .supply_name            = "camera_vdd",
        .microvolts             = 2800000,
-       .enable_high            = 0,
        .init_data              = &camera_regulator_initdata,
 };
 
@@ -730,7 +729,7 @@ static struct gpiod_lookup_table camera_supply_gpiod_table = {
        .dev_id = "reg-fixed-voltage.1",
        .table = {
                GPIO_LOOKUP("gpio-pxa", GPIO50_nCAM_EN,
-                           NULL, GPIO_ACTIVE_HIGH),
+                           NULL, GPIO_ACTIVE_LOW),
                { },
        },
 };
index e1db072756f255dd79bc7d54226fa5bb9ad11e8d..e13bfc9b01d291e928890ca2df7e5c061f7138ea 100644 (file)
@@ -883,7 +883,6 @@ static struct regulator_init_data audio_va_initdata = {
 static struct fixed_voltage_config audio_va_config = {
        .supply_name            = "audio_va",
        .microvolts             = 5000000,
-       .enable_high            = 1,
        .enabled_at_boot        = 0,
        .init_data              = &audio_va_initdata,
 };
index c411f79d4cb5063cf8082d20440f12fce100a671..ebd654302387672a7b70d181304214c927fe605e 100644 (file)
@@ -426,7 +426,7 @@ static struct gpiod_lookup_table can_regulator_gpiod_table = {
        .dev_id = "reg-fixed-voltage.0",
        .table = {
                GPIO_LOOKUP("gpio-pxa", ZEUS_CAN_SHDN_GPIO,
-                           NULL, GPIO_ACTIVE_HIGH),
+                           NULL, GPIO_ACTIVE_LOW),
                { },
        },
 };
@@ -547,7 +547,6 @@ static struct regulator_init_data zeus_ohci_regulator_data = {
 static struct fixed_voltage_config zeus_ohci_regulator_config = {
        .supply_name            = "vbus2",
        .microvolts             = 5000000, /* 5.0V */
-       .enable_high            = 1,
        .startup_delay          = 0,
        .init_data              = &zeus_ohci_regulator_data,
 };
index dfa42496ec27957f8a1cddff3b640626d430c374..d09c3f236186fe540e227766e0548fe62ece1a75 100644 (file)
@@ -469,7 +469,6 @@ static struct regulator_consumer_supply assabet_cf_vcc_consumers[] = {
 static struct fixed_voltage_config assabet_cf_vcc_pdata __initdata = {
        .supply_name = "cf-power",
        .microvolts = 3300000,
-       .enable_high = 1,
 };
 
 static struct gpiod_lookup_table assabet_cf_vcc_gpio_table = {
index 22b4106b808481280637b7be29d0d8efbec40bc6..5495efa0733507d3f707f2c8b61beae81c741643 100644 (file)
@@ -630,7 +630,6 @@ static struct regulator_init_data cn12_power_init_data = {
 static struct fixed_voltage_config cn12_power_info = {
        .supply_name = "CN12 SD/MMC Vdd",
        .microvolts = 3300000,
-       .enable_high = 1,
        .init_data = &cn12_power_init_data,
 };
 
@@ -671,7 +670,6 @@ static struct regulator_init_data sdhi0_power_init_data = {
 static struct fixed_voltage_config sdhi0_power_info = {
        .supply_name = "CN11 SD/MMC Vdd",
        .microvolts = 3300000,
-       .enable_high = 1,
        .init_data = &sdhi0_power_init_data,
 };
 
index 96f438d4b026f397f306feb2bd64b11d20602192..1421d5330b2cea6981e13c9376112d55442850fb 100644 (file)
@@ -44,7 +44,6 @@ static struct fixed_voltage_config bcm43xx_vmmc = {
         */
        .microvolts             = 2000000,              /* 1.8V */
        .startup_delay          = 250 * 1000,           /* 250ms */
-       .enable_high            = 1,                    /* active high */
        .enabled_at_boot        = 0,                    /* disabled at boot */
        .init_data              = &bcm43xx_vmmc_data,
 };
index 430a73dea487b5c9ed3467663ecbaaf520a57ed7..1778c5d1b2d0e305e774c5be11332b918d86e9e7 100644 (file)
@@ -82,7 +82,6 @@ struct regulator_enable_gpio {
        struct gpio_desc *gpiod;
        u32 enable_count;       /* a number of enabled shared GPIO */
        u32 request_count;      /* a number of requested shared GPIO */
-       unsigned int ena_gpio_invert:1;
 };
 
 /*
@@ -2268,7 +2267,6 @@ static int regulator_ena_gpio_request(struct regulator_dev *rdev,
        }
 
        pin->gpiod = gpiod;
-       pin->ena_gpio_invert = config->ena_gpio_invert;
        list_add(&pin->list, &regulator_ena_gpio_list);
 
 update_ena_gpio_to_rdev:
@@ -2319,8 +2317,7 @@ static int regulator_ena_gpio_ctrl(struct regulator_dev *rdev, bool enable)
        if (enable) {
                /* Enable GPIO at initial use */
                if (pin->enable_count == 0)
-                       gpiod_set_value_cansleep(pin->gpiod,
-                                                !pin->ena_gpio_invert);
+                       gpiod_set_value_cansleep(pin->gpiod, 1);
 
                pin->enable_count++;
        } else {
@@ -2331,8 +2328,7 @@ static int regulator_ena_gpio_ctrl(struct regulator_dev *rdev, bool enable)
 
                /* Disable GPIO if not used */
                if (pin->enable_count <= 1) {
-                       gpiod_set_value_cansleep(pin->gpiod,
-                                                pin->ena_gpio_invert);
+                       gpiod_set_value_cansleep(pin->gpiod, 0);
                        pin->enable_count = 0;
                }
        }
index 588c3d2445cf364c91cdcbb2c6376aaa095750ee..417cafe2aba01fd16b46c0b9a25acb8ed482807f 100644 (file)
@@ -457,7 +457,6 @@ static int da9055_gpio_init(struct da9055_regulator *regulator,
                int gpio_mux = pdata->gpio_ren[id];
 
                config->ena_gpiod = pdata->ena_gpiods[id];
-               config->ena_gpio_invert = 1;
 
                /*
                 * GPI pin is muxed with regulator to control the
index 9abdb91307662a8abf5a64e2d52c023180755231..b5afc9db2c61757e81de61475d3cfb6b264f9fdd 100644 (file)
@@ -79,15 +79,6 @@ of_get_fixed_voltage_config(struct device *dev,
 
        of_property_read_u32(np, "startup-delay-us", &config->startup_delay);
 
-       /*
-        * FIXME: we pulled active low/high and open drain handling into
-        * gpiolib so it will be handled there. Delete this in the second
-        * step when we also remove the custom inversion handling for all
-        * legacy boardfiles.
-        */
-       config->enable_high = 1;
-       config->gpio_is_open_drain = 0;
-
        if (of_find_property(np, "vin-supply", NULL))
                config->input_supply = "vin";
 
@@ -151,24 +142,14 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
 
        drvdata->desc.fixed_uV = config->microvolts;
 
-       cfg.ena_gpio_invert = !config->enable_high;
-       if (config->enabled_at_boot) {
-               if (config->enable_high)
-                       gflags = GPIOD_OUT_HIGH;
-               else
-                       gflags = GPIOD_OUT_LOW;
-       } else {
-               if (config->enable_high)
-                       gflags = GPIOD_OUT_LOW;
-               else
-                       gflags = GPIOD_OUT_HIGH;
-       }
-       if (config->gpio_is_open_drain) {
-               if (gflags == GPIOD_OUT_HIGH)
-                       gflags = GPIOD_OUT_HIGH_OPEN_DRAIN;
-               else
-                       gflags = GPIOD_OUT_LOW_OPEN_DRAIN;
-       }
+       /*
+        * The signal will be inverted by the GPIO core if flagged so in the
+        * decriptor.
+        */
+       if (config->enabled_at_boot)
+               gflags = GPIOD_OUT_HIGH;
+       else
+               gflags = GPIOD_OUT_LOW;
 
        /*
         * Some fixed regulators share the enable line between two
index 1a4340ed8e2bb51d82cd3ab9a98b7589d89d6108..f10140da71459986c22fc5d0ee8a1580410347d3 100644 (file)
@@ -25,14 +25,6 @@ struct regulator_init_data;
  * @input_supply:      Name of the input regulator supply
  * @microvolts:                Output voltage of regulator
  * @startup_delay:     Start-up time in microseconds
- * @gpio_is_open_drain: Gpio pin is open drain or normal type.
- *                     If it is open drain type then HIGH will be set
- *                     through PULL-UP with setting gpio as input
- *                     and low will be set as gpio-output with driven
- *                     to low. For non-open-drain case, the gpio will
- *                     will be in output and drive to low/high accordingly.
- * @enable_high:       Polarity of enable GPIO
- *                     1 = Active high, 0 = Active low
  * @enabled_at_boot:   Whether regulator has been enabled at
  *                     boot or not. 1 = Yes, 0 = No
  *                     This is used to keep the regulator at
@@ -48,8 +40,6 @@ struct fixed_voltage_config {
        const char *input_supply;
        int microvolts;
        unsigned startup_delay;
-       unsigned gpio_is_open_drain:1;
-       unsigned enable_high:1;
        unsigned enabled_at_boot:1;
        struct regulator_init_data *init_data;
 };
index 49c407afb944319089ca687befcf0d956acf530a..11cd6375215d92e18e1eae6a6c0bb6188d96734a 100644 (file)
@@ -46,10 +46,6 @@ struct gpio_regulator_state {
 /**
  * struct gpio_regulator_config - config structure
  * @supply_name:       Name of the regulator supply
- * @enable_gpio:       GPIO to use for enable control
- *                     set to -EINVAL if not used
- * @enable_high:       Polarity of enable GPIO
- *                     1 = Active high, 0 = Active low
  * @enabled_at_boot:   Whether regulator has been enabled at
  *                     boot or not. 1 = Yes, 0 = No
  *                     This is used to keep the regulator at
@@ -71,8 +67,6 @@ struct gpio_regulator_state {
 struct gpio_regulator_config {
        const char *supply_name;
 
-       int enable_gpio;
-       unsigned enable_high:1;
        unsigned enabled_at_boot:1;
        unsigned startup_delay;