Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 023c22fd authored by Wolfram Sang's avatar Wolfram Sang Committed by Wolfram Sang
Browse files

i2c: sh_mobile: let RuntimePM do the clock handling



Start RuntimePM a bit earlier, so we can use it to enable the clock
during probe for frequency calculations. Make sure it is enabled before
calling setup().

Signed-off-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
parent b3750b62
Loading
Loading
Loading
Loading
+17 −18
Original line number Original line Diff line number Diff line
@@ -252,11 +252,7 @@ static int sh_mobile_i2c_init(struct sh_mobile_i2c_data *pd)
	u32 tHIGH, tLOW, tf;
	u32 tHIGH, tLOW, tf;
	uint16_t max_val;
	uint16_t max_val;


	/* Get clock rate after clock is enabled */
	i2c_clk_khz = clk_get_rate(pd->clk) / 1000 / pd->clks_per_count;
	clk_prepare_enable(pd->clk);
	i2c_clk_khz = clk_get_rate(pd->clk) / 1000;
	clk_disable_unprepare(pd->clk);
	i2c_clk_khz /= pd->clks_per_count;


	if (pd->bus_speed == STANDARD_MODE) {
	if (pd->bus_speed == STANDARD_MODE) {
		tLOW	= 47;	/* tLOW = 4.7 us */
		tLOW	= 47;	/* tLOW = 4.7 us */
@@ -881,6 +877,20 @@ static int sh_mobile_i2c_probe(struct platform_device *dev)
	if (resource_size(res) > 0x17)
	if (resource_size(res) > 0x17)
		pd->flags |= IIC_FLAG_HAS_ICIC67;
		pd->flags |= IIC_FLAG_HAS_ICIC67;


	/* Enable Runtime PM for this device.
	 *
	 * Also tell the Runtime PM core to ignore children
	 * for this device since it is valid for us to suspend
	 * this I2C master driver even though the slave devices
	 * on the I2C bus may not be suspended.
	 *
	 * The state of the I2C hardware bus is unaffected by
	 * the Runtime PM state.
	 */
	pm_suspend_ignore_children(&dev->dev, true);
	pm_runtime_enable(&dev->dev);
	pm_runtime_get_sync(&dev->dev);

	config = of_device_get_match_data(&dev->dev);
	config = of_device_get_match_data(&dev->dev);
	if (config) {
	if (config) {
		pd->clks_per_count = config->clks_per_count;
		pd->clks_per_count = config->clks_per_count;
@@ -888,6 +898,8 @@ static int sh_mobile_i2c_probe(struct platform_device *dev)
	} else {
	} else {
		ret = sh_mobile_i2c_init(pd);
		ret = sh_mobile_i2c_init(pd);
	}
	}

	pm_runtime_put_sync(&dev->dev);
	if (ret)
	if (ret)
		return ret;
		return ret;


@@ -896,19 +908,6 @@ static int sh_mobile_i2c_probe(struct platform_device *dev)
	pd->dma_direction = DMA_NONE;
	pd->dma_direction = DMA_NONE;
	pd->dma_rx = pd->dma_tx = ERR_PTR(-EPROBE_DEFER);
	pd->dma_rx = pd->dma_tx = ERR_PTR(-EPROBE_DEFER);


	/* Enable Runtime PM for this device.
	 *
	 * Also tell the Runtime PM core to ignore children
	 * for this device since it is valid for us to suspend
	 * this I2C master driver even though the slave devices
	 * on the I2C bus may not be suspended.
	 *
	 * The state of the I2C hardware bus is unaffected by
	 * the Runtime PM state.
	 */
	pm_suspend_ignore_children(&dev->dev, true);
	pm_runtime_enable(&dev->dev);

	/* setup the private data */
	/* setup the private data */
	adap = &pd->adap;
	adap = &pd->adap;
	i2c_set_adapdata(adap, pd);
	i2c_set_adapdata(adap, pd);