Lines Matching refs:imxdi

135 static void di_int_enable(struct imxdi_dev *imxdi, u32 intr)  in di_int_enable()  argument
139 spin_lock_irqsave(&imxdi->irq_lock, flags); in di_int_enable()
140 __raw_writel(__raw_readl(imxdi->ioaddr + DIER) | intr, in di_int_enable()
141 imxdi->ioaddr + DIER); in di_int_enable()
142 spin_unlock_irqrestore(&imxdi->irq_lock, flags); in di_int_enable()
148 static void di_int_disable(struct imxdi_dev *imxdi, u32 intr) in di_int_disable() argument
152 spin_lock_irqsave(&imxdi->irq_lock, flags); in di_int_disable()
153 __raw_writel(__raw_readl(imxdi->ioaddr + DIER) & ~intr, in di_int_disable()
154 imxdi->ioaddr + DIER); in di_int_disable()
155 spin_unlock_irqrestore(&imxdi->irq_lock, flags); in di_int_disable()
165 static void clear_write_error(struct imxdi_dev *imxdi) in clear_write_error() argument
169 dev_warn(&imxdi->pdev->dev, "WARNING: Register write error!\n"); in clear_write_error()
172 __raw_writel(DSR_WEF, imxdi->ioaddr + DSR); in clear_write_error()
176 if ((__raw_readl(imxdi->ioaddr + DSR) & DSR_WEF) == 0) in clear_write_error()
180 dev_err(&imxdi->pdev->dev, in clear_write_error()
190 static int di_write_wait(struct imxdi_dev *imxdi, u32 val, int reg) in di_write_wait() argument
196 mutex_lock(&imxdi->write_mutex); in di_write_wait()
199 di_int_enable(imxdi, DIER_WCIE); in di_write_wait()
201 imxdi->dsr = 0; in di_write_wait()
204 __raw_writel(val, imxdi->ioaddr + reg); in di_write_wait()
207 ret = wait_event_interruptible_timeout(imxdi->write_wait, in di_write_wait()
208 imxdi->dsr & (DSR_WCF | DSR_WEF), msecs_to_jiffies(1)); in di_write_wait()
213 dev_warn(&imxdi->pdev->dev, in di_write_wait()
219 if (imxdi->dsr & DSR_WEF) { in di_write_wait()
220 clear_write_error(imxdi); in di_write_wait()
225 mutex_unlock(&imxdi->write_mutex); in di_write_wait()
235 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_read_time() local
238 now = __raw_readl(imxdi->ioaddr + DTCMR); in dryice_rtc_read_time()
250 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_set_mmss() local
254 rc = di_write_wait(imxdi, 0, DTCLR); in dryice_rtc_set_mmss()
256 rc = di_write_wait(imxdi, secs, DTCMR); in dryice_rtc_set_mmss()
264 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_alarm_irq_enable() local
267 di_int_enable(imxdi, DIER_CAIE); in dryice_rtc_alarm_irq_enable()
269 di_int_disable(imxdi, DIER_CAIE); in dryice_rtc_alarm_irq_enable()
280 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_read_alarm() local
283 dcamr = __raw_readl(imxdi->ioaddr + DCAMR); in dryice_rtc_read_alarm()
287 alarm->enabled = (__raw_readl(imxdi->ioaddr + DIER) & DIER_CAIE) != 0; in dryice_rtc_read_alarm()
290 mutex_lock(&imxdi->write_mutex); in dryice_rtc_read_alarm()
293 alarm->pending = (__raw_readl(imxdi->ioaddr + DSR) & DSR_CAF) != 0; in dryice_rtc_read_alarm()
295 mutex_unlock(&imxdi->write_mutex); in dryice_rtc_read_alarm()
305 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_set_alarm() local
315 now = __raw_readl(imxdi->ioaddr + DTCMR); in dryice_rtc_set_alarm()
320 rc = di_write_wait(imxdi, (u32)alarm_time, DCAMR); in dryice_rtc_set_alarm()
325 di_int_enable(imxdi, DIER_CAIE); /* enable alarm intr */ in dryice_rtc_set_alarm()
327 di_int_disable(imxdi, DIER_CAIE); /* disable alarm intr */ in dryice_rtc_set_alarm()
345 struct imxdi_dev *imxdi = dev_id; in dryice_norm_irq() local
349 dier = __raw_readl(imxdi->ioaddr + DIER); in dryice_norm_irq()
356 if (list_empty_careful(&imxdi->write_wait.task_list)) in dryice_norm_irq()
360 dsr = __raw_readl(imxdi->ioaddr + DSR); in dryice_norm_irq()
363 di_int_disable(imxdi, DIER_WCIE); in dryice_norm_irq()
366 imxdi->dsr |= dsr; in dryice_norm_irq()
368 wake_up_interruptible(&imxdi->write_wait); in dryice_norm_irq()
376 dsr = __raw_readl(imxdi->ioaddr + DSR); in dryice_norm_irq()
379 di_int_disable(imxdi, DIER_CAIE); in dryice_norm_irq()
382 schedule_work(&imxdi->work); in dryice_norm_irq()
395 struct imxdi_dev *imxdi = container_of(work, in dryice_work() local
399 di_write_wait(imxdi, DSR_CAF, DSR); in dryice_work()
402 rtc_update_irq(imxdi->rtc, 1, RTC_AF | RTC_IRQF); in dryice_work()
411 struct imxdi_dev *imxdi; in dryice_rtc_probe() local
414 imxdi = devm_kzalloc(&pdev->dev, sizeof(*imxdi), GFP_KERNEL); in dryice_rtc_probe()
415 if (!imxdi) in dryice_rtc_probe()
418 imxdi->pdev = pdev; in dryice_rtc_probe()
421 imxdi->ioaddr = devm_ioremap_resource(&pdev->dev, res); in dryice_rtc_probe()
422 if (IS_ERR(imxdi->ioaddr)) in dryice_rtc_probe()
423 return PTR_ERR(imxdi->ioaddr); in dryice_rtc_probe()
425 spin_lock_init(&imxdi->irq_lock); in dryice_rtc_probe()
427 imxdi->irq = platform_get_irq(pdev, 0); in dryice_rtc_probe()
428 if (imxdi->irq < 0) in dryice_rtc_probe()
429 return imxdi->irq; in dryice_rtc_probe()
431 init_waitqueue_head(&imxdi->write_wait); in dryice_rtc_probe()
433 INIT_WORK(&imxdi->work, dryice_work); in dryice_rtc_probe()
435 mutex_init(&imxdi->write_mutex); in dryice_rtc_probe()
437 imxdi->clk = devm_clk_get(&pdev->dev, NULL); in dryice_rtc_probe()
438 if (IS_ERR(imxdi->clk)) in dryice_rtc_probe()
439 return PTR_ERR(imxdi->clk); in dryice_rtc_probe()
440 rc = clk_prepare_enable(imxdi->clk); in dryice_rtc_probe()
449 __raw_writel(0, imxdi->ioaddr + DIER); in dryice_rtc_probe()
451 rc = devm_request_irq(&pdev->dev, imxdi->irq, dryice_norm_irq, in dryice_rtc_probe()
452 IRQF_SHARED, pdev->name, imxdi); in dryice_rtc_probe()
459 if (__raw_readl(imxdi->ioaddr + DSR) & DSR_NVF) { in dryice_rtc_probe()
460 rc = di_write_wait(imxdi, DSR_NVF | DSR_SVF, DSR); in dryice_rtc_probe()
466 rc = di_write_wait(imxdi, DCAMR_UNSET, DCAMR); in dryice_rtc_probe()
469 rc = di_write_wait(imxdi, 0, DCALR); in dryice_rtc_probe()
474 if (__raw_readl(imxdi->ioaddr + DSR) & DSR_CAF) { in dryice_rtc_probe()
475 rc = di_write_wait(imxdi, DSR_CAF, DSR); in dryice_rtc_probe()
481 if (__raw_readl(imxdi->ioaddr + DTCMR) == 0) { in dryice_rtc_probe()
482 rc = di_write_wait(imxdi, 0, DTCMR); in dryice_rtc_probe()
488 if (!(__raw_readl(imxdi->ioaddr + DCR) & DCR_TCE)) { in dryice_rtc_probe()
489 rc = di_write_wait(imxdi, in dryice_rtc_probe()
490 __raw_readl(imxdi->ioaddr + DCR) | DCR_TCE, in dryice_rtc_probe()
496 platform_set_drvdata(pdev, imxdi); in dryice_rtc_probe()
497 imxdi->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, in dryice_rtc_probe()
499 if (IS_ERR(imxdi->rtc)) { in dryice_rtc_probe()
500 rc = PTR_ERR(imxdi->rtc); in dryice_rtc_probe()
507 clk_disable_unprepare(imxdi->clk); in dryice_rtc_probe()
514 struct imxdi_dev *imxdi = platform_get_drvdata(pdev); in dryice_rtc_remove() local
516 flush_work(&imxdi->work); in dryice_rtc_remove()
519 __raw_writel(0, imxdi->ioaddr + DIER); in dryice_rtc_remove()
521 clk_disable_unprepare(imxdi->clk); in dryice_rtc_remove()