[PATCH v2 1/2] x86: tangier: Enable support for SD/SDIO family in the pinmux driver

We would need to quirk out the Card Detect case and for that we allow configuring the SD/SDIO family of pins.
Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com Reviewed-by: Bin Meng bmeng.cn@gmail.com --- v2: added tag, promised to deduplicate the code in the future (Bin) 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; +} + 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; }

There are two PCB designs in the wild which use the opposite signaling for SD card detection. This makes U-Boot working in one case and failing in the other. Quirk this out by disconnecting SD card detection pin from the PCB by switching it to mode 3. In the disconnected state the read value is always the same and inverted to what we are expecting in the code.
BugLink: https://github.com/edison-fw/meta-intel-edison/issues/136 Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com Reviewed-by: Bin Meng bmeng.cn@gmail.com --- v2: added tag, updated commit message and comments in DTS (Bin) arch/x86/dts/edison.dts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/arch/x86/dts/edison.dts b/arch/x86/dts/edison.dts index 2c8cf6c07102..b3658b8c3049 100644 --- a/arch/x86/dts/edison.dts +++ b/arch/x86/dts/edison.dts @@ -94,6 +94,12 @@ sdcard: mmc@ff3fa000 { compatible = "intel,sdhci-tangier"; reg = <0xff3fa000 0x1000>; + /* + * In the disconnected state of the SD Card Detection pin + * the read value is always the same and inverted to what + * we are expecting in the code. + */ + cd-inverted; };
pmu: power@ff00b000 { @@ -131,6 +137,17 @@ compatible = "intel,pinctrl-tangier"; reg = <0xff0c0000 0x8000>;
+ /* + * Disconnect SD card detection pin, so it won't affect + * the reality on two different PCB designs where it's + * using the opposite signaling: Edison/Arduino uses + * Active Low, while SparkFun went with Active High. + */ + sd_cd@0 { + pad-offset = <37>; + mode-func = <3>; + }; + /* * Initial configuration came from the firmware. * Which quite likely has been used in the phones, where I2C #8,

On Wed, Oct 27, 2021 at 7:28 PM Andy Shevchenko andriy.shevchenko@linux.intel.com wrote:
There are two PCB designs in the wild which use the opposite signaling for SD card detection. This makes U-Boot working in one case and failing in the other. Quirk this out by disconnecting SD card detection pin from the PCB by switching it to mode 3. In the disconnected state the read value is always the same and inverted to what we are expecting in the code.
BugLink: https://github.com/edison-fw/meta-intel-edison/issues/136 Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com Reviewed-by: Bin Meng bmeng.cn@gmail.com
v2: added tag, updated commit message and comments in DTS (Bin) arch/x86/dts/edison.dts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
applied to u-boot-x86, thanks!

On Wed, Oct 27, 2021 at 7:28 PM Andy Shevchenko andriy.shevchenko@linux.intel.com wrote:
We would need to quirk out the Card Detect case and for that we allow configuring the SD/SDIO family of pins.
Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com Reviewed-by: Bin Meng bmeng.cn@gmail.com
v2: added tag, promised to deduplicate the code in the future (Bin) arch/x86/cpu/tangier/pinmux.c | 39 ++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-)
applied to u-boot-x86, thanks!
participants (2)
-
Andy Shevchenko
-
Bin Meng