示例#1
0
static int rk3288_pinctrl_set_pins(struct udevice *dev, int banknum, int index,
				   int muxval, int flags)
{
	struct rk3288_pinctrl_priv *priv = dev_get_priv(dev);
	uint shift, ind = index;
	uint mask;
	uint value;
	u32 *addr;
	int ret;

	debug("%s: %x %x %x %x\n", __func__, banknum, index, muxval, flags);
	ret = rk3288_pinctrl_get_pin_info(priv, banknum, index, &addr, &shift,
					  &mask);
	if (ret)
		return ret;

	/*
	 * PMU_GPIO0 registers cannot be selectively written so we cannot use
	 * rk_clrsetreg() here.  However, the upper 16 bits are reserved and
	 * are ignored when written, so we can use the same code as for the
	 * other GPIO banks providing that we preserve the value of the other
	 * bits.
	 */
	value = readl(addr);
	value &= ~(mask << shift);
	value |= (mask << (shift + 16)) | (muxval << shift);
	writel(value, addr);

	/* Handle pullup/pulldown */
	if (flags) {
		uint val = 0;

		if (flags & (1 << PIN_CONFIG_BIAS_PULL_UP))
			val = 1;
		else if (flags & (1 << PIN_CONFIG_BIAS_PULL_DOWN))
			val = 2;
		shift = (index & 7) * 2;
		ind = index >> 3;
		if (banknum == 0)
			addr = &priv->pmu->gpio0pull[ind];
		else
			addr = &priv->grf->gpio1_p[banknum - 1][ind];
		debug("%s: addr=%p, val=%x, shift=%x\n", __func__, addr, val,
		      shift);

		/* As above, rk_clrsetreg() cannot be used here. */
		value = readl(addr);
		value &= ~(mask << shift);
		value |= (3 << (shift + 16)) | (val << shift);
		writel(value, addr);
	}

	return 0;
}
示例#2
0
static int rk3288_pinctrl_get_gpio_mux(struct udevice *dev, int banknum,
				       int index)
{
	struct rk3288_pinctrl_priv *priv = dev_get_priv(dev);
	uint shift;
	uint mask;
	u32 *addr;
	int ret;

	ret = rk3288_pinctrl_get_pin_info(priv, banknum, index, &addr, &shift,
					  &mask);
	if (ret)
		return ret;
	return (readl(addr) & mask) >> shift;
}
示例#3
0
static int rk3288_pinctrl_set_pins(struct udevice *dev, int banknum, int index,
                                   int muxval, int flags)
{
    struct rk3288_pinctrl_priv *priv = dev_get_priv(dev);
    uint shift, ind = index;
    uint mask;
    u32 *addr;
    int ret;

    debug("%s: %x %x %x %x\n", __func__, banknum, index, muxval, flags);
    ret = rk3288_pinctrl_get_pin_info(priv, banknum, index, &addr, &shift,
                                      &mask);
    if (ret)
        return ret;
    rk_clrsetreg(addr, mask << shift, muxval << shift);

    /* Handle pullup/pulldown */
    if (flags) {
        uint val = 0;

        if (flags & (1 << PIN_CONFIG_BIAS_PULL_UP))
            val = 1;
        else if (flags & (1 << PIN_CONFIG_BIAS_PULL_DOWN))
            val = 2;
        shift = (index & 7) * 2;
        ind = index >> 3;
        if (banknum == 0)
            addr = &priv->pmu->gpio0pull[ind];
        else
            addr = &priv->grf->gpio1_p[banknum - 1][ind];
        debug("%s: addr=%p, val=%x, shift=%x\n", __func__, addr, val,
              shift);
        rk_clrsetreg(addr, 3 << shift, val << shift);
    }

    return 0;
}