sh-pfc: Add function to retrieve a pin instance from its pin number
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Thu, 14 Feb 2013 21:35:09 +0000 (22:35 +0100)
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Fri, 15 Mar 2013 12:33:39 +0000 (13:33 +0100)
This prepares support for sparse pin numbering. The function currently
just performs and indexed lookup in the pins array.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/sh-pfc/core.c
drivers/pinctrl/sh-pfc/core.h
drivers/pinctrl/sh-pfc/gpio.c
drivers/pinctrl/sh-pfc/pinctrl.c

index 9b5c0319eb77174eda6ac94d03b22e2a3b2015fb..667db99fb51065002a001f09f5278c09e55ed1fd 100644 (file)
@@ -78,6 +78,11 @@ static void __iomem *sh_pfc_phys_to_virt(struct sh_pfc *pfc,
        return (void __iomem *)address;
 }
 
+struct sh_pfc_pin *sh_pfc_get_pin(struct sh_pfc *pfc, unsigned int pin)
+{
+       return &pfc->info->pins[pin];
+}
+
 static int sh_pfc_enum_in_range(pinmux_enum_t enum_id, struct pinmux_range *r)
 {
        if (enum_id < r->begin)
@@ -278,7 +283,7 @@ static void sh_pfc_setup_data_regs(struct sh_pfc *pfc)
 void sh_pfc_get_data_reg(struct sh_pfc *pfc, unsigned gpio,
                         struct pinmux_data_reg **drp, int *bitp)
 {
-       struct sh_pfc_pin *gpiop = &pfc->info->pins[gpio];
+       struct sh_pfc_pin *gpiop = sh_pfc_get_pin(pfc, gpio);
        int k, n;
 
        k = (gpiop->flags & PINMUX_FLAG_DREG) >> PINMUX_FLAG_DREG_SHIFT;
index a3111b73fb9454b312240831a2a92a054978b906..6ea3d4f3d05e17126440713153a47b6d6602c052 100644 (file)
@@ -49,6 +49,7 @@ void sh_pfc_write_bit(struct pinmux_data_reg *dr, unsigned long in_pos,
                      unsigned long value);
 void sh_pfc_get_data_reg(struct sh_pfc *pfc, unsigned gpio,
                         struct pinmux_data_reg **drp, int *bitp);
+struct sh_pfc_pin *sh_pfc_get_pin(struct sh_pfc *pfc, unsigned int pin);
 int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type,
                      int cfg_mode);
 
index db9af4e548a017d6404e62539530c60c8e89ba61..45090d8381a284dd5a3498eb51a2505f1e150e4a 100644 (file)
@@ -43,8 +43,9 @@ static struct sh_pfc *gpio_to_pfc(struct gpio_chip *gc)
 static int gpio_pin_request(struct gpio_chip *gc, unsigned offset)
 {
        struct sh_pfc *pfc = gpio_to_pfc(gc);
+       struct sh_pfc_pin *pin = sh_pfc_get_pin(pfc, offset);
 
-       if (pfc->info->pins[offset].enum_id == 0)
+       if (pin->enum_id == 0)
                return -EINVAL;
 
        return pinctrl_request_gpio(offset);
index a83f40070b3ba7ddc81b578e198bdd1c3ad736ae..78bd277c01d9fce11c9766b1e456f0fb6269a261 100644 (file)
@@ -119,14 +119,15 @@ static void sh_pfc_noop_disable(struct pinctrl_dev *pctldev, unsigned func,
 static int sh_pfc_reconfig_pin(struct sh_pfc *pfc, unsigned offset,
                               int new_type)
 {
-       unsigned int mark = pfc->info->pins[offset].enum_id;
+       struct sh_pfc_pin *pin = sh_pfc_get_pin(pfc, offset);
+       unsigned int mark = pin->enum_id;
        unsigned long flags;
        int pinmux_type;
        int ret = -EINVAL;
 
        spin_lock_irqsave(&pfc->lock, flags);
 
-       pinmux_type = pfc->info->pins[offset].flags & PINMUX_FLAG_TYPE;
+       pinmux_type = pin->flags & PINMUX_FLAG_TYPE;
 
        /*
         * See if the present config needs to first be de-configured.
@@ -156,8 +157,8 @@ static int sh_pfc_reconfig_pin(struct sh_pfc *pfc, unsigned offset,
        if (sh_pfc_config_mux(pfc, mark, new_type, GPIO_CFG_REQ) != 0)
                goto err;
 
-       pfc->info->pins[offset].flags &= ~PINMUX_FLAG_TYPE;
-       pfc->info->pins[offset].flags |= new_type;
+       pin->flags &= ~PINMUX_FLAG_TYPE;
+       pin->flags |= new_type;
 
        ret = 0;
 
@@ -173,12 +174,13 @@ static int sh_pfc_gpio_request_enable(struct pinctrl_dev *pctldev,
 {
        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
        struct sh_pfc *pfc = pmx->pfc;
+       struct sh_pfc_pin *pin = sh_pfc_get_pin(pfc, offset);
        unsigned long flags;
        int ret, pinmux_type;
 
        spin_lock_irqsave(&pfc->lock, flags);
 
-       pinmux_type = pfc->info->pins[offset].flags & PINMUX_FLAG_TYPE;
+       pinmux_type = pin->flags & PINMUX_FLAG_TYPE;
 
        switch (pinmux_type) {
        case PINMUX_TYPE_GPIO:
@@ -206,15 +208,15 @@ static void sh_pfc_gpio_disable_free(struct pinctrl_dev *pctldev,
 {
        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
        struct sh_pfc *pfc = pmx->pfc;
+       struct sh_pfc_pin *pin = sh_pfc_get_pin(pfc, offset);
        unsigned long flags;
        int pinmux_type;
 
        spin_lock_irqsave(&pfc->lock, flags);
 
-       pinmux_type = pfc->info->pins[offset].flags & PINMUX_FLAG_TYPE;
+       pinmux_type = pin->flags & PINMUX_FLAG_TYPE;
 
-       sh_pfc_config_mux(pfc, pfc->info->pins[offset].enum_id, pinmux_type,
-                         GPIO_CFG_FREE);
+       sh_pfc_config_mux(pfc, pin->enum_id, pinmux_type, GPIO_CFG_FREE);
 
        spin_unlock_irqrestore(&pfc->lock, flags);
 }
@@ -240,13 +242,14 @@ static const struct pinmux_ops sh_pfc_pinmux_ops = {
        .gpio_set_direction     = sh_pfc_gpio_set_direction,
 };
 
-static int sh_pfc_pinconf_get(struct pinctrl_dev *pctldev, unsigned pin,
+static int sh_pfc_pinconf_get(struct pinctrl_dev *pctldev, unsigned _pin,
                              unsigned long *config)
 {
        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
        struct sh_pfc *pfc = pmx->pfc;
+       struct sh_pfc_pin *pin = sh_pfc_get_pin(pfc, _pin);
 
-       *config = pfc->info->pins[pin].flags & PINMUX_FLAG_TYPE;
+       *config = pin->flags & PINMUX_FLAG_TYPE;
 
        return 0;
 }