Lines Matching refs:imxdi
170 static void di_write_busy_wait(const struct imxdi_dev *imxdi, u32 val, in di_write_busy_wait() argument
174 writel(val, imxdi->ioaddr + reg); in di_write_busy_wait()
183 static void di_report_tamper_info(struct imxdi_dev *imxdi, u32 dsr) in di_report_tamper_info() argument
187 dtcr = readl(imxdi->ioaddr + DTCR); in di_report_tamper_info()
189 dev_emerg(&imxdi->pdev->dev, "DryIce tamper event detected\n"); in di_report_tamper_info()
192 dev_emerg(&imxdi->pdev->dev, "%sVoltage Tamper Event\n", in di_report_tamper_info()
196 dev_emerg(&imxdi->pdev->dev, "%s32768 Hz Clock Tamper Event\n", in di_report_tamper_info()
200 dev_emerg(&imxdi->pdev->dev, "%sTemperature Tamper Event\n", in di_report_tamper_info()
204 dev_emerg(&imxdi->pdev->dev, in di_report_tamper_info()
209 dev_emerg(&imxdi->pdev->dev, "%sExternal Boot Tamper Event\n", in di_report_tamper_info()
213 dev_emerg(&imxdi->pdev->dev, "%sExternal Tamper A Event\n", in di_report_tamper_info()
217 dev_emerg(&imxdi->pdev->dev, "%sExternal Tamper B Event\n", in di_report_tamper_info()
221 dev_emerg(&imxdi->pdev->dev, "%sWire-mesh Tamper Event\n", in di_report_tamper_info()
225 dev_emerg(&imxdi->pdev->dev, in di_report_tamper_info()
230 dev_emerg(&imxdi->pdev->dev, "%sTimer-counter Overflow Event\n", in di_report_tamper_info()
234 static void di_what_is_to_be_done(struct imxdi_dev *imxdi, in di_what_is_to_be_done() argument
237 …dev_emerg(&imxdi->pdev->dev, "Please cycle the %s power supply in order to get the DryIce/RTC unit… in di_what_is_to_be_done()
241 static int di_handle_failure_state(struct imxdi_dev *imxdi, u32 dsr) in di_handle_failure_state() argument
245 dev_dbg(&imxdi->pdev->dev, "DSR register reports: %08X\n", dsr); in di_handle_failure_state()
248 di_report_tamper_info(imxdi, dsr); in di_handle_failure_state()
250 dcr = readl(imxdi->ioaddr + DCR); in di_handle_failure_state()
254 di_what_is_to_be_done(imxdi, "battery"); in di_handle_failure_state()
261 di_what_is_to_be_done(imxdi, "main"); in di_handle_failure_state()
266 static int di_handle_valid_state(struct imxdi_dev *imxdi, u32 dsr) in di_handle_valid_state() argument
269 di_write_busy_wait(imxdi, DCAMR_UNSET, DCAMR); in di_handle_valid_state()
270 di_write_busy_wait(imxdi, 0, DCALR); in di_handle_valid_state()
274 di_write_busy_wait(imxdi, DSR_CAF, DSR); in di_handle_valid_state()
279 static int di_handle_invalid_state(struct imxdi_dev *imxdi, u32 dsr) in di_handle_invalid_state() argument
287 di_write_busy_wait(imxdi, 0x00000000, DTCR); in di_handle_invalid_state()
289 di_write_busy_wait(imxdi, DCR_TDCSL, DCR); in di_handle_invalid_state()
291 sec = readl(imxdi->ioaddr + DTCMR); in di_handle_invalid_state()
293 dev_warn(&imxdi->pdev->dev, in di_handle_invalid_state()
300 dcr = readl(imxdi->ioaddr + DCR); in di_handle_invalid_state()
304 di_what_is_to_be_done(imxdi, "battery"); in di_handle_invalid_state()
308 di_what_is_to_be_done(imxdi, "main"); in di_handle_invalid_state()
324 di_write_busy_wait(imxdi, DSR_NVF, DSR); in di_handle_invalid_state()
326 di_write_busy_wait(imxdi, DSR_TCO, DSR); in di_handle_invalid_state()
328 di_write_busy_wait(imxdi, dcr | DCR_TCE, DCR); in di_handle_invalid_state()
330 di_write_busy_wait(imxdi, sec, DTCMR); in di_handle_invalid_state()
333 return di_handle_valid_state(imxdi, __raw_readl(imxdi->ioaddr + DSR)); in di_handle_invalid_state()
336 static int di_handle_invalid_and_failure_state(struct imxdi_dev *imxdi, u32 dsr) in di_handle_invalid_and_failure_state() argument
347 dcr = __raw_readl(imxdi->ioaddr + DCR); in di_handle_invalid_and_failure_state()
360 di_what_is_to_be_done(imxdi, "battery"); in di_handle_invalid_and_failure_state()
365 di_what_is_to_be_done(imxdi, "main"); in di_handle_invalid_and_failure_state()
371 di_write_busy_wait(imxdi, 0x00000000, DTCR); in di_handle_invalid_and_failure_state()
374 di_write_busy_wait(imxdi, dsr & (DSR_WTD | DSR_ETBD | DSR_ETAD | in di_handle_invalid_and_failure_state()
378 dsr = readl(imxdi->ioaddr + DSR); in di_handle_invalid_and_failure_state()
381 dev_warn(&imxdi->pdev->dev, in di_handle_invalid_and_failure_state()
390 di_write_busy_wait(imxdi, DSR_SVF, DSR); in di_handle_invalid_and_failure_state()
393 dsr = readl(imxdi->ioaddr + DSR); in di_handle_invalid_and_failure_state()
395 dev_crit(&imxdi->pdev->dev, in di_handle_invalid_and_failure_state()
398 di_what_is_to_be_done(imxdi, "battery"); in di_handle_invalid_and_failure_state()
406 return di_handle_invalid_state(imxdi, dsr); in di_handle_invalid_and_failure_state()
409 static int di_handle_state(struct imxdi_dev *imxdi) in di_handle_state() argument
414 dsr = readl(imxdi->ioaddr + DSR); in di_handle_state()
418 dev_warn(&imxdi->pdev->dev, "Invalid stated unit detected\n"); in di_handle_state()
419 rc = di_handle_invalid_state(imxdi, dsr); in di_handle_state()
422 dev_warn(&imxdi->pdev->dev, "Failure stated unit detected\n"); in di_handle_state()
423 rc = di_handle_failure_state(imxdi, dsr); in di_handle_state()
426 dev_warn(&imxdi->pdev->dev, in di_handle_state()
428 rc = di_handle_invalid_and_failure_state(imxdi, dsr); in di_handle_state()
431 dev_notice(&imxdi->pdev->dev, "Unlocked unit detected\n"); in di_handle_state()
432 rc = di_handle_valid_state(imxdi, dsr); in di_handle_state()
441 static void di_int_enable(struct imxdi_dev *imxdi, u32 intr) in di_int_enable() argument
445 spin_lock_irqsave(&imxdi->irq_lock, flags); in di_int_enable()
446 writel(readl(imxdi->ioaddr + DIER) | intr, in di_int_enable()
447 imxdi->ioaddr + DIER); in di_int_enable()
448 spin_unlock_irqrestore(&imxdi->irq_lock, flags); in di_int_enable()
454 static void di_int_disable(struct imxdi_dev *imxdi, u32 intr) in di_int_disable() argument
458 spin_lock_irqsave(&imxdi->irq_lock, flags); in di_int_disable()
459 writel(readl(imxdi->ioaddr + DIER) & ~intr, in di_int_disable()
460 imxdi->ioaddr + DIER); in di_int_disable()
461 spin_unlock_irqrestore(&imxdi->irq_lock, flags); in di_int_disable()
471 static void clear_write_error(struct imxdi_dev *imxdi) in clear_write_error() argument
475 dev_warn(&imxdi->pdev->dev, "WARNING: Register write error!\n"); in clear_write_error()
478 writel(DSR_WEF, imxdi->ioaddr + DSR); in clear_write_error()
482 if ((readl(imxdi->ioaddr + DSR) & DSR_WEF) == 0) in clear_write_error()
486 dev_err(&imxdi->pdev->dev, in clear_write_error()
496 static int di_write_wait(struct imxdi_dev *imxdi, u32 val, int reg) in di_write_wait() argument
502 mutex_lock(&imxdi->write_mutex); in di_write_wait()
505 di_int_enable(imxdi, DIER_WCIE); in di_write_wait()
507 imxdi->dsr = 0; in di_write_wait()
510 writel(val, imxdi->ioaddr + reg); in di_write_wait()
513 ret = wait_event_interruptible_timeout(imxdi->write_wait, in di_write_wait()
514 imxdi->dsr & (DSR_WCF | DSR_WEF), msecs_to_jiffies(1)); in di_write_wait()
519 dev_warn(&imxdi->pdev->dev, in di_write_wait()
525 if (imxdi->dsr & DSR_WEF) { in di_write_wait()
526 clear_write_error(imxdi); in di_write_wait()
531 mutex_unlock(&imxdi->write_mutex); in di_write_wait()
541 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_read_time() local
544 now = readl(imxdi->ioaddr + DTCMR); in dryice_rtc_read_time()
556 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_set_time() local
560 dcr = readl(imxdi->ioaddr + DCR); in dryice_rtc_set_time()
561 dsr = readl(imxdi->ioaddr + DSR); in dryice_rtc_set_time()
566 di_what_is_to_be_done(imxdi, "battery"); in dryice_rtc_set_time()
571 di_what_is_to_be_done(imxdi, "main"); in dryice_rtc_set_time()
577 rc = di_write_wait(imxdi, 0, DTCLR); in dryice_rtc_set_time()
581 rc = di_write_wait(imxdi, rtc_tm_to_time64(tm), DTCMR); in dryice_rtc_set_time()
585 return di_write_wait(imxdi, readl(imxdi->ioaddr + DCR) | DCR_TCE, DCR); in dryice_rtc_set_time()
591 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_alarm_irq_enable() local
594 di_int_enable(imxdi, DIER_CAIE); in dryice_rtc_alarm_irq_enable()
596 di_int_disable(imxdi, DIER_CAIE); in dryice_rtc_alarm_irq_enable()
607 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_read_alarm() local
610 dcamr = readl(imxdi->ioaddr + DCAMR); in dryice_rtc_read_alarm()
614 alarm->enabled = (readl(imxdi->ioaddr + DIER) & DIER_CAIE) != 0; in dryice_rtc_read_alarm()
617 mutex_lock(&imxdi->write_mutex); in dryice_rtc_read_alarm()
620 alarm->pending = (readl(imxdi->ioaddr + DSR) & DSR_CAF) != 0; in dryice_rtc_read_alarm()
622 mutex_unlock(&imxdi->write_mutex); in dryice_rtc_read_alarm()
632 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_set_alarm() local
636 rc = di_write_wait(imxdi, rtc_tm_to_time64(&alarm->time), DCAMR); in dryice_rtc_set_alarm()
641 di_int_enable(imxdi, DIER_CAIE); /* enable alarm intr */ in dryice_rtc_set_alarm()
643 di_int_disable(imxdi, DIER_CAIE); /* disable alarm intr */ in dryice_rtc_set_alarm()
661 struct imxdi_dev *imxdi = dev_id; in dryice_irq() local
665 dier = readl(imxdi->ioaddr + DIER); in dryice_irq()
666 dsr = readl(imxdi->ioaddr + DSR); in dryice_irq()
679 di_int_disable(imxdi, DIER_SVIE); in dryice_irq()
681 di_report_tamper_info(imxdi, dsr); in dryice_irq()
691 if (list_empty_careful(&imxdi->write_wait.head)) in dryice_irq()
697 di_int_disable(imxdi, DIER_WCIE); in dryice_irq()
700 imxdi->dsr |= dsr; in dryice_irq()
702 wake_up_interruptible(&imxdi->write_wait); in dryice_irq()
712 di_int_disable(imxdi, DIER_CAIE); in dryice_irq()
715 schedule_work(&imxdi->work); in dryice_irq()
728 struct imxdi_dev *imxdi = container_of(work, in dryice_work() local
732 di_write_wait(imxdi, DSR_CAF, DSR); in dryice_work()
735 rtc_update_irq(imxdi->rtc, 1, RTC_AF | RTC_IRQF); in dryice_work()
743 struct imxdi_dev *imxdi; in dryice_rtc_probe() local
747 imxdi = devm_kzalloc(&pdev->dev, sizeof(*imxdi), GFP_KERNEL); in dryice_rtc_probe()
748 if (!imxdi) in dryice_rtc_probe()
751 imxdi->pdev = pdev; in dryice_rtc_probe()
753 imxdi->ioaddr = devm_platform_ioremap_resource(pdev, 0); in dryice_rtc_probe()
754 if (IS_ERR(imxdi->ioaddr)) in dryice_rtc_probe()
755 return PTR_ERR(imxdi->ioaddr); in dryice_rtc_probe()
757 spin_lock_init(&imxdi->irq_lock); in dryice_rtc_probe()
770 init_waitqueue_head(&imxdi->write_wait); in dryice_rtc_probe()
772 INIT_WORK(&imxdi->work, dryice_work); in dryice_rtc_probe()
774 mutex_init(&imxdi->write_mutex); in dryice_rtc_probe()
776 imxdi->rtc = devm_rtc_allocate_device(&pdev->dev); in dryice_rtc_probe()
777 if (IS_ERR(imxdi->rtc)) in dryice_rtc_probe()
778 return PTR_ERR(imxdi->rtc); in dryice_rtc_probe()
780 imxdi->clk = devm_clk_get(&pdev->dev, NULL); in dryice_rtc_probe()
781 if (IS_ERR(imxdi->clk)) in dryice_rtc_probe()
782 return PTR_ERR(imxdi->clk); in dryice_rtc_probe()
783 rc = clk_prepare_enable(imxdi->clk); in dryice_rtc_probe()
792 writel(0, imxdi->ioaddr + DIER); in dryice_rtc_probe()
794 rc = di_handle_state(imxdi); in dryice_rtc_probe()
799 IRQF_SHARED, pdev->name, imxdi); in dryice_rtc_probe()
806 IRQF_SHARED, pdev->name, imxdi); in dryice_rtc_probe()
812 platform_set_drvdata(pdev, imxdi); in dryice_rtc_probe()
814 imxdi->rtc->ops = &dryice_rtc_ops; in dryice_rtc_probe()
815 imxdi->rtc->range_max = U32_MAX; in dryice_rtc_probe()
817 rc = rtc_register_device(imxdi->rtc); in dryice_rtc_probe()
824 clk_disable_unprepare(imxdi->clk); in dryice_rtc_probe()
831 struct imxdi_dev *imxdi = platform_get_drvdata(pdev); in dryice_rtc_remove() local
833 flush_work(&imxdi->work); in dryice_rtc_remove()
836 writel(0, imxdi->ioaddr + DIER); in dryice_rtc_remove()
838 clk_disable_unprepare(imxdi->clk); in dryice_rtc_remove()