Skip to contentSkip to conversation

windfarm: add PowerMac 12,1 support

PATCH New Benjamin Herrenschmidt 1 participant 1 message Apr 29, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 windfarm: add PowerMac 12,1 support

From: Etienne Bersac <[email protected]>

Implement a new driver named windfarm_pm121 which drive fans on PowerMac 12,1 machine : iMac G5 iSight (rev C) 17" and 20". It's based on windfarm_pm81 driver from Benjamin Herrenschmidt.

---

Initial patch by Etienne, fixes by David, but they couldn't be bothered making that a single patch for merging so here it is.

(Etienne, the accent on your name didn't survive the process sorry)

 arch/powerpc/configs/g5_defconfig           |    1 
 drivers/macintosh/Kconfig                   |    8 
 drivers/macintosh/Makefile                  |    5 
 drivers/macintosh/windfarm_lm75_sensor.c    |    6 
 drivers/macintosh/windfarm_max6690_sensor.c |   20 
 drivers/macintosh/windfarm_pm121.c          | 1040 ++++++++++++++++++++++++++++
 drivers/macintosh/windfarm_smu_controls.c   |    4 
 7 files changed, 1078 insertions(+), 6 deletions(-)
arch/powerpc/configs/g5_defconfig +1 -0
@@ -696,6 +696,7 @@ CONFIG_WINDFARM=y
 CONFIG_WINDFARM_PM81=y
 CONFIG_WINDFARM_PM91=y
 CONFIG_WINDFARM_PM112=y
+CONFIG_WINDFARM_PM121=y
 # CONFIG_PMAC_RACKMETER is not set
 CONFIG_NETDEVICES=y
 # CONFIG_NETDEVICES_MULTIQUEUE is not set
drivers/macintosh/Kconfig +8 -0
Index: linux-work/drivers/macintosh/Kconfig
===================================================================
@@ -234,6 +234,14 @@ config WINDFARM_PM112
 	  which are the recent dual and quad G5 machines using the
 	  970MP dual-core processor.
 
+config WINDFARM_PM121
+	tristate "Support for thermal management on PowerMac12,1"
+	depends on WINDFARM && I2C && PMAC_SMU
+	select I2C_POWERMAC
+	help
+	  This driver provides thermal control for the PowerMac12,1
+	  which is the iMac G5 (iSight)
+
 config ANSLCD
 	tristate "Support for ANS LCD display"
 	depends on ADB_CUDA && PPC_PMAC
drivers/macintosh/Makefile +5 -0
Index: linux-work/drivers/macintosh/Makefile
===================================================================
@@ -42,4 +42,9 @@ obj-$(CONFIG_WINDFARM_PM112)	+= windfarm
 				   windfarm_smu_sensors.o \
 				   windfarm_max6690_sensor.o \
 				   windfarm_lm75_sensor.o windfarm_pid.o
+obj-$(CONFIG_WINDFARM_PM121)	+= windfarm_pm121.o windfarm_smu_sat.o \
+				   windfarm_smu_controls.o \
+				   windfarm_smu_sensors.o \
+				   windfarm_max6690_sensor.o \
+				   windfarm_lm75_sensor.o windfarm_pid.o
 obj-$(CONFIG_PMAC_RACKMETER)	+= rack-meter.o
drivers/macintosh/windfarm_lm75_sensor.c +6 -0
Index: linux-work/drivers/macintosh/windfarm_lm75_sensor.c
===================================================================
@@ -127,6 +127,12 @@ static struct wf_lm75_sensor *wf_lm75_cr
 	 */
 	if (!strcmp(loc, "Hard drive") || !strcmp(loc, "DRIVE BAY"))
 		lm->sens.name = "hd-temp";
+	else if (!strcmp(loc, "Incoming Air Temp"))
+		lm->sens.name = "incoming-air-temp";
+	else if (!strcmp(loc, "ODD Temp"))
+		lm->sens.name = "optical-drive-temp";
+	else if (!strcmp(loc, "HD Temp"))
+		lm->sens.name = "hard-drive-temp";
 	else
 		goto fail;
 
drivers/macintosh/windfarm_max6690_sensor.c +14 -6
Index: linux-work/drivers/macintosh/windfarm_max6690_sensor.c
===================================================================
@@ -77,18 +77,28 @@ static struct wf_sensor_ops wf_max6690_o
 	.owner		= THIS_MODULE,
 };
 
-static void wf_max6690_create(struct i2c_adapter *adapter, u8 addr)
+static void wf_max6690_create(struct i2c_adapter *adapter, u8 addr,
+			      const char *loc)
 {
 	struct wf_6690_sensor *max;
-	char *name = "backside-temp";
+	char *name;
 
 	max = kzalloc(sizeof(struct wf_6690_sensor), GFP_KERNEL);
 	if (max == NULL) {
 		printk(KERN_ERR "windfarm: Couldn't create MAX6690 sensor %s: "
-		       "no memory\n", name);
+		       "no memory\n", loc);
 		return;
 	}
 
+	if (!strcmp(loc, "BACKSIDE"))
+		name = "backside-temp";
+	else if (!strcmp(loc, "NB Ambient"))
+		name = "north-bridge-temp";
+	else if (!strcmp(loc, "GPU Ambient"))
+		name = "gpu-temp";
+	else
+		goto fail;
+
 	max->sens.ops = &wf_max6690_ops;
 	max->sens.name = name;
 	max->i2c.addr = addr >> 1;
@@ -138,9 +148,7 @@ static int wf_max6690_attach(struct i2c_
 		if (loc == NULL || addr == 0)
 			continue;
 		printk("found max6690, loc=%s addr=0x%02x\n", loc, addr);
-		if (strcmp(loc, "BACKSIDE"))
-			continue;
-		wf_max6690_create(adapter, addr);
+		wf_max6690_create(adapter, addr, loc);
 	}
 
 	return 0;
drivers/macintosh/windfarm_pm121.c new file +1040 -0

1,040 lines not on this page · raw message

drivers/macintosh/windfarm_smu_controls.c +4 -0
Index: linux-work/drivers/macintosh/windfarm_smu_controls.c
===================================================================
@@ -218,6 +218,10 @@ static struct smu_fan_control *smu_fan_c
 		fct->ctrl.name = "cpu-fan";
 	else if (!strcmp(l, "Hard Drive") || !strcmp(l, "Hard drive"))
 		fct->ctrl.name = "drive-bay-fan";
+	else if (!strcmp(l, "HDD Fan")) /* seen on iMac G5 iSight */
+		fct->ctrl.name = "hard-drive-fan";
+	else if (!strcmp(l, "ODD Fan")) /* same */
+		fct->ctrl.name = "optical-drive-fan";
 
 	/* Unrecognized fan, bail out */
 	if (fct->ctrl.name == NULL)