]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/rtc/rtc-s3c.c
Merge tag 'trace-fixes-v3.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[karo-tx-linux.git] / drivers / rtc / rtc-s3c.c
index fb994e9ddc156de9a98465531db161202826fe57..14040b22888de32607eef344e31efe574cec5250 100644 (file)
@@ -29,9 +29,8 @@
 #include <linux/uaccess.h>
 #include <linux/io.h>
 
-#include <mach/hardware.h>
 #include <asm/irq.h>
-#include <plat/regs-rtc.h>
+#include "rtc-s3c.h"
 
 enum s3c_cpu_type {
        TYPE_S3C2410,
@@ -51,7 +50,6 @@ static struct clk *rtc_clk;
 static void __iomem *s3c_rtc_base;
 static int s3c_rtc_alarmno = NO_IRQ;
 static int s3c_rtc_tickno  = NO_IRQ;
-static bool wake_en;
 static enum s3c_cpu_type s3c_rtc_cpu_type;
 
 static DEFINE_SPINLOCK(s3c_rtc_pie_lock);
@@ -423,13 +421,11 @@ static void s3c_rtc_enable(struct platform_device *pdev, int en)
 
 static int s3c_rtc_remove(struct platform_device *dev)
 {
-       struct rtc_device *rtc = platform_get_drvdata(dev);
-
        platform_set_drvdata(dev, NULL);
-       rtc_device_unregister(rtc);
 
        s3c_rtc_setaie(&dev->dev, 0);
 
+       clk_unprepare(rtc_clk);
        rtc_clk = NULL;
 
        return 0;
@@ -498,7 +494,7 @@ static int s3c_rtc_probe(struct platform_device *pdev)
                return ret;
        }
 
-       clk_enable(rtc_clk);
+       clk_prepare_enable(rtc_clk);
 
        /* check to see if everything is setup correctly */
 
@@ -511,7 +507,7 @@ static int s3c_rtc_probe(struct platform_device *pdev)
 
        /* register RTC and exit */
 
-       rtc = rtc_device_register("s3c", &pdev->dev, &s3c_rtcops,
+       rtc = devm_rtc_device_register(&pdev->dev, "s3c", &s3c_rtcops,
                                  THIS_MODULE);
 
        if (IS_ERR(rtc)) {
@@ -574,23 +570,24 @@ static int s3c_rtc_probe(struct platform_device *pdev)
 
  err_alarm_irq:
        platform_set_drvdata(pdev, NULL);
-       rtc_device_unregister(rtc);
 
  err_nortc:
        s3c_rtc_enable(pdev, 0);
-       clk_disable(rtc_clk);
+       clk_disable_unprepare(rtc_clk);
 
        return ret;
 }
 
-#ifdef CONFIG_PM
-
+#ifdef CONFIG_PM_SLEEP
 /* RTC Power management control */
 
 static int ticnt_save, ticnt_en_save;
+static bool wake_en;
 
-static int s3c_rtc_suspend(struct platform_device *pdev, pm_message_t state)
+static int s3c_rtc_suspend(struct device *dev)
 {
+       struct platform_device *pdev = to_platform_device(dev);
+
        clk_enable(rtc_clk);
        /* save TICNT for anyone using periodic interrupts */
        ticnt_save = readb(s3c_rtc_base + S3C2410_TICNT);
@@ -600,19 +597,20 @@ static int s3c_rtc_suspend(struct platform_device *pdev, pm_message_t state)
        }
        s3c_rtc_enable(pdev, 0);
 
-       if (device_may_wakeup(&pdev->dev) && !wake_en) {
+       if (device_may_wakeup(dev) && !wake_en) {
                if (enable_irq_wake(s3c_rtc_alarmno) == 0)
                        wake_en = true;
                else
-                       dev_err(&pdev->dev, "enable_irq_wake failed\n");
+                       dev_err(dev, "enable_irq_wake failed\n");
        }
        clk_disable(rtc_clk);
 
        return 0;
 }
 
-static int s3c_rtc_resume(struct platform_device *pdev)
+static int s3c_rtc_resume(struct device *dev)
 {
+       struct platform_device *pdev = to_platform_device(dev);
        unsigned int tmp;
 
        clk_enable(rtc_clk);
@@ -623,7 +621,7 @@ static int s3c_rtc_resume(struct platform_device *pdev)
                writew(tmp | ticnt_en_save, s3c_rtc_base + S3C2410_RTCCON);
        }
 
-       if (device_may_wakeup(&pdev->dev) && wake_en) {
+       if (device_may_wakeup(dev) && wake_en) {
                disable_irq_wake(s3c_rtc_alarmno);
                wake_en = false;
        }
@@ -631,11 +629,10 @@ static int s3c_rtc_resume(struct platform_device *pdev)
 
        return 0;
 }
-#else
-#define s3c_rtc_suspend NULL
-#define s3c_rtc_resume  NULL
 #endif
 
+static SIMPLE_DEV_PM_OPS(s3c_rtc_pm_ops, s3c_rtc_suspend, s3c_rtc_resume);
+
 #ifdef CONFIG_OF
 static struct s3c_rtc_drv_data s3c_rtc_drv_data_array[] = {
        [TYPE_S3C2410] = { TYPE_S3C2410 },
@@ -685,12 +682,11 @@ MODULE_DEVICE_TABLE(platform, s3c_rtc_driver_ids);
 static struct platform_driver s3c_rtc_driver = {
        .probe          = s3c_rtc_probe,
        .remove         = s3c_rtc_remove,
-       .suspend        = s3c_rtc_suspend,
-       .resume         = s3c_rtc_resume,
        .id_table       = s3c_rtc_driver_ids,
        .driver         = {
                .name   = "s3c-rtc",
                .owner  = THIS_MODULE,
+               .pm     = &s3c_rtc_pm_ops,
                .of_match_table = of_match_ptr(s3c_rtc_dt_match),
        },
 };