26.01.2019 0:11, Sowjanya Komatineni пишет:
>
>
>>>>> + if (i2c_dev->has_dma) {
>>>>> + ret = tegra_i2c_init_dma_param(i2c_dev, true);
>>>>> + if (ret == -EPROBE_DEFER)
>>>>> + goto disable_div_clk;
>>>>> + ret = tegra_i2c_init_dma_param(i2c_dev, false);
>>>>> + if (ret == -EPROBE_DEFER)
>>>>> + goto disable_div_clk;
>>>>
>>>> So tegra_i2c_init_dma_param() could fail, printing a error message, and
>>>> probe will succeed? If allocation fails during the driver's probe, then
>>>> just fail the probe. Please give the rationale.
>>>
>>> If APB DMA probe doesn’t happen prior to tegra i2c, DMA is not available by
>>> the time tegra_init_dma_param tries to request slave channel and in those
>>> cases dma_request_slave_channel_reason will return EPROBE_DEFER for tegra
>>> I2C probe to retry
>>>
>>> In case if DMA is available but DMA buffer allocation fails, then
>>> tegra_i2c_init_dma_param returns ENOMEM and probe also fails returning same
>>> ENOMEM
>>
>> Is that what you're going to change in the next version? Your current
>> variant of the code doesn't fail the probe on ENOMEM and there is duplicated
>> attempt to invoke tegra_i2c_init_dma_param() during the transfer.
>
> Sorry correction to my previous reply. If DMA buffer allocation fails,
> tegra_i2c_init_dma_param returns ENOMEM but probe will succeed as i2c
> transaction need to happen during boot for some platform device programming
> for successful boot and they use PIO mode as xfer bytes is less and deferring
> i2c probe for ENOMEM causes boot to fail so during probe EPROBE_DEFER is only
> taken care.
>
> Re-attempt of tegra_i2c_init_dma_param in xfer happens only if no successful
> DMA channel allocation happens prior to that ( during probe in case of
> ENOMEM).
> DMA mode is mainly for large transfer, and i2c xfer returning failure due to
> failing DMA buffer allocation causes boot to hang as platform device
> programming need to happen which doesn’t need to use DMA.
> Will fix this and will send updated patch to reattempt DMA request and buffer
> allocation during DMA mode transfer and will return fail for DMA mode I2C
> transfer...
1) The chance to get ENOMEM during is miserable and likely that there are much
bigger problems in this case. Hence just fail the probe if
tegra_i2c_init_dma_param() fails with any error.
2) What is that super-critical platform device? It is possible to compile
tegra-i2c as a kernel module and seems nothing enforces CONFIG_I2C_TEGRA=y.
3) After applying these patches I2C transfers are failing on Tegra20 with
"tegra-i2c 7000c400.i2c: Failed to allocate the DMA buffer".