Blame view
drivers/macintosh/windfarm_lm75_sensor.c
4.26 KB
2c162f9b4 treewide: Replace... |
1 |
// SPDX-License-Identifier: GPL-2.0-only |
75722d399 [PATCH] ppc64: Th... |
2 3 4 5 6 |
/* * Windfarm PowerMac thermal control. LM75 sensor * * (c) Copyright 2005 Benjamin Herrenschmidt, IBM Corp. * <benh@kernel.crashing.org> |
75722d399 [PATCH] ppc64: Th... |
7 8 9 10 11 12 13 14 15 16 |
*/ #include <linux/types.h> #include <linux/errno.h> #include <linux/kernel.h> #include <linux/delay.h> #include <linux/slab.h> #include <linux/init.h> #include <linux/wait.h> #include <linux/i2c.h> |
bcf3588d8 macintosh: windfa... |
17 |
#include <linux/of_device.h> |
75722d399 [PATCH] ppc64: Th... |
18 19 20 |
#include <asm/prom.h> #include <asm/machdep.h> #include <asm/io.h> |
75722d399 [PATCH] ppc64: Th... |
21 |
#include <asm/sections.h> |
a28d3af2a [PATCH] 2/5 power... |
22 |
#include <asm/pmac_low_i2c.h> |
75722d399 [PATCH] ppc64: Th... |
23 24 |
#include "windfarm.h" |
5400480f5 powerpc/pmac: Con... |
25 |
#define VERSION "1.0" |
75722d399 [PATCH] ppc64: Th... |
26 27 28 29 30 31 32 33 34 35 36 37 |
#undef DEBUG #ifdef DEBUG #define DBG(args...) printk(args) #else #define DBG(args...) do { } while(0) #endif struct wf_lm75_sensor { int ds1775 : 1; int inited : 1; |
5400480f5 powerpc/pmac: Con... |
38 39 |
struct i2c_client *i2c; struct wf_sensor sens; |
75722d399 [PATCH] ppc64: Th... |
40 41 |
}; #define wf_to_lm75(c) container_of(c, struct wf_lm75_sensor, sens) |
75722d399 [PATCH] ppc64: Th... |
42 43 44 45 46 |
static int wf_lm75_get(struct wf_sensor *sr, s32 *value) { struct wf_lm75_sensor *lm = wf_to_lm75(sr); s32 data; |
351ca3e31 windfarm: Convert... |
47 |
if (lm->i2c == NULL) |
75722d399 [PATCH] ppc64: Th... |
48 49 50 51 |
return -ENODEV; /* Init chip if necessary */ if (!lm->inited) { |
351ca3e31 windfarm: Convert... |
52 |
u8 cfg_new, cfg = (u8)i2c_smbus_read_byte_data(lm->i2c, 1); |
75722d399 [PATCH] ppc64: Th... |
53 54 55 56 57 58 59 60 61 |
DBG("wf_lm75: Initializing %s, cfg was: %02x ", sr->name, cfg); /* clear shutdown bit, keep other settings as left by * the firmware for now */ cfg_new = cfg & ~0x01; |
351ca3e31 windfarm: Convert... |
62 |
i2c_smbus_write_byte_data(lm->i2c, 1, cfg_new); |
75722d399 [PATCH] ppc64: Th... |
63 64 65 66 67 68 69 |
lm->inited = 1; /* If we just powered it up, let's wait 200 ms */ msleep(200); } /* Read temperature register */ |
351ca3e31 windfarm: Convert... |
70 |
data = (s32)le16_to_cpu(i2c_smbus_read_word_data(lm->i2c, 0)); |
75722d399 [PATCH] ppc64: Th... |
71 72 73 74 75 76 77 78 79 |
data <<= 8; *value = data; return 0; } static void wf_lm75_release(struct wf_sensor *sr) { struct wf_lm75_sensor *lm = wf_to_lm75(sr); |
75722d399 [PATCH] ppc64: Th... |
80 81 |
kfree(lm); } |
de854e54d powerpc/macintosh... |
82 |
static const struct wf_sensor_ops wf_lm75_ops = { |
75722d399 [PATCH] ppc64: Th... |
83 84 85 86 |
.get_value = wf_lm75_get, .release = wf_lm75_release, .owner = THIS_MODULE, }; |
351ca3e31 windfarm: Convert... |
87 88 |
static int wf_lm75_probe(struct i2c_client *client, const struct i2c_device_id *id) |
5400480f5 powerpc/pmac: Con... |
89 |
{ |
75722d399 [PATCH] ppc64: Th... |
90 |
struct wf_lm75_sensor *lm; |
bcf3588d8 macintosh: windfa... |
91 |
int rc, ds1775; |
5400480f5 powerpc/pmac: Con... |
92 |
const char *name, *loc; |
351ca3e31 windfarm: Convert... |
93 |
|
bcf3588d8 macintosh: windfa... |
94 95 96 97 |
if (id) ds1775 = id->driver_data; else ds1775 = !!of_device_get_match_data(&client->dev); |
351ca3e31 windfarm: Convert... |
98 99 |
DBG("wf_lm75: creating %s device at address 0x%02x ", |
5400480f5 powerpc/pmac: Con... |
100 101 102 103 104 105 106 107 |
ds1775 ? "ds1775" : "lm75", client->addr); loc = of_get_property(client->dev.of_node, "hwsensor-location", NULL); if (!loc) { dev_warn(&client->dev, "Missing hwsensor-location property! "); return -ENXIO; } |
75722d399 [PATCH] ppc64: Th... |
108 109 110 111 112 113 |
/* Usual rant about sensor names not beeing very consistent in * the device-tree, oh well ... * Add more entries below as you deal with more setups */ if (!strcmp(loc, "Hard drive") || !strcmp(loc, "DRIVE BAY")) |
351ca3e31 windfarm: Convert... |
114 |
name = "hd-temp"; |
80ff974db [POWERPC] windfar... |
115 |
else if (!strcmp(loc, "Incoming Air Temp")) |
351ca3e31 windfarm: Convert... |
116 |
name = "incoming-air-temp"; |
80ff974db [POWERPC] windfar... |
117 |
else if (!strcmp(loc, "ODD Temp")) |
351ca3e31 windfarm: Convert... |
118 |
name = "optical-drive-temp"; |
80ff974db [POWERPC] windfar... |
119 |
else if (!strcmp(loc, "HD Temp")) |
351ca3e31 windfarm: Convert... |
120 |
name = "hard-drive-temp"; |
d839ba2ab powerpc/windfarm:... |
121 122 123 124 125 126 |
else if (!strcmp(loc, "PCI SLOTS")) name = "slots-temp"; else if (!strcmp(loc, "CPU A INLET")) name = "cpu-inlet-temp-0"; else if (!strcmp(loc, "CPU B INLET")) name = "cpu-inlet-temp-1"; |
75722d399 [PATCH] ppc64: Th... |
127 |
else |
5400480f5 powerpc/pmac: Con... |
128 129 |
return -ENXIO; |
75722d399 [PATCH] ppc64: Th... |
130 |
|
5400480f5 powerpc/pmac: Con... |
131 132 |
lm = kzalloc(sizeof(struct wf_lm75_sensor), GFP_KERNEL); if (lm == NULL) |
a28d3af2a [PATCH] 2/5 power... |
133 |
return -ENODEV; |
75722d399 [PATCH] ppc64: Th... |
134 |
|
5400480f5 powerpc/pmac: Con... |
135 136 137 |
lm->inited = 0; lm->ds1775 = ds1775; lm->i2c = client; |
8bb61fe1d powerpc/windfarm:... |
138 |
lm->sens.name = name; |
5400480f5 powerpc/pmac: Con... |
139 140 |
lm->sens.ops = &wf_lm75_ops; i2c_set_clientdata(client, lm); |
b55fafc5a [PATCH] powerpc: ... |
141 |
|
5400480f5 powerpc/pmac: Con... |
142 143 144 145 |
rc = wf_register_sensor(&lm->sens); if (rc) kfree(lm); return rc; |
75722d399 [PATCH] ppc64: Th... |
146 |
} |
351ca3e31 windfarm: Convert... |
147 |
static int wf_lm75_remove(struct i2c_client *client) |
75722d399 [PATCH] ppc64: Th... |
148 |
{ |
351ca3e31 windfarm: Convert... |
149 |
struct wf_lm75_sensor *lm = i2c_get_clientdata(client); |
75722d399 [PATCH] ppc64: Th... |
150 |
|
75722d399 [PATCH] ppc64: Th... |
151 |
/* Mark client detached */ |
351ca3e31 windfarm: Convert... |
152 |
lm->i2c = NULL; |
75722d399 [PATCH] ppc64: Th... |
153 154 155 156 157 158 |
/* release sensor */ wf_unregister_sensor(&lm->sens); return 0; } |
351ca3e31 windfarm: Convert... |
159 |
static const struct i2c_device_id wf_lm75_id[] = { |
5400480f5 powerpc/pmac: Con... |
160 161 |
{ "MAC,lm75", 0 }, { "MAC,ds1775", 1 }, |
351ca3e31 windfarm: Convert... |
162 163 |
{ } }; |
5400480f5 powerpc/pmac: Con... |
164 |
MODULE_DEVICE_TABLE(i2c, wf_lm75_id); |
351ca3e31 windfarm: Convert... |
165 |
|
bcf3588d8 macintosh: windfa... |
166 167 168 169 170 171 |
static const struct of_device_id wf_lm75_of_id[] = { { .compatible = "lm75", .data = (void *)0}, { .compatible = "ds1775", .data = (void *)1 }, { } }; MODULE_DEVICE_TABLE(of, wf_lm75_of_id); |
351ca3e31 windfarm: Convert... |
172 173 174 |
static struct i2c_driver wf_lm75_driver = { .driver = { .name = "wf_lm75", |
bcf3588d8 macintosh: windfa... |
175 |
.of_match_table = wf_lm75_of_id, |
351ca3e31 windfarm: Convert... |
176 |
}, |
351ca3e31 windfarm: Convert... |
177 178 179 180 |
.probe = wf_lm75_probe, .remove = wf_lm75_remove, .id_table = wf_lm75_id, }; |
f7fb862b8 powerpc/windfarm:... |
181 |
module_i2c_driver(wf_lm75_driver); |
75722d399 [PATCH] ppc64: Th... |
182 183 184 185 |
MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>"); MODULE_DESCRIPTION("LM75 sensor objects for PowerMacs thermal control"); MODULE_LICENSE("GPL"); |