]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/pinctrl/pinctrl-at91.c
net: fec: call dma_mapping_error() where appropriate
[karo-tx-linux.git] / drivers / pinctrl / pinctrl-at91.c
index b90a3a0ac53432af15a64849a115823de0fedd9b..c4598dcf333c3d6050e29dfce6f6893c9ab17785 100644 (file)
@@ -144,11 +144,11 @@ struct at91_pinctrl_mux_ops {
        void (*mux_C_periph)(void __iomem *pio, unsigned mask);
        void (*mux_D_periph)(void __iomem *pio, unsigned mask);
        bool (*get_deglitch)(void __iomem *pio, unsigned pin);
-       void (*set_deglitch)(void __iomem *pio, unsigned mask, bool in_on);
+       void (*set_deglitch)(void __iomem *pio, unsigned mask, bool is_on);
        bool (*get_debounce)(void __iomem *pio, unsigned pin, u32 *div);
-       void (*set_debounce)(void __iomem *pio, unsigned mask, bool in_on, u32 div);
+       void (*set_debounce)(void __iomem *pio, unsigned mask, bool is_on, u32 div);
        bool (*get_pulldown)(void __iomem *pio, unsigned pin);
-       void (*set_pulldown)(void __iomem *pio, unsigned mask, bool in_on);
+       void (*set_pulldown)(void __iomem *pio, unsigned mask, bool is_on);
        bool (*get_schmitt_trig)(void __iomem *pio, unsigned pin);
        void (*disable_schmitt_trig)(void __iomem *pio, unsigned mask);
        /* irq */
@@ -243,7 +243,7 @@ static int at91_dt_node_to_map(struct pinctrl_dev *pctldev,
        int i;
 
        /*
-        * first find the group of this node and check if we need create
+        * first find the group of this node and check if we need to create
         * config maps for pins
         */
        grp = at91_pinctrl_find_group_by_name(info, np->name);
@@ -325,7 +325,7 @@ static void at91_mux_disable_interrupt(void __iomem *pio, unsigned mask)
 
 static unsigned at91_mux_get_pullup(void __iomem *pio, unsigned pin)
 {
-       return (readl_relaxed(pio + PIO_PUSR) >> pin) & 0x1;
+       return !((readl_relaxed(pio + PIO_PUSR) >> pin) & 0x1);
 }
 
 static void at91_mux_set_pullup(void __iomem *pio, unsigned mask, bool on)
@@ -417,6 +417,14 @@ static void at91_mux_set_deglitch(void __iomem *pio, unsigned mask, bool is_on)
        __raw_writel(mask, pio + (is_on ? PIO_IFER : PIO_IFDR));
 }
 
+static bool at91_mux_pio3_get_deglitch(void __iomem *pio, unsigned pin)
+{
+       if ((__raw_readl(pio + PIO_IFSR) >> pin) & 0x1)
+               return !((__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1);
+
+       return false;
+}
+
 static void at91_mux_pio3_set_deglitch(void __iomem *pio, unsigned mask, bool is_on)
 {
        if (is_on)
@@ -428,7 +436,8 @@ static bool at91_mux_pio3_get_debounce(void __iomem *pio, unsigned pin, u32 *div
 {
        *div = __raw_readl(pio + PIO_SCDR);
 
-       return (__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1;
+       return ((__raw_readl(pio + PIO_IFSR) >> pin) & 0x1) &&
+              ((__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1);
 }
 
 static void at91_mux_pio3_set_debounce(void __iomem *pio, unsigned mask,
@@ -438,14 +447,13 @@ static void at91_mux_pio3_set_debounce(void __iomem *pio, unsigned mask,
                __raw_writel(mask, pio + PIO_IFSCER);
                __raw_writel(div & PIO_SCDR_DIV, pio + PIO_SCDR);
                __raw_writel(mask, pio + PIO_IFER);
-       } else {
-               __raw_writel(mask, pio + PIO_IFDR);
-       }
+       } else
+               __raw_writel(mask, pio + PIO_IFSCDR);
 }
 
 static bool at91_mux_pio3_get_pulldown(void __iomem *pio, unsigned pin)
 {
-       return (__raw_readl(pio + PIO_PPDSR) >> pin) & 0x1;
+       return !((__raw_readl(pio + PIO_PPDSR) >> pin) & 0x1);
 }
 
 static void at91_mux_pio3_set_pulldown(void __iomem *pio, unsigned mask, bool is_on)
@@ -478,7 +486,7 @@ static struct at91_pinctrl_mux_ops at91sam9x5_ops = {
        .mux_B_periph   = at91_mux_pio3_set_B_periph,
        .mux_C_periph   = at91_mux_pio3_set_C_periph,
        .mux_D_periph   = at91_mux_pio3_set_D_periph,
-       .get_deglitch   = at91_mux_get_deglitch,
+       .get_deglitch   = at91_mux_pio3_get_deglitch,
        .set_deglitch   = at91_mux_pio3_set_deglitch,
        .get_debounce   = at91_mux_pio3_get_debounce,
        .set_debounce   = at91_mux_pio3_set_debounce,
@@ -564,7 +572,7 @@ static int at91_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
                info->functions[selector].name, info->groups[group].name);
 
        /* first check that all the pins of the group are valid with a valid
-        * paramter */
+        * parameter */
        for (i = 0; i < npins; i++) {
                pin = &pins_conf[i];
                ret = pin_check_config(info, info->groups[group].name, i, pin);
@@ -736,30 +744,40 @@ static int at91_pinconf_get(struct pinctrl_dev *pctldev,
 }
 
 static int at91_pinconf_set(struct pinctrl_dev *pctldev,
-                            unsigned pin_id, unsigned long config)
+                            unsigned pin_id, unsigned long *configs,
+                            unsigned num_configs)
 {
        struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
        unsigned mask;
        void __iomem *pio;
-
-       dev_dbg(info->dev, "%s:%d, pin_id=%d, config=0x%lx", __func__, __LINE__, pin_id, config);
-       pio = pin_to_controller(info, pin_to_bank(pin_id));
-       mask = pin_to_mask(pin_id % MAX_NB_GPIO_PER_BANK);
-
-       if (config & PULL_UP && config & PULL_DOWN)
-               return -EINVAL;
-
-       at91_mux_set_pullup(pio, mask, config & PULL_UP);
-       at91_mux_set_multidrive(pio, mask, config & MULTI_DRIVE);
-       if (info->ops->set_deglitch)
-               info->ops->set_deglitch(pio, mask, config & DEGLITCH);
-       if (info->ops->set_debounce)
-               info->ops->set_debounce(pio, mask, config & DEBOUNCE,
+       int i;
+       unsigned long config;
+
+       for (i = 0; i < num_configs; i++) {
+               config = configs[i];
+
+               dev_dbg(info->dev,
+                       "%s:%d, pin_id=%d, config=0x%lx",
+                       __func__, __LINE__, pin_id, config);
+               pio = pin_to_controller(info, pin_to_bank(pin_id));
+               mask = pin_to_mask(pin_id % MAX_NB_GPIO_PER_BANK);
+
+               if (config & PULL_UP && config & PULL_DOWN)
+                       return -EINVAL;
+
+               at91_mux_set_pullup(pio, mask, config & PULL_UP);
+               at91_mux_set_multidrive(pio, mask, config & MULTI_DRIVE);
+               if (info->ops->set_deglitch)
+                       info->ops->set_deglitch(pio, mask, config & DEGLITCH);
+               if (info->ops->set_debounce)
+                       info->ops->set_debounce(pio, mask, config & DEBOUNCE,
                                (config & DEBOUNCE_VAL) >> DEBOUNCE_VAL_SHIFT);
-       if (info->ops->set_pulldown)
-               info->ops->set_pulldown(pio, mask, config & PULL_DOWN);
-       if (info->ops->disable_schmitt_trig && config & DIS_SCHMIT)
-               info->ops->disable_schmitt_trig(pio, mask);
+               if (info->ops->set_pulldown)
+                       info->ops->set_pulldown(pio, mask, config & PULL_DOWN);
+               if (info->ops->disable_schmitt_trig && config & DIS_SCHMIT)
+                       info->ops->disable_schmitt_trig(pio, mask);
+
+       } /* for each config */
 
        return 0;
 }
@@ -948,7 +966,7 @@ static int at91_pinctrl_probe_dt(struct platform_device *pdev,
        at91_pinctrl_child_count(info, np);
 
        if (info->nbanks < 1) {
-               dev_err(&pdev->dev, "you need to specify atleast one gpio-controller\n");
+               dev_err(&pdev->dev, "you need to specify at least one gpio-controller\n");
                return -EINVAL;
        }
 
@@ -1241,18 +1259,22 @@ static int alt_gpio_irq_type(struct irq_data *d, unsigned type)
 
        switch (type) {
        case IRQ_TYPE_EDGE_RISING:
+               irq_set_handler(d->irq, handle_simple_irq);
                writel_relaxed(mask, pio + PIO_ESR);
                writel_relaxed(mask, pio + PIO_REHLSR);
                break;
        case IRQ_TYPE_EDGE_FALLING:
+               irq_set_handler(d->irq, handle_simple_irq);
                writel_relaxed(mask, pio + PIO_ESR);
                writel_relaxed(mask, pio + PIO_FELLSR);
                break;
        case IRQ_TYPE_LEVEL_LOW:
+               irq_set_handler(d->irq, handle_level_irq);
                writel_relaxed(mask, pio + PIO_LSR);
                writel_relaxed(mask, pio + PIO_FELLSR);
                break;
        case IRQ_TYPE_LEVEL_HIGH:
+               irq_set_handler(d->irq, handle_level_irq);
                writel_relaxed(mask, pio + PIO_LSR);
                writel_relaxed(mask, pio + PIO_REHLSR);
                break;
@@ -1261,6 +1283,7 @@ static int alt_gpio_irq_type(struct irq_data *d, unsigned type)
                 * disable additional interrupt modes:
                 * fall back to default behavior
                 */
+               irq_set_handler(d->irq, handle_simple_irq);
                writel_relaxed(mask, pio + PIO_AIMDR);
                return 0;
        case IRQ_TYPE_NONE:
@@ -1402,6 +1425,8 @@ static int at91_gpio_irq_map(struct irq_domain *h, unsigned int virq,
                                                        irq_hw_number_t hw)
 {
        struct at91_gpio_chip   *at91_gpio = h->host_data;
+       void __iomem            *pio = at91_gpio->regbase;
+       u32                     mask = 1 << hw;
 
        irq_set_lockdep_class(virq, &gpio_lock_class);
 
@@ -1409,8 +1434,13 @@ static int at91_gpio_irq_map(struct irq_domain *h, unsigned int virq,
         * Can use the "simple" and not "edge" handler since it's
         * shorter, and the AIC handles interrupts sanely.
         */
-       irq_set_chip_and_handler(virq, &gpio_irqchip,
-                                handle_simple_irq);
+       irq_set_chip(virq, &gpio_irqchip);
+       if ((at91_gpio->ops == &at91sam9x5_ops) &&
+           (readl_relaxed(pio + PIO_AIMMR) & mask) &&
+           (readl_relaxed(pio + PIO_ELSR) & mask))
+               irq_set_handler(virq, handle_level_irq);
+       else
+               irq_set_handler(virq, handle_simple_irq);
        set_irq_flags(virq, IRQF_VALID);
        irq_set_chip_data(virq, at91_gpio);
 
@@ -1473,7 +1503,7 @@ static int at91_gpio_of_irq_setup(struct device_node *node,
        if (at91_gpio->pioc_idx)
                prev = gpio_chips[at91_gpio->pioc_idx - 1];
 
-       /* The toplevel handler handles one bank of GPIOs, except
+       /* The top level handler handles one bank of GPIOs, except
         * on some SoC it can handles up to three...
         * We only set up the handler for the first of the list.
         */
@@ -1649,7 +1679,7 @@ static struct platform_driver at91_gpio_driver = {
        .driver = {
                .name = "gpio-at91",
                .owner = THIS_MODULE,
-               .of_match_table = of_match_ptr(at91_gpio_of_match),
+               .of_match_table = at91_gpio_of_match,
        },
        .probe = at91_gpio_probe,
 };
@@ -1658,7 +1688,7 @@ static struct platform_driver at91_pinctrl_driver = {
        .driver = {
                .name = "pinctrl-at91",
                .owner = THIS_MODULE,
-               .of_match_table = of_match_ptr(at91_pinctrl_of_match),
+               .of_match_table = at91_pinctrl_of_match,
        },
        .probe = at91_pinctrl_probe,
        .remove = at91_pinctrl_remove,