From: Clark Wang <xiaoning.wang@nxp.com> To: aisheng.dong@nxp.com, robh+dt@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, festevam@gmail.com Cc: kernel@pengutronix.de, linux-imx@nxp.com, linux-i2c@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH V2 02/18] i2c: imx-lpi2c: add ipg clk for lpi2c driver Date: Tue, 6 Apr 2021 19:32:50 +0800 [thread overview] Message-ID: <20210406113306.2633595-3-xiaoning.wang@nxp.com> (raw) In-Reply-To: <20210406113306.2633595-1-xiaoning.wang@nxp.com> The lpi2c IP needs two clks: ipg clk and per clk. The old lpi2c driver missed ipg clk. This patch adds ipg clk for lpi2c driver. Signed-off-by: Gao Pan <pandy.gao@nxp.com> Signed-off-by: Clark Wang <xiaoning.wang@nxp.com> Acked-by: Fugang Duan <fugang.duan@nxp.com> --- V2 changes: - Merge two clocks' prepare funtions to lpi2c_imx_clocks_prepare(). --- drivers/i2c/busses/i2c-imx-lpi2c.c | 61 +++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/drivers/i2c/busses/i2c-imx-lpi2c.c b/drivers/i2c/busses/i2c-imx-lpi2c.c index bbf44ac95021..89b7b0795f51 100644 --- a/drivers/i2c/busses/i2c-imx-lpi2c.c +++ b/drivers/i2c/busses/i2c-imx-lpi2c.c @@ -94,7 +94,8 @@ enum lpi2c_imx_pincfg { struct lpi2c_imx_struct { struct i2c_adapter adapter; - struct clk *clk; + struct clk *clk_per; + struct clk *clk_ipg; 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->clk_per); if (lpi2c_imx->mode == HS || lpi2c_imx->mode == ULTRA_FAST) filt = 0; else @@ -538,6 +539,34 @@ static const struct of_device_id lpi2c_imx_of_match[] = { }; MODULE_DEVICE_TABLE(of, lpi2c_imx_of_match); +static int lpi2c_imx_clocks_prepare(struct lpi2c_imx_struct *lpi2c_imx) +{ + int ret = 0; + + ret = clk_prepare_enable(lpi2c_imx->clk_per); + if (ret) { + dev_err(lpi2c_imx->adapter.dev.parent, + "can't enable I2C per clock, ret=%d\n", ret); + return ret; + } + + ret = clk_prepare_enable(lpi2c_imx->clk_ipg); + if (ret) { + clk_disable_unprepare(lpi2c_imx->clk_per); + dev_err(lpi2c_imx->adapter.dev.parent, + "can't enable I2C ipg clock, ret=%d\n", ret); + return ret; + } + + return ret; +} + +static void lpi2c_imx_clocks_unprepare(struct lpi2c_imx_struct *lpi2c_imx) +{ + clk_disable_unprepare(lpi2c_imx->clk_ipg); + clk_disable_unprepare(lpi2c_imx->clk_per); +} + static int lpi2c_imx_probe(struct platform_device *pdev) { struct lpi2c_imx_struct *lpi2c_imx; @@ -563,10 +592,16 @@ static int lpi2c_imx_probe(struct platform_device *pdev) strlcpy(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)) { + lpi2c_imx->clk_per = devm_clk_get(&pdev->dev, "per"); + if (IS_ERR(lpi2c_imx->clk_per)) { dev_err(&pdev->dev, "can't get I2C peripheral clock\n"); - return PTR_ERR(lpi2c_imx->clk); + return PTR_ERR(lpi2c_imx->clk_per); + } + + lpi2c_imx->clk_ipg = devm_clk_get(&pdev->dev, "ipg"); + if (IS_ERR(lpi2c_imx->clk_ipg)) { + dev_err(&pdev->dev, "can't get I2C ipg clock\n"); + return PTR_ERR(lpi2c_imx->clk_ipg); } ret = of_property_read_u32(pdev->dev.of_node, @@ -584,11 +619,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 = lpi2c_imx_clocks_prepare(lpi2c_imx); + if (ret) return ret; - } pm_runtime_set_autosuspend_delay(&pdev->dev, I2C_PM_TIMEOUT); pm_runtime_use_autosuspend(&pdev->dev); @@ -635,7 +668,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); + lpi2c_imx_clocks_unprepare(lpi2c_imx); pinctrl_pm_select_sleep_state(dev); return 0; @@ -644,16 +677,10 @@ static int __maybe_unused lpi2c_runtime_suspend(struct device *dev) static int __maybe_unused lpi2c_runtime_resume(struct device *dev) { struct lpi2c_imx_struct *lpi2c_imx = dev_get_drvdata(dev); - int ret; pinctrl_pm_select_default_state(dev); - ret = clk_prepare_enable(lpi2c_imx->clk); - if (ret) { - dev_err(dev, "failed to enable I2C clock, ret=%d\n", ret); - return ret; - } - return 0; + return lpi2c_imx_clocks_prepare(lpi2c_imx); } static const struct dev_pm_ops lpi2c_pm_ops = { -- 2.25.1
WARNING: multiple messages have this Message-ID (diff)
From: Clark Wang <xiaoning.wang@nxp.com> To: aisheng.dong@nxp.com, robh+dt@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, festevam@gmail.com Cc: kernel@pengutronix.de, linux-imx@nxp.com, linux-i2c@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH V2 02/18] i2c: imx-lpi2c: add ipg clk for lpi2c driver Date: Tue, 6 Apr 2021 19:32:50 +0800 [thread overview] Message-ID: <20210406113306.2633595-3-xiaoning.wang@nxp.com> (raw) In-Reply-To: <20210406113306.2633595-1-xiaoning.wang@nxp.com> The lpi2c IP needs two clks: ipg clk and per clk. The old lpi2c driver missed ipg clk. This patch adds ipg clk for lpi2c driver. Signed-off-by: Gao Pan <pandy.gao@nxp.com> Signed-off-by: Clark Wang <xiaoning.wang@nxp.com> Acked-by: Fugang Duan <fugang.duan@nxp.com> --- V2 changes: - Merge two clocks' prepare funtions to lpi2c_imx_clocks_prepare(). --- drivers/i2c/busses/i2c-imx-lpi2c.c | 61 +++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/drivers/i2c/busses/i2c-imx-lpi2c.c b/drivers/i2c/busses/i2c-imx-lpi2c.c index bbf44ac95021..89b7b0795f51 100644 --- a/drivers/i2c/busses/i2c-imx-lpi2c.c +++ b/drivers/i2c/busses/i2c-imx-lpi2c.c @@ -94,7 +94,8 @@ enum lpi2c_imx_pincfg { struct lpi2c_imx_struct { struct i2c_adapter adapter; - struct clk *clk; + struct clk *clk_per; + struct clk *clk_ipg; 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->clk_per); if (lpi2c_imx->mode == HS || lpi2c_imx->mode == ULTRA_FAST) filt = 0; else @@ -538,6 +539,34 @@ static const struct of_device_id lpi2c_imx_of_match[] = { }; MODULE_DEVICE_TABLE(of, lpi2c_imx_of_match); +static int lpi2c_imx_clocks_prepare(struct lpi2c_imx_struct *lpi2c_imx) +{ + int ret = 0; + + ret = clk_prepare_enable(lpi2c_imx->clk_per); + if (ret) { + dev_err(lpi2c_imx->adapter.dev.parent, + "can't enable I2C per clock, ret=%d\n", ret); + return ret; + } + + ret = clk_prepare_enable(lpi2c_imx->clk_ipg); + if (ret) { + clk_disable_unprepare(lpi2c_imx->clk_per); + dev_err(lpi2c_imx->adapter.dev.parent, + "can't enable I2C ipg clock, ret=%d\n", ret); + return ret; + } + + return ret; +} + +static void lpi2c_imx_clocks_unprepare(struct lpi2c_imx_struct *lpi2c_imx) +{ + clk_disable_unprepare(lpi2c_imx->clk_ipg); + clk_disable_unprepare(lpi2c_imx->clk_per); +} + static int lpi2c_imx_probe(struct platform_device *pdev) { struct lpi2c_imx_struct *lpi2c_imx; @@ -563,10 +592,16 @@ static int lpi2c_imx_probe(struct platform_device *pdev) strlcpy(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)) { + lpi2c_imx->clk_per = devm_clk_get(&pdev->dev, "per"); + if (IS_ERR(lpi2c_imx->clk_per)) { dev_err(&pdev->dev, "can't get I2C peripheral clock\n"); - return PTR_ERR(lpi2c_imx->clk); + return PTR_ERR(lpi2c_imx->clk_per); + } + + lpi2c_imx->clk_ipg = devm_clk_get(&pdev->dev, "ipg"); + if (IS_ERR(lpi2c_imx->clk_ipg)) { + dev_err(&pdev->dev, "can't get I2C ipg clock\n"); + return PTR_ERR(lpi2c_imx->clk_ipg); } ret = of_property_read_u32(pdev->dev.of_node, @@ -584,11 +619,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 = lpi2c_imx_clocks_prepare(lpi2c_imx); + if (ret) return ret; - } pm_runtime_set_autosuspend_delay(&pdev->dev, I2C_PM_TIMEOUT); pm_runtime_use_autosuspend(&pdev->dev); @@ -635,7 +668,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); + lpi2c_imx_clocks_unprepare(lpi2c_imx); pinctrl_pm_select_sleep_state(dev); return 0; @@ -644,16 +677,10 @@ static int __maybe_unused lpi2c_runtime_suspend(struct device *dev) static int __maybe_unused lpi2c_runtime_resume(struct device *dev) { struct lpi2c_imx_struct *lpi2c_imx = dev_get_drvdata(dev); - int ret; pinctrl_pm_select_default_state(dev); - ret = clk_prepare_enable(lpi2c_imx->clk); - if (ret) { - dev_err(dev, "failed to enable I2C clock, ret=%d\n", ret); - return ret; - } - return 0; + return lpi2c_imx_clocks_prepare(lpi2c_imx); } static const struct dev_pm_ops lpi2c_pm_ops = { -- 2.25.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2021-04-06 11:33 UTC|newest] Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-04-06 11:32 [PATCH V2 00/18] i2c: imx-lpi2c: New features and bug fixes Clark Wang 2021-04-06 11:32 ` Clark Wang 2021-04-06 11:32 ` [PATCH V2 01/18] i2c: imx-lpi2c: directly retrun ISR when detect a NACK Clark Wang 2021-04-06 11:32 ` Clark Wang 2021-04-06 11:32 ` Clark Wang [this message] 2021-04-06 11:32 ` [PATCH V2 02/18] i2c: imx-lpi2c: add ipg clk for lpi2c driver Clark Wang 2021-05-21 6:14 ` Aisheng Dong 2021-05-21 6:14 ` Aisheng Dong 2021-04-06 11:32 ` [PATCH V2 03/18] ARM: dts: imx7ulp: add the missing lpi2c ipg clock Clark Wang 2021-04-06 11:32 ` Clark Wang 2021-05-21 6:17 ` Aisheng Dong 2021-05-21 6:17 ` Aisheng Dong 2021-04-06 11:32 ` [PATCH V2 04/18] ARM: dts: imx7ulp: add the missing lpi2c nodes Clark Wang 2021-04-06 11:32 ` Clark Wang 2021-05-21 6:25 ` Aisheng Dong 2021-05-21 6:25 ` Aisheng Dong 2021-04-06 11:32 ` [PATCH V2 05/18] ARM64: dts: imx8: add the missing lpi2c ipg clock Clark Wang 2021-04-06 11:32 ` Clark Wang 2021-05-11 2:59 ` Shawn Guo 2021-05-11 2:59 ` Shawn Guo 2021-05-21 6:28 ` Aisheng Dong 2021-05-21 6:28 ` Aisheng Dong 2021-04-06 11:32 ` [PATCH V2 06/18] ARM64: dts: imx8: change i2c irq number to non-combined Clark Wang 2021-04-06 11:32 ` Clark Wang 2021-05-21 6:32 ` Aisheng Dong 2021-05-21 6:32 ` Aisheng Dong 2021-04-06 11:32 ` [PATCH V2 07/18] i2c: imx-lpi2c: manage irq resource request/release in runtime pm Clark Wang 2021-04-06 11:32 ` Clark Wang 2021-05-21 6:38 ` Aisheng Dong 2021-05-21 6:38 ` Aisheng Dong 2021-04-06 11:32 ` [PATCH V2 08/18] i2c: imx-lpi2c: add debug message when i2c peripheral clk doesn't work Clark Wang 2021-04-06 11:32 ` Clark Wang 2021-05-21 6:43 ` Aisheng Dong 2021-05-21 6:43 ` Aisheng Dong 2021-04-06 11:32 ` [PATCH V2 09/18] i2c: imx-lpi2c: increase PM timeout to avoid operate clk frequently Clark Wang 2021-04-06 11:32 ` Clark Wang 2021-04-06 11:32 ` [PATCH V2 10/18] i2c: imx-lpi2c: add bus recovery feature Clark Wang 2021-04-06 11:32 ` Clark Wang 2021-04-07 0:34 ` kernel test robot 2021-04-07 0:34 ` kernel test robot 2021-04-07 0:34 ` kernel test robot 2021-05-21 6:44 ` Aisheng Dong 2021-05-21 6:44 ` Aisheng Dong 2021-04-06 11:32 ` [PATCH V2 11/18] dt-bindings: i2c: imx-lpi2c: Add bus recovery example Clark Wang 2021-04-06 11:32 ` Clark Wang 2021-04-06 13:24 ` Rob Herring 2021-04-06 13:24 ` Rob Herring 2021-05-21 7:02 ` Aisheng Dong 2021-05-21 7:02 ` Aisheng Dong 2021-04-06 11:33 ` [PATCH V2 12/18] i2c: imx-lpi2c: fix i2c timing issue Clark Wang 2021-04-06 11:33 ` Clark Wang 2021-04-06 11:33 ` [PATCH V2 13/18] i2c: imx-lpi2c: fix type char overflow issue when calculating the clock cycle Clark Wang 2021-04-06 11:33 ` Clark Wang 2021-04-06 11:33 ` [PATCH V2 14/18] i2c: imx-lpi2c: add edma mode support Clark Wang 2021-04-06 11:33 ` Clark Wang 2021-04-06 11:41 ` Clark Wang 2021-04-06 11:41 ` Clark Wang 2021-04-06 11:33 ` [PATCH V2 15/18] dt-bindings: i2c: imx-lpi2c: Add dma configuration example Clark Wang 2021-04-06 11:33 ` Clark Wang 2021-04-09 16:33 ` Rob Herring 2021-04-09 16:33 ` Rob Herring 2021-04-06 11:33 ` [PATCH V2 16/18] ARM: dts: imx7ulp: add dma configurations for lpi2c Clark Wang 2021-04-06 11:33 ` Clark Wang 2021-04-06 11:33 ` [PATCH V2 17/18] ARM: dts: imx7ulp: add the missing status property of lpi2c5 Clark Wang 2021-04-06 11:33 ` Clark Wang 2021-04-06 11:33 ` [PATCH V2 18/18] i2c: imx-lpi2c: fix pio mode cannot send 256+ bytes in one frame Clark Wang 2021-04-06 11:33 ` Clark Wang
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210406113306.2633595-3-xiaoning.wang@nxp.com \ --to=xiaoning.wang@nxp.com \ --cc=aisheng.dong@nxp.com \ --cc=devicetree@vger.kernel.org \ --cc=festevam@gmail.com \ --cc=kernel@pengutronix.de \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-i2c@vger.kernel.org \ --cc=linux-imx@nxp.com \ --cc=linux-kernel@vger.kernel.org \ --cc=robh+dt@kernel.org \ --cc=s.hauer@pengutronix.de \ --cc=shawnguo@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.