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