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

Commit aca9fa0c authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
parents fc6f41ba bbb27fc3
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -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;
}