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

Commit 97727600 authored by Virupax Sadashivpetimath's avatar Virupax Sadashivpetimath Committed by Ben Dooks
Browse files

i2c-nomadik: make i2c timeout specific per i2c bus



Add option to have different i2c timeout delay for different i2c buses
specified in platform data. Default to the old value unless specified.

Signed-off-by: default avatarVirupax Sadashivpetimath <virupax.sadashivpetimath@stericsson.com>
Reviewed-by: default avatarSrinidhi Kasagar <srinidhi.kasagar@stericsson.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarBen Dooks <ben-linux@fluff.org>
parent a20d2394
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ enum i2c_freq_mode {
 *		to the values of 14, 6, 2 for a 48 MHz i2c clk
 * @tft:	Tx FIFO Threshold in bytes
 * @rft:	Rx FIFO Threshold in bytes
 * @timeout	Slave response timeout(ms)
 * @sm:		speed mode
 */
struct nmk_i2c_controller {
@@ -31,6 +32,7 @@ struct nmk_i2c_controller {
	unsigned short	slsu;
	unsigned char	tft;
	unsigned char	rft;
	int timeout;
	enum i2c_freq_mode	sm;
};

+4 −6
Original line number Diff line number Diff line
@@ -121,9 +121,6 @@ enum i2c_operation {
	I2C_READ = 0x01
};

/* controller response timeout in ms */
#define I2C_TIMEOUT_MS	2000

/**
 * struct i2c_nmk_client - client specific data
 * @slave_adr: 7-bit slave address
@@ -213,7 +210,7 @@ static int flush_i2c_fifo(struct nmk_i2c_dev *dev)
	writel((I2C_CR_FTX | I2C_CR_FRX), dev->virtbase + I2C_CR);

	for (i = 0; i < LOOP_ATTEMPTS; i++) {
		timeout = jiffies + msecs_to_jiffies(I2C_TIMEOUT_MS);
		timeout = jiffies + msecs_to_jiffies(dev->adap.timeout);

		while (!time_after(jiffies, timeout)) {
			if ((readl(dev->virtbase + I2C_CR) &
@@ -434,7 +431,7 @@ static int read_i2c(struct nmk_i2c_dev *dev)
			dev->virtbase + I2C_IMSCR);

	timeout = wait_for_completion_interruptible_timeout(
		&dev->xfer_complete, msecs_to_jiffies(I2C_TIMEOUT_MS));
		&dev->xfer_complete, msecs_to_jiffies(dev->adap.timeout));

	if (timeout < 0) {
		dev_err(&dev->pdev->dev,
@@ -498,7 +495,7 @@ static int write_i2c(struct nmk_i2c_dev *dev)
			dev->virtbase + I2C_IMSCR);

	timeout = wait_for_completion_interruptible_timeout(
		&dev->xfer_complete, msecs_to_jiffies(I2C_TIMEOUT_MS));
		&dev->xfer_complete, msecs_to_jiffies(dev->adap.timeout));

	if (timeout < 0) {
		dev_err(&dev->pdev->dev,
@@ -917,6 +914,7 @@ static int __devinit nmk_i2c_probe(struct platform_device *pdev)
	adap->owner	= THIS_MODULE;
	adap->class	= I2C_CLASS_HWMON | I2C_CLASS_SPD;
	adap->algo	= &nmk_i2c_algo;
	adap->timeout	= pdata->timeout ? pdata->timeout : 20000;
	snprintf(adap->name, sizeof(adap->name),
		 "Nomadik I2C%d at %lx", pdev->id, (unsigned long)res->start);