aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r--drivers/pinctrl/Kconfig2
-rw-r--r--drivers/pinctrl/core.c8
-rw-r--r--drivers/pinctrl/pinctrl-at91.c10
-rw-r--r--drivers/pinctrl/pinctrl-capri.c2
-rw-r--r--drivers/pinctrl/pinctrl-imx1-core.c10
-rw-r--r--drivers/pinctrl/pinctrl-sunxi.c6
-rw-r--r--drivers/pinctrl/pinctrl-sunxi.h6
-rw-r--r--drivers/pinctrl/pinctrl-tegra.c2
-rw-r--r--drivers/pinctrl/sh-pfc/pfc-r8a7791.c6
-rw-r--r--drivers/pinctrl/sirf/pinctrl-prima2.c2
-rw-r--r--drivers/pinctrl/sirf/pinctrl-sirf.c4
-rw-r--r--drivers/pinctrl/vt8500/pinctrl-wmt.c15
12 files changed, 48 insertions, 25 deletions
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
index be361b7cd30f..1e4e69384baa 100644
--- a/drivers/pinctrl/Kconfig
+++ b/drivers/pinctrl/Kconfig
@@ -217,7 +217,7 @@ config PINCTRL_IMX28
217 select PINCTRL_MXS 217 select PINCTRL_MXS
218 218
219config PINCTRL_MSM 219config PINCTRL_MSM
220 tristate 220 bool
221 select PINMUX 221 select PINMUX
222 select PINCONF 222 select PINCONF
223 select GENERIC_PINCONF 223 select GENERIC_PINCONF
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
index 5ee61a470016..c0fe6091566a 100644
--- a/drivers/pinctrl/core.c
+++ b/drivers/pinctrl/core.c
@@ -851,7 +851,9 @@ static struct pinctrl *create_pinctrl(struct device *dev)
851 kref_init(&p->users); 851 kref_init(&p->users);
852 852
853 /* Add the pinctrl handle to the global list */ 853 /* Add the pinctrl handle to the global list */
854 mutex_lock(&pinctrl_list_mutex);
854 list_add_tail(&p->node, &pinctrl_list); 855 list_add_tail(&p->node, &pinctrl_list);
856 mutex_unlock(&pinctrl_list_mutex);
855 857
856 return p; 858 return p;
857} 859}
@@ -1642,8 +1644,10 @@ static void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev)
1642 device_root, pctldev, &pinctrl_groups_ops); 1644 device_root, pctldev, &pinctrl_groups_ops);
1643 debugfs_create_file("gpio-ranges", S_IFREG | S_IRUGO, 1645 debugfs_create_file("gpio-ranges", S_IFREG | S_IRUGO,
1644 device_root, pctldev, &pinctrl_gpioranges_ops); 1646 device_root, pctldev, &pinctrl_gpioranges_ops);
1645 pinmux_init_device_debugfs(device_root, pctldev); 1647 if (pctldev->desc->pmxops)
1646 pinconf_init_device_debugfs(device_root, pctldev); 1648 pinmux_init_device_debugfs(device_root, pctldev);
1649 if (pctldev->desc->confops)
1650 pinconf_init_device_debugfs(device_root, pctldev);
1647} 1651}
1648 1652
1649static void pinctrl_remove_device_debugfs(struct pinctrl_dev *pctldev) 1653static void pinctrl_remove_device_debugfs(struct pinctrl_dev *pctldev)
diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c
index 38c6f8b9790e..d990e33d8aa7 100644
--- a/drivers/pinctrl/pinctrl-at91.c
+++ b/drivers/pinctrl/pinctrl-at91.c
@@ -1286,22 +1286,22 @@ static int alt_gpio_irq_type(struct irq_data *d, unsigned type)
1286 1286
1287 switch (type) { 1287 switch (type) {
1288 case IRQ_TYPE_EDGE_RISING: 1288 case IRQ_TYPE_EDGE_RISING:
1289 irq_set_handler(d->irq, handle_simple_irq); 1289 __irq_set_handler_locked(d->irq, handle_simple_irq);
1290 writel_relaxed(mask, pio + PIO_ESR); 1290 writel_relaxed(mask, pio + PIO_ESR);
1291 writel_relaxed(mask, pio + PIO_REHLSR); 1291 writel_relaxed(mask, pio + PIO_REHLSR);
1292 break; 1292 break;
1293 case IRQ_TYPE_EDGE_FALLING: 1293 case IRQ_TYPE_EDGE_FALLING:
1294 irq_set_handler(d->irq, handle_simple_irq); 1294 __irq_set_handler_locked(d->irq, handle_simple_irq);
1295 writel_relaxed(mask, pio + PIO_ESR); 1295 writel_relaxed(mask, pio + PIO_ESR);
1296 writel_relaxed(mask, pio + PIO_FELLSR); 1296 writel_relaxed(mask, pio + PIO_FELLSR);
1297 break; 1297 break;
1298 case IRQ_TYPE_LEVEL_LOW: 1298 case IRQ_TYPE_LEVEL_LOW:
1299 irq_set_handler(d->irq, handle_level_irq); 1299 __irq_set_handler_locked(d->irq, handle_level_irq);
1300 writel_relaxed(mask, pio + PIO_LSR); 1300 writel_relaxed(mask, pio + PIO_LSR);
1301 writel_relaxed(mask, pio + PIO_FELLSR); 1301 writel_relaxed(mask, pio + PIO_FELLSR);
1302 break; 1302 break;
1303 case IRQ_TYPE_LEVEL_HIGH: 1303 case IRQ_TYPE_LEVEL_HIGH:
1304 irq_set_handler(d->irq, handle_level_irq); 1304 __irq_set_handler_locked(d->irq, handle_level_irq);
1305 writel_relaxed(mask, pio + PIO_LSR); 1305 writel_relaxed(mask, pio + PIO_LSR);
1306 writel_relaxed(mask, pio + PIO_REHLSR); 1306 writel_relaxed(mask, pio + PIO_REHLSR);
1307 break; 1307 break;
@@ -1310,7 +1310,7 @@ static int alt_gpio_irq_type(struct irq_data *d, unsigned type)
1310 * disable additional interrupt modes: 1310 * disable additional interrupt modes:
1311 * fall back to default behavior 1311 * fall back to default behavior
1312 */ 1312 */
1313 irq_set_handler(d->irq, handle_simple_irq); 1313 __irq_set_handler_locked(d->irq, handle_simple_irq);
1314 writel_relaxed(mask, pio + PIO_AIMDR); 1314 writel_relaxed(mask, pio + PIO_AIMDR);
1315 return 0; 1315 return 0;
1316 case IRQ_TYPE_NONE: 1316 case IRQ_TYPE_NONE:
diff --git a/drivers/pinctrl/pinctrl-capri.c b/drivers/pinctrl/pinctrl-capri.c
index 4669c53f99b0..eb2500212147 100644
--- a/drivers/pinctrl/pinctrl-capri.c
+++ b/drivers/pinctrl/pinctrl-capri.c
@@ -1435,7 +1435,7 @@ int __init capri_pinctrl_probe(struct platform_device *pdev)
1435} 1435}
1436 1436
1437static struct of_device_id capri_pinctrl_of_match[] = { 1437static struct of_device_id capri_pinctrl_of_match[] = {
1438 { .compatible = "brcm,capri-pinctrl", }, 1438 { .compatible = "brcm,bcm11351-pinctrl", },
1439 { }, 1439 { },
1440}; 1440};
1441 1441
diff --git a/drivers/pinctrl/pinctrl-imx1-core.c b/drivers/pinctrl/pinctrl-imx1-core.c
index 17aecde1b51d..815384b377b5 100644
--- a/drivers/pinctrl/pinctrl-imx1-core.c
+++ b/drivers/pinctrl/pinctrl-imx1-core.c
@@ -45,7 +45,7 @@ struct imx1_pinctrl {
45#define MX1_DDIR 0x00 45#define MX1_DDIR 0x00
46#define MX1_OCR 0x04 46#define MX1_OCR 0x04
47#define MX1_ICONFA 0x0c 47#define MX1_ICONFA 0x0c
48#define MX1_ICONFB 0x10 48#define MX1_ICONFB 0x14
49#define MX1_GIUS 0x20 49#define MX1_GIUS 0x20
50#define MX1_GPR 0x38 50#define MX1_GPR 0x38
51#define MX1_PUEN 0x40 51#define MX1_PUEN 0x40
@@ -97,13 +97,13 @@ static void imx1_write_2bit(struct imx1_pinctrl *ipctl, unsigned int pin_id,
97 u32 old_val; 97 u32 old_val;
98 u32 new_val; 98 u32 new_val;
99 99
100 dev_dbg(ipctl->dev, "write: register 0x%p offset %d value 0x%x\n",
101 reg, offset, value);
102
103 /* Use the next register if the pin's port pin number is >=16 */ 100 /* Use the next register if the pin's port pin number is >=16 */
104 if (pin_id % 32 >= 16) 101 if (pin_id % 32 >= 16)
105 reg += 0x04; 102 reg += 0x04;
106 103
104 dev_dbg(ipctl->dev, "write: register 0x%p offset %d value 0x%x\n",
105 reg, offset, value);
106
107 /* Get current state of pins */ 107 /* Get current state of pins */
108 old_val = readl(reg); 108 old_val = readl(reg);
109 old_val &= mask; 109 old_val &= mask;
@@ -139,7 +139,7 @@ static int imx1_read_2bit(struct imx1_pinctrl *ipctl, unsigned int pin_id,
139 u32 reg_offset) 139 u32 reg_offset)
140{ 140{
141 void __iomem *reg = imx1_mem(ipctl, pin_id) + reg_offset; 141 void __iomem *reg = imx1_mem(ipctl, pin_id) + reg_offset;
142 int offset = pin_id % 16; 142 int offset = (pin_id % 16) * 2;
143 143
144 /* Use the next register if the pin's port pin number is >=16 */ 144 /* Use the next register if the pin's port pin number is >=16 */
145 if (pin_id % 32 >= 16) 145 if (pin_id % 32 >= 16)
diff --git a/drivers/pinctrl/pinctrl-sunxi.c b/drivers/pinctrl/pinctrl-sunxi.c
index 9ccf681dad2f..f9fabe9bf47d 100644
--- a/drivers/pinctrl/pinctrl-sunxi.c
+++ b/drivers/pinctrl/pinctrl-sunxi.c
@@ -14,6 +14,7 @@
14#include <linux/clk.h> 14#include <linux/clk.h>
15#include <linux/gpio.h> 15#include <linux/gpio.h>
16#include <linux/irqdomain.h> 16#include <linux/irqdomain.h>
17#include <linux/irqchip/chained_irq.h>
17#include <linux/module.h> 18#include <linux/module.h>
18#include <linux/of.h> 19#include <linux/of.h>
19#include <linux/of_address.h> 20#include <linux/of_address.h>
@@ -584,7 +585,7 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d,
584 spin_lock_irqsave(&pctl->lock, flags); 585 spin_lock_irqsave(&pctl->lock, flags);
585 586
586 regval = readl(pctl->membase + reg); 587 regval = readl(pctl->membase + reg);
587 regval &= ~IRQ_CFG_IRQ_MASK; 588 regval &= ~(IRQ_CFG_IRQ_MASK << index);
588 writel(regval | (mode << index), pctl->membase + reg); 589 writel(regval | (mode << index), pctl->membase + reg);
589 590
590 spin_unlock_irqrestore(&pctl->lock, flags); 591 spin_unlock_irqrestore(&pctl->lock, flags);
@@ -665,6 +666,7 @@ static struct irq_chip sunxi_pinctrl_irq_chip = {
665 666
666static void sunxi_pinctrl_irq_handler(unsigned irq, struct irq_desc *desc) 667static void sunxi_pinctrl_irq_handler(unsigned irq, struct irq_desc *desc)
667{ 668{
669 struct irq_chip *chip = irq_get_chip(irq);
668 struct sunxi_pinctrl *pctl = irq_get_handler_data(irq); 670 struct sunxi_pinctrl *pctl = irq_get_handler_data(irq);
669 const unsigned long reg = readl(pctl->membase + IRQ_STATUS_REG); 671 const unsigned long reg = readl(pctl->membase + IRQ_STATUS_REG);
670 672
@@ -674,10 +676,12 @@ static void sunxi_pinctrl_irq_handler(unsigned irq, struct irq_desc *desc)
674 if (reg) { 676 if (reg) {
675 int irqoffset; 677 int irqoffset;
676 678
679 chained_irq_enter(chip, desc);
677 for_each_set_bit(irqoffset, &reg, SUNXI_IRQ_NUMBER) { 680 for_each_set_bit(irqoffset, &reg, SUNXI_IRQ_NUMBER) {
678 int pin_irq = irq_find_mapping(pctl->domain, irqoffset); 681 int pin_irq = irq_find_mapping(pctl->domain, irqoffset);
679 generic_handle_irq(pin_irq); 682 generic_handle_irq(pin_irq);
680 } 683 }
684 chained_irq_exit(chip, desc);
681 } 685 }
682} 686}
683 687
diff --git a/drivers/pinctrl/pinctrl-sunxi.h b/drivers/pinctrl/pinctrl-sunxi.h
index 01c494f8a14f..552b0e97077a 100644
--- a/drivers/pinctrl/pinctrl-sunxi.h
+++ b/drivers/pinctrl/pinctrl-sunxi.h
@@ -511,7 +511,7 @@ static inline u32 sunxi_pull_offset(u16 pin)
511 511
512static inline u32 sunxi_irq_cfg_reg(u16 irq) 512static inline u32 sunxi_irq_cfg_reg(u16 irq)
513{ 513{
514 u8 reg = irq / IRQ_CFG_IRQ_PER_REG; 514 u8 reg = irq / IRQ_CFG_IRQ_PER_REG * 0x04;
515 return reg + IRQ_CFG_REG; 515 return reg + IRQ_CFG_REG;
516} 516}
517 517
@@ -523,7 +523,7 @@ static inline u32 sunxi_irq_cfg_offset(u16 irq)
523 523
524static inline u32 sunxi_irq_ctrl_reg(u16 irq) 524static inline u32 sunxi_irq_ctrl_reg(u16 irq)
525{ 525{
526 u8 reg = irq / IRQ_CTRL_IRQ_PER_REG; 526 u8 reg = irq / IRQ_CTRL_IRQ_PER_REG * 0x04;
527 return reg + IRQ_CTRL_REG; 527 return reg + IRQ_CTRL_REG;
528} 528}
529 529
@@ -535,7 +535,7 @@ static inline u32 sunxi_irq_ctrl_offset(u16 irq)
535 535
536static inline u32 sunxi_irq_status_reg(u16 irq) 536static inline u32 sunxi_irq_status_reg(u16 irq)
537{ 537{
538 u8 reg = irq / IRQ_STATUS_IRQ_PER_REG; 538 u8 reg = irq / IRQ_STATUS_IRQ_PER_REG * 0x04;
539 return reg + IRQ_STATUS_REG; 539 return reg + IRQ_STATUS_REG;
540} 540}
541 541
diff --git a/drivers/pinctrl/pinctrl-tegra.c b/drivers/pinctrl/pinctrl-tegra.c
index a2e93a2b5ff4..e767355ab0ad 100644
--- a/drivers/pinctrl/pinctrl-tegra.c
+++ b/drivers/pinctrl/pinctrl-tegra.c
@@ -645,7 +645,7 @@ int tegra_pinctrl_probe(struct platform_device *pdev,
645 GFP_KERNEL); 645 GFP_KERNEL);
646 if (!pmx->regs) { 646 if (!pmx->regs) {
647 dev_err(&pdev->dev, "Can't alloc regs pointer\n"); 647 dev_err(&pdev->dev, "Can't alloc regs pointer\n");
648 return -ENODEV; 648 return -ENOMEM;
649 } 649 }
650 650
651 for (i = 0; i < pmx->nbanks; i++) { 651 for (i = 0; i < pmx->nbanks; i++) {
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c
index 77d103fe39d9..567d6918d50b 100644
--- a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c
+++ b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c
@@ -89,7 +89,8 @@ enum {
89 89
90 /* GPSR6 */ 90 /* GPSR6 */
91 FN_IP13_10, FN_IP13_11, FN_IP13_12, FN_IP13_13, FN_IP13_14, 91 FN_IP13_10, FN_IP13_11, FN_IP13_12, FN_IP13_13, FN_IP13_14,
92 FN_IP13_15, FN_IP13_18_16, FN_IP13_21_19, FN_IP13_22, FN_IP13_24_23, 92 FN_IP13_15, FN_IP13_18_16, FN_IP13_21_19,
93 FN_IP13_22, FN_IP13_24_23, FN_SD1_CLK,
93 FN_IP13_25, FN_IP13_26, FN_IP13_27, FN_IP13_30_28, FN_IP14_1_0, 94 FN_IP13_25, FN_IP13_26, FN_IP13_27, FN_IP13_30_28, FN_IP14_1_0,
94 FN_IP14_2, FN_IP14_3, FN_IP14_4, FN_IP14_5, FN_IP14_6, FN_IP14_7, 95 FN_IP14_2, FN_IP14_3, FN_IP14_4, FN_IP14_5, FN_IP14_6, FN_IP14_7,
95 FN_IP14_10_8, FN_IP14_13_11, FN_IP14_16_14, FN_IP14_19_17, 96 FN_IP14_10_8, FN_IP14_13_11, FN_IP14_16_14, FN_IP14_19_17,
@@ -788,6 +789,7 @@ static const u16 pinmux_data[] = {
788 PINMUX_DATA(USB1_PWEN_MARK, FN_USB1_PWEN), 789 PINMUX_DATA(USB1_PWEN_MARK, FN_USB1_PWEN),
789 PINMUX_DATA(USB1_OVC_MARK, FN_USB1_OVC), 790 PINMUX_DATA(USB1_OVC_MARK, FN_USB1_OVC),
790 PINMUX_DATA(DU0_DOTCLKIN_MARK, FN_DU0_DOTCLKIN), 791 PINMUX_DATA(DU0_DOTCLKIN_MARK, FN_DU0_DOTCLKIN),
792 PINMUX_DATA(SD1_CLK_MARK, FN_SD1_CLK),
791 793
792 /* IPSR0 */ 794 /* IPSR0 */
793 PINMUX_IPSR_DATA(IP0_0, D0), 795 PINMUX_IPSR_DATA(IP0_0, D0),
@@ -3825,7 +3827,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = {
3825 GP_6_11_FN, FN_IP13_25, 3827 GP_6_11_FN, FN_IP13_25,
3826 GP_6_10_FN, FN_IP13_24_23, 3828 GP_6_10_FN, FN_IP13_24_23,
3827 GP_6_9_FN, FN_IP13_22, 3829 GP_6_9_FN, FN_IP13_22,
3828 0, 0, 3830 GP_6_8_FN, FN_SD1_CLK,
3829 GP_6_7_FN, FN_IP13_21_19, 3831 GP_6_7_FN, FN_IP13_21_19,
3830 GP_6_6_FN, FN_IP13_18_16, 3832 GP_6_6_FN, FN_IP13_18_16,
3831 GP_6_5_FN, FN_IP13_15, 3833 GP_6_5_FN, FN_IP13_15,
diff --git a/drivers/pinctrl/sirf/pinctrl-prima2.c b/drivers/pinctrl/sirf/pinctrl-prima2.c
index 37b42651d76a..dde0285544d6 100644
--- a/drivers/pinctrl/sirf/pinctrl-prima2.c
+++ b/drivers/pinctrl/sirf/pinctrl-prima2.c
@@ -413,7 +413,7 @@ static const struct sirfsoc_padmux ac97_padmux = {
413 .funcval = 0, 413 .funcval = 0,
414}; 414};
415 415
416static const unsigned ac97_pins[] = { 33, 34, 35, 36 }; 416static const unsigned ac97_pins[] = { 43, 44, 45, 46 };
417 417
418static const struct sirfsoc_muxmask spi1_muxmask[] = { 418static const struct sirfsoc_muxmask spi1_muxmask[] = {
419 { 419 {
diff --git a/drivers/pinctrl/sirf/pinctrl-sirf.c b/drivers/pinctrl/sirf/pinctrl-sirf.c
index a0d6152701cd..617a4916b50f 100644
--- a/drivers/pinctrl/sirf/pinctrl-sirf.c
+++ b/drivers/pinctrl/sirf/pinctrl-sirf.c
@@ -598,7 +598,7 @@ static unsigned int sirfsoc_gpio_irq_startup(struct irq_data *d)
598{ 598{
599 struct sirfsoc_gpio_bank *bank = irq_data_get_irq_chip_data(d); 599 struct sirfsoc_gpio_bank *bank = irq_data_get_irq_chip_data(d);
600 600
601 if (gpio_lock_as_irq(&bank->chip.gc, d->hwirq)) 601 if (gpio_lock_as_irq(&bank->chip.gc, d->hwirq % SIRFSOC_GPIO_BANK_SIZE))
602 dev_err(bank->chip.gc.dev, 602 dev_err(bank->chip.gc.dev,
603 "unable to lock HW IRQ %lu for IRQ\n", 603 "unable to lock HW IRQ %lu for IRQ\n",
604 d->hwirq); 604 d->hwirq);
@@ -611,7 +611,7 @@ static void sirfsoc_gpio_irq_shutdown(struct irq_data *d)
611 struct sirfsoc_gpio_bank *bank = irq_data_get_irq_chip_data(d); 611 struct sirfsoc_gpio_bank *bank = irq_data_get_irq_chip_data(d);
612 612
613 sirfsoc_gpio_irq_mask(d); 613 sirfsoc_gpio_irq_mask(d);
614 gpio_unlock_as_irq(&bank->chip.gc, d->hwirq); 614 gpio_unlock_as_irq(&bank->chip.gc, d->hwirq % SIRFSOC_GPIO_BANK_SIZE);
615} 615}
616 616
617static struct irq_chip sirfsoc_irq_chip = { 617static struct irq_chip sirfsoc_irq_chip = {
diff --git a/drivers/pinctrl/vt8500/pinctrl-wmt.c b/drivers/pinctrl/vt8500/pinctrl-wmt.c
index b28d1af9c232..9802b67040cc 100644
--- a/drivers/pinctrl/vt8500/pinctrl-wmt.c
+++ b/drivers/pinctrl/vt8500/pinctrl-wmt.c
@@ -276,7 +276,20 @@ static int wmt_pctl_dt_node_to_map_pull(struct wmt_pinctrl_data *data,
276 if (!configs) 276 if (!configs)
277 return -ENOMEM; 277 return -ENOMEM;
278 278
279 configs[0] = pull; 279 switch (pull) {
280 case 0:
281 configs[0] = PIN_CONFIG_BIAS_DISABLE;
282 break;
283 case 1:
284 configs[0] = PIN_CONFIG_BIAS_PULL_DOWN;
285 break;
286 case 2:
287 configs[0] = PIN_CONFIG_BIAS_PULL_UP;
288 break;
289 default:
290 configs[0] = PIN_CONFIG_BIAS_DISABLE;
291 dev_err(data->dev, "invalid pull state %d - disabling\n", pull);
292 }
280 293
281 map->type = PIN_MAP_TYPE_CONFIGS_PIN; 294 map->type = PIN_MAP_TYPE_CONFIGS_PIN;
282 map->data.configs.group_or_pin = data->groups[group]; 295 map->data.configs.group_or_pin = data->groups[group];