/* rtc init check */ int rtc_init(u8 recover) { int ret; rtc_info("recovery: %d\n", recover); /* write powerkeys to enable rtc functions */ if (!rtc_powerkey_init()) { ret = -RTC_STATUS_POWERKEY_INIT_FAIL; goto err; } /* write interface unlock need to be set after powerkey match */ if (!rtc_writeif_unlock()) { ret = -RTC_STATUS_WRITEIF_UNLOCK_FAIL; goto err; } /* using dcxo 32K clock */ if (!rtc_enable_dcxo()) { ret = -RTC_STATUS_OSC_SETTING_FAIL; goto err; } if (recover) mdelay(20); if (!rtc_gpio_init()) { ret = -RTC_STATUS_GPIO_INIT_FAIL; goto err; } if (!rtc_hw_init()) { ret = -RTC_STATUS_HW_INIT_FAIL; goto err; } if (!rtc_reg_init()) { ret = -RTC_STATUS_REG_INIT_FAIL; goto err; } if (!rtc_lpd_init()) { ret = -RTC_STATUS_LPD_INIT_FAIL; goto err; } /* After lpd init, powerkeys need to be written again to enable * low power detect function. */ if (!rtc_powerkey_init()) { ret = -RTC_STATUS_POWERKEY_INIT_FAIL; goto err; } return RTC_STATUS_OK; err: rtc_info("init fail: ret=%d\n", ret); return ret; }
static int __devinit sunxi_rtc_probe(struct platform_device *pdev) { struct rtc_device *rtc; int ret; rtc_reg_list = (rtc_alarm_reg *)(SW_VA_TIMERC_IO_BASE + LOSC_CTRL_REG_OFF); /* init rtc hardware */ ret = rtc_hw_init(); if(ret) { pr_err("%s(%d) err: rtc_probe_init failed\n", __func__, __LINE__); return ret; } device_init_wakeup(&pdev->dev, 1); /* register rtc device */ rtc = rtc_device_register("rtc", &pdev->dev, &sunxi_rtcops, THIS_MODULE); if(IS_ERR(rtc)) { dev_err(&pdev->dev, "err: cannot attach rtc\n"); ret = PTR_ERR(rtc); return ret; } #ifdef A20_ALARM /* register alarm irq */ ret = request_irq(sunxi_rtc_alarmno, sunxi_rtc_alarmirq, IRQF_DISABLED, "sunxi-rtc alarm", rtc); if(ret) { dev_err(&pdev->dev, "IRQ%d error %d\n", sunxi_rtc_alarmno, ret); rtc_device_unregister(rtc); return ret; } #endif platform_set_drvdata(pdev, rtc); return 0; }