Commit 5400480f5411aab31939747371c6690a02ee7780

Authored by Benjamin Herrenschmidt
1 parent 7a4b15cdf3

powerpc/pmac: Convert windfarm_lm75 to new i2c probing

This simplifies the driver to stop using the deprecated attach interface

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

Showing 1 changed file with 30 additions and 94 deletions Side-by-side Diff

drivers/macintosh/windfarm_lm75_sensor.c
... ... @@ -23,7 +23,7 @@
23 23  
24 24 #include "windfarm.h"
25 25  
26   -#define VERSION "0.2"
  26 +#define VERSION "1.0"
27 27  
28 28 #undef DEBUG
29 29  
... ... @@ -36,8 +36,8 @@
36 36 struct wf_lm75_sensor {
37 37 int ds1775 : 1;
38 38 int inited : 1;
39   - struct i2c_client *i2c;
40   - struct wf_sensor sens;
  39 + struct i2c_client *i2c;
  40 + struct wf_sensor sens;
41 41 };
42 42 #define wf_to_lm75(c) container_of(c, struct wf_lm75_sensor, sens)
43 43  
44 44  
45 45  
46 46  
47 47  
... ... @@ -90,41 +90,20 @@
90 90  
91 91 static int wf_lm75_probe(struct i2c_client *client,
92 92 const struct i2c_device_id *id)
93   -{
  93 +{
94 94 struct wf_lm75_sensor *lm;
95   - int rc;
  95 + int rc, ds1775 = id->driver_data;
  96 + const char *name, *loc;
96 97  
97   - lm = kzalloc(sizeof(struct wf_lm75_sensor), GFP_KERNEL);
98   - if (lm == NULL)
99   - return -ENODEV;
100   -
101   - lm->inited = 0;
102   - lm->ds1775 = id->driver_data;
103   - lm->i2c = client;
104   - lm->sens.name = client->dev.platform_data;
105   - lm->sens.ops = &wf_lm75_ops;
106   - i2c_set_clientdata(client, lm);
107   -
108   - rc = wf_register_sensor(&lm->sens);
109   - if (rc)
110   - kfree(lm);
111   -
112   - return rc;
113   -}
114   -
115   -static struct i2c_driver wf_lm75_driver;
116   -
117   -static struct i2c_client *wf_lm75_create(struct i2c_adapter *adapter,
118   - u8 addr, int ds1775,
119   - const char *loc)
120   -{
121   - struct i2c_board_info info;
122   - struct i2c_client *client;
123   - char *name;
124   -
125 98 DBG("wf_lm75: creating %s device at address 0x%02x\n",
126   - ds1775 ? "ds1775" : "lm75", addr);
  99 + ds1775 ? "ds1775" : "lm75", client->addr);
127 100  
  101 + loc = of_get_property(client->dev.of_node, "hwsensor-location", NULL);
  102 + if (!loc) {
  103 + dev_warn(&client->dev, "Missing hwsensor-location property!\n");
  104 + return -ENXIO;
  105 + }
  106 +
128 107 /* Usual rant about sensor names not beeing very consistent in
129 108 * the device-tree, oh well ...
130 109 * Add more entries below as you deal with more setups
131 110  
132 111  
133 112  
134 113  
... ... @@ -138,67 +117,24 @@
138 117 else if (!strcmp(loc, "HD Temp"))
139 118 name = "hard-drive-temp";
140 119 else
141   - goto fail;
  120 + return -ENXIO;
  121 +
142 122  
143   - memset(&info, 0, sizeof(struct i2c_board_info));
144   - info.addr = (addr >> 1) & 0x7f;
145   - info.platform_data = name;
146   - strlcpy(info.type, ds1775 ? "wf_ds1775" : "wf_lm75", I2C_NAME_SIZE);
147   -
148   - client = i2c_new_device(adapter, &info);
149   - if (client == NULL) {
150   - printk(KERN_ERR "windfarm: failed to attach %s %s to i2c\n",
151   - ds1775 ? "ds1775" : "lm75", name);
152   - goto fail;
153   - }
154   -
155   - /*
156   - * Let i2c-core delete that device on driver removal.
157   - * This is safe because i2c-core holds the core_lock mutex for us.
158   - */
159   - list_add_tail(&client->detected, &wf_lm75_driver.clients);
160   - return client;
161   - fail:
162   - return NULL;
163   -}
164   -
165   -static int wf_lm75_attach(struct i2c_adapter *adapter)
166   -{
167   - struct device_node *busnode, *dev;
168   - struct pmac_i2c_bus *bus;
169   -
170   - DBG("wf_lm75: adapter %s detected\n", adapter->name);
171   -
172   - bus = pmac_i2c_adapter_to_bus(adapter);
173   - if (bus == NULL)
  123 + lm = kzalloc(sizeof(struct wf_lm75_sensor), GFP_KERNEL);
  124 + if (lm == NULL)
174 125 return -ENODEV;
175   - busnode = pmac_i2c_get_bus_node(bus);
176 126  
177   - DBG("wf_lm75: bus found, looking for device...\n");
  127 + lm->inited = 0;
  128 + lm->ds1775 = ds1775;
  129 + lm->i2c = client;
  130 + lm->sens.name = (char *)name; /* XXX fix constness in structure */
  131 + lm->sens.ops = &wf_lm75_ops;
  132 + i2c_set_clientdata(client, lm);
178 133  
179   - /* Now look for lm75(s) in there */
180   - for (dev = NULL;
181   - (dev = of_get_next_child(busnode, dev)) != NULL;) {
182   - const char *loc =
183   - of_get_property(dev, "hwsensor-location", NULL);
184   - u8 addr;
185   -
186   - /* We must re-match the adapter in order to properly check
187   - * the channel on multibus setups
188   - */
189   - if (!pmac_i2c_match_adapter(dev, adapter))
190   - continue;
191   - addr = pmac_i2c_get_dev_addr(dev);
192   - if (loc == NULL || addr == 0)
193   - continue;
194   - /* real lm75 */
195   - if (of_device_is_compatible(dev, "lm75"))
196   - wf_lm75_create(adapter, addr, 0, loc);
197   - /* ds1775 (compatible, better resolution */
198   - else if (of_device_is_compatible(dev, "ds1775"))
199   - wf_lm75_create(adapter, addr, 1, loc);
200   - }
201   - return 0;
  134 + rc = wf_register_sensor(&lm->sens);
  135 + if (rc)
  136 + kfree(lm);
  137 + return rc;
202 138 }
203 139  
204 140 static int wf_lm75_remove(struct i2c_client *client)
205 141  
206 142  
... ... @@ -217,16 +153,16 @@
217 153 }
218 154  
219 155 static const struct i2c_device_id wf_lm75_id[] = {
220   - { "wf_lm75", 0 },
221   - { "wf_ds1775", 1 },
  156 + { "MAC,lm75", 0 },
  157 + { "MAC,ds1775", 1 },
222 158 { }
223 159 };
  160 +MODULE_DEVICE_TABLE(i2c, wf_lm75_id);
224 161  
225 162 static struct i2c_driver wf_lm75_driver = {
226 163 .driver = {
227 164 .name = "wf_lm75",
228 165 },
229   - .attach_adapter = wf_lm75_attach,
230 166 .probe = wf_lm75_probe,
231 167 .remove = wf_lm75_remove,
232 168 .id_table = wf_lm75_id,