[i2c] [PATCH] i2c-ali1563: Fix device initialization

Jean Delvare khali at linux-fr.org
Sun Jan 7 16:38:27 CET 2007


The i2c-ali1563 initialization looks quite broken to me:
* If the I/O space isn't enabled, we forcibly set 3 bits in
  the PCI configuration space instead of just the one enabling
  the I/O space.
* After that we pretend to check if the write worked, but we
  don't actually read the new value from the register.
* It's probably not a good idea to enable the I/O space if no
  base address has been set.

So I propose the following changes to that part of the driver:
* Merge ali1563_enable() into ali1563_setup().
* Check the base address before the I/O space enabled bit.

Signed-off-by: Jean Delvare <khali at linux-fr.org>
Cc: Rudolf Marek <r.marek at assembler.cz>
---
 drivers/i2c/busses/i2c-ali1563.c |   41 +++++++++++++++++---------------------
 1 file changed, 18 insertions(+), 23 deletions(-)

--- linux-2.6.20-rc4.orig/drivers/i2c/busses/i2c-ali1563.c	2007-01-07 14:47:46.000000000 +0100
+++ linux-2.6.20-rc4/drivers/i2c/busses/i2c-ali1563.c	2007-01-07 16:23:15.000000000 +0100
@@ -318,35 +318,12 @@ static u32 ali1563_func(struct i2c_adapt
 }
 
 
-static void ali1563_enable(struct pci_dev * dev)
-{
-	u16 ctrl;
-
-	pci_read_config_word(dev,ALI1563_SMBBA,&ctrl);
-	ctrl |= 0x7;
-	pci_write_config_word(dev,ALI1563_SMBBA,ctrl);
-}
-
 static int __devinit ali1563_setup(struct pci_dev * dev)
 {
 	u16 ctrl;
 
 	pci_read_config_word(dev,ALI1563_SMBBA,&ctrl);
 
-	/* Check if device is even enabled first */
-	if (!(ctrl & ALI1563_SMB_IOEN)) {
-		dev_warn(&dev->dev,"I/O space not enabled, trying manually\n");
-		ali1563_enable(dev);
-	}
-	if (!(ctrl & ALI1563_SMB_IOEN)) {
-		dev_warn(&dev->dev,"I/O space still not enabled, giving up\n");
-		goto Err;
-	}
-	if (!(ctrl & ALI1563_SMB_HOSTEN)) {
-		dev_warn(&dev->dev,"Host Controller not enabled\n");
-		goto Err;
-	}
-
 	/* SMB I/O Base in high 12 bits and must be aligned with the
 	 * size of the I/O space. */
 	ali1563_smba = ctrl & ~(ALI1563_SMB_IOSIZE - 1);
@@ -354,6 +331,24 @@ static int __devinit ali1563_setup(struc
 		dev_warn(&dev->dev,"ali1563_smba Uninitialized\n");
 		goto Err;
 	}
+
+	/* Check if device is enabled */
+	if (!(ctrl & ALI1563_SMB_HOSTEN)) {
+		dev_warn(&dev->dev, "Host Controller not enabled\n");
+		goto Err;
+	}
+	if (!(ctrl & ALI1563_SMB_IOEN)) {
+		dev_warn(&dev->dev, "I/O space not enabled, trying manually\n");
+		pci_write_config_word(dev, ALI1563_SMBBA,
+				      ctrl | ALI1563_SMB_IOEN);
+		pci_read_config_word(dev, ALI1563_SMBBA, &ctrl);
+		if (!(ctrl & ALI1563_SMB_IOEN)) {
+			dev_warn(&dev->dev, "I/O space still not enabled, "
+				 "giving up\n");
+			goto Err;
+		}
+	}
+
 	if (!request_region(ali1563_smba, ALI1563_SMB_IOSIZE,
 			    ali1563_pci_driver.name)) {
 		dev_err(&dev->dev, "Could not allocate I/O space at 0x%04x\n",


-- 
Jean Delvare



More information about the i2c mailing list