return -ENODEV;
hdq_data = kmalloc(sizeof(*hdq_data), GFP_KERNEL);
- if (!hdq_data)
- return -ENODEV;
+ if (!hdq_data) {
+ dev_dbg(&pdev->dev, "unable to allocate memory\n");
+ ret = -ENODEV;
+ goto err_kmalloc;
+ }
hdq_data->dev = &pdev->dev;
platform_set_drvdata(pdev, hdq_data);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (res == NULL) {
- platform_set_drvdata(pdev, NULL);
- kfree(hdq_data);
- return -ENXIO;
+ if (!res) {
+ dev_dbg(&pdev->dev, "unable to get resource\n");
+ ret = ENXIO;
+ goto err_resource;
}
hdq_data->hdq_base = res->start;
dev_dbg(&pdev->dev, "Can't get HDQ clock objects\n");
if (IS_ERR(hdq_data->hdq_ick)) {
ret = PTR_ERR(hdq_data->hdq_ick);
- platform_set_drvdata(pdev, NULL);
- kfree(hdq_data);
- return ret;
+ goto err_clk;
}
if (IS_ERR(hdq_data->hdq_fck)) {
ret = PTR_ERR(hdq_data->hdq_fck);
- platform_set_drvdata(pdev, NULL);
- kfree(hdq_data);
- return ret;
+ clk_put(hdq_data->hdq_ick);
+ goto err_clk;
}
}
if (clk_enable(hdq_data->hdq_ick)) {
dev_dbg(&pdev->dev, "Can not enable ick\n");
- clk_put(hdq_data->hdq_ick);
- clk_put(hdq_data->hdq_fck);
- platform_set_drvdata(pdev, NULL);
- kfree(hdq_data);
- return -ENODEV;
+ ret = -ENODEV;
+ goto err_ick;
}
if (clk_enable(hdq_data->hdq_fck)) {
dev_dbg(&pdev->dev, "Can not enable fck\n");
- clk_disable(hdq_data->hdq_ick);
- clk_put(hdq_data->hdq_ick);
- clk_put(hdq_data->hdq_fck);
- platform_set_drvdata(pdev, NULL);
- kfree(hdq_data);
- return -ENODEV;
+ ret = -ENODEV;
+ goto err_fck;
}
rev = hdq_reg_in(hdq_data, OMAP_HDQ_REVISION);
irq = platform_get_irq(pdev, 0);
if (irq < 0) {
- platform_set_drvdata(pdev, NULL);
- kfree(hdq_data);
- return -ENXIO;
+ ret = -ENXIO;
+ goto err_irq;
}
- if (request_irq(irq, hdq_isr, IRQF_DISABLED, "OMAP HDQ",
- hdq_data)) {
- dev_dbg(&pdev->dev, "request_irq failed\n");
- clk_disable(hdq_data->hdq_ick);
- clk_put(hdq_data->hdq_ick);
- clk_put(hdq_data->hdq_fck);
- platform_set_drvdata(pdev, NULL);
- kfree(hdq_data);
- return -ENODEV;
+ ret = request_irq(irq, hdq_isr, IRQF_DISABLED, "omap_hdq", hdq_data);
+ if (ret < 0) {
+ dev_dbg(&pdev->dev, "could not request irq\n");
+ goto err_irq;
}
/* don't clock the HDQ until it is needed */
ret = w1_add_master_device(&omap_w1_master);
if (ret) {
dev_dbg(&pdev->dev, "Failure in registering w1 master\n");
- clk_put(hdq_data->hdq_ick);
- clk_put(hdq_data->hdq_fck);
- platform_set_drvdata(pdev, NULL);
- kfree(hdq_data);
- return ret;
+ goto err_w1;
}
return 0;
+
+err_w1:
+err_irq:
+ clk_disable(hdq_data->hdq_fck);
+
+err_fck:
+ clk_disable(hdq_data->hdq_ick);
+
+err_ick:
+ clk_put(hdq_data->hdq_ick);
+ clk_put(hdq_data->hdq_fck);
+
+err_clk:
+ hdq_data->hdq_base = NULL;
+
+err_resource:
+ platform_set_drvdata(pdev, NULL);
+ kfree(hdq_data);
+
+err_kmalloc:
+ return ret;
+
}
static int omap_hdq_remove(struct platform_device *pdev)