[U-Boot] [PATCH 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
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 | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 58 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 ---
drivers/core/ofnode.c | 2 +- drivers/core/read.c | 10 ++++++++++ include/dm/ofnode.h | 2 +- include/dm/read.h | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 44 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..5dd2ddca70e8 100644 --- a/drivers/core/read.c +++ b/drivers/core/read.c @@ -11,6 +11,16 @@ #include <mapmem.h> #include <dm/of_access.h>
+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); +} + int dev_read_u32(struct udevice *dev, const char *propname, u32 *outp) { return ofnode_read_u32(dev_ofnode(dev), propname, outp); 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..8985f248c68f 100644 --- a/include/dm/read.h +++ b/include/dm/read.h @@ -44,6 +44,26 @@ static inline bool dev_of_valid(struct udevice *dev) }
#ifndef CONFIG_DM_DEV_READ_INLINE +/** + * 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_u32() - read a 32-bit integer from a device's DT property * @@ -563,6 +583,18 @@ int dev_read_alias_highest_id(const char *stem);
#else /* CONFIG_DM_DEV_READ_INLINE is enabled */
+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 int dev_read_u32(struct udevice *dev, const char *propname, u32 *outp) {

Hi Michal,
On Thu, Aug 22, 2019 at 7:18 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
drivers/core/ofnode.c | 2 +- drivers/core/read.c | 10 ++++++++++ include/dm/ofnode.h | 2 +- include/dm/read.h | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 44 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)
Why changing the return value type here?
{ assert(ofnode_valid(node)); ofnode_read_u64(node, propname, &def); diff --git a/drivers/core/read.c b/drivers/core/read.c index 8b5502de1159..5dd2ddca70e8 100644 --- a/drivers/core/read.c +++ b/drivers/core/read.c @@ -11,6 +11,16 @@ #include <mapmem.h> #include <dm/of_access.h>
+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);
+}
I would put the dev_read_u64_* routines after the u32 version below.
int dev_read_u32(struct udevice *dev, const char *propname, u32 *outp) { return ofnode_read_u32(dev_ofnode(dev), propname, outp); 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..8985f248c68f 100644 --- a/include/dm/read.h +++ b/include/dm/read.h @@ -44,6 +44,26 @@ static inline bool dev_of_valid(struct udevice *dev) }
#ifndef CONFIG_DM_DEV_READ_INLINE +/**
- 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_u32() - read a 32-bit integer from a device's DT property
@@ -563,6 +583,18 @@ int dev_read_alias_highest_id(const char *stem);
#else /* CONFIG_DM_DEV_READ_INLINE is enabled */
+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 int dev_read_u32(struct udevice *dev, const char *propname, u32 *outp) { --
Regards, Bin

Hi Bin Meng,
-----Original Message----- From: Bin Meng bmeng.cn@gmail.com Sent: Friday, August 23, 2019 8:58 AM To: Michal Simek michals@xilinx.com Cc: U-Boot Mailing List u-boot@lists.denx.de; T Karthik Reddy tkarthik@xilinx.com; git git@xilinx.com Subject: Re: [U-Boot] [PATCH 1/2] dm: core: Add functions to read 64-bit dt properties
Hi Michal,
On Thu, Aug 22, 2019 at 7:18 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
drivers/core/ofnode.c | 2 +- drivers/core/read.c | 10 ++++++++++ include/dm/ofnode.h | 2 +- include/dm/read.h | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 44 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)
Why changing the return value type here?
Because "ofnode_read_u64_default" will get a 64-bit integer value from DT & that 64-bit value should return instead of 32-bit value.
{ assert(ofnode_valid(node)); ofnode_read_u64(node, propname, &def); diff --git a/drivers/core/read.c b/drivers/core/read.c index 8b5502de1159..5dd2ddca70e8 100644 --- a/drivers/core/read.c +++ b/drivers/core/read.c @@ -11,6 +11,16 @@ #include <mapmem.h> #include <dm/of_access.h>
+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); }
I would put the dev_read_u64_* routines after the u32 version below.
It will be modified in V2.
Regards T karthik
int dev_read_u32(struct udevice *dev, const char *propname, u32 *outp) { return ofnode_read_u32(dev_ofnode(dev), propname, outp); 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..8985f248c68f 100644 --- a/include/dm/read.h +++ b/include/dm/read.h @@ -44,6 +44,26 @@ static inline bool dev_of_valid(struct udevice *dev) }
#ifndef CONFIG_DM_DEV_READ_INLINE +/**
- 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_u32() - read a 32-bit integer from a device's DT property
@@ -563,6 +583,18 @@ int dev_read_alias_highest_id(const char *stem);
#else /* CONFIG_DM_DEV_READ_INLINE is enabled */
+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 int dev_read_u32(struct udevice *dev, const char *propname, u32 *outp) { --
Regards, Bin

On Fri, Aug 23, 2019 at 11:58 AM T Karthik Reddy tkarthik@xilinx.com wrote:
Hi Bin Meng,
-----Original Message----- From: Bin Meng bmeng.cn@gmail.com Sent: Friday, August 23, 2019 8:58 AM To: Michal Simek michals@xilinx.com Cc: U-Boot Mailing List u-boot@lists.denx.de; T Karthik Reddy tkarthik@xilinx.com; git git@xilinx.com Subject: Re: [U-Boot] [PATCH 1/2] dm: core: Add functions to read 64-bit dt properties
Hi Michal,
On Thu, Aug 22, 2019 at 7:18 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
drivers/core/ofnode.c | 2 +- drivers/core/read.c | 10 ++++++++++ include/dm/ofnode.h | 2 +- include/dm/read.h | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 44 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)
Why changing the return value type here?
Because "ofnode_read_u64_default" will get a 64-bit integer value from DT & that 64-bit value should return instead of 32-bit value.
Somehow I misread the changes was to another API ofnode_read_u64. Yes, that makes sense!
{ assert(ofnode_valid(node)); ofnode_read_u64(node, propname, &def); diff --git a/drivers/core/read.c b/drivers/core/read.c index 8b5502de1159..5dd2ddca70e8 100644 --- a/drivers/core/read.c +++ b/drivers/core/read.c @@ -11,6 +11,16 @@ #include <mapmem.h> #include <dm/of_access.h>
+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); }
I would put the dev_read_u64_* routines after the u32 version below.
It will be modified in V2.
Regards, Bin

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 ---
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 (3)
-
Bin Meng
-
Michal Simek
-
T Karthik Reddy