]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/i2c/busses/i2c-pnx.c
i2c-pnx.c: Use resources in platforms
[karo-tx-linux.git] / drivers / i2c / busses / i2c-pnx.c
index eb8ad538c79ffb97616e43f135b5d9ff991cce96..6fb97aef0465d0141632083c7f503235986a415b 100644 (file)
@@ -568,14 +568,7 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
        int ret = 0;
        struct i2c_pnx_algo_data *alg_data;
        unsigned long freq;
-       struct i2c_pnx_data *i2c_pnx = pdev->dev.platform_data;
-
-       if (!i2c_pnx || !i2c_pnx->name) {
-               dev_err(&pdev->dev, "%s: no platform data supplied\n",
-                      __func__);
-               ret = -EINVAL;
-               goto out;
-       }
+       struct resource *res;
 
        alg_data = kzalloc(sizeof(*alg_data), GFP_KERNEL);
        if (!alg_data) {
@@ -585,13 +578,10 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, alg_data);
 
-       strlcpy(alg_data->adapter.name, i2c_pnx->name,
-               sizeof(alg_data->adapter.name));
        alg_data->adapter.dev.parent = &pdev->dev;
        alg_data->adapter.algo = &pnx_algorithm;
        alg_data->adapter.algo_data = alg_data;
        alg_data->adapter.nr = pdev->id;
-       alg_data->i2c_pnx = i2c_pnx;
 
        alg_data->clk = clk_get(&pdev->dev, NULL);
        if (IS_ERR(alg_data->clk)) {
@@ -603,17 +593,27 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
        alg_data->mif.timer.function = i2c_pnx_timeout;
        alg_data->mif.timer.data = (unsigned long)alg_data;
 
+       snprintf(alg_data->adapter.name, sizeof(alg_data->adapter.name),
+                "%s", pdev->name);
+
        /* Register I/O resource */
-       if (!request_mem_region(i2c_pnx->base, I2C_PNX_REGION_SIZE,
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "Unable to get mem resource.\n");
+               ret = -EBUSY;
+               goto out_clkget;
+       }
+       if (!request_mem_region(res->start, I2C_PNX_REGION_SIZE,
                                pdev->name)) {
                dev_err(&pdev->dev,
                       "I/O region 0x%08x for I2C already in use.\n",
-                      i2c_pnx->base);
+                      res->start);
                ret = -ENODEV;
                goto out_clkget;
        }
 
-       alg_data->ioaddr = ioremap(i2c_pnx->base, I2C_PNX_REGION_SIZE);
+       alg_data->base = res->start;
+       alg_data->ioaddr = ioremap(res->start, I2C_PNX_REGION_SIZE);
        if (!alg_data->ioaddr) {
                dev_err(&pdev->dev, "Couldn't ioremap I2C I/O region\n");
                ret = -ENOMEM;
@@ -650,7 +650,12 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
        }
        init_completion(&alg_data->mif.complete);
 
-       ret = request_irq(i2c_pnx->irq, i2c_pnx_interrupt,
+       alg_data->irq = platform_get_irq(pdev, 0);
+       if (alg_data->irq < 0) {
+               dev_err(&pdev->dev, "Failed to get IRQ from platform resource\n");
+               goto out_irq;
+       }
+       ret = request_irq(alg_data->irq, i2c_pnx_interrupt,
                        0, pdev->name, alg_data);
        if (ret)
                goto out_clock;
@@ -663,38 +668,36 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
        }
 
        dev_dbg(&pdev->dev, "%s: Master at %#8x, irq %d.\n",
-              alg_data->adapter.name, i2c_pnx->base, i2c_pnx->irq);
+               alg_data->adapter.name, res->start, alg_data->irq);
 
        return 0;
 
 out_irq:
-       free_irq(i2c_pnx->irq, alg_data);
+       free_irq(alg_data->irq, alg_data);
 out_clock:
        clk_disable(alg_data->clk);
 out_unmap:
        iounmap(alg_data->ioaddr);
 out_release:
-       release_mem_region(i2c_pnx->base, I2C_PNX_REGION_SIZE);
+       release_mem_region(res->start, I2C_PNX_REGION_SIZE);
 out_clkget:
        clk_put(alg_data->clk);
 out_drvdata:
        kfree(alg_data);
 err_kzalloc:
        platform_set_drvdata(pdev, NULL);
-out:
        return ret;
 }
 
 static int __devexit i2c_pnx_remove(struct platform_device *pdev)
 {
        struct i2c_pnx_algo_data *alg_data = platform_get_drvdata(pdev);
-       struct i2c_pnx_data *i2c_pnx = alg_data->i2c_pnx;
 
-       free_irq(i2c_pnx->irq, alg_data);
+       free_irq(alg_data->irq, alg_data);
        i2c_del_adapter(&alg_data->adapter);
        clk_disable(alg_data->clk);
        iounmap(alg_data->ioaddr);
-       release_mem_region(i2c_pnx->base, I2C_PNX_REGION_SIZE);
+       release_mem_region(alg_data->base, I2C_PNX_REGION_SIZE);
        clk_put(alg_data->clk);
        kfree(alg_data);
        platform_set_drvdata(pdev, NULL);