On Wed, Jun 16, 2010 at 6:22 PM, Ward Vandewege <[email protected]> wrote:
> On Wed, Jun 16, 2010 at 02:50:42PM -0600, Myles Watson wrote:
>> This patch breaks the s2881, which was doing some odd acrobatics in
>> order to get a device initialized after its parent.  It should be an
>> easy fix to do it correctly now, but I don't have an s2881 to test on.
>>  Ward?
>
> Yep, I've got (the guts) of an s2881 lying on my desk here, and can test any
> patches you throw at me :)

Great.  Here are two patches.

The first one enables the driver exactly like it was before, only as a driver.

The second one tries to make it less board specific.  Putting the fan
settings in the device tree would complete that effort, I think.

Suggestions welcome.  Thanks for testing!

Signed-off-by: Myles Watson <[email protected]>

Thanks,
Myles
Index: svn/src/mainboard/tyan/s2881/Makefile.inc
===================================================================
--- svn.orig/src/mainboard/tyan/s2881/Makefile.inc
+++ svn/src/mainboard/tyan/s2881/Makefile.inc
@@ -1 +1,2 @@
 obj-y += ../../../drivers/i2c/adm1027/adm1027.o
+obj-y += ../../../drivers/i2c/adt7463/adt7463.o
Index: svn/src/mainboard/tyan/s2881/devicetree.cb
===================================================================
--- svn.orig/src/mainboard/tyan/s2881/devicetree.cb
+++ svn/src/mainboard/tyan/s2881/devicetree.cb
@@ -103,7 +103,12 @@ chip northbridge/amd/amdk8/root_complex
                                                         device i2c 57 on end
                                                 end
                                                 chip drivers/i2c/adm1027 # ADT7463A CPU0/1 temp, CPU1 vid, SYS FAN 1/2/3
-                                                        device i2c 2d on end
+                                                        device i2c 2d on
+                                                                chip drivers/i2c/adt7463
+                                                                        device i2c d0 on
+                                                                        end
+                                                                end
+                                                        end
                                                 end
                                                 chip drivers/generic/generic # Winbond HWM 0x54 CPU0/1 VRM temp, SYSFAN 4,CPU0 vid, CPU0/1 FAN
                                                         device i2c 2a on end
Index: svn/src/drivers/i2c/adt7463/adt7463.c
===================================================================
--- svn.orig/src/drivers/i2c/adt7463/adt7463.c
+++ svn/src/drivers/i2c/adt7463/adt7463.c
@@ -116,7 +116,7 @@ static void enable_dev(struct device *de
 	dev->ops = &adt7463_operations;
 }
 
-struct chip_operations mainboard_ops = {
+struct chip_operations drivers_i2c_adt7463_ops = {
 	CHIP_NAME("adt7463")
 	.enable_dev = enable_dev,
 };
Index: svn/src/drivers/i2c/adt7463/adt7463.c
===================================================================
--- svn.orig/src/drivers/i2c/adt7463/adt7463.c
+++ svn/src/drivers/i2c/adt7463/adt7463.c
@@ -35,67 +35,56 @@
  */
 static void adt7463_init(device_t dev)
 {
-	device_t smbus_dev, adt7463;
-	struct device_path path;
+	device_t parent;
 	int result;
 
-	/* Find the SMBus controller (AMD-8111). */
-	smbus_dev = dev_find_device(0x1022, 0x746b, 0);
-	if (!smbus_dev)
-		die("SMBus controller not found\n");
-	printk(BIOS_DEBUG, "SMBus controller found\n");
-
-	/* Find the ADT7463 device. */
-	path.type = DEVICE_PATH_I2C;
-	path.i2c.device = 0x2d;
-	adt7463 = find_dev_path(smbus_dev->link_list, &path);
-	if (!adt7463)
-		die("ADT7463 not found\n");
-	printk(BIOS_DEBUG, "ADT7463 found\n");
+	/* Find the ADT7463's parent device. */
+	parent = dev->bus->dev;
+	printk(BIOS_DEBUG, "ADT7463 parent is %s\n", dev_path(parent));
 
 	/* Set all fans to 'Fastest Speed Calculated by All 3 Temperature
 	 * Channels Controls PWMx'.
 	 */
-	result = smbus_write_byte(adt7463, 0x5c, 0xc2);
-	result = smbus_write_byte(adt7463, 0x5d, 0xc2);
-	result = smbus_write_byte(adt7463, 0x5e, 0xc2);
+	result = smbus_write_byte(parent, 0x5c, 0xc2);
+	result = smbus_write_byte(parent, 0x5d, 0xc2);
+	result = smbus_write_byte(parent, 0x5e, 0xc2);
 
 	/* Make sure that our fans never stop when temp. falls below Tmin,
 	 * but rather keep going at minimum duty cycle (applies to automatic
 	 * fan control mode only).
 	 */
-	result = smbus_write_byte(adt7463, 0x62, 0xc0);
+	result = smbus_write_byte(parent, 0x62, 0xc0);
 
 	/* Set minimum PWM duty cycle to 25%, rather than the default 50%. */
-	result = smbus_write_byte(adt7463, 0x64, 0x40);
-	result = smbus_write_byte(adt7463, 0x65, 0x40);
-	result = smbus_write_byte(adt7463, 0x66, 0x40);
+	result = smbus_write_byte(parent, 0x64, 0x40);
+	result = smbus_write_byte(parent, 0x65, 0x40);
+	result = smbus_write_byte(parent, 0x66, 0x40);
 
 	/* Set Tmin to 55C, rather than the default 90C. Above this temperature
 	 * the fans will start blowing harder as temperature increases
 	 * (automatic mode only).
 	 */
-	result = smbus_write_byte(adt7463, 0x67, 0x37);
-	result = smbus_write_byte(adt7463, 0x68, 0x37);
-	result = smbus_write_byte(adt7463, 0x69, 0x37);
+	result = smbus_write_byte(parent, 0x67, 0x37);
+	result = smbus_write_byte(parent, 0x68, 0x37);
+	result = smbus_write_byte(parent, 0x69, 0x37);
 
 	/* Set THERM limit to 70C, rather than the default 100C.
 	 * The fans will kick in at 100% if the sensors reach this temperature,
 	 * (only in automatic mode, but supposedly even when hardware is
 	 * locked up). This is a failsafe measure.
 	 */
-	result = smbus_write_byte(adt7463, 0x6a, 0x46);
-	result = smbus_write_byte(adt7463, 0x6b, 0x46);
-	result = smbus_write_byte(adt7463, 0x6c, 0x46);
+	result = smbus_write_byte(parent, 0x6a, 0x46);
+	result = smbus_write_byte(parent, 0x6b, 0x46);
+	result = smbus_write_byte(parent, 0x6c, 0x46);
 
 	/* Remote temperature 1 offset (LSB == 0.25C). */
-	result = smbus_write_byte(adt7463, 0x70, 0x02);
+	result = smbus_write_byte(parent, 0x70, 0x02);
 
 	/* Remote temperature 2 offset (LSB == 0.25C). */
-	result = smbus_write_byte(adt7463, 0x72, 0x01);
+	result = smbus_write_byte(parent, 0x72, 0x01);
 
 	/* Set TACH measurements to normal (1/second). */
-	result = smbus_write_byte(adt7463, 0x78, 0xf0);
+	result = smbus_write_byte(parent, 0x78, 0xf0);
 
 	printk(BIOS_DEBUG, "ADT7463 properly initialized\n");
 }
-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to