diff options
Diffstat (limited to 'drivers/pinctrl/freescale/pinctrl-mxs.c')
| -rw-r--r-- | drivers/pinctrl/freescale/pinctrl-mxs.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/pinctrl/freescale/pinctrl-mxs.c b/drivers/pinctrl/freescale/pinctrl-mxs.c index 41b5b07d5a2b..6852010a6d70 100644 --- a/drivers/pinctrl/freescale/pinctrl-mxs.c +++ b/drivers/pinctrl/freescale/pinctrl-mxs.c | |||
| @@ -194,6 +194,16 @@ static int mxs_pinctrl_get_func_groups(struct pinctrl_dev *pctldev, | |||
| 194 | return 0; | 194 | return 0; |
| 195 | } | 195 | } |
| 196 | 196 | ||
| 197 | static void mxs_pinctrl_rmwl(u32 value, u32 mask, u8 shift, void __iomem *reg) | ||
| 198 | { | ||
| 199 | u32 tmp; | ||
| 200 | |||
| 201 | tmp = readl(reg); | ||
| 202 | tmp &= ~(mask << shift); | ||
| 203 | tmp |= value << shift; | ||
| 204 | writel(tmp, reg); | ||
| 205 | } | ||
| 206 | |||
| 197 | static int mxs_pinctrl_set_mux(struct pinctrl_dev *pctldev, unsigned selector, | 207 | static int mxs_pinctrl_set_mux(struct pinctrl_dev *pctldev, unsigned selector, |
| 198 | unsigned group) | 208 | unsigned group) |
| 199 | { | 209 | { |
| @@ -211,8 +221,7 @@ static int mxs_pinctrl_set_mux(struct pinctrl_dev *pctldev, unsigned selector, | |||
| 211 | reg += bank * 0x20 + pin / 16 * 0x10; | 221 | reg += bank * 0x20 + pin / 16 * 0x10; |
| 212 | shift = pin % 16 * 2; | 222 | shift = pin % 16 * 2; |
| 213 | 223 | ||
| 214 | writel(0x3 << shift, reg + CLR); | 224 | mxs_pinctrl_rmwl(g->muxsel[i], 0x3, shift, reg); |
| 215 | writel(g->muxsel[i] << shift, reg + SET); | ||
| 216 | } | 225 | } |
| 217 | 226 | ||
| 218 | return 0; | 227 | return 0; |
| @@ -279,8 +288,7 @@ static int mxs_pinconf_group_set(struct pinctrl_dev *pctldev, | |||
| 279 | /* mA */ | 288 | /* mA */ |
| 280 | if (config & MA_PRESENT) { | 289 | if (config & MA_PRESENT) { |
| 281 | shift = pin % 8 * 4; | 290 | shift = pin % 8 * 4; |
| 282 | writel(0x3 << shift, reg + CLR); | 291 | mxs_pinctrl_rmwl(ma, 0x3, shift, reg); |
| 283 | writel(ma << shift, reg + SET); | ||
| 284 | } | 292 | } |
| 285 | 293 | ||
| 286 | /* vol */ | 294 | /* vol */ |
