Commit 861601de authored by Laurent Pinchart's avatar Laurent Pinchart

sh-pfc: Remove configuration dry-run and free

The purpose of the dry-run is to ensure that a pin about to be
configured isn't in use. However, the current implementation is a no-op.
This proves that the dry-run isn't essential. Remove it.

Freeing configuration then becomes a no-op as well. Remove it.
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 1a0039dc
...@@ -163,22 +163,6 @@ static void sh_pfc_config_reg_helper(struct sh_pfc *pfc, ...@@ -163,22 +163,6 @@ static void sh_pfc_config_reg_helper(struct sh_pfc *pfc,
} }
} }
static int sh_pfc_read_config_reg(struct sh_pfc *pfc,
struct pinmux_cfg_reg *crp,
unsigned long field)
{
void __iomem *mapped_reg;
unsigned long mask, pos;
sh_pfc_config_reg_helper(pfc, crp, field, &mapped_reg, &mask, &pos);
pr_debug("read_reg: addr = %lx, field = %ld, "
"r_width = %ld, f_width = %ld\n",
crp->reg, field, crp->reg_width, crp->field_width);
return (sh_pfc_read_raw_reg(mapped_reg, crp->reg_width) >> pos) & mask;
}
static void sh_pfc_write_config_reg(struct sh_pfc *pfc, static void sh_pfc_write_config_reg(struct sh_pfc *pfc,
struct pinmux_cfg_reg *crp, struct pinmux_cfg_reg *crp,
unsigned long field, unsigned long value) unsigned long field, unsigned long value)
...@@ -209,7 +193,7 @@ static void sh_pfc_write_config_reg(struct sh_pfc *pfc, ...@@ -209,7 +193,7 @@ static void sh_pfc_write_config_reg(struct sh_pfc *pfc,
static int sh_pfc_get_config_reg(struct sh_pfc *pfc, pinmux_enum_t enum_id, static int sh_pfc_get_config_reg(struct sh_pfc *pfc, pinmux_enum_t enum_id,
struct pinmux_cfg_reg **crp, int *fieldp, struct pinmux_cfg_reg **crp, int *fieldp,
int *valuep, unsigned long **cntp) int *valuep)
{ {
struct pinmux_cfg_reg *config_reg; struct pinmux_cfg_reg *config_reg;
unsigned long r_width, f_width, curr_width, ncomb; unsigned long r_width, f_width, curr_width, ncomb;
...@@ -239,7 +223,6 @@ static int sh_pfc_get_config_reg(struct sh_pfc *pfc, pinmux_enum_t enum_id, ...@@ -239,7 +223,6 @@ static int sh_pfc_get_config_reg(struct sh_pfc *pfc, pinmux_enum_t enum_id,
*crp = config_reg; *crp = config_reg;
*fieldp = m; *fieldp = m;
*valuep = n; *valuep = n;
*cntp = &config_reg->cnt[m];
return 0; return 0;
} }
} }
...@@ -274,14 +257,12 @@ static int sh_pfc_mark_to_enum(struct sh_pfc *pfc, pinmux_enum_t mark, int pos, ...@@ -274,14 +257,12 @@ static int sh_pfc_mark_to_enum(struct sh_pfc *pfc, pinmux_enum_t mark, int pos,
return -1; return -1;
} }
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)
{ {
struct pinmux_cfg_reg *cr = NULL; struct pinmux_cfg_reg *cr = NULL;
pinmux_enum_t enum_id; pinmux_enum_t enum_id;
struct pinmux_range *range; struct pinmux_range *range;
int in_range, pos, field, value; int in_range, pos, field, value;
unsigned long *cntp;
switch (pinmux_type) { switch (pinmux_type) {
...@@ -306,7 +287,7 @@ int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type, ...@@ -306,7 +287,7 @@ int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type,
break; break;
default: default:
goto out_err; return -1;
} }
pos = 0; pos = 0;
...@@ -316,7 +297,7 @@ int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type, ...@@ -316,7 +297,7 @@ int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type,
while (1) { while (1) {
pos = sh_pfc_mark_to_enum(pfc, mark, pos, &enum_id); pos = sh_pfc_mark_to_enum(pfc, mark, pos, &enum_id);
if (pos <= 0) if (pos <= 0)
goto out_err; return -1;
if (!enum_id) if (!enum_id)
break; break;
...@@ -360,30 +341,13 @@ int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type, ...@@ -360,30 +341,13 @@ int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type,
continue; continue;
if (sh_pfc_get_config_reg(pfc, enum_id, &cr, if (sh_pfc_get_config_reg(pfc, enum_id, &cr,
&field, &value, &cntp) != 0) &field, &value) != 0)
goto out_err; return -1;
switch (cfg_mode) {
case GPIO_CFG_DRYRUN:
if (!*cntp ||
(sh_pfc_read_config_reg(pfc, cr, field) != value))
continue;
break;
case GPIO_CFG_REQ:
sh_pfc_write_config_reg(pfc, cr, field, value); sh_pfc_write_config_reg(pfc, cr, field, value);
*cntp = *cntp + 1;
break;
case GPIO_CFG_FREE:
*cntp = *cntp - 1;
break;
}
} }
return 0; return 0;
out_err:
return -1;
} }
static int sh_pfc_probe(struct platform_device *pdev) static int sh_pfc_probe(struct platform_device *pdev)
......
...@@ -52,8 +52,7 @@ void sh_pfc_write_raw_reg(void __iomem *mapped_reg, unsigned long reg_width, ...@@ -52,8 +52,7 @@ void sh_pfc_write_raw_reg(void __iomem *mapped_reg, unsigned long reg_width,
unsigned long data); unsigned long data);
int sh_pfc_get_pin_index(struct sh_pfc *pfc, unsigned int pin); int sh_pfc_get_pin_index(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);
extern struct sh_pfc_soc_info r8a7740_pinmux_info; extern struct sh_pfc_soc_info r8a7740_pinmux_info;
extern struct sh_pfc_soc_info r8a7779_pinmux_info; extern struct sh_pfc_soc_info r8a7779_pinmux_info;
......
...@@ -285,10 +285,7 @@ static int gpio_function_request(struct gpio_chip *gc, unsigned offset) ...@@ -285,10 +285,7 @@ static int gpio_function_request(struct gpio_chip *gc, unsigned offset)
spin_lock_irqsave(&pfc->lock, flags); spin_lock_irqsave(&pfc->lock, flags);
if (sh_pfc_config_mux(pfc, mark, PINMUX_TYPE_FUNCTION, GPIO_CFG_DRYRUN)) if (sh_pfc_config_mux(pfc, mark, PINMUX_TYPE_FUNCTION))
goto done;
if (sh_pfc_config_mux(pfc, mark, PINMUX_TYPE_FUNCTION, GPIO_CFG_REQ))
goto done; goto done;
ret = 0; ret = 0;
...@@ -300,15 +297,6 @@ static int gpio_function_request(struct gpio_chip *gc, unsigned offset) ...@@ -300,15 +297,6 @@ static int gpio_function_request(struct gpio_chip *gc, unsigned offset)
static void gpio_function_free(struct gpio_chip *gc, unsigned offset) static void gpio_function_free(struct gpio_chip *gc, unsigned offset)
{ {
struct sh_pfc *pfc = gpio_to_pfc(gc);
unsigned int mark = pfc->info->func_gpios[offset].enum_id;
unsigned long flags;
spin_lock_irqsave(&pfc->lock, flags);
sh_pfc_config_mux(pfc, mark, PINMUX_TYPE_FUNCTION, GPIO_CFG_FREE);
spin_unlock_irqrestore(&pfc->lock, flags);
} }
static int gpio_function_setup(struct sh_pfc_chip *chip) static int gpio_function_setup(struct sh_pfc_chip *chip)
......
...@@ -119,12 +119,7 @@ static int sh_pfc_func_enable(struct pinctrl_dev *pctldev, unsigned selector, ...@@ -119,12 +119,7 @@ static int sh_pfc_func_enable(struct pinctrl_dev *pctldev, unsigned selector,
spin_lock_irqsave(&pfc->lock, flags); spin_lock_irqsave(&pfc->lock, flags);
for (i = 0; i < grp->nr_pins; ++i) { for (i = 0; i < grp->nr_pins; ++i) {
if (sh_pfc_config_mux(pfc, grp->mux[i], PINMUX_TYPE_FUNCTION, if (sh_pfc_config_mux(pfc, grp->mux[i], PINMUX_TYPE_FUNCTION))
GPIO_CFG_DRYRUN))
goto done;
if (sh_pfc_config_mux(pfc, grp->mux[i], PINMUX_TYPE_FUNCTION,
GPIO_CFG_REQ))
goto done; goto done;
} }
...@@ -138,19 +133,6 @@ static int sh_pfc_func_enable(struct pinctrl_dev *pctldev, unsigned selector, ...@@ -138,19 +133,6 @@ static int sh_pfc_func_enable(struct pinctrl_dev *pctldev, unsigned selector,
static void sh_pfc_func_disable(struct pinctrl_dev *pctldev, unsigned selector, static void sh_pfc_func_disable(struct pinctrl_dev *pctldev, unsigned selector,
unsigned group) unsigned group)
{ {
struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
struct sh_pfc *pfc = pmx->pfc;
const struct sh_pfc_pin_group *grp = &pfc->info->groups[group];
unsigned long flags;
unsigned int i;
spin_lock_irqsave(&pfc->lock, flags);
for (i = 0; i < grp->nr_pins; ++i)
sh_pfc_config_mux(pfc, grp->mux[i], PINMUX_TYPE_FUNCTION,
GPIO_CFG_FREE);
spin_unlock_irqrestore(&pfc->lock, flags);
} }
static int sh_pfc_reconfig_pin(struct sh_pfc_pinctrl *pmx, unsigned offset, static int sh_pfc_reconfig_pin(struct sh_pfc_pinctrl *pmx, unsigned offset,
...@@ -166,32 +148,18 @@ static int sh_pfc_reconfig_pin(struct sh_pfc_pinctrl *pmx, unsigned offset, ...@@ -166,32 +148,18 @@ static int sh_pfc_reconfig_pin(struct sh_pfc_pinctrl *pmx, unsigned offset,
spin_lock_irqsave(&pfc->lock, flags); spin_lock_irqsave(&pfc->lock, flags);
/*
* See if the present config needs to first be de-configured.
*/
switch (cfg->type) { switch (cfg->type) {
case PINMUX_TYPE_GPIO: case PINMUX_TYPE_GPIO:
break;
case PINMUX_TYPE_OUTPUT: case PINMUX_TYPE_OUTPUT:
case PINMUX_TYPE_INPUT: case PINMUX_TYPE_INPUT:
case PINMUX_TYPE_INPUT_PULLUP: case PINMUX_TYPE_INPUT_PULLUP:
case PINMUX_TYPE_INPUT_PULLDOWN: case PINMUX_TYPE_INPUT_PULLDOWN:
sh_pfc_config_mux(pfc, mark, cfg->type, GPIO_CFG_FREE);
break; break;
default: default:
goto err; goto err;
} }
/* if (sh_pfc_config_mux(pfc, mark, new_type) != 0)
* Dry run
*/
if (sh_pfc_config_mux(pfc, mark, new_type, GPIO_CFG_DRYRUN) != 0)
goto err;
/*
* Request
*/
if (sh_pfc_config_mux(pfc, mark, new_type, GPIO_CFG_REQ) != 0)
goto err; goto err;
cfg->type = new_type; cfg->type = new_type;
...@@ -241,18 +209,6 @@ static void sh_pfc_gpio_disable_free(struct pinctrl_dev *pctldev, ...@@ -241,18 +209,6 @@ static void sh_pfc_gpio_disable_free(struct pinctrl_dev *pctldev,
struct pinctrl_gpio_range *range, struct pinctrl_gpio_range *range,
unsigned offset) unsigned offset)
{ {
struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
struct sh_pfc *pfc = pmx->pfc;
int idx = sh_pfc_get_pin_index(pfc, offset);
struct sh_pfc_pin_config *cfg = &pmx->configs[idx];
struct sh_pfc_pin *pin = &pfc->info->pins[idx];
unsigned long flags;
spin_lock_irqsave(&pfc->lock, flags);
sh_pfc_config_mux(pfc, pin->enum_id, cfg->type, GPIO_CFG_FREE);
spin_unlock_irqrestore(&pfc->lock, flags);
} }
static int sh_pfc_gpio_set_direction(struct pinctrl_dev *pctldev, static int sh_pfc_gpio_set_direction(struct pinctrl_dev *pctldev,
......
...@@ -84,19 +84,16 @@ struct pinmux_func { ...@@ -84,19 +84,16 @@ struct pinmux_func {
struct pinmux_cfg_reg { struct pinmux_cfg_reg {
unsigned long reg, reg_width, field_width; unsigned long reg, reg_width, field_width;
unsigned long *cnt;
pinmux_enum_t *enum_ids; pinmux_enum_t *enum_ids;
unsigned long *var_field_width; unsigned long *var_field_width;
}; };
#define PINMUX_CFG_REG(name, r, r_width, f_width) \ #define PINMUX_CFG_REG(name, r, r_width, f_width) \
.reg = r, .reg_width = r_width, .field_width = f_width, \ .reg = r, .reg_width = r_width, .field_width = f_width, \
.cnt = (unsigned long [r_width / f_width]) {}, \
.enum_ids = (pinmux_enum_t [(r_width / f_width) * (1 << f_width)]) .enum_ids = (pinmux_enum_t [(r_width / f_width) * (1 << f_width)])
#define PINMUX_CFG_REG_VAR(name, r, r_width, var_fw0, var_fwn...) \ #define PINMUX_CFG_REG_VAR(name, r, r_width, var_fw0, var_fwn...) \
.reg = r, .reg_width = r_width, \ .reg = r, .reg_width = r_width, \
.cnt = (unsigned long [r_width]) {}, \
.var_field_width = (unsigned long [r_width]) { var_fw0, var_fwn, 0 }, \ .var_field_width = (unsigned long [r_width]) { var_fw0, var_fwn, 0 }, \
.enum_ids = (pinmux_enum_t []) .enum_ids = (pinmux_enum_t [])
...@@ -155,7 +152,7 @@ struct sh_pfc_soc_info { ...@@ -155,7 +152,7 @@ struct sh_pfc_soc_info {
unsigned long unlock_reg; unsigned long unlock_reg;
}; };
enum { GPIO_CFG_DRYRUN, GPIO_CFG_REQ, GPIO_CFG_FREE }; enum { GPIO_CFG_REQ, GPIO_CFG_FREE };
/* helper macro for port */ /* helper macro for port */
#define PORT_1(fn, pfx, sfx) fn(pfx, sfx) #define PORT_1(fn, pfx, sfx) fn(pfx, sfx)
......
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