[PATCH v1 1/2] x86: tangier: Enable support for SD/SDIO family in the pinmux driver
Bin Meng
bmeng.cn at gmail.com
Wed Oct 27 04:49:10 CEST 2021
Hi Andy,
On Sat, Oct 16, 2021 at 1:27 AM Andy Shevchenko
<andriy.shevchenko at linux.intel.com> wrote:
>
> We would need to quirk out Card Detect case and for that we allow
> configuring SD/SDIO family of pins.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
> ---
> arch/x86/cpu/tangier/pinmux.c | 39 ++++++++++++++++++++++++++++++-----
> 1 file changed, 34 insertions(+), 5 deletions(-)
>
> diff --git a/arch/x86/cpu/tangier/pinmux.c b/arch/x86/cpu/tangier/pinmux.c
> index acf97e3af51d..8385167b2b6b 100644
> --- a/arch/x86/cpu/tangier/pinmux.c
> +++ b/arch/x86/cpu/tangier/pinmux.c
> @@ -37,8 +37,9 @@ struct mrfld_family {
> .npins = (e) - (s) + 1, \
> }
>
> -/* Now we only support I2C family of pins */
> +/* Now we only support SD/SDIO and I2C families of pins */
> static struct mrfld_family mrfld_families[] = {
> + MRFLD_FAMILY(3, 37, 56),
> MRFLD_FAMILY(7, 101, 114),
> };
>
> @@ -125,6 +126,34 @@ static int mrfld_pinconfig_protected(unsigned int pin, u32 mask, u32 bits)
> return ret;
> }
>
> +static int mrfld_pinconfig(unsigned int pin, u32 mask, u32 bits)
> +{
> + struct mrfld_pinctrl *pinctrl;
> + struct udevice *dev;
> + void __iomem *bufcfg;
> + u32 v, value;
> + int ret;
> +
> + ret = syscon_get_by_driver_data(X86_SYSCON_PINCONF, &dev);
> + if (ret)
> + return ret;
> +
> + pinctrl = dev_get_priv(dev);
> +
> + bufcfg = mrfld_get_bufcfg(pinctrl, pin);
> + if (!bufcfg)
> + return -EINVAL;
> +
> + value = readl(bufcfg);
> + v = (value & ~mask) | (bits & mask);
> + writel(v, bufcfg);
> +
> + debug("v: 0x%x p: 0x%x bits: %d, mask: %d bufcfg: 0x%p\n",
> + v, (u32)bufcfg, bits, mask, bufcfg);
> +
> + return 0;
This function can be consolidated with mrfld_pinconfig_protected(),
ie: updating mrfld_pinconfig_protected() to call mrfld_pinconfig().
> +}
> +
> static int mrfld_pinctrl_cfg_pin(ofnode pin_node)
> {
> bool is_protected;
> @@ -133,10 +162,7 @@ static int mrfld_pinctrl_cfg_pin(ofnode pin_node)
> u32 mask;
> int ret;
>
> - /* For now we only support just protected Family of pins */
> is_protected = ofnode_read_bool(pin_node, "protected");
> - if (!is_protected)
> - return -ENOTSUPP;
>
> pad_offset = ofnode_read_s32_default(pin_node, "pad-offset", -1);
> if (pad_offset == -1)
> @@ -152,7 +178,10 @@ static int mrfld_pinctrl_cfg_pin(ofnode pin_node)
> if (mode & ~mask)
> return -ENOTSUPP;
>
> - ret = mrfld_pinconfig_protected(pad_offset, mask, mode);
> + if (is_protected)
> + ret = mrfld_pinconfig_protected(pad_offset, mask, mode);
> + else
> + ret = mrfld_pinconfig(pad_offset, mask, mode);
>
> return ret;
> }
Regards,
Bin
More information about the U-Boot
mailing list