[U-Boot] [PATCH v2 0/2] Add sdhci dt caps & caps mask support

Hi,
This patch series adds support for reading 64-bit dt properties & add support sdhci dt caps & caps mask.
Thanks, Michal
Changes in v2: - Moved newly added 64-bit funtion definations & prototypes below 32-bit functions.
T Karthik Reddy (2): dm: core: Add functions to read 64-bit dt properties mmc: sdhci: Add support for dt caps & caps mask
drivers/core/ofnode.c | 2 +- drivers/core/read.c | 10 ++++++++++ drivers/mmc/sdhci.c | 23 ++++++++++++++--------- include/dm/ofnode.h | 2 +- include/dm/read.h | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 59 insertions(+), 11 deletions(-)

From: T Karthik Reddy t.karthik.reddy@xilinx.com
This patch adds functions dev_read_u64_default & dev_read_u64 to read unsigned 64-bit values from devicetree.
Signed-off-by: T Karthik Reddy t.karthik.reddy@xilinx.com Signed-off-by: Michal Simek michal.simek@xilinx.com ---
Changes in v2: - Moved newly added 64-bit funtion definations & prototypes below 32-bit functions.
drivers/core/ofnode.c | 2 +- drivers/core/read.c | 10 ++++++++++ include/dm/ofnode.h | 2 +- include/dm/read.h | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index e74a662d1d30..7eca00cd6613 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -79,7 +79,7 @@ int ofnode_read_u64(ofnode node, const char *propname, u64 *outp) return 0; }
-int ofnode_read_u64_default(ofnode node, const char *propname, u64 def) +u64 ofnode_read_u64_default(ofnode node, const char *propname, u64 def) { assert(ofnode_valid(node)); ofnode_read_u64(node, propname, &def); diff --git a/drivers/core/read.c b/drivers/core/read.c index 8b5502de1159..fb3dcd9a7905 100644 --- a/drivers/core/read.c +++ b/drivers/core/read.c @@ -44,6 +44,16 @@ int dev_read_u32u(struct udevice *dev, const char *propname, uint *outp) return 0; }
+int dev_read_u64(struct udevice *dev, const char *propname, u64 *outp) +{ + return ofnode_read_u64(dev_ofnode(dev), propname, outp); +} + +u64 dev_read_u64_default(struct udevice *dev, const char *propname, u64 def) +{ + return ofnode_read_u64_default(dev_ofnode(dev), propname, def); +} + const char *dev_read_string(struct udevice *dev, const char *propname) { return ofnode_read_string(dev_ofnode(dev), propname); diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h index 4f89db44c19e..5c4cbf099869 100644 --- a/include/dm/ofnode.h +++ b/include/dm/ofnode.h @@ -254,7 +254,7 @@ int ofnode_read_u64(ofnode node, const char *propname, u64 *outp); * @def: default value to return if the property has no value * @return property value, or @def if not found */ -int ofnode_read_u64_default(ofnode node, const char *propname, u64 def); +u64 ofnode_read_u64_default(ofnode node, const char *propname, u64 def);
/** * ofnode_read_string() - Read a string from a property diff --git a/include/dm/read.h b/include/dm/read.h index 0c62d62f1148..803daf7620c8 100644 --- a/include/dm/read.h +++ b/include/dm/read.h @@ -44,6 +44,7 @@ static inline bool dev_of_valid(struct udevice *dev) }
#ifndef CONFIG_DM_DEV_READ_INLINE + /** * dev_read_u32() - read a 32-bit integer from a device's DT property * @@ -96,6 +97,26 @@ int dev_read_s32_default(struct udevice *dev, const char *propname, int def); */ int dev_read_u32u(struct udevice *dev, const char *propname, uint *outp);
+/** + * dev_read_u64() - read a 64-bit integer from a device's DT property + * + * @dev: device to read DT property from + * @propname: name of the property to read from + * @outp: place to put value (if found) + * @return 0 if OK, -ve on error + */ +int dev_read_u64(struct udevice *dev, const char *propname, u64 *outp); + +/** + * dev_read_u64_default() - read a 64-bit integer from a device's DT property + * + * @dev: device to read DT property from + * @propname: name of the property to read from + * @def: default value to return if the property has no value + * @return property value, or @def if not found + */ +u64 dev_read_u64_default(struct udevice *dev, const char *propname, u64 def); + /** * dev_read_string() - Read a string from a device's DT property * @@ -601,6 +622,18 @@ static inline int dev_read_u32u(struct udevice *dev, return 0; }
+static inline int dev_read_u64(struct udevice *dev, + const char *propname, u64 *outp) +{ + return ofnode_read_u64(dev_ofnode(dev), propname, outp); +} + +static inline u64 dev_read_u64_default(struct udevice *dev, + const char *propname, u64 def) +{ + return ofnode_read_u64_default(dev_ofnode(dev), propname, def); +} + static inline const char *dev_read_string(struct udevice *dev, const char *propname) {

On Mon, Sep 2, 2019 at 10:34 PM Michal Simek michal.simek@xilinx.com wrote:
From: T Karthik Reddy t.karthik.reddy@xilinx.com
This patch adds functions dev_read_u64_default & dev_read_u64 to read unsigned 64-bit values from devicetree.
Signed-off-by: T Karthik Reddy t.karthik.reddy@xilinx.com Signed-off-by: Michal Simek michal.simek@xilinx.com
Changes in v2:
- Moved newly added 64-bit funtion definations & prototypes below 32-bit functions.
drivers/core/ofnode.c | 2 +- drivers/core/read.c | 10 ++++++++++ include/dm/ofnode.h | 2 +- include/dm/read.h | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-)
Reviewed-by: Bin Meng bmeng.cn@gmail.com

On Mon, 2 Sep 2019 at 09:24, Bin Meng bmeng.cn@gmail.com wrote:
On Mon, Sep 2, 2019 at 10:34 PM Michal Simek michal.simek@xilinx.com wrote:
From: T Karthik Reddy t.karthik.reddy@xilinx.com
This patch adds functions dev_read_u64_default & dev_read_u64 to read unsigned 64-bit values from devicetree.
Signed-off-by: T Karthik Reddy t.karthik.reddy@xilinx.com Signed-off-by: Michal Simek michal.simek@xilinx.com
Changes in v2:
- Moved newly added 64-bit funtion definations & prototypes below 32-bit functions.
drivers/core/ofnode.c | 2 +- drivers/core/read.c | 10 ++++++++++ include/dm/ofnode.h | 2 +- include/dm/read.h | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-)
Reviewed-by: Bin Meng bmeng.cn@gmail.com
How about adding a few tests for these new functions?
See for example here:
https://gitlab.denx.de/u-boot/custodians/u-boot-dm/commit/63453b90049cef1030...
- Simon

On 17. 09. 19 7:47, Simon Glass wrote:
On Mon, 2 Sep 2019 at 09:24, Bin Meng bmeng.cn@gmail.com wrote:
On Mon, Sep 2, 2019 at 10:34 PM Michal Simek michal.simek@xilinx.com wrote:
From: T Karthik Reddy t.karthik.reddy@xilinx.com
This patch adds functions dev_read_u64_default & dev_read_u64 to read unsigned 64-bit values from devicetree.
Signed-off-by: T Karthik Reddy t.karthik.reddy@xilinx.com Signed-off-by: Michal Simek michal.simek@xilinx.com
Changes in v2:
- Moved newly added 64-bit funtion definations & prototypes below 32-bit functions.
drivers/core/ofnode.c | 2 +- drivers/core/read.c | 10 ++++++++++ include/dm/ofnode.h | 2 +- include/dm/read.h | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-)
Reviewed-by: Bin Meng bmeng.cn@gmail.com
How about adding a few tests for these new functions?
See for example here:
https://gitlab.denx.de/u-boot/custodians/u-boot-dm/commit/63453b90049cef1030...
It shouldn't be a problem to put some u64 properties and read them back.
Karthik: Can you please take a look at it?
Thanks, Michal

Hi,
-----Original Message----- From: Michal Simek michal.simek@xilinx.com Sent: Tuesday, September 17, 2019 6:56 PM To: Simon Glass sjg@chromium.org; Bin Meng bmeng.cn@gmail.com Cc: Michal Simek michals@xilinx.com; U-Boot Mailing List <u- boot@lists.denx.de>; T Karthik Reddy tkarthik@xilinx.com; git git@xilinx.com Subject: Re: [PATCH v2 1/2] dm: core: Add functions to read 64-bit dt properties
On 17. 09. 19 7:47, Simon Glass wrote:
On Mon, 2 Sep 2019 at 09:24, Bin Meng bmeng.cn@gmail.com wrote:
On Mon, Sep 2, 2019 at 10:34 PM Michal Simek
michal.simek@xilinx.com wrote:
From: T Karthik Reddy t.karthik.reddy@xilinx.com
This patch adds functions dev_read_u64_default & dev_read_u64 to read unsigned 64-bit values from devicetree.
Signed-off-by: T Karthik Reddy t.karthik.reddy@xilinx.com Signed-off-by: Michal Simek michal.simek@xilinx.com
Changes in v2:
- Moved newly added 64-bit funtion definations & prototypes below 32-bit functions.
drivers/core/ofnode.c | 2 +- drivers/core/read.c | 10 ++++++++++ include/dm/ofnode.h | 2 +- include/dm/read.h | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-)
Reviewed-by: Bin Meng bmeng.cn@gmail.com
How about adding a few tests for these new functions?
See for example here:
https://nam02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitl ab.denx.de%2Fu-boot%2Fcustodians%2Fu-boot-
dm%2Fcommit%2F63453b90049cef
10309f254c35d8a33e1e6552ba&data=02%7C01%7Ctkarthik%40xilinx.co m%7C
3e117e8ac64647d1c85c08d73b72c06e%7C657af505d5df48d08300c31994686c5 c%7C
0%7C1%7C637043236369808223&sdata=MQJnMjJlj6QHbMQ%2Fz77bXjd BkfiGFXa
YAbnISGTKR3A%3D&reserved=0
It shouldn't be a problem to put some u64 properties and read them back.
Karthik: Can you please take a look at it?
Okay.
Regards T karthik
Thanks, Michal

From: T Karthik Reddy t.karthik.reddy@xilinx.com
The sdhci capabilities registers can be incorrect. The sdhci-caps-mask and sdhci-caps dt properties specify which bits of the registers are incorrect and what their values should be. This patch makes the sdhci driver use those properties to correct the caps. Also use "dev_read_u64_default" instead of "dev_read_u32_array" for caps mask.
Signed-off-by: T Karthik Reddy t.karthik.reddy@xilinx.com Signed-off-by: Michal Simek michal.simek@xilinx.com ---
Changes in v2: None
drivers/mmc/sdhci.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c index 2779bca93f08..fbc576fd726e 100644 --- a/drivers/mmc/sdhci.c +++ b/drivers/mmc/sdhci.c @@ -711,17 +711,19 @@ int sdhci_setup_cfg(struct mmc_config *cfg, struct sdhci_host *host, { u32 caps, caps_1 = 0; #if CONFIG_IS_ENABLED(DM_MMC) - u32 mask[2] = {0}; - int ret; - ret = dev_read_u32_array(host->mmc->dev, "sdhci-caps-mask", - mask, 2); - if (ret && ret != -1) - return ret; - - caps = ~mask[1] & sdhci_readl(host, SDHCI_CAPABILITIES); + u64 dt_caps, dt_caps_mask; + + dt_caps_mask = dev_read_u64_default(host->mmc->dev, + "sdhci-caps-mask", 0); + dt_caps = dev_read_u64_default(host->mmc->dev, + "sdhci-caps", 0); + caps = ~(u32)dt_caps_mask & + sdhci_readl(host, SDHCI_CAPABILITIES); + caps |= (u32)dt_caps; #else caps = sdhci_readl(host, SDHCI_CAPABILITIES); #endif + debug("%s, caps: 0x%x\n", __func__, caps);
#ifdef CONFIG_MMC_SDHCI_SDMA if (!(caps & SDHCI_CAN_DO_SDMA)) { @@ -762,10 +764,13 @@ int sdhci_setup_cfg(struct mmc_config *cfg, struct sdhci_host *host, /* Check whether the clock multiplier is supported or not */ if (SDHCI_GET_VERSION(host) >= SDHCI_SPEC_300) { #if CONFIG_IS_ENABLED(DM_MMC) - caps_1 = ~mask[0] & sdhci_readl(host, SDHCI_CAPABILITIES_1); + caps_1 = ~(u32)(dt_caps_mask >> 32) & + sdhci_readl(host, SDHCI_CAPABILITIES_1); + caps_1 |= (u32)(dt_caps >> 32); #else caps_1 = sdhci_readl(host, SDHCI_CAPABILITIES_1); #endif + debug("%s, caps_1: 0x%x\n", __func__, caps_1); host->clk_mul = (caps_1 & SDHCI_CLOCK_MUL_MASK) >> SDHCI_CLOCK_MUL_SHIFT; }
participants (4)
-
Bin Meng
-
Michal Simek
-
Simon Glass
-
T Karthik Reddy