aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2006-10-09 21:45:45 -0400
committerPaul Mackerras <paulus@samba.org>2006-10-09 23:56:13 -0400
commit9f2545c11869868fd3cde7098d99e690891e442c (patch)
treee0e22ce8b9aaef7f29175a0841859c309c6090a7
parentd6a29252ad120457cd544d44b2fbea46a00734a7 (diff)
[POWERPC] Fix i2c-powermac platform device usage
i2c-powermac was written & merged right after Russell King's changes adding platform_driver... which I missed. Thus it still used struct device, causing crashes when hitting sleep/wakeup callbacks (it happened to work by luck so far, until early/late callbacks got added). This causes crashes on sleep/wakeup on PowerBooks with 2.6.19. The patch fixes it by using a proper platform_driver. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r--drivers/i2c/busses/i2c-powermac.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/drivers/i2c/busses/i2c-powermac.c b/drivers/i2c/busses/i2c-powermac.c
index a508cb962d24..648d55533d87 100644
--- a/drivers/i2c/busses/i2c-powermac.c
+++ b/drivers/i2c/busses/i2c-powermac.c
@@ -182,9 +182,9 @@ static const struct i2c_algorithm i2c_powermac_algorithm = {
182}; 182};
183 183
184 184
185static int i2c_powermac_remove(struct device *dev) 185static int i2c_powermac_remove(struct platform_device *dev)
186{ 186{
187 struct i2c_adapter *adapter = dev_get_drvdata(dev); 187 struct i2c_adapter *adapter = platform_get_drvdata(dev);
188 struct pmac_i2c_bus *bus = i2c_get_adapdata(adapter); 188 struct pmac_i2c_bus *bus = i2c_get_adapdata(adapter);
189 int rc; 189 int rc;
190 190
@@ -195,16 +195,16 @@ static int i2c_powermac_remove(struct device *dev)
195 if (rc) 195 if (rc)
196 printk("i2c-powermac.c: Failed to remove bus %s !\n", 196 printk("i2c-powermac.c: Failed to remove bus %s !\n",
197 adapter->name); 197 adapter->name);
198 dev_set_drvdata(dev, NULL); 198 platform_set_drvdata(dev, NULL);
199 kfree(adapter); 199 kfree(adapter);
200 200
201 return 0; 201 return 0;
202} 202}
203 203
204 204
205static int i2c_powermac_probe(struct device *dev) 205static int __devexit i2c_powermac_probe(struct platform_device *dev)
206{ 206{
207 struct pmac_i2c_bus *bus = dev->platform_data; 207 struct pmac_i2c_bus *bus = dev->dev.platform_data;
208 struct device_node *parent = NULL; 208 struct device_node *parent = NULL;
209 struct i2c_adapter *adapter; 209 struct i2c_adapter *adapter;
210 char name[32]; 210 char name[32];
@@ -246,11 +246,11 @@ static int i2c_powermac_probe(struct device *dev)
246 printk(KERN_ERR "i2c-powermac: can't allocate inteface !\n"); 246 printk(KERN_ERR "i2c-powermac: can't allocate inteface !\n");
247 return -ENOMEM; 247 return -ENOMEM;
248 } 248 }
249 dev_set_drvdata(dev, adapter); 249 platform_set_drvdata(dev, adapter);
250 strcpy(adapter->name, name); 250 strcpy(adapter->name, name);
251 adapter->algo = &i2c_powermac_algorithm; 251 adapter->algo = &i2c_powermac_algorithm;
252 i2c_set_adapdata(adapter, bus); 252 i2c_set_adapdata(adapter, bus);
253 adapter->dev.parent = dev; 253 adapter->dev.parent = &dev->dev;
254 pmac_i2c_attach_adapter(bus, adapter); 254 pmac_i2c_attach_adapter(bus, adapter);
255 rc = i2c_add_adapter(adapter); 255 rc = i2c_add_adapter(adapter);
256 if (rc) { 256 if (rc) {
@@ -265,23 +265,25 @@ static int i2c_powermac_probe(struct device *dev)
265} 265}
266 266
267 267
268static struct device_driver i2c_powermac_driver = { 268static struct platform_driver i2c_powermac_driver = {
269 .name = "i2c-powermac",
270 .bus = &platform_bus_type,
271 .probe = i2c_powermac_probe, 269 .probe = i2c_powermac_probe,
272 .remove = i2c_powermac_remove, 270 .remove = __devexit_p(i2c_powermac_remove),
271 .driver = {
272 .name = "i2c-powermac",
273 .bus = &platform_bus_type,
274 },
273}; 275};
274 276
275static int __init i2c_powermac_init(void) 277static int __init i2c_powermac_init(void)
276{ 278{
277 driver_register(&i2c_powermac_driver); 279 platform_driver_register(&i2c_powermac_driver);
278 return 0; 280 return 0;
279} 281}
280 282
281 283
282static void __exit i2c_powermac_cleanup(void) 284static void __exit i2c_powermac_cleanup(void)
283{ 285{
284 driver_unregister(&i2c_powermac_driver); 286 platform_driver_unregister(&i2c_powermac_driver);
285} 287}
286 288
287module_init(i2c_powermac_init); 289module_init(i2c_powermac_init);