ret = geni_se_resources_on(&gi2c->se);
if (ret) {
- clk_disable_unprepare(gi2c->core_clk);
- return dev_err_probe(dev, ret, "Error turning on resources\n");
+ dev_err_probe(dev, ret, "Error turning on resources\n");
+ goto err_clk;
}
proto = geni_se_read_proto(&gi2c->se);
if (proto != GENI_SE_I2C) {
- geni_se_resources_off(&gi2c->se);
- clk_disable_unprepare(gi2c->core_clk);
- return dev_err_probe(dev, -ENXIO, "Invalid proto %d\n", proto);
+ ret = dev_err_probe(dev, -ENXIO, "Invalid proto %d\n", proto);
+ goto err_resources;
}
if (desc && desc->no_dma_support)
/* FIFO is disabled, so we can only use GPI DMA */
gi2c->gpi_mode = true;
ret = setup_gpi_dma(gi2c);
- if (ret) {
- geni_se_resources_off(&gi2c->se);
- clk_disable_unprepare(gi2c->core_clk);
- return ret;
- }
+ if (ret)
+ goto err_resources;
dev_dbg(dev, "Using GPI DMA mode for I2C\n");
} else {
tx_depth = desc->tx_fifo_depth;
if (!tx_depth) {
- geni_se_resources_off(&gi2c->se);
- clk_disable_unprepare(gi2c->core_clk);
- return dev_err_probe(dev, -EINVAL,
- "Invalid TX FIFO depth\n");
+ ret = dev_err_probe(dev, -EINVAL,
+ "Invalid TX FIFO depth\n");
+ goto err_resources;
}
gi2c->tx_wm = tx_depth - 1;
dev_dbg(dev, "Geni-I2C adaptor successfully added\n");
- return 0;
+ return ret;
+
+err_resources:
+ geni_se_resources_off(&gi2c->se);
+err_clk:
+ clk_disable_unprepare(gi2c->core_clk);
+
+ return ret;
err_dma:
release_gpi_dma(gi2c);
+
return ret;
}