|
@@ -18,6 +18,7 @@
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
*/
|
|
|
|
|
|
+#include <linux/clk.h>
|
|
|
#include <linux/delay.h>
|
|
|
#include <linux/init.h>
|
|
|
#include <linux/io.h>
|
|
@@ -60,6 +61,7 @@ struct tegra_rtc_info {
|
|
|
struct platform_device *pdev;
|
|
|
struct rtc_device *rtc_dev;
|
|
|
void __iomem *rtc_base; /* NULL if not initialized. */
|
|
|
+ struct clk *clk;
|
|
|
int tegra_rtc_irq; /* alarm and periodic irq */
|
|
|
spinlock_t tegra_rtc_lock;
|
|
|
};
|
|
@@ -327,6 +329,14 @@ static int __init tegra_rtc_probe(struct platform_device *pdev)
|
|
|
if (info->tegra_rtc_irq <= 0)
|
|
|
return -EBUSY;
|
|
|
|
|
|
+ info->clk = devm_clk_get(&pdev->dev, NULL);
|
|
|
+ if (IS_ERR(info->clk))
|
|
|
+ return PTR_ERR(info->clk);
|
|
|
+
|
|
|
+ ret = clk_prepare_enable(info->clk);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
/* set context info. */
|
|
|
info->pdev = pdev;
|
|
|
spin_lock_init(&info->tegra_rtc_lock);
|
|
@@ -347,7 +357,7 @@ static int __init tegra_rtc_probe(struct platform_device *pdev)
|
|
|
ret = PTR_ERR(info->rtc_dev);
|
|
|
dev_err(&pdev->dev, "Unable to register device (err=%d).\n",
|
|
|
ret);
|
|
|
- return ret;
|
|
|
+ goto disable_clk;
|
|
|
}
|
|
|
|
|
|
ret = devm_request_irq(&pdev->dev, info->tegra_rtc_irq,
|
|
@@ -357,11 +367,24 @@ static int __init tegra_rtc_probe(struct platform_device *pdev)
|
|
|
dev_err(&pdev->dev,
|
|
|
"Unable to request interrupt for device (err=%d).\n",
|
|
|
ret);
|
|
|
- return ret;
|
|
|
+ goto disable_clk;
|
|
|
}
|
|
|
|
|
|
dev_notice(&pdev->dev, "Tegra internal Real Time Clock\n");
|
|
|
|
|
|
+ return 0;
|
|
|
+
|
|
|
+disable_clk:
|
|
|
+ clk_disable_unprepare(info->clk);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static int tegra_rtc_remove(struct platform_device *pdev)
|
|
|
+{
|
|
|
+ struct tegra_rtc_info *info = platform_get_drvdata(pdev);
|
|
|
+
|
|
|
+ clk_disable_unprepare(info->clk);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -414,6 +437,7 @@ static void tegra_rtc_shutdown(struct platform_device *pdev)
|
|
|
|
|
|
MODULE_ALIAS("platform:tegra_rtc");
|
|
|
static struct platform_driver tegra_rtc_driver = {
|
|
|
+ .remove = tegra_rtc_remove,
|
|
|
.shutdown = tegra_rtc_shutdown,
|
|
|
.driver = {
|
|
|
.name = "tegra_rtc",
|