Lines Matching refs:rtc

57 static void st_rtc_set_hw_alarm(struct st_rtc *rtc,  in st_rtc_set_hw_alarm()  argument
62 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_set_hw_alarm()
64 writel_relaxed(1, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_set_hw_alarm()
66 writel_relaxed(msb, rtc->ioaddr + LPC_LPA_MSB_OFF); in st_rtc_set_hw_alarm()
67 writel_relaxed(lsb, rtc->ioaddr + LPC_LPA_LSB_OFF); in st_rtc_set_hw_alarm()
68 writel_relaxed(1, rtc->ioaddr + LPC_LPA_START_OFF); in st_rtc_set_hw_alarm()
70 writel_relaxed(0, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_set_hw_alarm()
72 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_set_hw_alarm()
77 struct st_rtc *rtc = (struct st_rtc *)data; in st_rtc_handler() local
79 rtc_update_irq(rtc->rtc_dev, 1, RTC_AF); in st_rtc_handler()
86 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_read_time() local
91 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_read_time()
94 lpt_msb = readl_relaxed(rtc->ioaddr + LPC_LPT_MSB_OFF); in st_rtc_read_time()
95 lpt_lsb = readl_relaxed(rtc->ioaddr + LPC_LPT_LSB_OFF); in st_rtc_read_time()
96 } while (readl_relaxed(rtc->ioaddr + LPC_LPT_MSB_OFF) != lpt_msb); in st_rtc_read_time()
98 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_read_time()
101 do_div(lpt, rtc->clkrate); in st_rtc_read_time()
109 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_set_time() local
115 lpt = (unsigned long long)secs * rtc->clkrate; in st_rtc_set_time()
117 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_set_time()
119 writel_relaxed(lpt >> 32, rtc->ioaddr + LPC_LPT_MSB_OFF); in st_rtc_set_time()
120 writel_relaxed(lpt, rtc->ioaddr + LPC_LPT_LSB_OFF); in st_rtc_set_time()
121 writel_relaxed(1, rtc->ioaddr + LPC_LPT_START_OFF); in st_rtc_set_time()
123 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_set_time()
130 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_read_alarm() local
133 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_read_alarm()
135 memcpy(wkalrm, &rtc->alarm, sizeof(struct rtc_wkalrm)); in st_rtc_read_alarm()
137 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_read_alarm()
144 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_alarm_irq_enable() local
146 if (enabled && !rtc->irq_enabled) { in st_rtc_alarm_irq_enable()
147 enable_irq(rtc->irq); in st_rtc_alarm_irq_enable()
148 rtc->irq_enabled = true; in st_rtc_alarm_irq_enable()
149 } else if (!enabled && rtc->irq_enabled) { in st_rtc_alarm_irq_enable()
150 disable_irq(rtc->irq); in st_rtc_alarm_irq_enable()
151 rtc->irq_enabled = false; in st_rtc_alarm_irq_enable()
159 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_set_alarm() local
173 memcpy(&rtc->alarm, t, sizeof(struct rtc_wkalrm)); in st_rtc_set_alarm()
177 lpa = (unsigned long long)alarm_secs * rtc->clkrate; in st_rtc_set_alarm()
179 st_rtc_set_hw_alarm(rtc, lpa >> 32, lpa); in st_rtc_set_alarm()
196 struct st_rtc *rtc; in st_rtc_probe() local
211 rtc = devm_kzalloc(&pdev->dev, sizeof(struct st_rtc), GFP_KERNEL); in st_rtc_probe()
212 if (!rtc) in st_rtc_probe()
215 rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev); in st_rtc_probe()
216 if (IS_ERR(rtc->rtc_dev)) in st_rtc_probe()
217 return PTR_ERR(rtc->rtc_dev); in st_rtc_probe()
219 spin_lock_init(&rtc->lock); in st_rtc_probe()
222 rtc->ioaddr = devm_ioremap_resource(&pdev->dev, res); in st_rtc_probe()
223 if (IS_ERR(rtc->ioaddr)) in st_rtc_probe()
224 return PTR_ERR(rtc->ioaddr); in st_rtc_probe()
226 rtc->irq = irq_of_parse_and_map(np, 0); in st_rtc_probe()
227 if (!rtc->irq) { in st_rtc_probe()
232 ret = devm_request_irq(&pdev->dev, rtc->irq, st_rtc_handler, 0, in st_rtc_probe()
233 pdev->name, rtc); in st_rtc_probe()
235 dev_err(&pdev->dev, "Failed to request irq %i\n", rtc->irq); in st_rtc_probe()
239 enable_irq_wake(rtc->irq); in st_rtc_probe()
240 disable_irq(rtc->irq); in st_rtc_probe()
242 rtc->clk = clk_get(&pdev->dev, NULL); in st_rtc_probe()
243 if (IS_ERR(rtc->clk)) { in st_rtc_probe()
245 return PTR_ERR(rtc->clk); in st_rtc_probe()
248 clk_prepare_enable(rtc->clk); in st_rtc_probe()
250 rtc->clkrate = clk_get_rate(rtc->clk); in st_rtc_probe()
251 if (!rtc->clkrate) { in st_rtc_probe()
258 platform_set_drvdata(pdev, rtc); in st_rtc_probe()
260 rtc->rtc_dev->ops = &st_rtc_ops; in st_rtc_probe()
261 rtc->rtc_dev->range_max = U64_MAX; in st_rtc_probe()
262 do_div(rtc->rtc_dev->range_max, rtc->clkrate); in st_rtc_probe()
264 ret = rtc_register_device(rtc->rtc_dev); in st_rtc_probe()
266 clk_disable_unprepare(rtc->clk); in st_rtc_probe()
276 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_suspend() local
281 writel_relaxed(1, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_suspend()
282 writel_relaxed(0, rtc->ioaddr + LPC_LPA_START_OFF); in st_rtc_suspend()
283 writel_relaxed(0, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_suspend()
290 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_resume() local
292 rtc_alarm_irq_enable(rtc->rtc_dev, 0); in st_rtc_resume()
298 memset(&rtc->alarm, 0, sizeof(struct rtc_wkalrm)); in st_rtc_resume()
300 writel_relaxed(0, rtc->ioaddr + LPC_LPA_MSB_OFF); in st_rtc_resume()
301 writel_relaxed(0, rtc->ioaddr + LPC_LPA_LSB_OFF); in st_rtc_resume()
302 writel_relaxed(1, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_resume()
303 writel_relaxed(1, rtc->ioaddr + LPC_LPA_START_OFF); in st_rtc_resume()
304 writel_relaxed(0, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_resume()