mirror of
https://github.com/torvalds/linux.git
synced 2026-09-28 03:52:02 +02:00
i2c: qcom-geni: Move resource initialization to separate function
Refactor the resource initialization in geni_i2c_probe() by introducing a new geni_i2c_resources_init() function and utilizing the common geni_se_resources_init() framework and clock frequency mapping, making the probe function cleaner. Signed-off-by: Praveen Talari <praveen.talari@oss.qualcomm.com> Acked-by: Viken Dadhaniya <viken.dadhaniya@oss.qualcomm.com> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> Tested-by: Mattijs Korpershoek <mkorpershoek@kernel.org> Signed-off-by: Andi Shyti <andi.shyti@kernel.org> Link: https://lore.kernel.org/r/20260617-enable-i2c-on-sa8255p-v7-3-ad736dbeab57@oss.qualcomm.com
This commit is contained in:
parent
d8d3bb127a
commit
ed4b34033d
|
|
@ -107,7 +107,6 @@ struct geni_i2c_dev {
|
|||
int cur_wr;
|
||||
int cur_rd;
|
||||
spinlock_t lock;
|
||||
struct clk *core_clk;
|
||||
u32 clk_freq_out;
|
||||
const struct geni_i2c_clk_fld *clk_fld;
|
||||
void *dma_buf;
|
||||
|
|
@ -124,8 +123,6 @@ struct geni_i2c_dev {
|
|||
};
|
||||
|
||||
struct geni_i2c_desc {
|
||||
bool has_core_clk;
|
||||
char *icc_ddr;
|
||||
bool no_dma_support;
|
||||
unsigned int tx_fifo_depth;
|
||||
};
|
||||
|
|
@ -1058,6 +1055,23 @@ static int geni_i2c_init(struct geni_i2c_dev *gi2c)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int geni_i2c_resources_init(struct geni_i2c_dev *gi2c)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = geni_se_resources_init(&gi2c->se);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = geni_i2c_clk_map_idx(gi2c);
|
||||
if (ret)
|
||||
return dev_err_probe(gi2c->se.dev, ret, "Invalid clk frequency %d Hz\n",
|
||||
gi2c->clk_freq_out);
|
||||
|
||||
return geni_icc_set_bw_ab(&gi2c->se, GENI_DEFAULT_BW, GENI_DEFAULT_BW,
|
||||
Bps_to_icc(gi2c->clk_freq_out));
|
||||
}
|
||||
|
||||
static int geni_i2c_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct geni_i2c_dev *gi2c;
|
||||
|
|
@ -1077,16 +1091,6 @@ static int geni_i2c_probe(struct platform_device *pdev)
|
|||
|
||||
desc = device_get_match_data(&pdev->dev);
|
||||
|
||||
if (desc && desc->has_core_clk) {
|
||||
gi2c->core_clk = devm_clk_get(dev, "core");
|
||||
if (IS_ERR(gi2c->core_clk))
|
||||
return PTR_ERR(gi2c->core_clk);
|
||||
}
|
||||
|
||||
gi2c->se.clk = devm_clk_get(dev, "se");
|
||||
if (IS_ERR(gi2c->se.clk) && !has_acpi_companion(dev))
|
||||
return PTR_ERR(gi2c->se.clk);
|
||||
|
||||
ret = device_property_read_u32(dev, "clock-frequency",
|
||||
&gi2c->clk_freq_out);
|
||||
if (ret) {
|
||||
|
|
@ -1101,16 +1105,15 @@ static int geni_i2c_probe(struct platform_device *pdev)
|
|||
if (gi2c->irq < 0)
|
||||
return gi2c->irq;
|
||||
|
||||
ret = geni_i2c_clk_map_idx(gi2c);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Invalid clk frequency %d Hz\n",
|
||||
gi2c->clk_freq_out);
|
||||
|
||||
gi2c->adap.algo = &geni_i2c_algo;
|
||||
init_completion(&gi2c->done);
|
||||
spin_lock_init(&gi2c->lock);
|
||||
platform_set_drvdata(pdev, gi2c);
|
||||
|
||||
ret = geni_i2c_resources_init(gi2c);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Keep interrupts disabled initially to allow for low-power modes */
|
||||
ret = devm_request_irq(dev, gi2c->irq, geni_i2c_irq, IRQF_NO_AUTOEN,
|
||||
dev_name(dev), gi2c);
|
||||
|
|
@ -1123,23 +1126,6 @@ static int geni_i2c_probe(struct platform_device *pdev)
|
|||
gi2c->adap.dev.of_node = dev->of_node;
|
||||
strscpy(gi2c->adap.name, "Geni-I2C", sizeof(gi2c->adap.name));
|
||||
|
||||
ret = geni_icc_get(&gi2c->se, desc ? desc->icc_ddr : "qup-memory");
|
||||
if (ret)
|
||||
return ret;
|
||||
/*
|
||||
* Set the bus quota for core and cpu to a reasonable value for
|
||||
* register access.
|
||||
* Set quota for DDR based on bus speed.
|
||||
*/
|
||||
gi2c->se.icc_paths[GENI_TO_CORE].avg_bw = GENI_DEFAULT_BW;
|
||||
gi2c->se.icc_paths[CPU_TO_GENI].avg_bw = GENI_DEFAULT_BW;
|
||||
if (!desc || desc->icc_ddr)
|
||||
gi2c->se.icc_paths[GENI_TO_DDR].avg_bw = Bps_to_icc(gi2c->clk_freq_out);
|
||||
|
||||
ret = geni_icc_set_bw(&gi2c->se);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pm_runtime_set_suspended(gi2c->se.dev);
|
||||
pm_runtime_set_autosuspend_delay(gi2c->se.dev, I2C_AUTO_SUSPEND_DELAY);
|
||||
pm_runtime_use_autosuspend(gi2c->se.dev);
|
||||
|
|
@ -1192,7 +1178,7 @@ static int __maybe_unused geni_i2c_runtime_suspend(struct device *dev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
clk_disable_unprepare(gi2c->core_clk);
|
||||
clk_disable_unprepare(gi2c->se.core_clk);
|
||||
|
||||
return geni_icc_disable(&gi2c->se);
|
||||
}
|
||||
|
|
@ -1206,7 +1192,7 @@ static int __maybe_unused geni_i2c_runtime_resume(struct device *dev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = clk_prepare_enable(gi2c->core_clk);
|
||||
ret = clk_prepare_enable(gi2c->se.core_clk);
|
||||
if (ret)
|
||||
goto out_icc_disable;
|
||||
|
||||
|
|
@ -1219,7 +1205,7 @@ static int __maybe_unused geni_i2c_runtime_resume(struct device *dev)
|
|||
return 0;
|
||||
|
||||
out_clk_disable:
|
||||
clk_disable_unprepare(gi2c->core_clk);
|
||||
clk_disable_unprepare(gi2c->se.core_clk);
|
||||
out_icc_disable:
|
||||
geni_icc_disable(&gi2c->se);
|
||||
|
||||
|
|
@ -1260,8 +1246,6 @@ static const struct dev_pm_ops geni_i2c_pm_ops = {
|
|||
};
|
||||
|
||||
static const struct geni_i2c_desc i2c_master_hub = {
|
||||
.has_core_clk = true,
|
||||
.icc_ddr = NULL,
|
||||
.no_dma_support = true,
|
||||
.tx_fifo_depth = 16,
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user