|
@@ -3225,10 +3225,29 @@ static int sh_eth_drv_probe(struct platform_device *pdev)
|
|
|
/* ioremap the TSU registers */
|
|
|
if (mdp->cd->tsu) {
|
|
|
struct resource *rtsu;
|
|
|
+
|
|
|
rtsu = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
|
|
- mdp->tsu_addr = devm_ioremap_resource(&pdev->dev, rtsu);
|
|
|
- if (IS_ERR(mdp->tsu_addr)) {
|
|
|
- ret = PTR_ERR(mdp->tsu_addr);
|
|
|
+ if (!rtsu) {
|
|
|
+ dev_err(&pdev->dev, "no TSU resource\n");
|
|
|
+ ret = -ENODEV;
|
|
|
+ goto out_release;
|
|
|
+ }
|
|
|
+ /* We can only request the TSU region for the first port
|
|
|
+ * of the two sharing this TSU for the probe to succeed...
|
|
|
+ */
|
|
|
+ if (devno % 2 == 0 &&
|
|
|
+ !devm_request_mem_region(&pdev->dev, rtsu->start,
|
|
|
+ resource_size(rtsu),
|
|
|
+ dev_name(&pdev->dev))) {
|
|
|
+ dev_err(&pdev->dev, "can't request TSU resource.\n");
|
|
|
+ ret = -EBUSY;
|
|
|
+ goto out_release;
|
|
|
+ }
|
|
|
+ mdp->tsu_addr = devm_ioremap(&pdev->dev, rtsu->start,
|
|
|
+ resource_size(rtsu));
|
|
|
+ if (!mdp->tsu_addr) {
|
|
|
+ dev_err(&pdev->dev, "TSU region ioremap() failed.\n");
|
|
|
+ ret = -ENOMEM;
|
|
|
goto out_release;
|
|
|
}
|
|
|
mdp->port = devno % 2;
|