diff options
author | Dong Aisheng <aisheng.dong@nxp.com> | 2017-05-19 03:05:43 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2017-05-22 05:05:19 -0400 |
commit | 5586ee4191219f74632ad6e527c46d1c3d9cdf3e (patch) | |
tree | d96338efd6ffa2f91556f2195cb357212e93d557 /drivers/pinctrl/freescale | |
parent | a5cadbbb081cb84a9fdb14391fb461a41f089a0a (diff) |
pinctrl: imx: add soc specific mux_mode mask and shift property
MX7ULP MUX mode mask and shift bit is different from VF610.
Let's make it a platform specific property for the later easy of
adding MX7ULP support.
One trick in exist code that Vybrid hardcoded the config part
as 0xffff because its mux_config register BIT[15-0] are all configs
part. But it's not true in ULP, so use mux_mask instead to address
the difference.
Cc: Stefan Agner <stefan@agner.ch>
Cc: Bai Ping <ping.bai@nxp.com>
Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
Acked-by: Shawn Guo <shawnguo@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/freescale')
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx.c | 10 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx.h | 4 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-vf610.c | 2 |
3 files changed, 11 insertions, 5 deletions
diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c index 328d079b237e..72aca758f4c6 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx.c +++ b/drivers/pinctrl/freescale/pinctrl-imx.c | |||
@@ -197,8 +197,8 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector, | |||
197 | if (info->flags & SHARE_MUX_CONF_REG) { | 197 | if (info->flags & SHARE_MUX_CONF_REG) { |
198 | u32 reg; | 198 | u32 reg; |
199 | reg = readl(ipctl->base + pin_reg->mux_reg); | 199 | reg = readl(ipctl->base + pin_reg->mux_reg); |
200 | reg &= ~(0x7 << 20); | 200 | reg &= ~info->mux_mask; |
201 | reg |= (pin->mux_mode << 20); | 201 | reg |= (pin->mux_mode << info->mux_shift); |
202 | writel(reg, ipctl->base + pin_reg->mux_reg); | 202 | writel(reg, ipctl->base + pin_reg->mux_reg); |
203 | dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%x\n", | 203 | dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%x\n", |
204 | pin_reg->mux_reg, reg); | 204 | pin_reg->mux_reg, reg); |
@@ -290,7 +290,7 @@ static int imx_pmx_gpio_request_enable(struct pinctrl_dev *pctldev, | |||
290 | 290 | ||
291 | mux_pin: | 291 | mux_pin: |
292 | reg = readl(ipctl->base + pin_reg->mux_reg); | 292 | reg = readl(ipctl->base + pin_reg->mux_reg); |
293 | reg &= ~(0x7 << 20); | 293 | reg &= ~info->mux_mask; |
294 | reg |= imx_pin->config; | 294 | reg |= imx_pin->config; |
295 | writel(reg, ipctl->base + pin_reg->mux_reg); | 295 | writel(reg, ipctl->base + pin_reg->mux_reg); |
296 | 296 | ||
@@ -434,7 +434,7 @@ static int imx_pinconf_get(struct pinctrl_dev *pctldev, | |||
434 | *config = readl(ipctl->base + pin_reg->conf_reg); | 434 | *config = readl(ipctl->base + pin_reg->conf_reg); |
435 | 435 | ||
436 | if (info->flags & SHARE_MUX_CONF_REG) | 436 | if (info->flags & SHARE_MUX_CONF_REG) |
437 | *config &= 0xffff; | 437 | *config &= ~info->mux_mask; |
438 | 438 | ||
439 | return 0; | 439 | return 0; |
440 | } | 440 | } |
@@ -461,7 +461,7 @@ static int imx_pinconf_set(struct pinctrl_dev *pctldev, | |||
461 | if (info->flags & SHARE_MUX_CONF_REG) { | 461 | if (info->flags & SHARE_MUX_CONF_REG) { |
462 | u32 reg; | 462 | u32 reg; |
463 | reg = readl(ipctl->base + pin_reg->conf_reg); | 463 | reg = readl(ipctl->base + pin_reg->conf_reg); |
464 | reg &= ~0xffff; | 464 | reg &= info->mux_mask; |
465 | reg |= configs[i]; | 465 | reg |= configs[i]; |
466 | writel(reg, ipctl->base + pin_reg->conf_reg); | 466 | writel(reg, ipctl->base + pin_reg->conf_reg); |
467 | dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%x\n", | 467 | dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%x\n", |
diff --git a/drivers/pinctrl/freescale/pinctrl-imx.h b/drivers/pinctrl/freescale/pinctrl-imx.h index 38aa53c671ed..880bba7fd1ab 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx.h +++ b/drivers/pinctrl/freescale/pinctrl-imx.h | |||
@@ -64,6 +64,10 @@ struct imx_pinctrl_soc_info { | |||
64 | const char *gpr_compatible; | 64 | const char *gpr_compatible; |
65 | struct mutex mutex; | 65 | struct mutex mutex; |
66 | 66 | ||
67 | /* MUX_MODE shift and mask in case SHARE_MUX_CONF_REG */ | ||
68 | unsigned int mux_mask; | ||
69 | u8 mux_shift; | ||
70 | |||
67 | /* generic pinconf */ | 71 | /* generic pinconf */ |
68 | bool generic_pinconf; | 72 | bool generic_pinconf; |
69 | const struct pinconf_generic_params *custom_params; | 73 | const struct pinconf_generic_params *custom_params; |
diff --git a/drivers/pinctrl/freescale/pinctrl-vf610.c b/drivers/pinctrl/freescale/pinctrl-vf610.c index 2b1e198e3092..3bd85564d1e4 100644 --- a/drivers/pinctrl/freescale/pinctrl-vf610.c +++ b/drivers/pinctrl/freescale/pinctrl-vf610.c | |||
@@ -299,6 +299,8 @@ static struct imx_pinctrl_soc_info vf610_pinctrl_info = { | |||
299 | .pins = vf610_pinctrl_pads, | 299 | .pins = vf610_pinctrl_pads, |
300 | .npins = ARRAY_SIZE(vf610_pinctrl_pads), | 300 | .npins = ARRAY_SIZE(vf610_pinctrl_pads), |
301 | .flags = SHARE_MUX_CONF_REG | ZERO_OFFSET_VALID, | 301 | .flags = SHARE_MUX_CONF_REG | ZERO_OFFSET_VALID, |
302 | .mux_mask = 0x700000, | ||
303 | .mux_shift = 20, | ||
302 | }; | 304 | }; |
303 | 305 | ||
304 | static const struct of_device_id vf610_pinctrl_of_match[] = { | 306 | static const struct of_device_id vf610_pinctrl_of_match[] = { |