Skip to content

Commit

Permalink
i2c: designware: Use standard optional ref clock implementation
Browse files Browse the repository at this point in the history
[ Upstream commit 27071b5 ]

Even though the DW I2C controller reference clock source is requested by
the method devm_clk_get() with non-optional clock requirement the way the
clock handler is used afterwards has a pure optional clock semantic
(though in some circumstances we can get a warning about the clock missing
printed in the system console). There is no point in reimplementing that
functionality seeing the kernel clock framework already supports the
optional interface from scratch. Thus let's convert the platform driver to
using it.

Note by providing this commit we get to fix two problems. The first one
was introduced in commit c62ebb3 ("i2c: designware: Add support for
an interface clock"). It causes not having the interface clock (pclk)
enabled/disabled in case if the reference clock isn't provided. The second
problem was first introduced in commit b33af11 ("i2c: designware: Do
not require clock when SSCN and FFCN are provided"). Since that
modification the deferred probe procedure has been unsupported in case if
the interface clock isn't ready.

Fixes: c62ebb3 ("i2c: designware: Add support for an interface clock")
Fixes: b33af11 ("i2c: designware: Do not require clock when SSCN and FFCN are provided")
Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
fancer authored and gregkh committed Jun 22, 2022
1 parent 506a88a commit 9ea9c92
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 5 deletions.
3 changes: 0 additions & 3 deletions drivers/i2c/busses/i2c-designware-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -474,9 +474,6 @@ int i2c_dw_prepare_clk(struct dw_i2c_dev *dev, bool prepare)
{
int ret;

if (IS_ERR(dev->clk))
return PTR_ERR(dev->clk);

if (prepare) {
/* Optional interface clock */
ret = clk_prepare_enable(dev->pclk);
Expand Down
13 changes: 11 additions & 2 deletions drivers/i2c/busses/i2c-designware-platdrv.c
Original file line number Diff line number Diff line change
Expand Up @@ -266,8 +266,17 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
goto exit_reset;
}

dev->clk = devm_clk_get(&pdev->dev, NULL);
if (!i2c_dw_prepare_clk(dev, true)) {
dev->clk = devm_clk_get_optional(&pdev->dev, NULL);
if (IS_ERR(dev->clk)) {
ret = PTR_ERR(dev->clk);
goto exit_reset;
}

ret = i2c_dw_prepare_clk(dev, true);
if (ret)
goto exit_reset;

if (dev->clk) {
u64 clk_khz;

dev->get_clk_rate_khz = i2c_dw_get_clk_rate_khz;
Expand Down

0 comments on commit 9ea9c92

Please sign in to comment.