|
@@ -70,28 +70,14 @@ static int i2c_versatile_probe(struct platform_device *dev)
|
|
|
struct resource *r;
|
|
|
int ret;
|
|
|
|
|
|
+ i2c = devm_kzalloc(&dev->dev, sizeof(struct i2c_versatile), GFP_KERNEL);
|
|
|
+ if (!i2c)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
r = platform_get_resource(dev, IORESOURCE_MEM, 0);
|
|
|
- if (!r) {
|
|
|
- ret = -EINVAL;
|
|
|
- goto err_out;
|
|
|
- }
|
|
|
-
|
|
|
- if (!request_mem_region(r->start, resource_size(r), "versatile-i2c")) {
|
|
|
- ret = -EBUSY;
|
|
|
- goto err_out;
|
|
|
- }
|
|
|
-
|
|
|
- i2c = kzalloc(sizeof(struct i2c_versatile), GFP_KERNEL);
|
|
|
- if (!i2c) {
|
|
|
- ret = -ENOMEM;
|
|
|
- goto err_release;
|
|
|
- }
|
|
|
-
|
|
|
- i2c->base = ioremap(r->start, resource_size(r));
|
|
|
- if (!i2c->base) {
|
|
|
- ret = -ENOMEM;
|
|
|
- goto err_free;
|
|
|
- }
|
|
|
+ i2c->base = devm_ioremap_resource(&dev->dev, r);
|
|
|
+ if (IS_ERR(i2c->base))
|
|
|
+ return PTR_ERR(i2c->base);
|
|
|
|
|
|
writel(SCL | SDA, i2c->base + I2C_CONTROLS);
|
|
|
|
|
@@ -105,18 +91,12 @@ static int i2c_versatile_probe(struct platform_device *dev)
|
|
|
|
|
|
i2c->adap.nr = dev->id;
|
|
|
ret = i2c_bit_add_numbered_bus(&i2c->adap);
|
|
|
- if (ret >= 0) {
|
|
|
- platform_set_drvdata(dev, i2c);
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- iounmap(i2c->base);
|
|
|
- err_free:
|
|
|
- kfree(i2c);
|
|
|
- err_release:
|
|
|
- release_mem_region(r->start, resource_size(r));
|
|
|
- err_out:
|
|
|
- return ret;
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ platform_set_drvdata(dev, i2c);
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static int i2c_versatile_remove(struct platform_device *dev)
|