From: Anders Berg <anders.b...@lsi.com>

Use the devm_ functions for resource allocation to simplify error handling.

Signed-off-by: Anders Berg <anders.b...@lsi.com>
---
 drivers/i2c/busses/i2c-axxia.c |   98 +++++++++++++++-------------------------
 1 file changed, 36 insertions(+), 62 deletions(-)

diff --git a/drivers/i2c/busses/i2c-axxia.c b/drivers/i2c/busses/i2c-axxia.c
index 8cc972d..c2b84a4 100644
--- a/drivers/i2c/busses/i2c-axxia.c
+++ b/drivers/i2c/busses/i2c-axxia.c
@@ -116,12 +116,8 @@ struct axxia_i2c_dev {
        struct i2c_adapter adapter;
        /* clock reference for i2c input clock */
        struct clk *i2c_clk;
-       /* ioremapped registers cookie */
-       void __iomem *base;
        /* pointer to register struct */
        struct i2c_regs __iomem *regs;
-       /* irq number */
-       int irq;
        /* xfer completion object */
        struct completion msg_complete;
        /* pointer to current message */
@@ -488,11 +484,11 @@ axxia_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg 
msgs[], int num)
 static u32
 axxia_i2c_func(struct i2c_adapter *adap)
 {
-       return I2C_FUNC_I2C |
+       u32 caps = (I2C_FUNC_I2C |
                I2C_FUNC_10BIT_ADDR |
                I2C_FUNC_SMBUS_EMUL |
-               I2C_FUNC_SMBUS_BLOCK_DATA;
-
+               I2C_FUNC_SMBUS_BLOCK_DATA);
+       return caps;
 }
 
 static const struct i2c_algorithm axxia_i2c_algo = {
@@ -505,49 +501,42 @@ axxia_i2c_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
        struct axxia_i2c_dev *idev = NULL;
-       struct clk *i2c_clk = NULL;
-       void __iomem *base = NULL;
-       u32 bus = pdev->id;
-       int irq = 0;
+       struct resource *res;
+       void __iomem *base;
+       int irq;
        int ret = 0;
 
-       base = of_iomap(np, 0);
-       if (!base) {
-               dev_err(&pdev->dev, "failed to iomap registers\n");
-               ret = -ENOMEM;
-               goto err_cleanup;
-       }
+       idev = devm_kzalloc(&pdev->dev, sizeof(*idev), GFP_KERNEL);
+       if (!idev)
+               return -ENOMEM;
 
-       irq = irq_of_parse_and_map(np, 0);
-       if (irq == 0) {
-               dev_err(&pdev->dev, "no irq property\n");
-               ret = -EINVAL;
-               goto err_cleanup;
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "can't get device io-resource\n");
+               return -ENOENT;
        }
 
-       i2c_clk = clk_get(&pdev->dev, "i2c");
-       if (IS_ERR(i2c_clk)) {
-               dev_err(&pdev->dev, "missing bus clock");
-               ret = PTR_ERR(i2c_clk);
-               goto err_cleanup;
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0) {
+               dev_err(&pdev->dev, "can't get irq number\n");
+               return -ENOENT;
        }
 
-       idev = kzalloc(sizeof(struct axxia_i2c_dev), GFP_KERNEL);
-       if (!idev) {
-               ret = -ENOMEM;
-               goto err_cleanup;
+       base = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       idev->i2c_clk = devm_clk_get(&pdev->dev, "i2c");
+       if (IS_ERR(idev->i2c_clk)) {
+               dev_err(&pdev->dev, "missing I2C bus clock");
+               return PTR_ERR(idev->i2c_clk);
        }
 
-       idev->base         = base;
-       idev->regs         = (struct __iomem i2c_regs*) base;
-       idev->i2c_clk      = i2c_clk;
+       idev->regs         = (struct i2c_regs __iomem *) base;
        idev->dev          = &pdev->dev;
        init_completion(&idev->msg_complete);
 
-       of_property_read_u32(np, "bus", &bus);
-
        of_property_read_u32(np, "clock-frequency", &idev->bus_clk_rate);
-
        if (idev->bus_clk_rate == 0)
                idev->bus_clk_rate = 100000; /* default clock rate */
 
@@ -556,48 +545,37 @@ axxia_i2c_probe(struct platform_device *pdev)
        ret = axxia_i2c_init(idev);
        if (ret) {
                dev_err(&pdev->dev, "Failed to initialize i2c controller");
-               goto err_cleanup;
+               return ret;
        }
 
-       ret = request_irq(irq, axxia_i2c_isr, 0, pdev->name, idev);
+       ret = devm_request_irq(&pdev->dev, irq, axxia_i2c_isr, 0,
+                       pdev->name, idev);
        if (ret) {
-               dev_err(&pdev->dev, "Failed to request irq %i\n", idev->irq);
-               goto err_cleanup;
+               dev_err(&pdev->dev, "can't claim irq %d\n", irq);
+               return ret;
        }
-       idev->irq = irq;
 
        clk_enable(idev->i2c_clk);
 
        i2c_set_adapdata(&idev->adapter, idev);
+       strlcpy(idev->adapter.name, pdev->name, sizeof(idev->adapter.name));
        idev->adapter.owner = THIS_MODULE;
        idev->adapter.class = I2C_CLASS_HWMON;
-       snprintf(idev->adapter.name, sizeof(idev->adapter.name),
-                "Axxia I2C%u", bus);
        idev->adapter.algo = &axxia_i2c_algo;
        idev->adapter.dev.parent = &pdev->dev;
-       idev->adapter.nr = bus;
        idev->adapter.dev.of_node = pdev->dev.of_node;
 
-       ret = i2c_add_numbered_adapter(&idev->adapter);
+       ret = i2c_add_adapter(&idev->adapter);
        if (ret) {
                dev_err(&pdev->dev, "Failed to add I2C adapter\n");
-               goto err_cleanup;
+               return ret;
        }
 
+       platform_set_drvdata(pdev, idev);
+
        of_i2c_register_devices(&idev->adapter);
 
        return 0;
-
-err_cleanup:
-       if (!IS_ERR_OR_NULL(i2c_clk))
-               clk_put(i2c_clk);
-       if (base)
-               iounmap(base);
-       if (idev && idev->irq)
-               free_irq(irq, idev);
-       kfree(idev);
-
-       return ret;
 }
 
 static int
@@ -605,10 +583,6 @@ axxia_i2c_remove(struct platform_device *pdev)
 {
        struct axxia_i2c_dev *idev = platform_get_drvdata(pdev);
        i2c_del_adapter(&idev->adapter);
-       free_irq(idev->irq, idev);
-       clk_put(idev->i2c_clk);
-       iounmap(idev->base);
-       kfree(idev);
        return 0;
 }
 
-- 
1.7.9.5

-- 
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to