mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
sh_eth: fix TSU resource handling
[ Upstream commitdfe8266b8d] When switching the driver to the managed device API, I managed to break the case of a dual Ether devices sharing a single TSU: the 2nd Ether port wouldn't probe. Iwamatsu-san has tried to fix this but his patch was buggy and he then dropped the ball... The solution is to limit calling devm_request_mem_region() to the first of the two ports sharing the same TSU, so devm_ioremap_resource() can't be used anymore for the TSU resource... Fixes:d5e07e6921("sh_eth: use managed device API") Reported-by: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
d47da4eb8a
commit
47b5886f73
@@ -3212,10 +3212,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;
|
||||
|
||||
Reference in New Issue
Block a user