diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/pinctrl/core.c | 2 | ||||
| -rw-r--r-- | drivers/pinctrl/pinctrl-at91.c | 2 | ||||
| -rw-r--r-- | drivers/pinctrl/pinctrl-imx53.c | 2 | ||||
| -rw-r--r-- | drivers/pinctrl/pinctrl-nomadik.c | 11 | ||||
| -rw-r--r-- | drivers/pinctrl/pinctrl-sirf.c | 48 |
5 files changed, 61 insertions, 4 deletions
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 5cdee8669ea3..59f5a965bdc4 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
| @@ -700,7 +700,7 @@ static struct pinctrl *create_pinctrl(struct device *dev) | |||
| 700 | } | 700 | } |
| 701 | } | 701 | } |
| 702 | 702 | ||
| 703 | /* Add the pinmux to the global list */ | 703 | /* Add the pinctrl handle to the global list */ |
| 704 | list_add_tail(&p->node, &pinctrl_list); | 704 | list_add_tail(&p->node, &pinctrl_list); |
| 705 | 705 | ||
| 706 | return p; | 706 | return p; |
diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c index c5e757157183..bff54bfaff43 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c | |||
| @@ -265,7 +265,7 @@ static int at91_dt_node_to_map(struct pinctrl_dev *pctldev, | |||
| 265 | /* create mux map */ | 265 | /* create mux map */ |
| 266 | parent = of_get_parent(np); | 266 | parent = of_get_parent(np); |
| 267 | if (!parent) { | 267 | if (!parent) { |
| 268 | kfree(new_map); | 268 | devm_kfree(pctldev->dev, new_map); |
| 269 | return -EINVAL; | 269 | return -EINVAL; |
| 270 | } | 270 | } |
| 271 | new_map[0].type = PIN_MAP_TYPE_MUX_GROUP; | 271 | new_map[0].type = PIN_MAP_TYPE_MUX_GROUP; |
diff --git a/drivers/pinctrl/pinctrl-imx53.c b/drivers/pinctrl/pinctrl-imx53.c index ec4048691775..af571dc3dc63 100644 --- a/drivers/pinctrl/pinctrl-imx53.c +++ b/drivers/pinctrl/pinctrl-imx53.c | |||
| @@ -1371,7 +1371,7 @@ static struct imx_pin_reg imx53_pin_regs[] = { | |||
| 1371 | IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 0, 0x7F8, 1), /* MX53_PAD_GPIO_8__ESAI1_TX5_RX0 */ | 1371 | IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 0, 0x7F8, 1), /* MX53_PAD_GPIO_8__ESAI1_TX5_RX0 */ |
| 1372 | IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 1, 0x000, 0), /* MX53_PAD_GPIO_8__GPIO1_8 */ | 1372 | IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 1, 0x000, 0), /* MX53_PAD_GPIO_8__GPIO1_8 */ |
| 1373 | IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 2, 0x000, 0), /* MX53_PAD_GPIO_8__EPIT2_EPITO */ | 1373 | IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 2, 0x000, 0), /* MX53_PAD_GPIO_8__EPIT2_EPITO */ |
| 1374 | IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 3, 0x760, 3), /* MX53_PAD_GPIO_8__CAN1_RXCAN */ | 1374 | IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 3, 0x760, 2), /* MX53_PAD_GPIO_8__CAN1_RXCAN */ |
| 1375 | IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 4, 0x880, 5), /* MX53_PAD_GPIO_8__UART2_RXD_MUX */ | 1375 | IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 4, 0x880, 5), /* MX53_PAD_GPIO_8__UART2_RXD_MUX */ |
| 1376 | IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 5, 0x000, 0), /* MX53_PAD_GPIO_8__FIRI_TXD */ | 1376 | IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 5, 0x000, 0), /* MX53_PAD_GPIO_8__FIRI_TXD */ |
| 1377 | IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 6, 0x000, 0), /* MX53_PAD_GPIO_8__SPDIF_SRCLK */ | 1377 | IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 6, 0x000, 0), /* MX53_PAD_GPIO_8__SPDIF_SRCLK */ |
diff --git a/drivers/pinctrl/pinctrl-nomadik.c b/drivers/pinctrl/pinctrl-nomadik.c index ef66f98e9202..015b093287a4 100644 --- a/drivers/pinctrl/pinctrl-nomadik.c +++ b/drivers/pinctrl/pinctrl-nomadik.c | |||
| @@ -259,6 +259,9 @@ static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct, | |||
| 259 | const struct prcm_gpiocr_altcx_pin_desc *pin_desc; | 259 | const struct prcm_gpiocr_altcx_pin_desc *pin_desc; |
| 260 | const u16 *gpiocr_regs; | 260 | const u16 *gpiocr_regs; |
| 261 | 261 | ||
| 262 | if (!npct->prcm_base) | ||
| 263 | return; | ||
| 264 | |||
| 262 | if (alt_num > PRCM_IDX_GPIOCR_ALTC_MAX) { | 265 | if (alt_num > PRCM_IDX_GPIOCR_ALTC_MAX) { |
| 263 | dev_err(npct->dev, "PRCM GPIOCR: alternate-C%i is invalid\n", | 266 | dev_err(npct->dev, "PRCM GPIOCR: alternate-C%i is invalid\n", |
| 264 | alt_num); | 267 | alt_num); |
| @@ -682,6 +685,9 @@ static int nmk_prcm_gpiocr_get_mode(struct pinctrl_dev *pctldev, int gpio) | |||
| 682 | const struct prcm_gpiocr_altcx_pin_desc *pin_desc; | 685 | const struct prcm_gpiocr_altcx_pin_desc *pin_desc; |
| 683 | const u16 *gpiocr_regs; | 686 | const u16 *gpiocr_regs; |
| 684 | 687 | ||
| 688 | if (!npct->prcm_base) | ||
| 689 | return NMK_GPIO_ALT_C; | ||
| 690 | |||
| 685 | for (i = 0; i < npct->soc->npins_altcx; i++) { | 691 | for (i = 0; i < npct->soc->npins_altcx; i++) { |
| 686 | if (npct->soc->altcx_pins[i].pin == gpio) | 692 | if (npct->soc->altcx_pins[i].pin == gpio) |
| 687 | break; | 693 | break; |
| @@ -1887,9 +1893,12 @@ static int __devinit nmk_pinctrl_probe(struct platform_device *pdev) | |||
| 1887 | "failed to ioremap PRCM registers\n"); | 1893 | "failed to ioremap PRCM registers\n"); |
| 1888 | return -ENOMEM; | 1894 | return -ENOMEM; |
| 1889 | } | 1895 | } |
| 1890 | } else { | 1896 | } else if (version == PINCTRL_NMK_STN8815) { |
| 1891 | dev_info(&pdev->dev, | 1897 | dev_info(&pdev->dev, |
| 1892 | "No PRCM base, assume no ALT-Cx control is available\n"); | 1898 | "No PRCM base, assume no ALT-Cx control is available\n"); |
| 1899 | } else { | ||
| 1900 | dev_err(&pdev->dev, "missing PRCM base address\n"); | ||
| 1901 | return -EINVAL; | ||
| 1893 | } | 1902 | } |
| 1894 | 1903 | ||
| 1895 | /* | 1904 | /* |
diff --git a/drivers/pinctrl/pinctrl-sirf.c b/drivers/pinctrl/pinctrl-sirf.c index a4f0c5e487d5..30e1a38293a0 100644 --- a/drivers/pinctrl/pinctrl-sirf.c +++ b/drivers/pinctrl/pinctrl-sirf.c | |||
| @@ -1663,6 +1663,44 @@ const struct irq_domain_ops sirfsoc_gpio_irq_simple_ops = { | |||
| 1663 | .xlate = irq_domain_xlate_twocell, | 1663 | .xlate = irq_domain_xlate_twocell, |
| 1664 | }; | 1664 | }; |
| 1665 | 1665 | ||
| 1666 | static void sirfsoc_gpio_set_pullup(const u32 *pullups) | ||
| 1667 | { | ||
| 1668 | int i, n; | ||
| 1669 | const unsigned long *p = (const unsigned long *)pullups; | ||
| 1670 | |||
| 1671 | for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) { | ||
| 1672 | n = find_first_bit(p + i, BITS_PER_LONG); | ||
| 1673 | while (n < BITS_PER_LONG) { | ||
| 1674 | u32 offset = SIRFSOC_GPIO_CTRL(i, n); | ||
| 1675 | u32 val = readl(sgpio_bank[i].chip.regs + offset); | ||
| 1676 | val |= SIRFSOC_GPIO_CTL_PULL_MASK; | ||
| 1677 | val |= SIRFSOC_GPIO_CTL_PULL_HIGH; | ||
| 1678 | writel(val, sgpio_bank[i].chip.regs + offset); | ||
| 1679 | |||
| 1680 | n = find_next_bit(p + i, BITS_PER_LONG, n + 1); | ||
| 1681 | } | ||
| 1682 | } | ||
| 1683 | } | ||
| 1684 | |||
| 1685 | static void sirfsoc_gpio_set_pulldown(const u32 *pulldowns) | ||
| 1686 | { | ||
| 1687 | int i, n; | ||
| 1688 | const unsigned long *p = (const unsigned long *)pulldowns; | ||
| 1689 | |||
| 1690 | for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) { | ||
| 1691 | n = find_first_bit(p + i, BITS_PER_LONG); | ||
| 1692 | while (n < BITS_PER_LONG) { | ||
| 1693 | u32 offset = SIRFSOC_GPIO_CTRL(i, n); | ||
| 1694 | u32 val = readl(sgpio_bank[i].chip.regs + offset); | ||
| 1695 | val |= SIRFSOC_GPIO_CTL_PULL_MASK; | ||
| 1696 | val &= ~SIRFSOC_GPIO_CTL_PULL_HIGH; | ||
| 1697 | writel(val, sgpio_bank[i].chip.regs + offset); | ||
| 1698 | |||
| 1699 | n = find_next_bit(p + i, BITS_PER_LONG, n + 1); | ||
| 1700 | } | ||
| 1701 | } | ||
| 1702 | } | ||
| 1703 | |||
| 1666 | static int __devinit sirfsoc_gpio_probe(struct device_node *np) | 1704 | static int __devinit sirfsoc_gpio_probe(struct device_node *np) |
| 1667 | { | 1705 | { |
| 1668 | int i, err = 0; | 1706 | int i, err = 0; |
| @@ -1671,6 +1709,8 @@ static int __devinit sirfsoc_gpio_probe(struct device_node *np) | |||
| 1671 | struct platform_device *pdev; | 1709 | struct platform_device *pdev; |
| 1672 | bool is_marco = false; | 1710 | bool is_marco = false; |
| 1673 | 1711 | ||
| 1712 | u32 pullups[SIRFSOC_GPIO_NO_OF_BANKS], pulldowns[SIRFSOC_GPIO_NO_OF_BANKS]; | ||
| 1713 | |||
| 1674 | pdev = of_find_device_by_node(np); | 1714 | pdev = of_find_device_by_node(np); |
| 1675 | if (!pdev) | 1715 | if (!pdev) |
| 1676 | return -ENODEV; | 1716 | return -ENODEV; |
| @@ -1726,6 +1766,14 @@ static int __devinit sirfsoc_gpio_probe(struct device_node *np) | |||
| 1726 | irq_set_handler_data(bank->parent_irq, bank); | 1766 | irq_set_handler_data(bank->parent_irq, bank); |
| 1727 | } | 1767 | } |
| 1728 | 1768 | ||
| 1769 | if (!of_property_read_u32_array(np, "sirf,pullups", pullups, | ||
| 1770 | SIRFSOC_GPIO_NO_OF_BANKS)) | ||
| 1771 | sirfsoc_gpio_set_pullup(pullups); | ||
| 1772 | |||
| 1773 | if (!of_property_read_u32_array(np, "sirf,pulldowns", pulldowns, | ||
| 1774 | SIRFSOC_GPIO_NO_OF_BANKS)) | ||
| 1775 | sirfsoc_gpio_set_pulldown(pulldowns); | ||
| 1776 | |||
| 1729 | return 0; | 1777 | return 0; |
| 1730 | 1778 | ||
| 1731 | out: | 1779 | out: |
