diff options
author | Krzysztof Helt <krzysztof.h1@wp.pl> | 2008-09-03 18:41:57 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-09-03 18:41:57 -0400 |
commit | 64151ad5b3a03e236390d6d5160805ee4f4e7c67 (patch) | |
tree | fc47e478fd05dd84b7f0b3c5a019a3326ac8a880 | |
parent | 94fe7424a4c21940b4569200faaf0a0a5efd2924 (diff) |
rtc-m48t59: allow externally mapped ioaddr
Add support for externally mapped ioaddr. This is required on sparc32
as the ioaddr must be mapped with of_ioremap().
Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/rtc/rtc-m48t59.c | 14 | ||||
-rw-r--r-- | include/linux/rtc/m48t59.h | 2 |
2 files changed, 12 insertions, 4 deletions
diff --git a/drivers/rtc/rtc-m48t59.c b/drivers/rtc/rtc-m48t59.c index 50f9f10b32f0..867c8a79a6a8 100644 --- a/drivers/rtc/rtc-m48t59.c +++ b/drivers/rtc/rtc-m48t59.c | |||
@@ -411,9 +411,14 @@ static int __devinit m48t59_rtc_probe(struct platform_device *pdev) | |||
411 | if (!m48t59) | 411 | if (!m48t59) |
412 | return -ENOMEM; | 412 | return -ENOMEM; |
413 | 413 | ||
414 | m48t59->ioaddr = ioremap(res->start, res->end - res->start + 1); | 414 | m48t59->ioaddr = pdata->ioaddr; |
415 | if (!m48t59->ioaddr) | 415 | |
416 | goto out; | 416 | if (!m48t59->ioaddr) { |
417 | /* ioaddr not mapped externally */ | ||
418 | m48t59->ioaddr = ioremap(res->start, res->end - res->start + 1); | ||
419 | if (!m48t59->ioaddr) | ||
420 | goto out; | ||
421 | } | ||
417 | 422 | ||
418 | /* Try to get irq number. We also can work in | 423 | /* Try to get irq number. We also can work in |
419 | * the mode without IRQ. | 424 | * the mode without IRQ. |
@@ -481,11 +486,12 @@ out: | |||
481 | static int __devexit m48t59_rtc_remove(struct platform_device *pdev) | 486 | static int __devexit m48t59_rtc_remove(struct platform_device *pdev) |
482 | { | 487 | { |
483 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 488 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
489 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | ||
484 | 490 | ||
485 | sysfs_remove_bin_file(&pdev->dev.kobj, &m48t59_nvram_attr); | 491 | sysfs_remove_bin_file(&pdev->dev.kobj, &m48t59_nvram_attr); |
486 | if (!IS_ERR(m48t59->rtc)) | 492 | if (!IS_ERR(m48t59->rtc)) |
487 | rtc_device_unregister(m48t59->rtc); | 493 | rtc_device_unregister(m48t59->rtc); |
488 | if (m48t59->ioaddr) | 494 | if (m48t59->ioaddr && !pdata->ioaddr) |
489 | iounmap(m48t59->ioaddr); | 495 | iounmap(m48t59->ioaddr); |
490 | if (m48t59->irq != NO_IRQ) | 496 | if (m48t59->irq != NO_IRQ) |
491 | free_irq(m48t59->irq, &pdev->dev); | 497 | free_irq(m48t59->irq, &pdev->dev); |
diff --git a/include/linux/rtc/m48t59.h b/include/linux/rtc/m48t59.h index 41798505d157..6fc961459b4a 100644 --- a/include/linux/rtc/m48t59.h +++ b/include/linux/rtc/m48t59.h | |||
@@ -55,6 +55,8 @@ struct m48t59_plat_data { | |||
55 | 55 | ||
56 | int type; /* RTC model */ | 56 | int type; /* RTC model */ |
57 | 57 | ||
58 | /* ioaddr mapped externally */ | ||
59 | void __iomem *ioaddr; | ||
58 | /* offset to RTC registers, automatically set according to the type */ | 60 | /* offset to RTC registers, automatically set according to the type */ |
59 | unsigned int offset; | 61 | unsigned int offset; |
60 | }; | 62 | }; |