Skip to content

Commit

Permalink
pinctrl: sunxi: Prepare for alternative bias voltage setting methods
Browse files Browse the repository at this point in the history
H6 has a different I/O voltage bias setting method than A80. Prepare
existing code for using alternative bias voltage setting methods.

Signed-off-by: Ondrej Jirman <megous@megous.com>
Acked-by: Maxime Ripard <maxime.ripard@bootlin.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
  • Loading branch information
Ondrej Jirman authored and linusw committed Apr 23, 2019
1 parent 483d70d commit f727534
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 23 deletions.
2 changes: 1 addition & 1 deletion drivers/pinctrl/sunxi/pinctrl-sun9i-a80-r.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ static const struct sunxi_pinctrl_desc sun9i_a80_r_pinctrl_data = {
.pin_base = PL_BASE,
.irq_banks = 2,
.disable_strict_mode = true,
.has_io_bias_cfg = true,
.io_bias_cfg_variant = BIAS_VOLTAGE_GRP_CONFIG,
};

static int sun9i_a80_r_pinctrl_probe(struct platform_device *pdev)
Expand Down
2 changes: 1 addition & 1 deletion drivers/pinctrl/sunxi/pinctrl-sun9i-a80.c
Original file line number Diff line number Diff line change
Expand Up @@ -722,7 +722,7 @@ static const struct sunxi_pinctrl_desc sun9i_a80_pinctrl_data = {
.npins = ARRAY_SIZE(sun9i_a80_pins),
.irq_banks = 5,
.disable_strict_mode = true,
.has_io_bias_cfg = true,
.io_bias_cfg_variant = BIAS_VOLTAGE_GRP_CONFIG,
};

static int sun9i_a80_pinctrl_probe(struct platform_device *pdev)
Expand Down
47 changes: 27 additions & 20 deletions drivers/pinctrl/sunxi/pinctrl-sunxi.c
Original file line number Diff line number Diff line change
Expand Up @@ -617,7 +617,7 @@ static int sunxi_pinctrl_set_io_bias_cfg(struct sunxi_pinctrl *pctl,
u32 val, reg;
int uV;

if (!pctl->desc->has_io_bias_cfg)
if (!pctl->desc->io_bias_cfg_variant)
return 0;

uV = regulator_get_voltage(supply);
Expand All @@ -628,25 +628,32 @@ static int sunxi_pinctrl_set_io_bias_cfg(struct sunxi_pinctrl *pctl,
if (uV == 0)
return 0;

/* Configured value must be equal or greater to actual voltage */
if (uV <= 1800000)
val = 0x0; /* 1.8V */
else if (uV <= 2500000)
val = 0x6; /* 2.5V */
else if (uV <= 2800000)
val = 0x9; /* 2.8V */
else if (uV <= 3000000)
val = 0xA; /* 3.0V */
else
val = 0xD; /* 3.3V */

pin -= pctl->desc->pin_base;

reg = readl(pctl->membase + sunxi_grp_config_reg(pin));
reg &= ~IO_BIAS_MASK;
writel(reg | val, pctl->membase + sunxi_grp_config_reg(pin));

return 0;
switch (pctl->desc->io_bias_cfg_variant) {
case BIAS_VOLTAGE_GRP_CONFIG:
/*
* Configured value must be equal or greater to actual
* voltage.
*/
if (uV <= 1800000)
val = 0x0; /* 1.8V */
else if (uV <= 2500000)
val = 0x6; /* 2.5V */
else if (uV <= 2800000)
val = 0x9; /* 2.8V */
else if (uV <= 3000000)
val = 0xA; /* 3.0V */
else
val = 0xD; /* 3.3V */

pin -= pctl->desc->pin_base;

reg = readl(pctl->membase + sunxi_grp_config_reg(pin));
reg &= ~IO_BIAS_MASK;
writel(reg | val, pctl->membase + sunxi_grp_config_reg(pin));
return 0;
default:
return -EINVAL;
}
}

static int sunxi_pmx_get_funcs_cnt(struct pinctrl_dev *pctldev)
Expand Down
11 changes: 10 additions & 1 deletion drivers/pinctrl/sunxi/pinctrl-sunxi.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,15 @@
#define PINCTRL_SUN7I_A20 BIT(7)
#define PINCTRL_SUN8I_R40 BIT(8)

enum sunxi_desc_bias_voltage {
BIAS_VOLTAGE_NONE,
/*
* Bias voltage configuration is done through
* Pn_GRP_CONFIG registers, as seen on A80 SoC.
*/
BIAS_VOLTAGE_GRP_CONFIG,
};

struct sunxi_desc_function {
unsigned long variant;
const char *name;
Expand All @@ -117,7 +126,7 @@ struct sunxi_pinctrl_desc {
const unsigned int *irq_bank_map;
bool irq_read_needs_mux;
bool disable_strict_mode;
bool has_io_bias_cfg;
enum sunxi_desc_bias_voltage io_bias_cfg_variant;
};

struct sunxi_pinctrl_function {
Expand Down

0 comments on commit f727534

Please sign in to comment.