|
@@ -29,6 +29,7 @@
|
|
|
#include <linux/spinlock.h>
|
|
|
#include <linux/reboot.h>
|
|
|
#include <linux/pm.h>
|
|
|
+#include <linux/log2.h>
|
|
|
|
|
|
#include "../core.h"
|
|
|
#include "../pinconf.h"
|
|
@@ -138,10 +139,11 @@ static int msm_pinmux_set_mux(struct pinctrl_dev *pctldev,
|
|
|
struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
|
|
|
const struct msm_pingroup *g;
|
|
|
unsigned long flags;
|
|
|
- u32 val;
|
|
|
+ u32 val, mask;
|
|
|
int i;
|
|
|
|
|
|
g = &pctrl->soc->groups[group];
|
|
|
+ mask = GENMASK(g->mux_bit + order_base_2(g->nfuncs) - 1, g->mux_bit);
|
|
|
|
|
|
for (i = 0; i < g->nfuncs; i++) {
|
|
|
if (g->funcs[i] == function)
|
|
@@ -154,7 +156,7 @@ static int msm_pinmux_set_mux(struct pinctrl_dev *pctldev,
|
|
|
spin_lock_irqsave(&pctrl->lock, flags);
|
|
|
|
|
|
val = readl(pctrl->regs + g->ctl_reg);
|
|
|
- val &= ~(0x7 << g->mux_bit);
|
|
|
+ val &= mask;
|
|
|
val |= i << g->mux_bit;
|
|
|
writel(val, pctrl->regs + g->ctl_reg);
|
|
|
|