summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@cvs.openbsd.org>2005-12-09 22:55:11 +0000
committerMark Kettenis <kettenis@cvs.openbsd.org>2005-12-09 22:55:11 +0000
commit6722e34abb48d61ddb47393df0b32ac360687ccd (patch)
tree5e293ac9812faade8720bef8059b6e2df394444a
parent21d517dcf1f270c0eec90f094e0cec77444e2261 (diff)
Add support for cpu voltage slewing.
-rw-r--r--sys/arch/macppc/dev/smu.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/sys/arch/macppc/dev/smu.c b/sys/arch/macppc/dev/smu.c
index 389a3754c35..d9a0219ccd9 100644
--- a/sys/arch/macppc/dev/smu.c
+++ b/sys/arch/macppc/dev/smu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smu.c,v 1.8 2005/11/19 02:18:00 pedro Exp $ */
+/* $OpenBSD: smu.c,v 1.9 2005/12/09 22:55:10 kettenis Exp $ */
/*
* Copyright (c) 2005 Mark Kettenis
@@ -25,6 +25,7 @@
#include <sys/sensors.h>
#include <machine/autoconf.h>
+#include <machine/cpu.h>
#include <dev/clock_subr.h>
#include <dev/i2c/i2cvar.h>
@@ -123,6 +124,9 @@ struct smu_cmd {
#define SMU_I2C_NORMAL 0x01
#define SMU_I2C_COMBINED 0x02
+/* Power Management */
+#define SMU_POWER 0xaa
+
/* Miscellaneous */
#define SMU_MISC 0xee
#define SMU_MISC_GET_DATA 0x02
@@ -143,6 +147,8 @@ void smu_i2c_release_bus(void *, int);
int smu_i2c_exec(void *, i2c_op_t, i2c_addr_t,
const void *, size_t, void *buf, size_t, int);
+void smu_slew_voltage(u_int);
+
#define GPIO_DDR 0x04 /* Data direction */
#define GPIO_DDR_OUTPUT 0x04 /* Output */
#define GPIO_DDR_INPUT 0x00 /* Input */
@@ -333,6 +339,8 @@ smu_attach(struct device *parent, struct device *self, void *aux)
sensor_task_register(sc, smu_refresh_sensors, 5);
printf("\n");
+ ppc64_slew_voltage = smu_slew_voltage;
+
sc->sc_i2c_tag.ic_cookie = sc;
sc->sc_i2c_tag.ic_acquire_bus = smu_i2c_acquire_bus;
sc->sc_i2c_tag.ic_release_bus = smu_i2c_release_bus;
@@ -668,3 +676,19 @@ smu_i2c_exec(void *cookie, i2c_op_t op, i2c_addr_t addr,
memcpy(buf, &cmd->data[1], len);
return (0);
}
+
+void
+smu_slew_voltage(u_int freq_scale)
+{
+ struct smu_softc *sc = smu_cd.cd_devs[0];
+ struct smu_cmd *cmd = (struct smu_cmd *)sc->sc_cmd;
+
+ cmd->cmd = SMU_POWER;
+ cmd->len = 8;
+ memcpy(cmd->data, "VSLEW", 5);
+ cmd->data[5] = 0xff;
+ cmd->data[6] = 1;
+ cmd->data[7] = freq_scale;
+
+ smu_do_cmd(sc, 250);
+}