2 * Windfarm PowerMac thermal control. MAX6690 sensor.
4 * Copyright (C) 2005 Paul Mackerras, IBM Corp. <paulus@samba.org>
6 * Use and redistribute under the terms of the GNU GPL v2.
8 #include <linux/types.h>
9 #include <linux/errno.h>
10 #include <linux/kernel.h>
11 #include <linux/init.h>
12 #include <linux/slab.h>
13 #include <linux/i2c.h>
15 #include <asm/pmac_low_i2c.h>
21 /* This currently only exports the external temperature sensor,
22 since that's all the control loops need. */
24 /* Some MAX6690 register numbers */
25 #define MAX6690_INTERNAL_TEMP 0
26 #define MAX6690_EXTERNAL_TEMP 1
28 struct wf_6690_sensor
{
29 struct i2c_client
*i2c
;
30 struct wf_sensor sens
;
33 #define wf_to_6690(x) container_of((x), struct wf_6690_sensor, sens)
35 static int wf_max6690_get(struct wf_sensor
*sr
, s32
*value
)
37 struct wf_6690_sensor
*max
= wf_to_6690(sr
);
43 /* chip gets initialized by firmware */
44 data
= i2c_smbus_read_byte_data(max
->i2c
, MAX6690_EXTERNAL_TEMP
);
51 static void wf_max6690_release(struct wf_sensor
*sr
)
53 struct wf_6690_sensor
*max
= wf_to_6690(sr
);
58 static struct wf_sensor_ops wf_max6690_ops
= {
59 .get_value
= wf_max6690_get
,
60 .release
= wf_max6690_release
,
64 static int wf_max6690_probe(struct i2c_client
*client
,
65 const struct i2c_device_id
*id
)
67 const char *name
, *loc
;
68 struct wf_6690_sensor
*max
;
71 loc
= of_get_property(client
->dev
.of_node
, "hwsensor-location", NULL
);
73 dev_warn(&client
->dev
, "Missing hwsensor-location property!\n");
78 * We only expose the external temperature register for
79 * now as this is all we need for our control loops
81 if (!strcmp(loc
, "BACKSIDE") || !strcmp(loc
, "SYS CTRLR AMBIENT"))
82 name
= "backside-temp";
83 else if (!strcmp(loc
, "NB Ambient"))
84 name
= "north-bridge-temp";
85 else if (!strcmp(loc
, "GPU Ambient"))
90 max
= kzalloc(sizeof(struct wf_6690_sensor
), GFP_KERNEL
);
92 printk(KERN_ERR
"windfarm: Couldn't create MAX6690 sensor: "
98 max
->sens
.name
= (char *)name
; /* XXX fix constness in structure */
99 max
->sens
.ops
= &wf_max6690_ops
;
100 i2c_set_clientdata(client
, max
);
102 rc
= wf_register_sensor(&max
->sens
);
108 static int wf_max6690_remove(struct i2c_client
*client
)
110 struct wf_6690_sensor
*max
= i2c_get_clientdata(client
);
113 wf_unregister_sensor(&max
->sens
);
118 static const struct i2c_device_id wf_max6690_id
[] = {
119 { "MAC,max6690", 0 },
122 MODULE_DEVICE_TABLE(i2c
, wf_max6690_id
);
124 static struct i2c_driver wf_max6690_driver
= {
126 .name
= "wf_max6690",
128 .probe
= wf_max6690_probe
,
129 .remove
= wf_max6690_remove
,
130 .id_table
= wf_max6690_id
,
133 module_i2c_driver(wf_max6690_driver
);
135 MODULE_AUTHOR("Paul Mackerras <paulus@samba.org>");
136 MODULE_DESCRIPTION("MAX6690 sensor objects for PowerMac thermal control");
137 MODULE_LICENSE("GPL");