diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-02-10 14:39:08 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-02-10 14:39:08 -0800 | 
| commit | aca9fa0c8d225b1446dbed798b1d2f20e37e52cf (patch) | |
| tree | cf8d9f70ca376665da6b83eaae382ac0218395fc | |
| parent | fc6f41ba8b2e705f91324db158c3cc28209a15b1 (diff) | |
| parent | bbb27fc33d44e7b8d96369810654df4ee1837566 (diff) | |
Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c bugfixes from Wolfram Sang:
 "Two bugfixes (proper IO mapping and use of mutex) for a driver feature
  we introduced in this cycle"
* 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
  i2c: piix4: Request the SMBUS semaphore inside the mutex
  i2c: piix4: Fix request_region size
| -rw-r--r-- | drivers/i2c/busses/i2c-piix4.c | 14 | 
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c index e34d82e79b98..c21ca7bf2efe 100644 --- a/drivers/i2c/busses/i2c-piix4.c +++ b/drivers/i2c/busses/i2c-piix4.c @@ -58,7 +58,7 @@  #define SMBSLVDAT	(0xC + piix4_smba)  /* count for request_region */ -#define SMBIOSIZE	8 +#define SMBIOSIZE	9  /* PCI Address Constants */  #define SMBBA		0x090 @@ -592,6 +592,8 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr,  	u8 port;  	int retval; +	mutex_lock(&piix4_mutex_sb800); +  	/* Request the SMBUS semaphore, avoid conflicts with the IMC */  	smbslvcnt  = inb_p(SMBSLVCNT);  	do { @@ -605,10 +607,10 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr,  		usleep_range(1000, 2000);  	} while (--retries);  	/* SMBus is still owned by the IMC, we give up */ -	if (!retries) +	if (!retries) { +		mutex_unlock(&piix4_mutex_sb800);  		return -EBUSY; - -	mutex_lock(&piix4_mutex_sb800); +	}  	outb_p(piix4_port_sel_sb800, SB800_PIIX4_SMB_IDX);  	smba_en_lo = inb_p(SB800_PIIX4_SMB_IDX + 1); @@ -623,11 +625,11 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr,  	outb_p(smba_en_lo, SB800_PIIX4_SMB_IDX + 1); -	mutex_unlock(&piix4_mutex_sb800); -  	/* Release the semaphore */  	outb_p(smbslvcnt | 0x20, SMBSLVCNT); +	mutex_unlock(&piix4_mutex_sb800); +  	return retval;  }  | 
