add support for writing to SMBus with vt8237
authorFlorian Zumbiehl <florz@florz.de>
Tue, 1 Nov 2011 19:17:13 +0000 (20:17 +0100)
committerRudolf Marek <r.marek@assembler.cz>
Thu, 3 Nov 2011 20:39:03 +0000 (21:39 +0100)
Change-Id: I70fe072f8f3447d0be7b7ac64508a954fe47091d
Signed-off-by: Florian Zumbiehl <florz@florz.de>
Reviewed-on: http://review.coreboot.org/372
Tested-by: build bot (Jenkins)
Reviewed-by: Rudolf Marek <r.marek@assembler.cz>
src/southbridge/via/vt8237r/early_smbus.c
src/southbridge/via/vt8237r/vt8237r.h

index a298e84676282e669d8ed24f2cc351ef6cef9128..e25535bf0f1ceea60c4aa7931005d435def3b45e 100644 (file)
@@ -87,17 +87,12 @@ static void smbus_reset(void)
        PRINT_DEBUG("\n");
 }
 
-/**
- * Read a byte from the SMBus.
- *
- * @param dimm The address location of the DIMM on the SMBus.
- * @param offset The offset the data is located at.
- */
-u8 smbus_read_byte(u8 dimm, u8 offset)
+static u8 smbus_transaction(u8 dimm, u8 offset, u8 data, int do_read)
 {
        u8 val;
 
-       PRINT_DEBUG("DIMM ");
+       PRINT_DEBUG(do_read ? "RD: " : "WR: ");
+       PRINT_DEBUG("ADDR ");
        PRINT_DEBUG_HEX16(dimm);
        PRINT_DEBUG(" OFFSET ");
        PRINT_DEBUG_HEX16(offset);
@@ -106,13 +101,13 @@ u8 smbus_read_byte(u8 dimm, u8 offset)
        smbus_reset();
 
        /* Clear host data port. */
-       outb(0x00, SMBHSTDAT0);
+       outb(do_read ? 0x00 : data, SMBHSTDAT0);
        SMBUS_DELAY();
        smbus_wait_until_ready();
 
        /* Actual addr to reg format. */
        dimm = (dimm << 1);
-       dimm |= 1;
+       dimm |= !!do_read;
        outb(dimm, SMBXMITADD);
        outb(offset, SMBHSTCMD);
 
@@ -132,6 +127,22 @@ u8 smbus_read_byte(u8 dimm, u8 offset)
        return val;
 }
 
+/**
+ * Read a byte from the SMBus.
+ *
+ * @param dimm The address location of the DIMM on the SMBus.
+ * @param offset The offset the data is located at.
+ */
+u8 smbus_read_byte(u8 dimm, u8 offset)
+{
+       return smbus_transaction(dimm, offset, 0, 1);
+}
+
+void smbus_write_byte(u8 dimm, u8 offset, u8 data)
+{
+       smbus_transaction(dimm, offset, data, 0);
+}
+
 #define PSONREADY_TIMEOUT 0x7fffffff
 
 static device_t get_vt8237_lpc(void)
index 94b18403616114b097f44d1ed11a08f05d4cedd2..9d5a1fc60813ae6f5f1812d21bd34eaa47132e65 100644 (file)
@@ -148,6 +148,7 @@ __attribute__ ((packed))
 #ifdef __PRE_RAM__
 #ifndef __ROMCC__
 u8 smbus_read_byte(u8 dimm, u8 offset);
+void smbus_write_byte(u8 dimm, u8 offset, u8 data);
 void enable_smbus(void);
 void smbus_fixup(const struct mem_controller *ctrl);
 // these are in vt8237_early_smbus.c - do they really belong there?