diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/edac/mpc85xx_edac.c | 67 |
1 files changed, 43 insertions, 24 deletions
diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c index d49361bfe670..2265d9ca1535 100644 --- a/drivers/edac/mpc85xx_edac.c +++ b/drivers/edac/mpc85xx_edac.c | |||
@@ -195,14 +195,15 @@ static irqreturn_t mpc85xx_pci_isr(int irq, void *dev_id) | |||
195 | return IRQ_HANDLED; | 195 | return IRQ_HANDLED; |
196 | } | 196 | } |
197 | 197 | ||
198 | static int __devinit mpc85xx_pci_err_probe(struct platform_device *pdev) | 198 | static int __devinit mpc85xx_pci_err_probe(struct of_device *op, |
199 | const struct of_device_id *match) | ||
199 | { | 200 | { |
200 | struct edac_pci_ctl_info *pci; | 201 | struct edac_pci_ctl_info *pci; |
201 | struct mpc85xx_pci_pdata *pdata; | 202 | struct mpc85xx_pci_pdata *pdata; |
202 | struct resource *r; | 203 | struct resource r; |
203 | int res = 0; | 204 | int res = 0; |
204 | 205 | ||
205 | if (!devres_open_group(&pdev->dev, mpc85xx_pci_err_probe, GFP_KERNEL)) | 206 | if (!devres_open_group(&op->dev, mpc85xx_pci_err_probe, GFP_KERNEL)) |
206 | return -ENOMEM; | 207 | return -ENOMEM; |
207 | 208 | ||
208 | pci = edac_pci_alloc_ctl_info(sizeof(*pdata), "mpc85xx_pci_err"); | 209 | pci = edac_pci_alloc_ctl_info(sizeof(*pdata), "mpc85xx_pci_err"); |
@@ -212,34 +213,37 @@ static int __devinit mpc85xx_pci_err_probe(struct platform_device *pdev) | |||
212 | pdata = pci->pvt_info; | 213 | pdata = pci->pvt_info; |
213 | pdata->name = "mpc85xx_pci_err"; | 214 | pdata->name = "mpc85xx_pci_err"; |
214 | pdata->irq = NO_IRQ; | 215 | pdata->irq = NO_IRQ; |
215 | platform_set_drvdata(pdev, pci); | 216 | dev_set_drvdata(&op->dev, pci); |
216 | pci->dev = &pdev->dev; | 217 | pci->dev = &op->dev; |
217 | pci->mod_name = EDAC_MOD_STR; | 218 | pci->mod_name = EDAC_MOD_STR; |
218 | pci->ctl_name = pdata->name; | 219 | pci->ctl_name = pdata->name; |
219 | pci->dev_name = pdev->dev.bus_id; | 220 | pci->dev_name = op->dev.bus_id; |
220 | 221 | ||
221 | if (edac_op_state == EDAC_OPSTATE_POLL) | 222 | if (edac_op_state == EDAC_OPSTATE_POLL) |
222 | pci->edac_check = mpc85xx_pci_check; | 223 | pci->edac_check = mpc85xx_pci_check; |
223 | 224 | ||
224 | pdata->edac_idx = edac_pci_idx++; | 225 | pdata->edac_idx = edac_pci_idx++; |
225 | 226 | ||
226 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 227 | res = of_address_to_resource(op->node, 0, &r); |
227 | if (!r) { | 228 | if (res) { |
228 | printk(KERN_ERR "%s: Unable to get resource for " | 229 | printk(KERN_ERR "%s: Unable to get resource for " |
229 | "PCI err regs\n", __func__); | 230 | "PCI err regs\n", __func__); |
230 | goto err; | 231 | goto err; |
231 | } | 232 | } |
232 | 233 | ||
233 | if (!devm_request_mem_region(&pdev->dev, r->start, | 234 | /* we only need the error registers */ |
234 | r->end - r->start + 1, pdata->name)) { | 235 | r.start += 0xe00; |
236 | |||
237 | if (!devm_request_mem_region(&op->dev, r.start, | ||
238 | r.end - r.start + 1, pdata->name)) { | ||
235 | printk(KERN_ERR "%s: Error while requesting mem region\n", | 239 | printk(KERN_ERR "%s: Error while requesting mem region\n", |
236 | __func__); | 240 | __func__); |
237 | res = -EBUSY; | 241 | res = -EBUSY; |
238 | goto err; | 242 | goto err; |
239 | } | 243 | } |
240 | 244 | ||
241 | pdata->pci_vbase = devm_ioremap(&pdev->dev, r->start, | 245 | pdata->pci_vbase = devm_ioremap(&op->dev, r.start, |
242 | r->end - r->start + 1); | 246 | r.end - r.start + 1); |
243 | if (!pdata->pci_vbase) { | 247 | if (!pdata->pci_vbase) { |
244 | printk(KERN_ERR "%s: Unable to setup PCI err regs\n", __func__); | 248 | printk(KERN_ERR "%s: Unable to setup PCI err regs\n", __func__); |
245 | res = -ENOMEM; | 249 | res = -ENOMEM; |
@@ -266,14 +270,15 @@ static int __devinit mpc85xx_pci_err_probe(struct platform_device *pdev) | |||
266 | } | 270 | } |
267 | 271 | ||
268 | if (edac_op_state == EDAC_OPSTATE_INT) { | 272 | if (edac_op_state == EDAC_OPSTATE_INT) { |
269 | pdata->irq = platform_get_irq(pdev, 0); | 273 | pdata->irq = irq_of_parse_and_map(op->node, 0); |
270 | res = devm_request_irq(&pdev->dev, pdata->irq, | 274 | res = devm_request_irq(&op->dev, pdata->irq, |
271 | mpc85xx_pci_isr, IRQF_DISABLED, | 275 | mpc85xx_pci_isr, IRQF_DISABLED, |
272 | "[EDAC] PCI err", pci); | 276 | "[EDAC] PCI err", pci); |
273 | if (res < 0) { | 277 | if (res < 0) { |
274 | printk(KERN_ERR | 278 | printk(KERN_ERR |
275 | "%s: Unable to requiest irq %d for " | 279 | "%s: Unable to requiest irq %d for " |
276 | "MPC85xx PCI err\n", __func__, pdata->irq); | 280 | "MPC85xx PCI err\n", __func__, pdata->irq); |
281 | irq_dispose_mapping(pdata->irq); | ||
277 | res = -ENODEV; | 282 | res = -ENODEV; |
278 | goto err2; | 283 | goto err2; |
279 | } | 284 | } |
@@ -282,23 +287,23 @@ static int __devinit mpc85xx_pci_err_probe(struct platform_device *pdev) | |||
282 | pdata->irq); | 287 | pdata->irq); |
283 | } | 288 | } |
284 | 289 | ||
285 | devres_remove_group(&pdev->dev, mpc85xx_pci_err_probe); | 290 | devres_remove_group(&op->dev, mpc85xx_pci_err_probe); |
286 | debugf3("%s(): success\n", __func__); | 291 | debugf3("%s(): success\n", __func__); |
287 | printk(KERN_INFO EDAC_MOD_STR " PCI err registered\n"); | 292 | printk(KERN_INFO EDAC_MOD_STR " PCI err registered\n"); |
288 | 293 | ||
289 | return 0; | 294 | return 0; |
290 | 295 | ||
291 | err2: | 296 | err2: |
292 | edac_pci_del_device(&pdev->dev); | 297 | edac_pci_del_device(&op->dev); |
293 | err: | 298 | err: |
294 | edac_pci_free_ctl_info(pci); | 299 | edac_pci_free_ctl_info(pci); |
295 | devres_release_group(&pdev->dev, mpc85xx_pci_err_probe); | 300 | devres_release_group(&op->dev, mpc85xx_pci_err_probe); |
296 | return res; | 301 | return res; |
297 | } | 302 | } |
298 | 303 | ||
299 | static int mpc85xx_pci_err_remove(struct platform_device *pdev) | 304 | static int mpc85xx_pci_err_remove(struct of_device *op) |
300 | { | 305 | { |
301 | struct edac_pci_ctl_info *pci = platform_get_drvdata(pdev); | 306 | struct edac_pci_ctl_info *pci = dev_get_drvdata(&op->dev); |
302 | struct mpc85xx_pci_pdata *pdata = pci->pvt_info; | 307 | struct mpc85xx_pci_pdata *pdata = pci->pvt_info; |
303 | 308 | ||
304 | debugf0("%s()\n", __func__); | 309 | debugf0("%s()\n", __func__); |
@@ -318,12 +323,26 @@ static int mpc85xx_pci_err_remove(struct platform_device *pdev) | |||
318 | return 0; | 323 | return 0; |
319 | } | 324 | } |
320 | 325 | ||
321 | static struct platform_driver mpc85xx_pci_err_driver = { | 326 | static struct of_device_id mpc85xx_pci_err_of_match[] = { |
327 | { | ||
328 | .compatible = "fsl,mpc8540-pcix", | ||
329 | }, | ||
330 | { | ||
331 | .compatible = "fsl,mpc8540-pci", | ||
332 | }, | ||
333 | {}, | ||
334 | }; | ||
335 | |||
336 | static struct of_platform_driver mpc85xx_pci_err_driver = { | ||
337 | .owner = THIS_MODULE, | ||
338 | .name = "mpc85xx_pci_err", | ||
339 | .match_table = mpc85xx_pci_err_of_match, | ||
322 | .probe = mpc85xx_pci_err_probe, | 340 | .probe = mpc85xx_pci_err_probe, |
323 | .remove = __devexit_p(mpc85xx_pci_err_remove), | 341 | .remove = __devexit_p(mpc85xx_pci_err_remove), |
324 | .driver = { | 342 | .driver = { |
325 | .name = "mpc85xx_pci_err", | 343 | .name = "mpc85xx_pci_err", |
326 | } | 344 | .owner = THIS_MODULE, |
345 | }, | ||
327 | }; | 346 | }; |
328 | 347 | ||
329 | #endif /* CONFIG_PCI */ | 348 | #endif /* CONFIG_PCI */ |
@@ -1002,7 +1021,7 @@ static int __init mpc85xx_mc_init(void) | |||
1002 | printk(KERN_WARNING EDAC_MOD_STR "L2 fails to register\n"); | 1021 | printk(KERN_WARNING EDAC_MOD_STR "L2 fails to register\n"); |
1003 | 1022 | ||
1004 | #ifdef CONFIG_PCI | 1023 | #ifdef CONFIG_PCI |
1005 | res = platform_driver_register(&mpc85xx_pci_err_driver); | 1024 | res = of_register_platform_driver(&mpc85xx_pci_err_driver); |
1006 | if (res) | 1025 | if (res) |
1007 | printk(KERN_WARNING EDAC_MOD_STR "PCI fails to register\n"); | 1026 | printk(KERN_WARNING EDAC_MOD_STR "PCI fails to register\n"); |
1008 | #endif | 1027 | #endif |
@@ -1025,7 +1044,7 @@ static void __exit mpc85xx_mc_exit(void) | |||
1025 | { | 1044 | { |
1026 | mtspr(SPRN_HID1, orig_hid1); | 1045 | mtspr(SPRN_HID1, orig_hid1); |
1027 | #ifdef CONFIG_PCI | 1046 | #ifdef CONFIG_PCI |
1028 | platform_driver_unregister(&mpc85xx_pci_err_driver); | 1047 | of_unregister_platform_driver(&mpc85xx_pci_err_driver); |
1029 | #endif | 1048 | #endif |
1030 | of_unregister_platform_driver(&mpc85xx_l2_err_driver); | 1049 | of_unregister_platform_driver(&mpc85xx_l2_err_driver); |
1031 | of_unregister_platform_driver(&mpc85xx_mc_err_driver); | 1050 | of_unregister_platform_driver(&mpc85xx_mc_err_driver); |