diff options
| -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); |
