Lines Matching refs:imxdi

180 static void di_write_busy_wait(const struct imxdi_dev *imxdi, u32 val,  in di_write_busy_wait()  argument
184 writel(val, imxdi->ioaddr + reg); in di_write_busy_wait()
193 static void di_report_tamper_info(struct imxdi_dev *imxdi, u32 dsr) in di_report_tamper_info() argument
197 dtcr = readl(imxdi->ioaddr + DTCR); in di_report_tamper_info()
199 dev_emerg(&imxdi->pdev->dev, "DryIce tamper event detected\n"); in di_report_tamper_info()
202 dev_emerg(&imxdi->pdev->dev, "%sVoltage Tamper Event\n", in di_report_tamper_info()
206 dev_emerg(&imxdi->pdev->dev, "%s32768 Hz Clock Tamper Event\n", in di_report_tamper_info()
210 dev_emerg(&imxdi->pdev->dev, "%sTemperature Tamper Event\n", in di_report_tamper_info()
214 dev_emerg(&imxdi->pdev->dev, in di_report_tamper_info()
219 dev_emerg(&imxdi->pdev->dev, "%sExternal Boot Tamper Event\n", in di_report_tamper_info()
223 dev_emerg(&imxdi->pdev->dev, "%sExternal Tamper A Event\n", in di_report_tamper_info()
227 dev_emerg(&imxdi->pdev->dev, "%sExternal Tamper B Event\n", in di_report_tamper_info()
231 dev_emerg(&imxdi->pdev->dev, "%sWire-mesh Tamper Event\n", in di_report_tamper_info()
235 dev_emerg(&imxdi->pdev->dev, in di_report_tamper_info()
240 dev_emerg(&imxdi->pdev->dev, "%sTimer-counter Overflow Event\n", in di_report_tamper_info()
244 static void di_what_is_to_be_done(struct imxdi_dev *imxdi, in di_what_is_to_be_done() argument
247 …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()
251 static int di_handle_failure_state(struct imxdi_dev *imxdi, u32 dsr) in di_handle_failure_state() argument
255 dev_dbg(&imxdi->pdev->dev, "DSR register reports: %08X\n", dsr); in di_handle_failure_state()
258 di_report_tamper_info(imxdi, dsr); in di_handle_failure_state()
260 dcr = readl(imxdi->ioaddr + DCR); in di_handle_failure_state()
264 di_what_is_to_be_done(imxdi, "battery"); in di_handle_failure_state()
271 di_what_is_to_be_done(imxdi, "main"); in di_handle_failure_state()
276 static int di_handle_valid_state(struct imxdi_dev *imxdi, u32 dsr) in di_handle_valid_state() argument
279 di_write_busy_wait(imxdi, DCAMR_UNSET, DCAMR); in di_handle_valid_state()
280 di_write_busy_wait(imxdi, 0, DCALR); in di_handle_valid_state()
284 di_write_busy_wait(imxdi, DSR_CAF, DSR); in di_handle_valid_state()
289 static int di_handle_invalid_state(struct imxdi_dev *imxdi, u32 dsr) in di_handle_invalid_state() argument
297 di_write_busy_wait(imxdi, 0x00000000, DTCR); in di_handle_invalid_state()
299 di_write_busy_wait(imxdi, DCR_TDCSL, DCR); in di_handle_invalid_state()
301 sec = readl(imxdi->ioaddr + DTCMR); in di_handle_invalid_state()
303 dev_warn(&imxdi->pdev->dev, in di_handle_invalid_state()
310 dcr = readl(imxdi->ioaddr + DCR); in di_handle_invalid_state()
314 di_what_is_to_be_done(imxdi, "battery"); in di_handle_invalid_state()
318 di_what_is_to_be_done(imxdi, "main"); in di_handle_invalid_state()
334 di_write_busy_wait(imxdi, DSR_NVF, DSR); in di_handle_invalid_state()
336 di_write_busy_wait(imxdi, DSR_TCO, DSR); in di_handle_invalid_state()
338 di_write_busy_wait(imxdi, dcr | DCR_TCE, DCR); in di_handle_invalid_state()
340 di_write_busy_wait(imxdi, sec, DTCMR); in di_handle_invalid_state()
343 return di_handle_valid_state(imxdi, __raw_readl(imxdi->ioaddr + DSR)); in di_handle_invalid_state()
346 static int di_handle_invalid_and_failure_state(struct imxdi_dev *imxdi, u32 dsr) in di_handle_invalid_and_failure_state() argument
357 dcr = __raw_readl(imxdi->ioaddr + DCR); in di_handle_invalid_and_failure_state()
370 di_what_is_to_be_done(imxdi, "battery"); in di_handle_invalid_and_failure_state()
375 di_what_is_to_be_done(imxdi, "main"); in di_handle_invalid_and_failure_state()
381 di_write_busy_wait(imxdi, 0x00000000, DTCR); in di_handle_invalid_and_failure_state()
384 di_write_busy_wait(imxdi, dsr & (DSR_WTD | DSR_ETBD | DSR_ETAD | in di_handle_invalid_and_failure_state()
388 dsr = readl(imxdi->ioaddr + DSR); in di_handle_invalid_and_failure_state()
391 dev_warn(&imxdi->pdev->dev, in di_handle_invalid_and_failure_state()
400 di_write_busy_wait(imxdi, DSR_SVF, DSR); in di_handle_invalid_and_failure_state()
403 dsr = readl(imxdi->ioaddr + DSR); in di_handle_invalid_and_failure_state()
405 dev_crit(&imxdi->pdev->dev, in di_handle_invalid_and_failure_state()
408 di_what_is_to_be_done(imxdi, "battery"); in di_handle_invalid_and_failure_state()
416 return di_handle_invalid_state(imxdi, dsr); in di_handle_invalid_and_failure_state()
419 static int di_handle_state(struct imxdi_dev *imxdi) in di_handle_state() argument
424 dsr = readl(imxdi->ioaddr + DSR); in di_handle_state()
428 dev_warn(&imxdi->pdev->dev, "Invalid stated unit detected\n"); in di_handle_state()
429 rc = di_handle_invalid_state(imxdi, dsr); in di_handle_state()
432 dev_warn(&imxdi->pdev->dev, "Failure stated unit detected\n"); in di_handle_state()
433 rc = di_handle_failure_state(imxdi, dsr); in di_handle_state()
436 dev_warn(&imxdi->pdev->dev, in di_handle_state()
438 rc = di_handle_invalid_and_failure_state(imxdi, dsr); in di_handle_state()
441 dev_notice(&imxdi->pdev->dev, "Unlocked unit detected\n"); in di_handle_state()
442 rc = di_handle_valid_state(imxdi, dsr); in di_handle_state()
451 static void di_int_enable(struct imxdi_dev *imxdi, u32 intr) in di_int_enable() argument
455 spin_lock_irqsave(&imxdi->irq_lock, flags); in di_int_enable()
456 writel(readl(imxdi->ioaddr + DIER) | intr, in di_int_enable()
457 imxdi->ioaddr + DIER); in di_int_enable()
458 spin_unlock_irqrestore(&imxdi->irq_lock, flags); in di_int_enable()
464 static void di_int_disable(struct imxdi_dev *imxdi, u32 intr) in di_int_disable() argument
468 spin_lock_irqsave(&imxdi->irq_lock, flags); in di_int_disable()
469 writel(readl(imxdi->ioaddr + DIER) & ~intr, in di_int_disable()
470 imxdi->ioaddr + DIER); in di_int_disable()
471 spin_unlock_irqrestore(&imxdi->irq_lock, flags); in di_int_disable()
481 static void clear_write_error(struct imxdi_dev *imxdi) in clear_write_error() argument
485 dev_warn(&imxdi->pdev->dev, "WARNING: Register write error!\n"); in clear_write_error()
488 writel(DSR_WEF, imxdi->ioaddr + DSR); in clear_write_error()
492 if ((readl(imxdi->ioaddr + DSR) & DSR_WEF) == 0) in clear_write_error()
496 dev_err(&imxdi->pdev->dev, in clear_write_error()
506 static int di_write_wait(struct imxdi_dev *imxdi, u32 val, int reg) in di_write_wait() argument
512 mutex_lock(&imxdi->write_mutex); in di_write_wait()
515 di_int_enable(imxdi, DIER_WCIE); in di_write_wait()
517 imxdi->dsr = 0; in di_write_wait()
520 writel(val, imxdi->ioaddr + reg); in di_write_wait()
523 ret = wait_event_interruptible_timeout(imxdi->write_wait, in di_write_wait()
524 imxdi->dsr & (DSR_WCF | DSR_WEF), msecs_to_jiffies(1)); in di_write_wait()
529 dev_warn(&imxdi->pdev->dev, in di_write_wait()
535 if (imxdi->dsr & DSR_WEF) { in di_write_wait()
536 clear_write_error(imxdi); in di_write_wait()
541 mutex_unlock(&imxdi->write_mutex); in di_write_wait()
551 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_read_time() local
554 now = readl(imxdi->ioaddr + DTCMR); in dryice_rtc_read_time()
566 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_set_mmss() local
570 dcr = readl(imxdi->ioaddr + DCR); in dryice_rtc_set_mmss()
571 dsr = readl(imxdi->ioaddr + DSR); in dryice_rtc_set_mmss()
576 di_what_is_to_be_done(imxdi, "battery"); in dryice_rtc_set_mmss()
581 di_what_is_to_be_done(imxdi, "main"); in dryice_rtc_set_mmss()
587 rc = di_write_wait(imxdi, 0, DTCLR); in dryice_rtc_set_mmss()
591 rc = di_write_wait(imxdi, secs, DTCMR); in dryice_rtc_set_mmss()
595 return di_write_wait(imxdi, readl(imxdi->ioaddr + DCR) | DCR_TCE, DCR); in dryice_rtc_set_mmss()
601 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_alarm_irq_enable() local
604 di_int_enable(imxdi, DIER_CAIE); in dryice_rtc_alarm_irq_enable()
606 di_int_disable(imxdi, DIER_CAIE); in dryice_rtc_alarm_irq_enable()
617 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_read_alarm() local
620 dcamr = readl(imxdi->ioaddr + DCAMR); in dryice_rtc_read_alarm()
624 alarm->enabled = (readl(imxdi->ioaddr + DIER) & DIER_CAIE) != 0; in dryice_rtc_read_alarm()
627 mutex_lock(&imxdi->write_mutex); in dryice_rtc_read_alarm()
630 alarm->pending = (readl(imxdi->ioaddr + DSR) & DSR_CAF) != 0; in dryice_rtc_read_alarm()
632 mutex_unlock(&imxdi->write_mutex); in dryice_rtc_read_alarm()
642 struct imxdi_dev *imxdi = dev_get_drvdata(dev); in dryice_rtc_set_alarm() local
652 now = readl(imxdi->ioaddr + DTCMR); in dryice_rtc_set_alarm()
657 rc = di_write_wait(imxdi, (u32)alarm_time, DCAMR); in dryice_rtc_set_alarm()
662 di_int_enable(imxdi, DIER_CAIE); /* enable alarm intr */ in dryice_rtc_set_alarm()
664 di_int_disable(imxdi, DIER_CAIE); /* disable alarm intr */ in dryice_rtc_set_alarm()
682 struct imxdi_dev *imxdi = dev_id; in dryice_irq() local
686 dier = readl(imxdi->ioaddr + DIER); in dryice_irq()
687 dsr = readl(imxdi->ioaddr + DSR); in dryice_irq()
700 di_int_disable(imxdi, DIER_SVIE); in dryice_irq()
702 di_report_tamper_info(imxdi, dsr); in dryice_irq()
712 if (list_empty_careful(&imxdi->write_wait.head)) in dryice_irq()
718 di_int_disable(imxdi, DIER_WCIE); in dryice_irq()
721 imxdi->dsr |= dsr; in dryice_irq()
723 wake_up_interruptible(&imxdi->write_wait); in dryice_irq()
733 di_int_disable(imxdi, DIER_CAIE); in dryice_irq()
736 schedule_work(&imxdi->work); in dryice_irq()
749 struct imxdi_dev *imxdi = container_of(work, in dryice_work() local
753 di_write_wait(imxdi, DSR_CAF, DSR); in dryice_work()
756 rtc_update_irq(imxdi->rtc, 1, RTC_AF | RTC_IRQF); in dryice_work()
765 struct imxdi_dev *imxdi; in dryice_rtc_probe() local
769 imxdi = devm_kzalloc(&pdev->dev, sizeof(*imxdi), GFP_KERNEL); in dryice_rtc_probe()
770 if (!imxdi) in dryice_rtc_probe()
773 imxdi->pdev = pdev; in dryice_rtc_probe()
776 imxdi->ioaddr = devm_ioremap_resource(&pdev->dev, res); in dryice_rtc_probe()
777 if (IS_ERR(imxdi->ioaddr)) in dryice_rtc_probe()
778 return PTR_ERR(imxdi->ioaddr); in dryice_rtc_probe()
780 spin_lock_init(&imxdi->irq_lock); in dryice_rtc_probe()
793 init_waitqueue_head(&imxdi->write_wait); in dryice_rtc_probe()
795 INIT_WORK(&imxdi->work, dryice_work); in dryice_rtc_probe()
797 mutex_init(&imxdi->write_mutex); in dryice_rtc_probe()
799 imxdi->clk = devm_clk_get(&pdev->dev, NULL); in dryice_rtc_probe()
800 if (IS_ERR(imxdi->clk)) in dryice_rtc_probe()
801 return PTR_ERR(imxdi->clk); in dryice_rtc_probe()
802 rc = clk_prepare_enable(imxdi->clk); in dryice_rtc_probe()
811 writel(0, imxdi->ioaddr + DIER); in dryice_rtc_probe()
813 rc = di_handle_state(imxdi); in dryice_rtc_probe()
818 IRQF_SHARED, pdev->name, imxdi); in dryice_rtc_probe()
825 IRQF_SHARED, pdev->name, imxdi); in dryice_rtc_probe()
831 platform_set_drvdata(pdev, imxdi); in dryice_rtc_probe()
832 imxdi->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, in dryice_rtc_probe()
834 if (IS_ERR(imxdi->rtc)) { in dryice_rtc_probe()
835 rc = PTR_ERR(imxdi->rtc); in dryice_rtc_probe()
842 clk_disable_unprepare(imxdi->clk); in dryice_rtc_probe()
849 struct imxdi_dev *imxdi = platform_get_drvdata(pdev); in dryice_rtc_remove() local
851 flush_work(&imxdi->work); in dryice_rtc_remove()
854 writel(0, imxdi->ioaddr + DIER); in dryice_rtc_remove()
856 clk_disable_unprepare(imxdi->clk); in dryice_rtc_remove()