ALI1563 SMBus driver - please test on your hardware

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Patrick,

Please can you test if this works for you on your hardware?

Please try this if you can see eeproms on your MB:

i2cdump 0 0x50
i2cdump 0 0x50 c
i2cdumo 0 0x50

Assuming that 0x50 is correct address (you can get i2cdetect 0 the address of the EEPROMs present on your system)

You should get three same dumps.
Also please try to load some monitoring driver and load also eeprom module
than after sensors command all should work.

The purpose of the test is to show that continous byte read works for eeproms. (I dont know how it would behave on sensor chip)
and if my changes to STS_DONE do not affect anyting on your HW.

Thank you

Regards
Rudolf

diff -Naur a/drivers/i2c/busses/i2c-ali1563.c c/drivers/i2c/busses/i2c-ali1563.c
--- a/drivers/i2c/busses/i2c-ali1563.c	2005-03-09 09:13:19.000000000 +0100
+++ c/drivers/i2c/busses/i2c-ali1563.c	2005-04-08 21:55:19.000000000 +0200
@@ -1,4 +1,4 @@
-/**
+/*
   *	i2c-ali1563.c - i2c driver for the ALi 1563 Southbridge
   *
   *	Copyright (C) 2004 Patrick Mochel
@@ -13,6 +13,9 @@
   *	with a little help from the ALi 1563 spec.
   *
   *	This file is released under the GPLv2
+ *
+ *	2005-04-08: Fixed SMBus mode setting, fixed byte data transactions 	
+ *			Rudolf Marek <r.marek at sh.cvut.cz>
   */

  #include <linux/module.h>
@@ -55,8 +58,7 @@
  #define HST_CNTL2_BYTE_DATA	0x02
  #define HST_CNTL2_WORD_DATA	0x03
  #define HST_CNTL2_BLOCK		0x05
-
-
+#define HST_CNTL2_SIZEMASK	0x38

  static unsigned short ali1563_smba;

@@ -73,7 +75,7 @@

  	data = inb_p(SMB_HST_STS);
  	if (data & HST_STS_BAD) {
-		dev_warn(&a->dev,"ali1563: Trying to reset busy device\n");
+		dev_err(&a->dev,"ali1563: Trying to reset busy device\n");
  		outb_p(data | HST_STS_BAD,SMB_HST_STS);
  		data = inb_p(SMB_HST_STS);
  		if (data & HST_STS_BAD)
@@ -94,19 +96,31 @@

  	if (timeout && !(data & HST_STS_BAD))
  		return 0;
-	dev_warn(&a->dev, "SMBus Error: %s%s%s%s%s\n",
-		timeout ? "Timeout " : "",
-		data & HST_STS_FAIL ? "Transaction Failed " : "",
-		data & HST_STS_BUSERR ? "No response or Bus Collision " : "",
-		data & HST_STS_DEVERR ? "Device Error " : "",
-		!(data & HST_STS_DONE) ? "Transaction Never Finished " : "");

-	if (!(data & HST_STS_DONE))
+	if (!timeout) {
+		dev_err(&a->dev, "Timeout - Trying to KILL transaction!\n");
  		/* Issue 'kill' to host controller */
  		outb_p(HST_CNTL2_KILL,SMB_HST_CNTL2);
-	else
-		/* Issue timeout to reset all devices on bus */
+		data = inb_p(SMB_HST_STS);		
+ 	}
+	
+	/* device error - probably missing ACK, from autdetection I2C_QUICK */	
+	if (data & HST_STS_DEVERR) {
+		dev_dbg(&a->dev, "Device error!\n");
+	}
+
+	/* bus collision */
+	if (data & HST_STS_BUSERR) {
+		dev_err(&a->dev, "Bus collision!\n");
+		/* Issue timeout, hoping it helps */
  		outb_p(HST_CNTL1_TIMEOUT,SMB_HST_CNTL1);
+	}
+
+	if (data & HST_STS_FAIL) {
+		dev_err(&a->dev, "Cleaning fail after KILL!\n");
+		outb_p(0x0,SMB_HST_CNTL2);
+	}
+
  	return -1;
  }

@@ -149,7 +163,7 @@

  	if (timeout && !(data & HST_STS_BAD))
  		return 0;
-	dev_warn(&a->dev, "SMBus Error: %s%s%s%s%s\n",
+	dev_err(&a->dev, "SMBus Error: %s%s%s%s%s\n",
  		timeout ? "Timeout " : "",
  		data & HST_STS_FAIL ? "Transaction Failed " : "",
  		data & HST_STS_BUSERR ? "No response or Bus Collision " : "",
@@ -242,13 +256,15 @@
  	}

  	outb_p(((addr & 0x7f) << 1) | (rw & 0x01), SMB_HST_ADD);
-	outb_p(inb_p(SMB_HST_CNTL2) | (size << 3), SMB_HST_CNTL2);
+	outb_p((inb_p(SMB_HST_CNTL2) & ~HST_CNTL2_SIZEMASK) | (size << 3), SMB_HST_CNTL2);

  	/* Write the command register */
+
  	switch(size) {
  	case HST_CNTL2_BYTE:
  		if (rw== I2C_SMBUS_WRITE)
-			outb_p(cmd, SMB_HST_CMD);
+			/* Beware it uses DAT0 register and not CMD !!! */
+			outb_p(cmd, SMB_HST_DAT0);
  		break;
  	case HST_CNTL2_BYTE_DATA:
  		outb_p(cmd, SMB_HST_CMD);



[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux