Commit 934cb02b authored by Laurent Pinchart's avatar Laurent Pinchart

sh-pfc: Add function to retrieve a pin instance from its pin number

This prepares support for sparse pin numbering. The function currently
just performs and indexed lookup in the pins array.
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 0b73ee5d
...@@ -78,6 +78,11 @@ static void __iomem *sh_pfc_phys_to_virt(struct sh_pfc *pfc, ...@@ -78,6 +78,11 @@ static void __iomem *sh_pfc_phys_to_virt(struct sh_pfc *pfc,
return (void __iomem *)address; 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) static int sh_pfc_enum_in_range(pinmux_enum_t enum_id, struct pinmux_range *r)
{ {
if (enum_id < r->begin) if (enum_id < r->begin)
...@@ -278,7 +283,7 @@ static void sh_pfc_setup_data_regs(struct sh_pfc *pfc) ...@@ -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, void sh_pfc_get_data_reg(struct sh_pfc *pfc, unsigned gpio,
struct pinmux_data_reg **drp, int *bitp) 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; int k, n;
k = (gpiop->flags & PINMUX_FLAG_DREG) >> PINMUX_FLAG_DREG_SHIFT; k = (gpiop->flags & PINMUX_FLAG_DREG) >> PINMUX_FLAG_DREG_SHIFT;
......
...@@ -49,6 +49,7 @@ void sh_pfc_write_bit(struct pinmux_data_reg *dr, unsigned long in_pos, ...@@ -49,6 +49,7 @@ void sh_pfc_write_bit(struct pinmux_data_reg *dr, unsigned long in_pos,
unsigned long value); unsigned long value);
void sh_pfc_get_data_reg(struct sh_pfc *pfc, unsigned gpio, void sh_pfc_get_data_reg(struct sh_pfc *pfc, unsigned gpio,
struct pinmux_data_reg **drp, int *bitp); 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 sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type,
int cfg_mode); int cfg_mode);
......
...@@ -43,8 +43,9 @@ static struct sh_pfc *gpio_to_pfc(struct gpio_chip *gc) ...@@ -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) static int gpio_pin_request(struct gpio_chip *gc, unsigned offset)
{ {
struct sh_pfc *pfc = gpio_to_pfc(gc); 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 -EINVAL;
return pinctrl_request_gpio(offset); return pinctrl_request_gpio(offset);
......
...@@ -119,14 +119,15 @@ static void sh_pfc_noop_disable(struct pinctrl_dev *pctldev, unsigned func, ...@@ -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, static int sh_pfc_reconfig_pin(struct sh_pfc *pfc, unsigned offset,
int new_type) 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; unsigned long flags;
int pinmux_type; int pinmux_type;
int ret = -EINVAL; int ret = -EINVAL;
spin_lock_irqsave(&pfc->lock, flags); 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. * 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, ...@@ -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) if (sh_pfc_config_mux(pfc, mark, new_type, GPIO_CFG_REQ) != 0)
goto err; goto err;
pfc->info->pins[offset].flags &= ~PINMUX_FLAG_TYPE; pin->flags &= ~PINMUX_FLAG_TYPE;
pfc->info->pins[offset].flags |= new_type; pin->flags |= new_type;
ret = 0; ret = 0;
...@@ -173,12 +174,13 @@ static int sh_pfc_gpio_request_enable(struct pinctrl_dev *pctldev, ...@@ -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_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
struct sh_pfc *pfc = pmx->pfc; struct sh_pfc *pfc = pmx->pfc;
struct sh_pfc_pin *pin = sh_pfc_get_pin(pfc, offset);
unsigned long flags; unsigned long flags;
int ret, pinmux_type; int ret, pinmux_type;
spin_lock_irqsave(&pfc->lock, flags); 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) { switch (pinmux_type) {
case PINMUX_TYPE_GPIO: case PINMUX_TYPE_GPIO:
...@@ -206,15 +208,15 @@ static void sh_pfc_gpio_disable_free(struct pinctrl_dev *pctldev, ...@@ -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_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
struct sh_pfc *pfc = pmx->pfc; struct sh_pfc *pfc = pmx->pfc;
struct sh_pfc_pin *pin = sh_pfc_get_pin(pfc, offset);
unsigned long flags; unsigned long flags;
int pinmux_type; int pinmux_type;
spin_lock_irqsave(&pfc->lock, flags); 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, sh_pfc_config_mux(pfc, pin->enum_id, pinmux_type, GPIO_CFG_FREE);
GPIO_CFG_FREE);
spin_unlock_irqrestore(&pfc->lock, flags); spin_unlock_irqrestore(&pfc->lock, flags);
} }
...@@ -240,13 +242,14 @@ static const struct pinmux_ops sh_pfc_pinmux_ops = { ...@@ -240,13 +242,14 @@ static const struct pinmux_ops sh_pfc_pinmux_ops = {
.gpio_set_direction = sh_pfc_gpio_set_direction, .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) unsigned long *config)
{ {
struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev); struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
struct sh_pfc *pfc = pmx->pfc; 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; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment