Commit e48248d0 authored by Wolfram Sang's avatar Wolfram Sang Committed by Stefan Bader

i2c: rcar: make sure clocks are on when doing clock calculation

BugLink: https://bugs.launchpad.net/bugs/1776177

commit e43e0df1 upstream.

When calculating the bus speed, the clock should be on, of course. Most
bootloaders left them on, so this went unnoticed so far.

Move the ioremapping out of this clock-enabled-block and prepare for
adding hw initialization there, too.
Reported-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
Signed-off-by: default avatarFabrizio Castro <fabrizio.castro@bp.renesas.com>
Reviewed-by: default avatarChris Paterson <Chris.Paterson2@renesas.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarJuerg Haefliger <juergh@canonical.com>
Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
parent 6cc8ef7e
...@@ -650,19 +650,23 @@ static int rcar_i2c_probe(struct platform_device *pdev) ...@@ -650,19 +650,23 @@ static int rcar_i2c_probe(struct platform_device *pdev)
return PTR_ERR(priv->clk); return PTR_ERR(priv->clk);
} }
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
priv->io = devm_ioremap_resource(dev, res);
if (IS_ERR(priv->io))
return PTR_ERR(priv->io);
bus_speed = 100000; /* default 100 kHz */ bus_speed = 100000; /* default 100 kHz */
of_property_read_u32(dev->of_node, "clock-frequency", &bus_speed); of_property_read_u32(dev->of_node, "clock-frequency", &bus_speed);
priv->devtype = (enum rcar_i2c_type)of_match_device(rcar_i2c_dt_ids, dev)->data; priv->devtype = (enum rcar_i2c_type)of_match_device(rcar_i2c_dt_ids, dev)->data;
pm_runtime_enable(dev);
pm_runtime_get_sync(dev);
ret = rcar_i2c_clock_calculate(priv, bus_speed, dev); ret = rcar_i2c_clock_calculate(priv, bus_speed, dev);
if (ret < 0) if (ret < 0)
return ret; goto out_pm_put;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); pm_runtime_put(dev);
priv->io = devm_ioremap_resource(dev, res);
if (IS_ERR(priv->io))
return PTR_ERR(priv->io);
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
init_waitqueue_head(&priv->wait); init_waitqueue_head(&priv->wait);
...@@ -682,22 +686,26 @@ static int rcar_i2c_probe(struct platform_device *pdev) ...@@ -682,22 +686,26 @@ static int rcar_i2c_probe(struct platform_device *pdev)
dev_name(dev), priv); dev_name(dev), priv);
if (ret < 0) { if (ret < 0) {
dev_err(dev, "cannot get irq %d\n", irq); dev_err(dev, "cannot get irq %d\n", irq);
return ret; goto out_pm_disable;
} }
pm_runtime_enable(dev);
platform_set_drvdata(pdev, priv); platform_set_drvdata(pdev, priv);
ret = i2c_add_numbered_adapter(adap); ret = i2c_add_numbered_adapter(adap);
if (ret < 0) { if (ret < 0) {
dev_err(dev, "reg adap failed: %d\n", ret); dev_err(dev, "reg adap failed: %d\n", ret);
pm_runtime_disable(dev); goto out_pm_disable;
return ret;
} }
dev_info(dev, "probed\n"); dev_info(dev, "probed\n");
return 0; return 0;
out_pm_put:
pm_runtime_put(dev);
out_pm_disable:
pm_runtime_disable(dev);
return ret;
} }
static int rcar_i2c_remove(struct platform_device *pdev) static int rcar_i2c_remove(struct platform_device *pdev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment