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