On 28-Dec-16 18:10, Luis Oliveira wrote:
> On 28-Dec-16 17:10, Andy Shevchenko wrote:
>> On Wed, 2016-12-28 at 16:41 +0000, Luis Oliveira wrote:
>>> On 28-Dec-16 16:31, Andy Shevchenko wrote:
>>>> On Wed, 2016-12-28 at 15:53 +0000, Luis Oliveira wrote:
>>>>> On 28-Dec-16 15:44, Andy Shevchenko wrote:
>>>>>> On Wed, 2016-12-28 at 14:43 +0000, Luis Oliveira wrote:
>>>>>>> - Slave mode selected in platform module (devicetree support
>>>>>>> only)
>>>>>>> - Check for ACPI - not supported in SLAVE mode:
>>>>>>>   - Changed the ifndef style to the use of ACPI_HANDLE that
>>>>>>> returns
>>>>>>> NULL
>>>>>>>     if the device was not enumerated from ACPI namespace.
>>>>>>
>>>>>> I'm not sure what is wrong with ACPI?
>>>>>
>>>>> I dont have a way to test it. Just that.
>>>>
>>>> Okay, can you provide an excerpt to see how it will look like in
>>>> DTS?
>>>
>>> Yes, it looks like this now:
>>>
>>>     i2c@0x2000 {
>>>                     compatible = "snps,designware-i2c";
>>>                     #address-cells = <1>;
>>>                     #size-cells = <0>;
>>>                     reg = <0x2000 0x100>;
>>>                     clock-frequency = <400000>;
>>>                     clocks = <&i2cclk>;
>>>                     interrupts = <0>;
>>>
>>>                     eeprom@64 {
>>>                             compatible = "linux,slave-24c02";
>>>                             reg = <0x40000064>;
>>>                     };
>>>     };
>>
>> +1 to Carlos' comment.
> 
> Agree, I'm on it.
> 
>>
>>>>  
>>>>>>> -       dev->functionality = I2C_FUNC_10BIT_ADDR |
>>>>>>> DW_IC_DEFAULT_FUNCTIONALITY;
>>>>>>> -
>>>>>>> -       i2c_dw_configure_master(pdev);
>>>>>>> +       if (ACPI_HANDLE(&pdev->dev) == NULL) {
>>>>>>
>>>>>> I don't think you need this at all.
>>>>>
>>>>> This is to avoid the use of the "ifdef" style I used before.
>>>>
>>>> My point is to drop it completely.
>>>>
>>>>>>
>>>>>>> +               device_for_each_child_node(&pdev->dev, child)
>>>>>>> {
>>>>>>
>>>>>> This is resource agnostic.
>>>>>>
>>>>>>> +                       fwnode_property_read_u32(child,
>>>>>>> "reg",
>>>>>>> &reg);
>>>>>>
>>>>>> This is as well.
>>>>>
>>>>> Are you suggesting I use of_ functions?
>>>>
>>>> Nope. See above.
>>
>> So, ACPI has a property to support slave mode for I2CSerialBus() macro.
>>
>> I would propose to create a helper function in i2c-core.c which will be
>> responsible for mode detection
>>
>> ... i2c_slave_mode_detect()
>> {
>> ...
>>  if (IS_BUILTIN(CONFIG_OF) && dev->of_node) {
>>   ... (use of_*() here) ...
>>  } else if (IS_BUILTIN(CONFIG_ACPI) && ACPI_HANDLE(dev))
>>   dev_dbg(..., "ACPI slave is not supported yet\n");
>>   ... to master ...
>>  } else {
>>   ... default to master ...
>>  }
>> }
>> EXPORT_...();
>>
>> Make it as a separate patch.
>>
> 
> Oh I see, yes it looks good. I will check it. Thanks
> 

Hi Andy,

I implemented a helper function as you proposed and it looks like this:

int i2c_slave_mode_detect(struct device *dev)
{
        struct device_node *child;
        u32 reg;
        
        if (IS_BUILTIN(CONFIG_OF) && dev->of_node) {
                for_each_child_of_node(dev->of_node, child) {
                        of_property_read_u32(child, "reg", &reg);
                        if (reg & I2C_OWN_SLAVE_ADDRESS)
                                return 1;
                }
        } else if (IS_BUILTIN(CONFIG_ACPI) && ACPI_HANDLE(dev))
                dev_dbg(dev, "ACPI slave is not supported yet\n");
        else
                return 0;
        return 0;
}

Before I submit the patch to the i2c-core.c I wonder if I could have some
comment on the implementation.

Thanks,
Luis


Reply via email to