34#include <sys/module.h>
35#include <sys/callout.h>
39#include <sys/kernel.h>
40#include <sys/reboot.h>
42#include <sys/sysctl.h>
43#include <sys/limits.h>
45#include <machine/bus.h>
46#include <machine/md_var.h>
51#include <dev/ofw/openfirm.h>
52#include <dev/ofw/ofw_bus.h>
53#include <powerpc/powermac/powermac_thermal.h>
57#define DS1631_STOP 0x22
58#define DS1631_START 0x51
59#define DS1631_RESET 0x54
60#define DS1631_TEMP 0xAA
61#define DS1631_CONTROL 0xAC
62#define DS1631_CONTROL_1SHOT 0x01
63#define DS1631_CONTROL_9BIT 0x00
64#define DS1631_CONTROL_10BIT 0x04
65#define DS1631_CONTROL_11BIT 0x08
66#define DS1631_CONTROL_12BIT 0x0C
101 uint8_t *buff,
int len);
133 memcpy(
buf + 1, buff,
len);
140 device_printf(
dev,
"iicbus write failed\n");
143 pause(
"ds1631_write", hz);
168 device_printf(
dev,
"iicbus read failed\n");
171 pause(
"ds1631_read_1", hz);
196 device_printf(
dev,
"iicbus read failed\n");
199 pause(
"ds1631_read_2", hz);
206 const char *name, *compatible;
209 name = ofw_bus_get_name(
dev);
210 compatible = ofw_bus_get_compat(
dev);
215 if (strcmp(name,
"temp-monitor") != 0 ||
216 strcmp(compatible,
"ds1631") != 0 )
219 sc = device_get_softc(
dev);
223 device_set_desc(
dev,
"Temp-Monitor DS1631");
233 sc = device_get_softc(
dev);
247 if (config_intrhook_establish(&sc->
enum_hook) != 0)
259 sc = device_get_softc(
dev);
263 device_printf(
dev,
"ds1631 read config failed: %x\n", err);
279 device_printf(
dev,
"ds1631 write config failed: %x\n", err);
287 device_printf(
dev,
"ds1631 write start failed: %x\n", err);
299 phandle_t child, node;
301 struct sysctl_oid *oid, *sensroot_oid;
302 struct sysctl_ctx_list *ctx;
305 char sysctl_desc[40], sysctl_name[40];
307 device_t
dev = (device_t)xdev;
309 sc = device_get_softc(
dev);
311 child = ofw_bus_get_node(
dev);
313 ctx = device_get_sysctl_ctx(
dev);
314 sensroot_oid = SYSCTL_ADD_NODE(ctx,
315 SYSCTL_CHILDREN(device_get_sysctl_tree(
dev)), OID_AUTO,
"sensor",
316 CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
"DS1631 Sensor Information");
318 if (OF_getprop(child,
"hwsensor-zone", &sc->
sc_sensor.zone,
322 plen = OF_getprop(child,
"hwsensor-location", sc->
sc_sensor.name,
329 for (node = OF_child(child); node; node = OF_peer(node))
330 plen = OF_getprop(node,
"location", sc->
sc_sensor.name,
335 strcpy(sysctl_name,
"sensor");
337 for (i = 0; i < strlen(sc->
sc_sensor.name); i++) {
338 sysctl_name[i] = tolower(sc->
sc_sensor.name[i]);
339 if (isspace(sysctl_name[i]))
340 sysctl_name[i] =
'_';
347 sc->
sc_sensor.target_temp = 400 + ZERO_C_TO_K;
348 sc->
sc_sensor.max_temp = 500 + ZERO_C_TO_K;
350 sc->
sc_sensor.target_temp = 300 + ZERO_C_TO_K;
351 sc->
sc_sensor.max_temp = 500 + ZERO_C_TO_K;
356 pmac_thermal_sensor_register(&sc->
sc_sensor);
358 sprintf(sysctl_desc,
"%s %s", sc->
sc_sensor.name,
"(C)");
359 oid = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(sensroot_oid),
360 OID_AUTO, sysctl_name, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
361 "Sensor Information");
362 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
"temp",
363 CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE,
dev,
366 config_intrhook_disestablish(&sc->
enum_hook);
381 device_printf(sc->
sc_dev,
"ds1631 read TEMP failed: %x\n", err);
393 return (((int16_t)(
read) >> 6) * 25 / 10 + ZERO_C_TO_K);
405 sc = device_get_softc(
dev);
411 error = sysctl_handle_int(oidp, &temp, 0, req);
DRIVER_MODULE(ds1631, iicbus, ds1631_driver, ds1631_devclass, 0, 0)
static device_method_t ds1631_methods[]
#define DS1631_CONTROL_1SHOT
static int ds1631_attach(device_t)
static int ds1631_sensor_sysctl(SYSCTL_HANDLER_ARGS)
static int ds1631_read_1(device_t dev, uint32_t addr, uint8_t reg, uint8_t *data)
static int ds1631_write(device_t dev, uint32_t addr, uint8_t reg, uint8_t *buff, int len)
static void ds1631_start(void *xdev)
#define DS1631_CONTROL_10BIT
static devclass_t ds1631_devclass
static int ds1631_read_2(device_t dev, uint32_t addr, uint8_t reg, uint16_t *data)
static int ds1631_probe(device_t)
static int ds1631_sensor_read(struct ds1631_softc *sc)
static int ds1631_init(device_t dev, uint32_t addr)
static driver_t ds1631_driver
int iicbus_transfer(device_t bus, struct iic_msg *msgs, uint32_t nmsgs)
struct intr_config_hook enum_hook
struct pmac_therm sc_sensor