static void uniphier_pinmux_set_one(struct udevice *dev, unsigned pin, unsigned muxval) { struct uniphier_pinctrl_priv *priv = dev_get_priv(dev); unsigned mux_bits = priv->socdata->mux_bits; unsigned reg_stride = priv->socdata->reg_stride; unsigned reg, reg_end, shift, mask; u32 tmp; /* some pins need input-enabling */ uniphier_pinconf_input_enable(dev, pin); reg = UNIPHIER_PINCTRL_PINMUX_BASE + pin * mux_bits / 32 * reg_stride; reg_end = reg + reg_stride; shift = pin * mux_bits % 32; mask = (1U << mux_bits) - 1; /* * If reg_stride is greater than 4, the MSB of each pinsel shall be * stored in the offset+4. */ for (; reg < reg_end; reg += 4) { tmp = readl(priv->base + reg); tmp &= ~(mask << shift); tmp |= (mask & muxval) << shift; writel(tmp, priv->base + reg); muxval >>= mux_bits; } if (priv->socdata->load_pinctrl) writel(1, priv->base + UNIPHIER_PINCTRL_LOAD_PINMUX); }
static void uniphier_pinmux_set_one(struct udevice *dev, unsigned pin, int muxval) { struct uniphier_pinctrl_priv *priv = dev_get_priv(dev); unsigned mux_bits, reg_stride, reg, reg_end, shift, mask; bool load_pinctrl; u32 tmp; /* some pins need input-enabling */ uniphier_pinconf_input_enable(dev, pin); if (muxval < 0) return; /* dedicated pin; nothing to do for pin-mux */ if (priv->socdata->caps & UNIPHIER_PINCTRL_CAPS_DBGMUX_SEPARATE) { /* * Mode offset bit * Normal 4 * n shift+3:shift * Debug 4 * n shift+7:shift+4 */ mux_bits = 4; reg_stride = 8; load_pinctrl = true; } else { /* * Mode offset bit * Normal 8 * n shift+3:shift * Debug 8 * n + 4 shift+3:shift */ mux_bits = 8; reg_stride = 4; load_pinctrl = false; } reg = UNIPHIER_PINCTRL_PINMUX_BASE + pin * mux_bits / 32 * reg_stride; reg_end = reg + reg_stride; shift = pin * mux_bits % 32; mask = (1U << mux_bits) - 1; /* * If reg_stride is greater than 4, the MSB of each pinsel shall be * stored in the offset+4. */ for (; reg < reg_end; reg += 4) { tmp = readl(priv->base + reg); tmp &= ~(mask << shift); tmp |= (mask & muxval) << shift; writel(tmp, priv->base + reg); muxval >>= mux_bits; } if (load_pinctrl) writel(1, priv->base + UNIPHIER_PINCTRL_LOAD_PINMUX); }
static int uniphier_pinconf_set_one(struct udevice *dev, unsigned int pin, unsigned int param, unsigned int arg) { int ret; switch (param) { case PIN_CONFIG_BIAS_DISABLE: case PIN_CONFIG_BIAS_PULL_UP: case PIN_CONFIG_BIAS_PULL_DOWN: case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: ret = uniphier_pinconf_bias_set(dev, pin, param, arg); break; case PIN_CONFIG_INPUT_ENABLE: ret = uniphier_pinconf_input_enable(dev, pin, arg); break; default: printf("unsupported configuration parameter %u\n", param); return -EINVAL; } return ret; }