[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