Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pinctrl: core: Add pinctrl_select_default_state() and export it

It has turned out that some mmc host drivers, but perhaps also others
drivers, needs to reset the pinctrl into the default state
(PINCTRL_STATE_DEFAULT). However, they can't use the existing
pinctrl_pm_select_default_state(), as that requires CONFIG_PM to be set.
This leads to open coding, as they need to look up the default state
themselves and then select it.

To avoid the open coding, let's introduce pinctrl_select_default_state()
and make it available independently of CONFIG_PM. As a matter of fact, this
makes it more consistent with the behaviour of the driver core, as it
already tries to looks up the default state during probe.

Going forward, users of pinctrl_pm_select_default_state() are encouraged to
move to pinctrl_select_default_state(), so the old API can be removed.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Link: https://lore.kernel.org/r/20191206170821.29711-2-ulf.hansson@linaro.org
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

authored by

Ulf Hansson and committed by
Linus Walleij
55d54d1e e42617b8

+26 -15
+20 -15
drivers/pinctrl/core.c
··· 1535 1535 return ret; 1536 1536 } 1537 1537 1538 - #ifdef CONFIG_PM 1539 - 1540 - /** 1541 - * pinctrl_pm_select_state() - select pinctrl state for PM 1542 - * @dev: device to select default state for 1543 - * @state: state to set 1544 - */ 1545 - static int pinctrl_pm_select_state(struct device *dev, 1546 - struct pinctrl_state *state) 1538 + static int pinctrl_select_bound_state(struct device *dev, 1539 + struct pinctrl_state *state) 1547 1540 { 1548 1541 struct dev_pin_info *pins = dev->pins; 1549 1542 int ret; ··· 1551 1558 } 1552 1559 1553 1560 /** 1561 + * pinctrl_select_default_state() - select default pinctrl state 1562 + * @dev: device to select default state for 1563 + */ 1564 + int pinctrl_select_default_state(struct device *dev) 1565 + { 1566 + if (!dev->pins) 1567 + return 0; 1568 + 1569 + return pinctrl_select_bound_state(dev, dev->pins->default_state); 1570 + } 1571 + EXPORT_SYMBOL_GPL(pinctrl_select_default_state); 1572 + 1573 + #ifdef CONFIG_PM 1574 + 1575 + /** 1554 1576 * pinctrl_pm_select_default_state() - select default pinctrl state for PM 1555 1577 * @dev: device to select default state for 1556 1578 */ 1557 1579 int pinctrl_pm_select_default_state(struct device *dev) 1558 1580 { 1559 - if (!dev->pins) 1560 - return 0; 1561 - 1562 - return pinctrl_pm_select_state(dev, dev->pins->default_state); 1581 + return pinctrl_select_default_state(dev); 1563 1582 } 1564 1583 EXPORT_SYMBOL_GPL(pinctrl_pm_select_default_state); 1565 1584 ··· 1584 1579 if (!dev->pins) 1585 1580 return 0; 1586 1581 1587 - return pinctrl_pm_select_state(dev, dev->pins->sleep_state); 1582 + return pinctrl_select_bound_state(dev, dev->pins->sleep_state); 1588 1583 } 1589 1584 EXPORT_SYMBOL_GPL(pinctrl_pm_select_sleep_state); 1590 1585 ··· 1597 1592 if (!dev->pins) 1598 1593 return 0; 1599 1594 1600 - return pinctrl_pm_select_state(dev, dev->pins->idle_state); 1595 + return pinctrl_select_bound_state(dev, dev->pins->idle_state); 1601 1596 } 1602 1597 EXPORT_SYMBOL_GPL(pinctrl_pm_select_idle_state); 1603 1598 #endif
+6
include/linux/pinctrl/consumer.h
··· 40 40 41 41 extern struct pinctrl * __must_check devm_pinctrl_get(struct device *dev); 42 42 extern void devm_pinctrl_put(struct pinctrl *p); 43 + extern int pinctrl_select_default_state(struct device *dev); 43 44 44 45 #ifdef CONFIG_PM 45 46 extern int pinctrl_pm_select_default_state(struct device *dev); ··· 121 120 122 121 static inline void devm_pinctrl_put(struct pinctrl *p) 123 122 { 123 + } 124 + 125 + static inline int pinctrl_select_default_state(struct device *dev) 126 + { 127 + return 0; 124 128 } 125 129 126 130 static inline int pinctrl_pm_select_default_state(struct device *dev)