Lines Matching refs:rtc

53 static void st_rtc_set_hw_alarm(struct st_rtc *rtc,  in st_rtc_set_hw_alarm()  argument
58 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_set_hw_alarm()
60 writel_relaxed(1, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_set_hw_alarm()
62 writel_relaxed(msb, rtc->ioaddr + LPC_LPA_MSB_OFF); in st_rtc_set_hw_alarm()
63 writel_relaxed(lsb, rtc->ioaddr + LPC_LPA_LSB_OFF); in st_rtc_set_hw_alarm()
64 writel_relaxed(1, rtc->ioaddr + LPC_LPA_START_OFF); in st_rtc_set_hw_alarm()
66 writel_relaxed(0, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_set_hw_alarm()
68 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_set_hw_alarm()
73 struct st_rtc *rtc = (struct st_rtc *)data; in st_rtc_handler() local
75 rtc_update_irq(rtc->rtc_dev, 1, RTC_AF); in st_rtc_handler()
82 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_read_time() local
87 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_read_time()
90 lpt_msb = readl_relaxed(rtc->ioaddr + LPC_LPT_MSB_OFF); in st_rtc_read_time()
91 lpt_lsb = readl_relaxed(rtc->ioaddr + LPC_LPT_LSB_OFF); in st_rtc_read_time()
92 } while (readl_relaxed(rtc->ioaddr + LPC_LPT_MSB_OFF) != lpt_msb); in st_rtc_read_time()
94 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_read_time()
97 do_div(lpt, rtc->clkrate); in st_rtc_read_time()
105 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_set_time() local
111 lpt = (unsigned long long)secs * rtc->clkrate; in st_rtc_set_time()
113 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_set_time()
115 writel_relaxed(lpt >> 32, rtc->ioaddr + LPC_LPT_MSB_OFF); in st_rtc_set_time()
116 writel_relaxed(lpt, rtc->ioaddr + LPC_LPT_LSB_OFF); in st_rtc_set_time()
117 writel_relaxed(1, rtc->ioaddr + LPC_LPT_START_OFF); in st_rtc_set_time()
119 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_set_time()
126 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_read_alarm() local
129 spin_lock_irqsave(&rtc->lock, flags); in st_rtc_read_alarm()
131 memcpy(wkalrm, &rtc->alarm, sizeof(struct rtc_wkalrm)); in st_rtc_read_alarm()
133 spin_unlock_irqrestore(&rtc->lock, flags); in st_rtc_read_alarm()
140 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_alarm_irq_enable() local
142 if (enabled && !rtc->irq_enabled) { in st_rtc_alarm_irq_enable()
143 enable_irq(rtc->irq); in st_rtc_alarm_irq_enable()
144 rtc->irq_enabled = true; in st_rtc_alarm_irq_enable()
145 } else if (!enabled && rtc->irq_enabled) { in st_rtc_alarm_irq_enable()
146 disable_irq(rtc->irq); in st_rtc_alarm_irq_enable()
147 rtc->irq_enabled = false; in st_rtc_alarm_irq_enable()
155 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_set_alarm() local
165 memcpy(&rtc->alarm, t, sizeof(struct rtc_wkalrm)); in st_rtc_set_alarm()
169 lpa = (unsigned long long)alarm_secs * rtc->clkrate; in st_rtc_set_alarm()
171 st_rtc_set_hw_alarm(rtc, lpa >> 32, lpa); in st_rtc_set_alarm()
188 struct st_rtc *rtc; in st_rtc_probe() local
203 rtc = devm_kzalloc(&pdev->dev, sizeof(struct st_rtc), GFP_KERNEL); in st_rtc_probe()
204 if (!rtc) in st_rtc_probe()
207 rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev); in st_rtc_probe()
208 if (IS_ERR(rtc->rtc_dev)) in st_rtc_probe()
209 return PTR_ERR(rtc->rtc_dev); in st_rtc_probe()
211 spin_lock_init(&rtc->lock); in st_rtc_probe()
214 rtc->ioaddr = devm_ioremap_resource(&pdev->dev, res); in st_rtc_probe()
215 if (IS_ERR(rtc->ioaddr)) in st_rtc_probe()
216 return PTR_ERR(rtc->ioaddr); in st_rtc_probe()
218 rtc->irq = irq_of_parse_and_map(np, 0); in st_rtc_probe()
219 if (!rtc->irq) { in st_rtc_probe()
224 ret = devm_request_irq(&pdev->dev, rtc->irq, st_rtc_handler, 0, in st_rtc_probe()
225 pdev->name, rtc); in st_rtc_probe()
227 dev_err(&pdev->dev, "Failed to request irq %i\n", rtc->irq); in st_rtc_probe()
231 enable_irq_wake(rtc->irq); in st_rtc_probe()
232 disable_irq(rtc->irq); in st_rtc_probe()
234 rtc->clk = clk_get(&pdev->dev, NULL); in st_rtc_probe()
235 if (IS_ERR(rtc->clk)) { in st_rtc_probe()
237 return PTR_ERR(rtc->clk); in st_rtc_probe()
240 clk_prepare_enable(rtc->clk); in st_rtc_probe()
242 rtc->clkrate = clk_get_rate(rtc->clk); in st_rtc_probe()
243 if (!rtc->clkrate) { in st_rtc_probe()
250 platform_set_drvdata(pdev, rtc); in st_rtc_probe()
252 rtc->rtc_dev->ops = &st_rtc_ops; in st_rtc_probe()
253 rtc->rtc_dev->range_max = U64_MAX; in st_rtc_probe()
254 do_div(rtc->rtc_dev->range_max, rtc->clkrate); in st_rtc_probe()
256 ret = rtc_register_device(rtc->rtc_dev); in st_rtc_probe()
258 clk_disable_unprepare(rtc->clk); in st_rtc_probe()
268 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_suspend() local
273 writel_relaxed(1, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_suspend()
274 writel_relaxed(0, rtc->ioaddr + LPC_LPA_START_OFF); in st_rtc_suspend()
275 writel_relaxed(0, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_suspend()
282 struct st_rtc *rtc = dev_get_drvdata(dev); in st_rtc_resume() local
284 rtc_alarm_irq_enable(rtc->rtc_dev, 0); in st_rtc_resume()
290 memset(&rtc->alarm, 0, sizeof(struct rtc_wkalrm)); in st_rtc_resume()
292 writel_relaxed(0, rtc->ioaddr + LPC_LPA_MSB_OFF); in st_rtc_resume()
293 writel_relaxed(0, rtc->ioaddr + LPC_LPA_LSB_OFF); in st_rtc_resume()
294 writel_relaxed(1, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_resume()
295 writel_relaxed(1, rtc->ioaddr + LPC_LPA_START_OFF); in st_rtc_resume()
296 writel_relaxed(0, rtc->ioaddr + LPC_WDT_OFF); in st_rtc_resume()