|
@@ -48,7 +48,6 @@ struct i2c_au1550_data {
|
|
|
void __iomem *psc_base;
|
|
|
int xfer_timeout;
|
|
|
struct i2c_adapter adap;
|
|
|
- struct resource *ioarea;
|
|
|
};
|
|
|
|
|
|
static inline void WR(struct i2c_au1550_data *a, int r, unsigned long v)
|
|
@@ -315,30 +314,16 @@ i2c_au1550_probe(struct platform_device *pdev)
|
|
|
struct resource *r;
|
|
|
int ret;
|
|
|
|
|
|
- r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
- if (!r) {
|
|
|
- ret = -ENODEV;
|
|
|
- goto out;
|
|
|
- }
|
|
|
+ priv = devm_kzalloc(&pdev->dev, sizeof(struct i2c_au1550_data),
|
|
|
+ GFP_KERNEL);
|
|
|
+ if (!priv)
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
- priv = kzalloc(sizeof(struct i2c_au1550_data), GFP_KERNEL);
|
|
|
- if (!priv) {
|
|
|
- ret = -ENOMEM;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- priv->ioarea = request_mem_region(r->start, resource_size(r),
|
|
|
- pdev->name);
|
|
|
- if (!priv->ioarea) {
|
|
|
- ret = -EBUSY;
|
|
|
- goto out_mem;
|
|
|
- }
|
|
|
+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
+ priv->psc_base = devm_ioremap_resource(&pdev->dev, r);
|
|
|
+ if (IS_ERR(priv->psc_base))
|
|
|
+ return PTR_ERR(priv->psc_base);
|
|
|
|
|
|
- priv->psc_base = ioremap(r->start, resource_size(r));
|
|
|
- if (!priv->psc_base) {
|
|
|
- ret = -EIO;
|
|
|
- goto out_map;
|
|
|
- }
|
|
|
priv->xfer_timeout = 200;
|
|
|
|
|
|
priv->adap.nr = pdev->id;
|
|
@@ -351,20 +336,13 @@ i2c_au1550_probe(struct platform_device *pdev)
|
|
|
i2c_au1550_setup(priv);
|
|
|
|
|
|
ret = i2c_add_numbered_adapter(&priv->adap);
|
|
|
- if (ret == 0) {
|
|
|
- platform_set_drvdata(pdev, priv);
|
|
|
- return 0;
|
|
|
+ if (ret) {
|
|
|
+ i2c_au1550_disable(priv);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
- i2c_au1550_disable(priv);
|
|
|
- iounmap(priv->psc_base);
|
|
|
-out_map:
|
|
|
- release_resource(priv->ioarea);
|
|
|
- kfree(priv->ioarea);
|
|
|
-out_mem:
|
|
|
- kfree(priv);
|
|
|
-out:
|
|
|
- return ret;
|
|
|
+ platform_set_drvdata(pdev, priv);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static int i2c_au1550_remove(struct platform_device *pdev)
|
|
@@ -373,10 +351,6 @@ static int i2c_au1550_remove(struct platform_device *pdev)
|
|
|
|
|
|
i2c_del_adapter(&priv->adap);
|
|
|
i2c_au1550_disable(priv);
|
|
|
- iounmap(priv->psc_base);
|
|
|
- release_resource(priv->ioarea);
|
|
|
- kfree(priv->ioarea);
|
|
|
- kfree(priv);
|
|
|
return 0;
|
|
|
}
|
|
|
|