On Fri, Jun 22, 2012 at 01:48:39PM +0000, Arnd Bergmann wrote:
On Friday 22 June 2012, Thierry Reding wrote:
quoted
quoted
It seems like this isn't working properly. For some reason both the reg
property of pci@0 and pci@1 are translated to the same parent address
0x80000000. I'll have to investigate where exactly this goes wrong.
So it turns out that while of_read_number() can actually read any number
of cells, only the two least significant are kept because it returns a
u64. Since of_bus_default_map() uses of_read_number() the addresses
<0 0 0> and <1 0 0> are in fact the same. I'm not sure how best to solve
this. I'm not aware of a 128 bit integer type in the kernel, so I guess
the better alternative would be to fix of_bus_default_map() to cope with
#address-cells > 2 properly.
of_translate_address should get it right. Which codes uses of_read_number()?
Can it be converted to use of_translate_address()?
Actually this is from of_translate_address(). The calling sequence looks
like this:
of_address_to_resource()
__of_address_to_resource()
of_translate_address()
__of_translate_address()
of_translate_one()
of_bus_default_map()
of_read_number()
Thierry