static void spear_rtc_shutdown(struct platform_device *pdev) { struct spear_rtc_config *config = platform_get_drvdata(pdev); spear_rtc_disable_interrupt(config); clk_disable(config->clk); }
/* * spear_rtc_set_alarm - set the alarm time * @dev: rtc device in use * @alm: holds alarm date and time * * This function set alarm time and date. On success it will return 0 * otherwise -ve error is returned. */ static int spear_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm) { struct spear_rtc_config *config = dev_get_drvdata(dev); unsigned int time, date; int err; if (tm2bcd(&alm->time) < 0) return -EINVAL; rtc_wait_not_busy(config); time = (alm->time.tm_sec << SECOND_SHIFT) | (alm->time.tm_min << MINUTE_SHIFT) | (alm->time.tm_hour << HOUR_SHIFT); date = (alm->time.tm_mday << MDAY_SHIFT) | (alm->time.tm_mon << MONTH_SHIFT) | (alm->time.tm_year << YEAR_SHIFT); writel(time, config->ioaddr + ALARM_TIME_REG); writel(date, config->ioaddr + ALARM_DATE_REG); err = is_write_complete(config); if (err < 0) return err; if (alm->enabled) spear_rtc_enable_interrupt(config); else spear_rtc_disable_interrupt(config); return 0; }
static int spear_rtc_remove(struct platform_device *pdev) { struct spear_rtc_config *config = platform_get_drvdata(pdev); spear_rtc_disable_interrupt(config); clk_disable_unprepare(config->clk); device_init_wakeup(&pdev->dev, 0); return 0; }
static int spear_rtc_suspend(struct platform_device *pdev, pm_message_t state) { struct spear_rtc_config *config = platform_get_drvdata(pdev); int irq; irq = platform_get_irq(pdev, 0); if (device_may_wakeup(&pdev->dev)) { if (!enable_irq_wake(irq)) config->irq_wake = 1; } else { spear_rtc_disable_interrupt(config); clk_disable(config->clk); } return 0; }
static int spear_alarm_irq_enable(struct device *dev, unsigned int enabled) { struct spear_rtc_config *config = dev_get_drvdata(dev); int ret = 0; spear_rtc_clear_interrupt(config); switch (enabled) { case 0: /* alarm off */ spear_rtc_disable_interrupt(config); break; case 1: /* alarm on */ spear_rtc_enable_interrupt(config); break; default: ret = -EINVAL; break; } return ret; }
static int __devexit spear_rtc_remove(struct platform_device *pdev) { struct spear_rtc_config *config = platform_get_drvdata(pdev); int irq; struct resource *res; /* leave rtc running, but disable irqs */ spear_rtc_disable_interrupt(config); device_init_wakeup(&pdev->dev, 0); irq = platform_get_irq(pdev, 0); if (irq) free_irq(irq, pdev); clk_disable(config->clk); clk_put(config->clk); iounmap(config->ioaddr); kfree(config); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res) release_mem_region(res->start, resource_size(res)); platform_set_drvdata(pdev, NULL); rtc_device_unregister(config->rtc); return 0; }