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

Commit 8c5660bb authored by Lucas De Marchi's avatar Lucas De Marchi Committed by Wolfram Sang
Browse files

i2c: designware: add common functions for locking



These are used in 2 places and will be needed in more.

Signed-off-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
Acked-by: default avatarJarkko Nikula <jarkko.nikula@linux.intel.com>
Tested-by: default avatarChristian Ruppert <christian.ruppert@alitech.com>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
parent 2702ea7d
Loading
Loading
Loading
Loading
+32 −20
Original line number Diff line number Diff line
@@ -292,6 +292,28 @@ static unsigned long i2c_dw_clk_rate(struct dw_i2c_dev *dev)
	return dev->get_clk_rate_khz(dev);
}

static int i2c_dw_acquire_lock(struct dw_i2c_dev *dev)
{
	int ret;

	if (!dev->acquire_lock)
		return 0;

	ret = dev->acquire_lock(dev);
	if (!ret)
		return 0;

	dev_err(dev->dev, "couldn't acquire bus ownership\n");

	return ret;
}

static void i2c_dw_release_lock(struct dw_i2c_dev *dev)
{
	if (dev->release_lock)
		dev->release_lock(dev);
}

/**
 * i2c_dw_init() - initialize the designware i2c master hardware
 * @dev: device private data
@@ -307,13 +329,9 @@ int i2c_dw_init(struct dw_i2c_dev *dev)
	u32 sda_falling_time, scl_falling_time;
	int ret;

	if (dev->acquire_lock) {
		ret = dev->acquire_lock(dev);
		if (ret) {
			dev_err(dev->dev, "couldn't acquire bus ownership\n");
	ret = i2c_dw_acquire_lock(dev);
	if (ret)
		return ret;
		}
	}

	reg = dw_readl(dev, DW_IC_COMP_TYPE);
	if (reg == ___constant_swab32(DW_IC_COMP_TYPE_VALUE)) {
@@ -325,8 +343,7 @@ int i2c_dw_init(struct dw_i2c_dev *dev)
	} else if (reg != DW_IC_COMP_TYPE_VALUE) {
		dev_err(dev->dev, "Unknown Synopsys component type: "
			"0x%08x\n", reg);
		if (dev->release_lock)
			dev->release_lock(dev);
		i2c_dw_release_lock(dev);
		return -ENODEV;
	}

@@ -415,8 +432,8 @@ int i2c_dw_init(struct dw_i2c_dev *dev)
	/* configure the i2c master */
	dw_writel(dev, dev->master_cfg , DW_IC_CON);

	if (dev->release_lock)
		dev->release_lock(dev);
	i2c_dw_release_lock(dev);

	return 0;
}
EXPORT_SYMBOL_GPL(i2c_dw_init);
@@ -679,13 +696,9 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
	dev->abort_source = 0;
	dev->rx_outstanding = 0;

	if (dev->acquire_lock) {
		ret = dev->acquire_lock(dev);
		if (ret) {
			dev_err(dev->dev, "couldn't acquire bus ownership\n");
	ret = i2c_dw_acquire_lock(dev);
	if (ret)
		goto done_nolock;
		}
	}

	ret = i2c_dw_wait_bus_not_busy(dev);
	if (ret < 0)
@@ -732,8 +745,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
	ret = -EIO;

done:
	if (dev->release_lock)
		dev->release_lock(dev);
	i2c_dw_release_lock(dev);

done_nolock:
	pm_runtime_mark_last_busy(dev->dev);