diff options
| author | Dave Jiang <djiang@mvista.com> | 2008-07-25 01:49:14 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-25 10:53:49 -0700 | 
| commit | f87bd330edf06fd49b3fbc368d90fb180375f2a2 (patch) | |
| tree | 88ca401667a635d8a394e3d7d3ea8174c0c34ec4 /drivers/edac/mpc85xx_edac.c | |
| parent | fcb19171d196172a4f57e056f7a60e6d1e2e8c85 (diff) | |
| download | linux-f87bd330edf06fd49b3fbc368d90fb180375f2a2.tar.bz2 | |
edac: mpc85xx fix pci ofdev 2nd pass
Convert PCI err device from platform to open firmware of_dev to comply
with powerpc schemes.
[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: Dave Jiang <djiang@mvista.com>
Signed-off-by: Doug Thompson <dougthompson@xmission.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/edac/mpc85xx_edac.c')
| -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)  	return IRQ_HANDLED;  } -static int __devinit mpc85xx_pci_err_probe(struct platform_device *pdev) +static int __devinit mpc85xx_pci_err_probe(struct of_device *op, +					   const struct of_device_id *match)  {  	struct edac_pci_ctl_info *pci;  	struct mpc85xx_pci_pdata *pdata; -	struct resource *r; +	struct resource r;  	int res = 0; -	if (!devres_open_group(&pdev->dev, mpc85xx_pci_err_probe, GFP_KERNEL)) +	if (!devres_open_group(&op->dev, mpc85xx_pci_err_probe, GFP_KERNEL))  		return -ENOMEM;  	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)  	pdata = pci->pvt_info;  	pdata->name = "mpc85xx_pci_err";  	pdata->irq = NO_IRQ; -	platform_set_drvdata(pdev, pci); -	pci->dev = &pdev->dev; +	dev_set_drvdata(&op->dev, pci); +	pci->dev = &op->dev;  	pci->mod_name = EDAC_MOD_STR;  	pci->ctl_name = pdata->name; -	pci->dev_name = pdev->dev.bus_id; +	pci->dev_name = op->dev.bus_id;  	if (edac_op_state == EDAC_OPSTATE_POLL)  		pci->edac_check = mpc85xx_pci_check;  	pdata->edac_idx = edac_pci_idx++; -	r = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!r) { +	res = of_address_to_resource(op->node, 0, &r); +	if (res) {  		printk(KERN_ERR "%s: Unable to get resource for "  		       "PCI err regs\n", __func__);  		goto err;  	} -	if (!devm_request_mem_region(&pdev->dev, r->start, -				     r->end - r->start + 1, pdata->name)) { +	/* we only need the error registers */ +	r.start += 0xe00; + +	if (!devm_request_mem_region(&op->dev, r.start, +					r.end - r.start + 1, pdata->name)) {  		printk(KERN_ERR "%s: Error while requesting mem region\n",  		       __func__);  		res = -EBUSY;  		goto err;  	} -	pdata->pci_vbase = devm_ioremap(&pdev->dev, r->start, -					r->end - r->start + 1); +	pdata->pci_vbase = devm_ioremap(&op->dev, r.start, +					r.end - r.start + 1);  	if (!pdata->pci_vbase) {  		printk(KERN_ERR "%s: Unable to setup PCI err regs\n", __func__);  		res = -ENOMEM; @@ -266,14 +270,15 @@ static int __devinit mpc85xx_pci_err_probe(struct platform_device *pdev)  	}  	if (edac_op_state == EDAC_OPSTATE_INT) { -		pdata->irq = platform_get_irq(pdev, 0); -		res = devm_request_irq(&pdev->dev, pdata->irq, +		pdata->irq = irq_of_parse_and_map(op->node, 0); +		res = devm_request_irq(&op->dev, pdata->irq,  				       mpc85xx_pci_isr, IRQF_DISABLED,  				       "[EDAC] PCI err", pci);  		if (res < 0) {  			printk(KERN_ERR  			       "%s: Unable to requiest irq %d for "  			       "MPC85xx PCI err\n", __func__, pdata->irq); +			irq_dispose_mapping(pdata->irq);  			res = -ENODEV;  			goto err2;  		} @@ -282,23 +287,23 @@ static int __devinit mpc85xx_pci_err_probe(struct platform_device *pdev)  		       pdata->irq);  	} -	devres_remove_group(&pdev->dev, mpc85xx_pci_err_probe); +	devres_remove_group(&op->dev, mpc85xx_pci_err_probe);  	debugf3("%s(): success\n", __func__);  	printk(KERN_INFO EDAC_MOD_STR " PCI err registered\n");  	return 0;  err2: -	edac_pci_del_device(&pdev->dev); +	edac_pci_del_device(&op->dev);  err:  	edac_pci_free_ctl_info(pci); -	devres_release_group(&pdev->dev, mpc85xx_pci_err_probe); +	devres_release_group(&op->dev, mpc85xx_pci_err_probe);  	return res;  } -static int mpc85xx_pci_err_remove(struct platform_device *pdev) +static int mpc85xx_pci_err_remove(struct of_device *op)  { -	struct edac_pci_ctl_info *pci = platform_get_drvdata(pdev); +	struct edac_pci_ctl_info *pci = dev_get_drvdata(&op->dev);  	struct mpc85xx_pci_pdata *pdata = pci->pvt_info;  	debugf0("%s()\n", __func__); @@ -318,12 +323,26 @@ static int mpc85xx_pci_err_remove(struct platform_device *pdev)  	return 0;  } -static struct platform_driver mpc85xx_pci_err_driver = { +static struct of_device_id mpc85xx_pci_err_of_match[] = { +	{ +	 .compatible = "fsl,mpc8540-pcix", +	 }, +	{ +	 .compatible = "fsl,mpc8540-pci", +	}, +	{}, +}; + +static struct of_platform_driver mpc85xx_pci_err_driver = { +	.owner = THIS_MODULE, +	.name = "mpc85xx_pci_err", +	.match_table = mpc85xx_pci_err_of_match,  	.probe = mpc85xx_pci_err_probe,  	.remove = __devexit_p(mpc85xx_pci_err_remove),  	.driver = { -		.name = "mpc85xx_pci_err", -	} +		   .name = "mpc85xx_pci_err", +		   .owner = THIS_MODULE, +		   },  };  #endif				/* CONFIG_PCI */ @@ -1002,7 +1021,7 @@ static int __init mpc85xx_mc_init(void)  		printk(KERN_WARNING EDAC_MOD_STR "L2 fails to register\n");  #ifdef CONFIG_PCI -	res = platform_driver_register(&mpc85xx_pci_err_driver); +	res = of_register_platform_driver(&mpc85xx_pci_err_driver);  	if (res)  		printk(KERN_WARNING EDAC_MOD_STR "PCI fails to register\n");  #endif @@ -1025,7 +1044,7 @@ static void __exit mpc85xx_mc_exit(void)  {  	mtspr(SPRN_HID1, orig_hid1);  #ifdef CONFIG_PCI -	platform_driver_unregister(&mpc85xx_pci_err_driver); +	of_unregister_platform_driver(&mpc85xx_pci_err_driver);  #endif  	of_unregister_platform_driver(&mpc85xx_l2_err_driver);  	of_unregister_platform_driver(&mpc85xx_mc_err_driver); |