lkml.org 
[lkml]   [2020]   [Sep]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v8 14/32] i2c: tegra: Clean up probe function
    Date
    The driver's probe function code is a bit difficult to read. This patch
    reorders code of the probe function, forming groups of code that are easy
    to work with. The probe tear-down order now matches the driver-removal
    order.

    Reviewed-by: Thierry Reding <treding@nvidia.com>
    Tested-by: Thierry Reding <treding@nvidia.com>
    Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
    ---
    drivers/i2c/busses/i2c-tegra.c | 100 ++++++++++++++++-----------------
    1 file changed, 49 insertions(+), 51 deletions(-)

    diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
    index 9486fcba655c..56981a5506ae 100644
    --- a/drivers/i2c/busses/i2c-tegra.c
    +++ b/drivers/i2c/busses/i2c-tegra.c
    @@ -440,6 +440,9 @@ static int tegra_i2c_init_dma(struct tegra_i2c_dev *i2c_dev)

    i2c_dev->tx_dma_chan = chan;

    + i2c_dev->dma_buf_size = i2c_dev->hw->quirks->max_write_len +
    + I2C_PACKET_HEADER_SIZE;
    +
    dma_buf = dma_alloc_coherent(i2c_dev->dev, i2c_dev->dma_buf_size,
    &dma_phys, GFP_KERNEL | __GFP_NOWARN);
    if (!dma_buf) {
    @@ -1694,34 +1697,42 @@ static int tegra_i2c_probe(struct platform_device *pdev)
    struct device *dev = &pdev->dev;
    struct tegra_i2c_dev *i2c_dev;
    struct resource *res;
    - void __iomem *base;
    - phys_addr_t base_phys;
    - int irq;
    int ret;

    - base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
    - if (IS_ERR(base))
    - return PTR_ERR(base);
    -
    - base_phys = res->start;
    -
    - irq = platform_get_irq(pdev, 0);
    - if (irq < 0)
    - return irq;
    -
    i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL);
    if (!i2c_dev)
    return -ENOMEM;

    - i2c_dev->base = base;
    - i2c_dev->base_phys = base_phys;
    - i2c_dev->adapter.algo = &tegra_i2c_algo;
    - i2c_dev->adapter.retries = 1;
    - i2c_dev->adapter.timeout = 6 * HZ;
    - i2c_dev->irq = irq;
    + platform_set_drvdata(pdev, i2c_dev);
    +
    + init_completion(&i2c_dev->msg_complete);
    + init_completion(&i2c_dev->dma_complete);
    +
    + i2c_dev->hw = of_device_get_match_data(&pdev->dev);
    i2c_dev->cont_id = pdev->id;
    i2c_dev->dev = &pdev->dev;

    + i2c_dev->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
    + if (IS_ERR(i2c_dev->base))
    + return PTR_ERR(i2c_dev->base);
    +
    + i2c_dev->base_phys = res->start;
    +
    + ret = platform_get_irq(pdev, 0);
    + if (ret < 0)
    + return ret;
    +
    + i2c_dev->irq = ret;
    +
    + /* interrupt will be enabled during of transfer time */
    + irq_set_status_flags(i2c_dev->irq, IRQ_NOAUTOEN);
    +
    + ret = devm_request_irq(&pdev->dev, i2c_dev->irq, tegra_i2c_isr,
    + IRQF_NO_SUSPEND, dev_name(&pdev->dev),
    + i2c_dev);
    + if (ret)
    + return ret;
    +
    i2c_dev->rst = devm_reset_control_get_exclusive(&pdev->dev, "i2c");
    if (IS_ERR(i2c_dev->rst)) {
    dev_err_probe(&pdev->dev, PTR_ERR(i2c_dev->rst),
    @@ -1735,14 +1746,9 @@ static int tegra_i2c_probe(struct platform_device *pdev)
    if (ret)
    return ret;

    - i2c_dev->hw = of_device_get_match_data(&pdev->dev);
    - i2c_dev->adapter.quirks = i2c_dev->hw->quirks;
    - i2c_dev->dma_buf_size = i2c_dev->adapter.quirks->max_write_len +
    - I2C_PACKET_HEADER_SIZE;
    - init_completion(&i2c_dev->msg_complete);
    - init_completion(&i2c_dev->dma_complete);
    -
    - platform_set_drvdata(pdev, i2c_dev);
    + ret = tegra_i2c_init_dma(i2c_dev);
    + if (ret)
    + goto release_clocks;

    /*
    * VI I2C is in VE power domain which is not always on and not
    @@ -1760,49 +1766,41 @@ static int tegra_i2c_probe(struct platform_device *pdev)
    goto put_rpm;
    }

    - if (i2c_dev->hw->supports_bus_clear)
    - i2c_dev->adapter.bus_recovery_info = &tegra_i2c_recovery_info;
    -
    - ret = tegra_i2c_init_dma(i2c_dev);
    - if (ret < 0)
    - goto put_rpm;
    -
    ret = tegra_i2c_init(i2c_dev);
    - if (ret) {
    - dev_err(&pdev->dev, "Failed to initialize i2c controller\n");
    - goto release_dma;
    - }
    -
    - irq_set_status_flags(i2c_dev->irq, IRQ_NOAUTOEN);
    -
    - ret = devm_request_irq(&pdev->dev, i2c_dev->irq, tegra_i2c_isr,
    - IRQF_NO_SUSPEND, dev_name(&pdev->dev), i2c_dev);
    if (ret)
    - goto release_dma;
    + goto put_rpm;

    i2c_set_adapdata(&i2c_dev->adapter, i2c_dev);
    + i2c_dev->adapter.dev.of_node = pdev->dev.of_node;
    + i2c_dev->adapter.dev.parent = &pdev->dev;
    + i2c_dev->adapter.retries = 1;
    + i2c_dev->adapter.timeout = 6 * HZ;
    + i2c_dev->adapter.quirks = i2c_dev->hw->quirks;
    i2c_dev->adapter.owner = THIS_MODULE;
    i2c_dev->adapter.class = I2C_CLASS_DEPRECATED;
    + i2c_dev->adapter.algo = &tegra_i2c_algo;
    + i2c_dev->adapter.nr = pdev->id;
    +
    + if (i2c_dev->hw->supports_bus_clear)
    + i2c_dev->adapter.bus_recovery_info = &tegra_i2c_recovery_info;
    +
    strlcpy(i2c_dev->adapter.name, dev_name(&pdev->dev),
    sizeof(i2c_dev->adapter.name));
    - i2c_dev->adapter.dev.parent = &pdev->dev;
    - i2c_dev->adapter.nr = pdev->id;
    - i2c_dev->adapter.dev.of_node = pdev->dev.of_node;

    ret = i2c_add_numbered_adapter(&i2c_dev->adapter);
    if (ret)
    - goto release_dma;
    + goto put_rpm;

    pm_runtime_put(&pdev->dev);

    return 0;

    -release_dma:
    - tegra_i2c_release_dma(i2c_dev);
    -
    put_rpm:
    pm_runtime_put_sync(&pdev->dev);
    pm_runtime_disable(&pdev->dev);
    +
    + tegra_i2c_release_dma(i2c_dev);
    +release_clocks:
    tegra_i2c_release_clocks(i2c_dev);

    return ret;
    --
    2.27.0
    \
     
     \ /
      Last update: 2020-09-23 00:54    [W:4.655 / U:0.476 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site