[PATCH] pinctrl/rockchip: re-fix RK3308 pinmux bits

Luca Ceresoli luca.ceresoli at bootlin.com
Fri Sep 30 09:23:58 PDT 2022


Hello Jianqun Xu,

On Fri, 30 Sep 2022 18:26:20 +0800
Jianqun Xu <jay.xu at rock-chips.com> wrote:

> Part of pins from RK3308 SoCs have two registers to do pinmux, one is
> the origin register with 2bits named by gpioxx_sel, and another with
> 3bits and named by gpioxx_sel_plus.

Are the "plus" registers documented anywhere?

The reference manual I have does not mention them.

> The default value is 2bits. But Rockchip downstream pinctrl driver has a
> soc init for RK3308 to switch to the 3bits path. The first patch
> upstream the support for RK3308 pinctrl but drop the soc init codes.
> 
> The commit 1f3e25a06883 ("pinctrl: rockchip: fix RK3308 pinmux bits") try
> to fix back to 2 bits path, but that will makes some iomux not be
> supported.

Sorry about that, of course I could not know because my documentation
does not mention those registers.

> @@ -3014,6 +3014,50 @@ static int __maybe_unused rockchip_pinctrl_resume(struct device *dev)
>  static SIMPLE_DEV_PM_OPS(rockchip_pinctrl_dev_pm_ops, rockchip_pinctrl_suspend,
>  			 rockchip_pinctrl_resume);
>  
> +
> +static int rk3308_soc_data_init(struct rockchip_pinctrl *info)
> +{
> +	int ret;
> +
> +	#define RK3308_GRF_SOC_CON13	(0x608)
> +	#define RK3308_GRF_SOC_CON15	(0x610)
> +
> +	/* RK3308_GRF_SOC_CON13 */
> +	#define RK3308_GRF_I2C3_IOFUNC_SRC_CTRL	(BIT(16 + 10) | BIT(10))
> +	#define RK3308_GRF_GPIO2A3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
> +	#define RK3308_GRF_GPIO2A2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
> +
> +	/* RK3308_GRF_SOC_CON15 */
> +	#define RK3308_GRF_GPIO2C0_SEL_SRC_CTRL	(BIT(16 + 11) | BIT(11))
> +	#define RK3308_GRF_GPIO3B3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
> +	#define RK3308_GRF_GPIO3B2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
> +
> +	/*
> +	 * Enable the special ctrl of selected sources.
> +	 *
> +	 * Example reference to GRF_SOC_CON13 description:
> +	 *
> +	 * gpio2a2_sel_src_ctrl
> +	 * IOMUX control source selection.
> +	 * 1'b0: use basic GPIO2A_IOMUX[gpio2a2_sel]
> +	 * 1'b1: use gpio2a2_sel_plus instead of GPIO2A_IOMUX[gpio2a2_sel]
> +	 */
> +
> +	ret = regmap_write(info->regmap_base, RK3308_GRF_SOC_CON13,
> +			   RK3308_GRF_I2C3_IOFUNC_SRC_CTRL |
> +			   RK3308_GRF_GPIO2A3_SEL_SRC_CTRL |
> +			   RK3308_GRF_GPIO2A2_SEL_SRC_CTRL);
> +	if (ret)
> +		return ret;
> +
> +	ret = regmap_write(info->regmap_base, RK3308_GRF_SOC_CON15,
> +			   RK3308_GRF_GPIO2C0_SEL_SRC_CTRL |
> +			   RK3308_GRF_GPIO3B3_SEL_SRC_CTRL |
> +			   RK3308_GRF_GPIO3B2_SEL_SRC_CTRL);
> +
> +	return ret;
> +}

This is new code, not code that my patch has removed. Is it needed? How
did the driver work before without this code?

I think we need to clarify those registers before applying a fix that
might create other problems.

Best regards.
-- 
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



More information about the Linux-rockchip mailing list