[U-Boot] Regression: gpio: pca953x_gpio: Make live-tree compatible
Mario Six
mario.six at gdsys.cc
Thu Mar 1 08:01:01 UTC 2018
On Thu, Mar 1, 2018 at 8:26 AM, Mario Six <mario.six at gdsys.cc> wrote:
> (Adding Simon, because of DM)
>
> Hi Martin,
>
> On Wed, Feb 28, 2018 at 7:27 PM, Martin Fuzzey <mfuzzey at parkeon.com> wrote:
>> Hi,
>>
>> since this commit:
>>
>> commit f62ca2cd2ab8171f603960da9203ceb6ee8a1efd
>> Author: Mario Six <mario.six at gdsys.cc>
>> Date: Mon Jan 15 11:07:45 2018 +0100
>>
>> gpio: pca953x_gpio: Make live-tree compatible
>>
>>
>> I am getting the error message "__of_translate_address: Bad cell count for
>> pcal6524 at 1"
>>
>> I don't think the patch
>>
>> - addr = fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev), "reg", 0);
>> + addr = dev_read_addr(dev);
>>
>> is correct since it replaces a simple lookup of the value "reg" property
>> with an attempted translation to a CPU address (which fails for I2C)
>>
>
> I see the issue on one of our boards as well, but the weird thing is that the
> translation should not happen: the I2C bus has no ranges property, which
> should, according to the DeviceTree specification, cause the translation
> routine to not attempt a translation (because a missing ranges property implies
> that the device's address space is not translatable). I'll take a look at the
> code; maybe it's a Linux-specific exception that was imported with the code
> that I was not aware of.
>
Looks like that's it (from drivers/core/of_addr.c):
* Note: We consider that crossing any level with #size-cells == 0 to mean
* that translation is impossible (that is we are not dealing with a value
* that can be mapped to a cpu physical address). This is not really specified
* that way, but this is traditionally the way IBM at least do things
So, of_translate_address fails by design if #size-cells == 0.
I propose the following patch, which would prevent translation in this case in
ofnode_get_addr_index:
---- >8 ----
diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c
index 98f4b539ea..b2f6ffe385 100644
--- a/drivers/core/ofnode.c
+++ b/drivers/core/ofnode.c
@@ -200,13 +200,16 @@ fdt_addr_t ofnode_get_addr_index(ofnode node, int index)
uint flags;
u64 size;
int na;
+ int ns;
prop_val = of_get_address(ofnode_to_np(node), index, &size,
&flags);
if (!prop_val)
return FDT_ADDR_T_NONE;
- if (IS_ENABLED(CONFIG_OF_TRANSLATE)) {
+ ns = of_n_size_cells(ofnode_to_np(node));
+
+ if (IS_ENABLED(CONFIG_OF_TRANSLATE) && ns > 0) {
return
of_translate_address(ofnode_to_np(node), prop_val);
} else {
na = of_n_addr_cells(ofnode_to_np(node));
---- >8 ----
In other words:
#size-cells == 0 -> No translation, return the plain reg value.
#size-cells != 0 -> Do proper translation.
This fixes the issue on our board.
> The dev_read_addr() is the go-to function for drivers to get device addresses
> (and have all issues like translation and the like taken care of
> automatically), so it would be nice to keep it in my opinion. Hence, fixing
> the underlying issue is probably preferable.
>
>> This does not cause the driver probe to fail since dev_read_addr() returns
>> FDT_ADDR_T_NONE (== -1) and is followed by
>>
>> if (addr == 0)
>> return -ENODEV;
>>
>> info->addr = addr;
>>
>> Although addr is stored in the driver data the only thing it is used for is
>> to build the bank name
>>
>> snprintf(name, sizeof(name), "gpio@%x_", info->addr);
>>
>> I'm not even sure that using the value of the "reg" property as before is
>> really a good idea - what happens if we have multiple chips with same
>> address on seperate busses?
>>
>
> We have that exact case on some of our boards. It works, but it's pretty
> annoying if you want to use the gpio command: When setting values of GPIOs, it
> only ever affects the first device the command comes across.
>
> I have a potential solution for that, see below.
>
>> Maybe it would be better to use the DT node name? But would that break
>> existing configurations by renaming the device?
>
> I have a patch I use on our boards that looks for a "label" string property in
> the DT, which is then used for the bank name if it's there, and falls back to
> the "gpio@%x_" in the case it's not there. If you think it's useful, I could
> send the patch to the mailing list?
>
>>
>>
>> Regards,
>>
>> Martin
>>
>
> Best regards,
>
> Mario
More information about the U-Boot
mailing list