On 2019-06-05 12:45 p.m., Lee Jones wrote:
>>>> diff --git a/include/linux/mfd/core.h b/include/linux/mfd/core.h
>>>> index 99c0395..470f6cb 100644
>>>> --- a/include/linux/mfd/core.h
>>>> +++ b/include/linux/mfd/core.h
>>>> @@ -55,6 +55,9 @@ struct mfd_cell {
>>>>     */
>>>>    const char              *of_compatible;
>>>>  
>>>> +  /* Optionally match against a specific device of a given type */
>>>> +  const char              *of_full_name;
>>>> +
>>>
>>> Can you give me an example for when this might be useful?
>>
>> This is an example of some device tree entries for our MFD device:
>>
>>             axi_iic_0: i2c@c0000 {
>>                 compatible = "xlnx,xps-iic-2.00.a";
>>                 clocks = <&axi_clk>;
>>                 clock-frequency = <100000>;
>>                 interrupts = <7>;
>>                 #size-cells = <0>;
>>                 #address-cells = <1>;
>>             };
>>
>>             axi_iic_1: i2c@d0000 {
>>                 compatible = "xlnx,xps-iic-2.00.a";
>>                 clocks = <&axi_clk>;
>>                 clock-frequency = <100000>;
>>                 interrupts = <8>;
>>                 #size-cells = <0>;
>>                 #address-cells = <1>;
>>             };
>>
>> and the corresponding MFD cells:
>>
>> {
>>      .name           = "axi_iic_0",
>>      .of_compatible  = "xlnx,xps-iic-2.00.a",
>>      .of_full_name   = "i2c@c0000",
>>      .num_resources  = ARRAY_SIZE(dbe_i2c1_resources),
>>      .resources      = dbe_i2c1_resources
>> },
>> {
>>      .name           = "axi_iic_1",
>>      .of_compatible  = "xlnx,xps-iic-2.00.a",
>>      .of_full_name   = "i2c@d0000",
>>      .num_resources  = ARRAY_SIZE(dbe_i2c2_resources),
>>      .resources      = dbe_i2c2_resources
>> },
>>
>> Without having the .of_full_name support, both MFD cells ended up
>> wrongly matching against the i2c@c0000 device tree node since we just
>> picked the first one where of_compatible matched.
> 
> What is contained in each of their resources?

These are the resource entries for those two devices:

static const struct resource dbe_i2c1_resources[] = {
{
        .start          = 0xc0000,
        .end            = 0xcffff,
        .name           = "xi2c1_regs",
        .flags          = IORESOURCE_MEM,
        .desc           = IORES_DESC_NONE
},
};

static const struct resource dbe_i2c2_resources[] = {
{
        .start          = 0xd0000,
        .end            = 0xdffff,
        .name           = "xi2c2_regs",
        .flags          = IORESOURCE_MEM,
        .desc           = IORES_DESC_NONE
},
};

Ideally the IO memory resource entries would be picked up and mapped
through the device tree as well, as they are with the interrupts, but I
haven't yet found the device tree magic that would allow that to happen
yet, if it's possible. The setup we have has a number of peripherals on
an AXI bus which are behind a PCIe to AXI bridge, and we're using mfd to
instantiate each of those AXI devices under the PCIe device.

-- 
Robert Hancock
Senior Software Developer
SED Systems, a division of Calian Ltd.
Email: hanc...@sedsystems.ca

Reply via email to