mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-19 07:39:54 +02:00
i2c: imx-lpi2c: use bulk clk API
The current driver only support one clock, however LPI2C requires two clocks: PER and IPG. To make sure old dts could work with newer kernel, use bulk clk API. Reviewed-by: Dong Aisheng <aisheng.dong@nxp.com> Signed-off-by: Peng Fan <peng.fan@nxp.com> Signed-off-by: Wolfram Sang <wsa@kernel.org>
This commit is contained in:
parent
6347eee5a3
commit
09d027dbe1
|
@ -94,7 +94,8 @@ enum lpi2c_imx_pincfg {
|
|||
|
||||
struct lpi2c_imx_struct {
|
||||
struct i2c_adapter adapter;
|
||||
struct clk *clk;
|
||||
int num_clks;
|
||||
struct clk_bulk_data *clks;
|
||||
void __iomem *base;
|
||||
__u8 *rx_buf;
|
||||
__u8 *tx_buf;
|
||||
|
@ -207,7 +208,7 @@ static int lpi2c_imx_config(struct lpi2c_imx_struct *lpi2c_imx)
|
|||
|
||||
lpi2c_imx_set_mode(lpi2c_imx);
|
||||
|
||||
clk_rate = clk_get_rate(lpi2c_imx->clk);
|
||||
clk_rate = clk_get_rate(lpi2c_imx->clks[0].clk);
|
||||
if (lpi2c_imx->mode == HS || lpi2c_imx->mode == ULTRA_FAST)
|
||||
filt = 0;
|
||||
else
|
||||
|
@ -561,11 +562,12 @@ static int lpi2c_imx_probe(struct platform_device *pdev)
|
|||
strscpy(lpi2c_imx->adapter.name, pdev->name,
|
||||
sizeof(lpi2c_imx->adapter.name));
|
||||
|
||||
lpi2c_imx->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(lpi2c_imx->clk)) {
|
||||
dev_err(&pdev->dev, "can't get I2C peripheral clock\n");
|
||||
return PTR_ERR(lpi2c_imx->clk);
|
||||
ret = devm_clk_bulk_get_all(&pdev->dev, &lpi2c_imx->clks);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "can't get I2C peripheral clock, ret=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
lpi2c_imx->num_clks = ret;
|
||||
|
||||
ret = of_property_read_u32(pdev->dev.of_node,
|
||||
"clock-frequency", &lpi2c_imx->bitrate);
|
||||
|
@ -582,11 +584,9 @@ static int lpi2c_imx_probe(struct platform_device *pdev)
|
|||
i2c_set_adapdata(&lpi2c_imx->adapter, lpi2c_imx);
|
||||
platform_set_drvdata(pdev, lpi2c_imx);
|
||||
|
||||
ret = clk_prepare_enable(lpi2c_imx->clk);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "clk enable failed %d\n", ret);
|
||||
ret = clk_bulk_prepare_enable(lpi2c_imx->num_clks, lpi2c_imx->clks);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
pm_runtime_set_autosuspend_delay(&pdev->dev, I2C_PM_TIMEOUT);
|
||||
pm_runtime_use_autosuspend(&pdev->dev);
|
||||
|
@ -633,7 +633,7 @@ static int __maybe_unused lpi2c_runtime_suspend(struct device *dev)
|
|||
{
|
||||
struct lpi2c_imx_struct *lpi2c_imx = dev_get_drvdata(dev);
|
||||
|
||||
clk_disable_unprepare(lpi2c_imx->clk);
|
||||
clk_bulk_disable_unprepare(lpi2c_imx->num_clks, lpi2c_imx->clks);
|
||||
pinctrl_pm_select_sleep_state(dev);
|
||||
|
||||
return 0;
|
||||
|
@ -645,7 +645,7 @@ static int __maybe_unused lpi2c_runtime_resume(struct device *dev)
|
|||
int ret;
|
||||
|
||||
pinctrl_pm_select_default_state(dev);
|
||||
ret = clk_prepare_enable(lpi2c_imx->clk);
|
||||
ret = clk_bulk_prepare_enable(lpi2c_imx->num_clks, lpi2c_imx->clks);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to enable I2C clock, ret=%d\n", ret);
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue
Block a user