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);