summaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/pinctrl-nomadik.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pinctrl/pinctrl-nomadik.c')
-rw-r--r--drivers/pinctrl/pinctrl-nomadik.c125
1 files changed, 67 insertions, 58 deletions
diff --git a/drivers/pinctrl/pinctrl-nomadik.c b/drivers/pinctrl/pinctrl-nomadik.c
index f7c7279d081a..d7c3ae300fa7 100644
--- a/drivers/pinctrl/pinctrl-nomadik.c
+++ b/drivers/pinctrl/pinctrl-nomadik.c
@@ -1695,7 +1695,7 @@ static int nmk_pin_config_get(struct pinctrl_dev *pctldev, unsigned pin,
1695} 1695}
1696 1696
1697static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned pin, 1697static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned pin,
1698 unsigned long config) 1698 unsigned long *configs, unsigned num_configs)
1699{ 1699{
1700 static const char *pullnames[] = { 1700 static const char *pullnames[] = {
1701 [NMK_GPIO_PULL_NONE] = "none", 1701 [NMK_GPIO_PULL_NONE] = "none",
@@ -1712,20 +1712,9 @@ static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned pin,
1712 struct pinctrl_gpio_range *range; 1712 struct pinctrl_gpio_range *range;
1713 struct gpio_chip *chip; 1713 struct gpio_chip *chip;
1714 unsigned bit; 1714 unsigned bit;
1715 1715 pin_cfg_t cfg;
1716 /* 1716 int pull, slpm, output, val, i;
1717 * The pin config contains pin number and altfunction fields, here 1717 bool lowemi, gpiomode, sleep;
1718 * we just ignore that part. It's being handled by the framework and
1719 * pinmux callback respectively.
1720 */
1721 pin_cfg_t cfg = (pin_cfg_t) config;
1722 int pull = PIN_PULL(cfg);
1723 int slpm = PIN_SLPM(cfg);
1724 int output = PIN_DIR(cfg);
1725 int val = PIN_VAL(cfg);
1726 bool lowemi = PIN_LOWEMI(cfg);
1727 bool gpiomode = PIN_GPIOMODE(cfg);
1728 bool sleep = PIN_SLEEPMODE(cfg);
1729 1718
1730 range = nmk_match_gpio_range(pctldev, pin); 1719 range = nmk_match_gpio_range(pctldev, pin);
1731 if (!range) { 1720 if (!range) {
@@ -1740,54 +1729,74 @@ static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned pin,
1740 chip = range->gc; 1729 chip = range->gc;
1741 nmk_chip = container_of(chip, struct nmk_gpio_chip, chip); 1730 nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
1742 1731
1743 if (sleep) { 1732 for (i = 0; i < num_configs; i++) {
1744 int slpm_pull = PIN_SLPM_PULL(cfg);
1745 int slpm_output = PIN_SLPM_DIR(cfg);
1746 int slpm_val = PIN_SLPM_VAL(cfg);
1747
1748 /* All pins go into GPIO mode at sleep */
1749 gpiomode = true;
1750
1751 /* 1733 /*
1752 * The SLPM_* values are normal values + 1 to allow zero to 1734 * The pin config contains pin number and altfunction fields,
1753 * mean "same as normal". 1735 * here we just ignore that part. It's being handled by the
1736 * framework and pinmux callback respectively.
1754 */ 1737 */
1755 if (slpm_pull) 1738 cfg = (pin_cfg_t) configs[i];
1756 pull = slpm_pull - 1; 1739 pull = PIN_PULL(cfg);
1757 if (slpm_output) 1740 slpm = PIN_SLPM(cfg);
1758 output = slpm_output - 1; 1741 output = PIN_DIR(cfg);
1759 if (slpm_val) 1742 val = PIN_VAL(cfg);
1760 val = slpm_val - 1; 1743 lowemi = PIN_LOWEMI(cfg);
1761 1744 gpiomode = PIN_GPIOMODE(cfg);
1762 dev_dbg(nmk_chip->chip.dev, "pin %d: sleep pull %s, dir %s, val %s\n", 1745 sleep = PIN_SLEEPMODE(cfg);
1763 pin, 1746
1764 slpm_pull ? pullnames[pull] : "same", 1747 if (sleep) {
1765 slpm_output ? (output ? "output" : "input") : "same", 1748 int slpm_pull = PIN_SLPM_PULL(cfg);
1766 slpm_val ? (val ? "high" : "low") : "same"); 1749 int slpm_output = PIN_SLPM_DIR(cfg);
1767 } 1750 int slpm_val = PIN_SLPM_VAL(cfg);
1751
1752 /* All pins go into GPIO mode at sleep */
1753 gpiomode = true;
1754
1755 /*
1756 * The SLPM_* values are normal values + 1 to allow zero
1757 * to mean "same as normal".
1758 */
1759 if (slpm_pull)
1760 pull = slpm_pull - 1;
1761 if (slpm_output)
1762 output = slpm_output - 1;
1763 if (slpm_val)
1764 val = slpm_val - 1;
1765
1766 dev_dbg(nmk_chip->chip.dev,
1767 "pin %d: sleep pull %s, dir %s, val %s\n",
1768 pin,
1769 slpm_pull ? pullnames[pull] : "same",
1770 slpm_output ? (output ? "output" : "input")
1771 : "same",
1772 slpm_val ? (val ? "high" : "low") : "same");
1773 }
1768 1774
1769 dev_dbg(nmk_chip->chip.dev, "pin %d [%#lx]: pull %s, slpm %s (%s%s), lowemi %s\n", 1775 dev_dbg(nmk_chip->chip.dev,
1770 pin, cfg, pullnames[pull], slpmnames[slpm], 1776 "pin %d [%#lx]: pull %s, slpm %s (%s%s), lowemi %s\n",
1771 output ? "output " : "input", 1777 pin, cfg, pullnames[pull], slpmnames[slpm],
1772 output ? (val ? "high" : "low") : "", 1778 output ? "output " : "input",
1773 lowemi ? "on" : "off"); 1779 output ? (val ? "high" : "low") : "",
1780 lowemi ? "on" : "off");
1774 1781
1775 clk_enable(nmk_chip->clk); 1782 clk_enable(nmk_chip->clk);
1776 bit = pin % NMK_GPIO_PER_CHIP; 1783 bit = pin % NMK_GPIO_PER_CHIP;
1777 if (gpiomode) 1784 if (gpiomode)
1778 /* No glitch when going to GPIO mode */ 1785 /* No glitch when going to GPIO mode */
1779 __nmk_gpio_set_mode(nmk_chip, bit, NMK_GPIO_ALT_GPIO); 1786 __nmk_gpio_set_mode(nmk_chip, bit, NMK_GPIO_ALT_GPIO);
1780 if (output) 1787 if (output)
1781 __nmk_gpio_make_output(nmk_chip, bit, val); 1788 __nmk_gpio_make_output(nmk_chip, bit, val);
1782 else { 1789 else {
1783 __nmk_gpio_make_input(nmk_chip, bit); 1790 __nmk_gpio_make_input(nmk_chip, bit);
1784 __nmk_gpio_set_pull(nmk_chip, bit, pull); 1791 __nmk_gpio_set_pull(nmk_chip, bit, pull);
1785 } 1792 }
1786 /* TODO: isn't this only applicable on output pins? */ 1793 /* TODO: isn't this only applicable on output pins? */
1787 __nmk_gpio_set_lowemi(nmk_chip, bit, lowemi); 1794 __nmk_gpio_set_lowemi(nmk_chip, bit, lowemi);
1795
1796 __nmk_gpio_set_slpm(nmk_chip, bit, slpm);
1797 clk_disable(nmk_chip->clk);
1798 } /* for each config */
1788 1799
1789 __nmk_gpio_set_slpm(nmk_chip, bit, slpm);
1790 clk_disable(nmk_chip->clk);
1791 return 0; 1800 return 0;
1792} 1801}
1793 1802