From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heiko Stuebner Date: Fri, 05 May 2017 15:10:07 +0200 Subject: [U-Boot] [PATCH v3] regmap: add support for address cell 2 In-Reply-To: <1493952008-9762-1-git-send-email-kever.yang@rock-chips.com> References: <1493952008-9762-1-git-send-email-kever.yang@rock-chips.com> Message-ID: <1899317.D03Pv7KL9M@phil> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Kever, Am Freitag, 5. Mai 2017, 10:39:35 CEST schrieb Kever Yang: > ARM64 is using 64bit address which address cell is 2 instead of 1, > update to support it when of-platdata enabled. > > Signed-off-by: Kever Yang This helps make OF_PLATDATA work on my firefly-rk3399 so yay :-), but I don't think it's that easy to solve, see below: > --- > > Changes in v3: > - move of_plat_get_number() into lib/of_plat.c > > Changes in v2: > - rename the fdtdec_get_number() to of_plat_get_number() > > drivers/core/regmap.c | 9 +++++++++ > include/of_plat.h | 22 ++++++++++++++++++++++ > lib/Makefile | 3 +++ > lib/of_plat.c | 17 +++++++++++++++++ > 4 files changed, 51 insertions(+) > create mode 100644 include/of_plat.h > create mode 100644 lib/of_plat.c > > diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c > index 3bec3df..c03279e 100644 > --- a/drivers/core/regmap.c > +++ b/drivers/core/regmap.c > @@ -12,6 +12,7 @@ > #include > #include > #include > +#include > > #include > > @@ -49,11 +50,19 @@ int regmap_init_mem_platdata(struct udevice *dev, u32 *reg, int count, > if (!map) > return -ENOMEM; > > +#ifdef CONFIG_PHYS_64BIT > + map->base = of_plat_get_number(reg, 2); > + for (range = map->range; count > 0; reg += 4, range++, count--) { > + range->start = of_plat_get_number(reg, 2); > + range->size = of_plat_get_number(reg + 2, 2); > + } I may just be missing something, but how can you be sure that the cell-size is always 2? For example, there were discussions about 64bit platforms not really needing to add all the 0x0 elements, when the whole io-registers are well below the 4GB mark and for example at least one sunxi also uses this, see for example: allwinner/sun50i-a64.dtsi, altera/socfpga_stratix10.dtsi, broadcom/bcm283x.dtsi and problably more using #address-cells = <1>, #size-cells = <1> for their memory mapped io. And from what I've seen dtoc simply converts the reg property and just ignores #address-cells and #size-cells (or I'm overlooking something). Possible solutions that come to mind would be make dtoc also convert #address-cells and #size-cells, making regmap and everybody check it or alternatively make dtoc convert regs to cell-size 2 in all cases when CONFIG_PHYS_64BIT is set. Heiko