Lines Matching refs:data
50 static u32 rtc_read_lp_counter(struct snvs_rtc_data *data) in rtc_read_lp_counter() argument
56 regmap_read(data->regmap, data->offset + SNVS_LPSRTCMR, &val); in rtc_read_lp_counter()
59 regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &val); in rtc_read_lp_counter()
62 regmap_read(data->regmap, data->offset + SNVS_LPSRTCMR, &val); in rtc_read_lp_counter()
65 regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &val); in rtc_read_lp_counter()
73 static void rtc_write_sync_lp(struct snvs_rtc_data *data) in rtc_write_sync_lp() argument
81 regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count1); in rtc_write_sync_lp()
82 regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count2); in rtc_write_sync_lp()
88 regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count2); in rtc_write_sync_lp()
89 regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count3); in rtc_write_sync_lp()
95 static int snvs_rtc_enable(struct snvs_rtc_data *data, bool enable) in snvs_rtc_enable() argument
100 regmap_update_bits(data->regmap, data->offset + SNVS_LPCR, SNVS_LPCR_SRTC_ENV, in snvs_rtc_enable()
104 regmap_read(data->regmap, data->offset + SNVS_LPCR, &lpcr); in snvs_rtc_enable()
123 struct snvs_rtc_data *data = dev_get_drvdata(dev); in snvs_rtc_read_time() local
124 unsigned long time = rtc_read_lp_counter(data); in snvs_rtc_read_time()
133 struct snvs_rtc_data *data = dev_get_drvdata(dev); in snvs_rtc_set_time() local
139 snvs_rtc_enable(data, false); in snvs_rtc_set_time()
142 regmap_write(data->regmap, data->offset + SNVS_LPSRTCLR, time << CNTR_TO_SECS_SH); in snvs_rtc_set_time()
143 regmap_write(data->regmap, data->offset + SNVS_LPSRTCMR, time >> (32 - CNTR_TO_SECS_SH)); in snvs_rtc_set_time()
146 snvs_rtc_enable(data, true); in snvs_rtc_set_time()
153 struct snvs_rtc_data *data = dev_get_drvdata(dev); in snvs_rtc_read_alarm() local
156 regmap_read(data->regmap, data->offset + SNVS_LPTAR, &lptar); in snvs_rtc_read_alarm()
159 regmap_read(data->regmap, data->offset + SNVS_LPSR, &lpsr); in snvs_rtc_read_alarm()
167 struct snvs_rtc_data *data = dev_get_drvdata(dev); in snvs_rtc_alarm_irq_enable() local
169 regmap_update_bits(data->regmap, data->offset + SNVS_LPCR, in snvs_rtc_alarm_irq_enable()
173 rtc_write_sync_lp(data); in snvs_rtc_alarm_irq_enable()
180 struct snvs_rtc_data *data = dev_get_drvdata(dev); in snvs_rtc_set_alarm() local
186 regmap_update_bits(data->regmap, data->offset + SNVS_LPCR, SNVS_LPCR_LPTA_EN, 0); in snvs_rtc_set_alarm()
187 regmap_write(data->regmap, data->offset + SNVS_LPTAR, time); in snvs_rtc_set_alarm()
190 regmap_write(data->regmap, data->offset + SNVS_LPSR, SNVS_LPSR_LPTA); in snvs_rtc_set_alarm()
206 struct snvs_rtc_data *data = dev_get_drvdata(dev); in snvs_rtc_irq_handler() local
210 regmap_read(data->regmap, data->offset + SNVS_LPSR, &lpsr); in snvs_rtc_irq_handler()
218 rtc_update_irq(data->rtc, 1, events); in snvs_rtc_irq_handler()
222 regmap_write(data->regmap, data->offset + SNVS_LPSR, lpsr); in snvs_rtc_irq_handler()
235 struct snvs_rtc_data *data; in snvs_rtc_probe() local
240 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in snvs_rtc_probe()
241 if (!data) in snvs_rtc_probe()
244 data->regmap = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, "regmap"); in snvs_rtc_probe()
246 if (IS_ERR(data->regmap)) { in snvs_rtc_probe()
254 data->regmap = devm_regmap_init_mmio(&pdev->dev, mmio, &snvs_rtc_config); in snvs_rtc_probe()
256 data->offset = SNVS_LPREGISTER_OFFSET; in snvs_rtc_probe()
257 of_property_read_u32(pdev->dev.of_node, "offset", &data->offset); in snvs_rtc_probe()
260 if (!data->regmap) { in snvs_rtc_probe()
265 data->irq = platform_get_irq(pdev, 0); in snvs_rtc_probe()
266 if (data->irq < 0) in snvs_rtc_probe()
267 return data->irq; in snvs_rtc_probe()
269 data->clk = devm_clk_get(&pdev->dev, "snvs-rtc"); in snvs_rtc_probe()
270 if (IS_ERR(data->clk)) { in snvs_rtc_probe()
271 data->clk = NULL; in snvs_rtc_probe()
273 ret = clk_prepare_enable(data->clk); in snvs_rtc_probe()
281 platform_set_drvdata(pdev, data); in snvs_rtc_probe()
284 regmap_write(data->regmap, data->offset + SNVS_LPPGDR, SNVS_LPPGDR_INIT); in snvs_rtc_probe()
287 regmap_write(data->regmap, data->offset + SNVS_LPSR, 0xffffffff); in snvs_rtc_probe()
290 snvs_rtc_enable(data, true); in snvs_rtc_probe()
294 ret = devm_request_irq(&pdev->dev, data->irq, snvs_rtc_irq_handler, in snvs_rtc_probe()
298 data->irq, ret); in snvs_rtc_probe()
302 data->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, in snvs_rtc_probe()
304 if (IS_ERR(data->rtc)) { in snvs_rtc_probe()
305 ret = PTR_ERR(data->rtc); in snvs_rtc_probe()
313 if (data->clk) in snvs_rtc_probe()
314 clk_disable_unprepare(data->clk); in snvs_rtc_probe()
322 struct snvs_rtc_data *data = dev_get_drvdata(dev); in snvs_rtc_suspend() local
325 enable_irq_wake(data->irq); in snvs_rtc_suspend()
332 struct snvs_rtc_data *data = dev_get_drvdata(dev); in snvs_rtc_suspend_noirq() local
334 if (data->clk) in snvs_rtc_suspend_noirq()
335 clk_disable_unprepare(data->clk); in snvs_rtc_suspend_noirq()
342 struct snvs_rtc_data *data = dev_get_drvdata(dev); in snvs_rtc_resume() local
345 return disable_irq_wake(data->irq); in snvs_rtc_resume()
352 struct snvs_rtc_data *data = dev_get_drvdata(dev); in snvs_rtc_resume_noirq() local
354 if (data->clk) in snvs_rtc_resume_noirq()
355 return clk_prepare_enable(data->clk); in snvs_rtc_resume_noirq()