|
@@ -287,7 +287,7 @@ static const struct rtc_class_ops at91_rtc_ops = {
|
|
|
/*
|
|
|
* Initialize and install RTC driver
|
|
|
*/
|
|
|
-static int __init at91_rtc_probe(struct platform_device *pdev)
|
|
|
+static int __devinit at91_rtc_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
struct resource *r;
|
|
|
struct sam9_rtc *rtc;
|
|
@@ -360,7 +360,7 @@ fail:
|
|
|
/*
|
|
|
* Disable and remove the RTC driver
|
|
|
*/
|
|
|
-static int __exit at91_rtc_remove(struct platform_device *pdev)
|
|
|
+static int __devexit at91_rtc_remove(struct platform_device *pdev)
|
|
|
{
|
|
|
struct sam9_rtc *rtc = platform_get_drvdata(pdev);
|
|
|
u32 mr = rtt_readl(rtc, MR);
|
|
@@ -433,63 +433,20 @@ static int at91_rtc_resume(struct platform_device *pdev)
|
|
|
#endif
|
|
|
|
|
|
static struct platform_driver at91_rtc_driver = {
|
|
|
- .driver.name = "rtc-at91sam9",
|
|
|
- .driver.owner = THIS_MODULE,
|
|
|
- .remove = __exit_p(at91_rtc_remove),
|
|
|
+ .probe = at91_rtc_probe,
|
|
|
+ .remove = __devexit_p(at91_rtc_remove),
|
|
|
.shutdown = at91_rtc_shutdown,
|
|
|
.suspend = at91_rtc_suspend,
|
|
|
.resume = at91_rtc_resume,
|
|
|
+ .driver = {
|
|
|
+ .name = "rtc-at91sam9",
|
|
|
+ .owner = THIS_MODULE,
|
|
|
+ },
|
|
|
};
|
|
|
|
|
|
-/* Chips can have more than one RTT module, and they can be used for more
|
|
|
- * than just RTCs. So we can't just register as "the" RTT driver.
|
|
|
- *
|
|
|
- * A normal approach in such cases is to create a library to allocate and
|
|
|
- * free the modules. Here we just use bus_find_device() as like such a
|
|
|
- * library, binding directly ... no runtime "library" footprint is needed.
|
|
|
- */
|
|
|
-static int __init at91_rtc_match(struct device *dev, void *v)
|
|
|
-{
|
|
|
- struct platform_device *pdev = to_platform_device(dev);
|
|
|
- int ret;
|
|
|
-
|
|
|
- /* continue searching if this isn't the RTT we need */
|
|
|
- if (strcmp("at91_rtt", pdev->name) != 0
|
|
|
- || pdev->id != CONFIG_RTC_DRV_AT91SAM9_RTT)
|
|
|
- goto fail;
|
|
|
-
|
|
|
- /* else we found it ... but fail unless we can bind to the RTC driver */
|
|
|
- if (dev->driver) {
|
|
|
- dev_dbg(dev, "busy, can't use as RTC!\n");
|
|
|
- goto fail;
|
|
|
- }
|
|
|
- dev->driver = &at91_rtc_driver.driver;
|
|
|
- if (device_attach(dev) == 0) {
|
|
|
- dev_dbg(dev, "can't attach RTC!\n");
|
|
|
- goto fail;
|
|
|
- }
|
|
|
- ret = at91_rtc_probe(pdev);
|
|
|
- if (ret == 0)
|
|
|
- return true;
|
|
|
-
|
|
|
- dev_dbg(dev, "RTC probe err %d!\n", ret);
|
|
|
-fail:
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
static int __init at91_rtc_init(void)
|
|
|
{
|
|
|
- int status;
|
|
|
- struct device *rtc;
|
|
|
-
|
|
|
- status = platform_driver_register(&at91_rtc_driver);
|
|
|
- if (status)
|
|
|
- return status;
|
|
|
- rtc = bus_find_device(&platform_bus_type, NULL,
|
|
|
- NULL, at91_rtc_match);
|
|
|
- if (!rtc)
|
|
|
- platform_driver_unregister(&at91_rtc_driver);
|
|
|
- return rtc ? 0 : -ENODEV;
|
|
|
+ return platform_driver_register(&at91_rtc_driver);
|
|
|
}
|
|
|
module_init(at91_rtc_init);
|
|
|
|