diff options
Diffstat (limited to 'drivers/pinctrl/pinctrl-stm32.c')
-rw-r--r-- | drivers/pinctrl/pinctrl-stm32.c | 89 |
1 files changed, 26 insertions, 63 deletions
diff --git a/drivers/pinctrl/pinctrl-stm32.c b/drivers/pinctrl/pinctrl-stm32.c index cee10636ce..63a01b6ec6 100644 --- a/drivers/pinctrl/pinctrl-stm32.c +++ b/drivers/pinctrl/pinctrl-stm32.c @@ -24,7 +24,6 @@ struct stm32_gpio_bank { void __iomem *base; struct gpio_chip chip; - struct clk *clk; const char *name; }; @@ -87,7 +86,8 @@ static inline u32 stm32_gpio_get_alt(u32 function) return 0; } -static int __stm32_pinctrl_set_state(struct device_d *dev, struct device_node *pins) +static int __stm32_pinctrl_set_state(struct device *dev, + struct device_node *pins) { int ret; @@ -101,8 +101,7 @@ static int __stm32_pinctrl_set_state(struct device_d *dev, struct device_node *p of_get_property(pins, "pinmux", &num_pins); num_pins /= sizeof(__be32); if (!num_pins) { - dev_err(dev, "Invalid pinmux property in %s\n", - pins->full_name); + dev_err(dev, "Invalid pinmux property in %pOF\n", pins); return -EINVAL; } @@ -129,7 +128,7 @@ static int __stm32_pinctrl_set_state(struct device_d *dev, struct device_node *p else if (of_get_property(pins, "output-high", NULL)) dir = PIN_OUTPUT_HIGH; - dev_dbg(dev, "%s: multiplexing %d pins\n", pins->full_name, num_pins); + dev_dbg(dev, "%pOF: multiplexing %d pins\n", pins, num_pins); for (i = 0; i < num_pins; i++) { struct stm32_gpio_bank *bank = NULL; @@ -154,8 +153,6 @@ static int __stm32_pinctrl_set_state(struct device_d *dev, struct device_node *p "fn %u, mode %u, alt %u\n", bank->name, offset, func, mode, alt); - clk_enable(bank->clk); - __stm32_pmx_set_mode(bank->base, offset, mode, alt); if (adjust_slew_rate) @@ -173,8 +170,6 @@ static int __stm32_pinctrl_set_state(struct device_d *dev, struct device_node *p __stm32_pmx_gpio_output(bank->base, offset, 0); else if (dir == PIN_OUTPUT_HIGH) __stm32_pmx_gpio_output(bank->base, offset, 1); - - clk_disable(bank->clk); } return 0; @@ -183,7 +178,7 @@ static int __stm32_pinctrl_set_state(struct device_d *dev, struct device_node *p static int stm32_pinctrl_set_state(struct pinctrl_device *pdev, struct device_node *np) { struct stm32_pinctrl *pinctrl = to_stm32_pinctrl(pdev); - struct device_d *dev = pdev->dev; + struct device *dev = pdev->dev; struct device_node *pins; void *prop; int ret; @@ -219,8 +214,6 @@ static int stm32_gpio_get_direction(struct gpio_chip *chip, unsigned int gpio) int ret; u32 mode, alt; - clk_enable(bank->clk); - __stm32_pmx_get_mode(bank->base, stm32_gpio_pin(gpio, NULL), &mode, &alt); if ((alt == 0) && (mode == 0)) ret = 1; @@ -229,8 +222,6 @@ static int stm32_gpio_get_direction(struct gpio_chip *chip, unsigned int gpio) else ret = -EINVAL; - clk_disable(bank->clk); - return ret; } @@ -238,37 +229,22 @@ static void stm32_gpio_set(struct gpio_chip *chip, unsigned gpio, int value) { struct stm32_gpio_bank *bank = to_stm32_gpio_bank(chip); - clk_enable(bank->clk); - __stm32_pmx_gpio_set(bank->base, stm32_gpio_pin(gpio, NULL), value); - - clk_disable(bank->clk); } static int stm32_gpio_get(struct gpio_chip *chip, unsigned gpio) { struct stm32_gpio_bank *bank = to_stm32_gpio_bank(chip); - int ret; - - clk_enable(bank->clk); - - ret = __stm32_pmx_gpio_get(bank->base, stm32_gpio_pin(gpio, NULL)); - - clk_disable(bank->clk); - return ret; + return __stm32_pmx_gpio_get(bank->base, stm32_gpio_pin(gpio, NULL)); } static int stm32_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) { struct stm32_gpio_bank *bank = to_stm32_gpio_bank(chip); - clk_enable(bank->clk); - __stm32_pmx_gpio_input(bank->base, stm32_gpio_pin(gpio, NULL)); - clk_disable(bank->clk); - return 0; } @@ -277,12 +253,8 @@ static int stm32_gpio_direction_output(struct gpio_chip *chip, { struct stm32_gpio_bank *bank = to_stm32_gpio_bank(chip); - clk_enable(bank->clk); - __stm32_pmx_gpio_output(bank->base, stm32_gpio_pin(gpio, NULL), value); - clk_disable(bank->clk); - return 0; } @@ -296,12 +268,13 @@ static struct gpio_ops stm32_gpio_ops = { static int stm32_gpiochip_add(struct stm32_gpio_bank *bank, struct device_node *np, - struct device_d *parent) + struct device *parent) { - struct device_d *dev; + struct device *dev; struct resource *iores; enum { PINCTRL_PHANDLE, GPIOCTRL_OFFSET, PINCTRL_OFFSET, PINCOUNT, GPIO_RANGE_NCELLS }; const __be32 *gpio_ranges; + struct clk *clk; u32 ngpios; int ret, size; @@ -312,8 +285,7 @@ static int stm32_gpiochip_add(struct stm32_gpio_bank *bank, gpio_ranges = of_get_property(np, "gpio-ranges", &size); size /= sizeof(__be32); if (!gpio_ranges || size < GPIO_RANGE_NCELLS) { - dev_err(dev, "Couldn't read 'gpio-ranges' property in %s\n", - np->full_name); + dev_err(dev, "Couldn't read 'gpio-ranges' property in %pOF\n", np); return -EINVAL; } @@ -324,14 +296,13 @@ static int stm32_gpiochip_add(struct stm32_gpio_bank *bank, bank->chip.ngpio = ngpios; if (size > GPIO_RANGE_NCELLS) { - dev_err(dev, "Unsupported disjunct 'gpio-ranges' in %s\n", - np->full_name); + dev_err(dev, "Unsupported disjunct 'gpio-ranges' in %pOF\n", np); return -EINVAL; } if (ngpios > STM32_GPIO_PINS_PER_BANK) { - dev_err(dev, "ngpios property expected to be %u at most in %s\n", - ngpios, np->full_name); + dev_err(dev, "ngpios property expected to be %u at most in %pOF\n", + ngpios, np); return -EINVAL; } @@ -350,12 +321,15 @@ static int stm32_gpiochip_add(struct stm32_gpio_bank *bank, bank->chip.base = be32_to_cpu(gpio_ranges[PINCTRL_OFFSET]); bank->chip.ops = &stm32_gpio_ops; bank->chip.dev = dev; - bank->clk = clk_get(dev, NULL); - if (IS_ERR(bank->clk)) { - dev_err(dev, "failed to get clk (%ld)\n", PTR_ERR(bank->clk)); - return PTR_ERR(bank->clk); + + clk = clk_get(dev, NULL); + if (IS_ERR(clk)) { + dev_err(dev, "failed to get clk (%ld)\n", PTR_ERR(clk)); + return PTR_ERR(clk); } + clk_enable(clk); + return gpiochip_add(&bank->chip); } @@ -363,19 +337,14 @@ static struct pinctrl_ops stm32_pinctrl_ops = { .set_state = stm32_pinctrl_set_state, }; -static int stm32_pinctrl_probe(struct device_d *dev) +static int stm32_pinctrl_probe(struct device *dev) { struct stm32_pinctrl *pinctrl; unsigned nbanks = 0; struct stm32_gpio_bank *gpio_bank; - struct device_node *np = dev->device_node, *child; + struct device_node *np = dev->of_node, *child; int ret; - if (!of_find_property(np, "pins-are-numbered", NULL)) { - dev_err(dev, "only pins-are-numbered format supported\n"); - return -EINVAL; - } - for_each_available_child_of_node(np, child) if (of_property_read_bool(child, "gpio-controller")) nbanks++; @@ -391,12 +360,6 @@ static int stm32_pinctrl_probe(struct device_d *dev) dev_dbg(dev, "proceeding without hw spinlock support: (%d)\n", ret); - ret = pinctrl_register(&pinctrl->pdev); - if (ret) { - dev_dbg(dev, "pinctrl_register failed: (%d)\n", ret); - return ret; - } - gpio_bank = pinctrl->gpio_banks; for_each_available_child_of_node(np, child) { if (!of_property_read_bool(child, "gpio-controller")) @@ -412,9 +375,7 @@ static int stm32_pinctrl_probe(struct device_d *dev) gpio_bank++; } - dev_dbg(dev, "pinctrl/gpio driver registered\n"); - - return 0; + return pinctrl_register(&pinctrl->pdev); } static __maybe_unused struct of_device_id stm32_pinctrl_dt_ids[] = { @@ -424,10 +385,12 @@ static __maybe_unused struct of_device_id stm32_pinctrl_dt_ids[] = { { .compatible = "st,stm32h743-pinctrl" }, { .compatible = "st,stm32mp157-pinctrl" }, { .compatible = "st,stm32mp157-z-pinctrl" }, + { .compatible = "st,stm32mp135-pinctrl" }, { /* sentinel */ } }; +MODULE_DEVICE_TABLE(of, stm32_pinctrl_dt_ids); -static struct driver_d stm32_pinctrl_driver = { +static struct driver stm32_pinctrl_driver = { .name = "stm32-pinctrl", .probe = stm32_pinctrl_probe, .of_compatible = DRV_OF_COMPAT(stm32_pinctrl_dt_ids), |