diff options
Diffstat (limited to 'drivers/pinctrl/pinctrl-nomadik.c')
-rw-r--r-- | drivers/pinctrl/pinctrl-nomadik.c | 125 |
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 | ||
1697 | static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned pin, | 1697 | static 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 | ||