From: Robin Gong Date: Mon, 4 Feb 2013 08:20:05 +0000 (+0800) Subject: ENGR00243120 rtc:snvs: support power off system by SNVS X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=bbf349ec946ee888fdf300afaf8dd6bf11764107;p=karo-tx-linux.git ENGR00243120 rtc:snvs: support power off system by SNVS Enable the function by SNVS which located in snvs-rtc driver Signed-off-by: Robin Gong --- diff --git a/drivers/rtc/rtc-snvs.c b/drivers/rtc/rtc-snvs.c index b394b0b5b88e..6c6b684e52e0 100644 --- a/drivers/rtc/rtc-snvs.c +++ b/drivers/rtc/rtc-snvs.c @@ -41,6 +41,8 @@ struct snvs_rtc_data { spinlock_t lock; }; +static void __iomem *snvs_base; + static u32 rtc_read_lp_counter(void __iomem *ioaddr) { u64 read1, read2; @@ -241,6 +243,15 @@ static irqreturn_t snvs_rtc_irq_handler(int irq, void *dev_id) return events ? IRQ_HANDLED : IRQ_NONE; } +static void snvs_poweroff(void) +{ + u32 value; + + value = readl(snvs_base + SNVS_LPCR); + /* set TOP and DP_EN bit */ + writel(value | 0x60, snvs_base + SNVS_LPCR); +} + static int snvs_rtc_probe(struct platform_device *pdev) { struct snvs_rtc_data *data; @@ -270,6 +281,7 @@ static int snvs_rtc_probe(struct platform_device *pdev) /* Clear interrupt status */ writel(0xffffffff, data->ioaddr + SNVS_LPSR); + snvs_base = data->ioaddr; /* Enable RTC */ snvs_rtc_enable(data, true); @@ -291,6 +303,12 @@ static int snvs_rtc_probe(struct platform_device *pdev) dev_err(&pdev->dev, "failed to register rtc: %d\n", ret); return ret; } + /* + * if no specific power off function in board file, power off system by + * SNVS + */ + if (!pm_power_off) + pm_power_off = snvs_poweroff; return 0; }