static void sprd_rtc_shutdown(struct platform_device *pdev) { sprd_rtc_set_bit_spg_counter(SPG_CNT_8SECS_RESET, 0); #if defined(CONFIG_RTC_CHN_ALARM_BOOT) sprd_rtc_set_alarm(&pdev->dev, &autoboot_alm_exit); sprd_rtc_set_bit_spg_counter(SPG_CNT_ALARM_BOOT, 1); #endif }
static int sprd_rtc_set_alarm_sec(unsigned long secs) { unsigned sec, min, hour, day; unsigned long temp; unsigned set_mask = 0, int_rsts; int i = 0; sec = secs % 60; temp = (secs - sec)/60; min = temp%60; temp = (temp - min)/60; hour = temp%24; temp = (temp - hour)/24; day = temp; sci_adi_set(ANA_RTC_INT_CLR, RTC_ALM_TIME_MASK); sci_adi_raw_write(ANA_RTC_SEC_ALM, sec); set_mask |= RTC_SEC_ALM_ACK_BIT; sci_adi_raw_write(ANA_RTC_MIN_ALM, min); set_mask |= RTC_MIN_ALM_ACK_BIT; sci_adi_raw_write(ANA_RTC_HOUR_ALM, hour); set_mask |= RTC_HOUR_ALM_ACK_BIT; sci_adi_raw_write(ANA_RTC_DAY_ALM, day); set_mask |= RTC_DAY_ALM_ACK_BIT; /* * wait till all update done */ do{ int_rsts = sci_adi_read(ANA_RTC_INT_RSTS) & RTC_ALM_TIME_MASK; if(set_mask == int_rsts) break; if(i < SPRD_RTC_SET_MAX){ msleep(1); i++; }else{ return 1; } }while(1); sci_adi_set(ANA_RTC_INT_CLR, RTC_ALM_TIME_MASK); #if defined(CONFIG_RTC_CHN_ALARM_BOOT) sprd_rtc_set_bit_spg_counter(SPG_CNT_ALARM_BOOT, 0); #endif return 0; }
static void sprd_rtc_shutdown(struct platform_device *pdev) { sprd_rtc_set_bit_spg_counter(SPG_CNT_8SECS_RESET, 0); }
static int sprd_rtc_probe(struct platform_device *plat_dev) { int err = -ENODEV; struct resource *irq; rtc_data = kzalloc(sizeof(*rtc_data), GFP_KERNEL); if(IS_ERR(rtc_data)){ err = PTR_ERR(rtc_data); return err; }; /*ensure the rtc interrupt don't be send to Adie when there's no *rtc alarm int occur. */ sci_adi_raw_write(ANA_RTC_SPG_UPD, SPRD_RTC_LOCK); /* disable all interrupt */ sci_adi_clr(ANA_RTC_INT_EN, RTC_INT_ALL_MSK); /* enable rtc device */ rtc_data->clk = clk_get(&plat_dev->dev, "ext_32k"); if (IS_ERR(rtc_data->clk)) { err = PTR_ERR(rtc_data->clk); goto kfree_data; } err = clk_enable(rtc_data->clk); if (err < 0) goto put_clk; CLEAR_RTC_INT(RTC_INT_ALL_MSK); rtc_data->rtc = rtc_device_register("sprd_rtc", &plat_dev->dev, &sprd_rtc_ops, THIS_MODULE); if (IS_ERR(rtc_data->rtc)) { err = PTR_ERR(rtc_data->rtc); goto disable_clk; } irq = platform_get_resource(plat_dev, IORESOURCE_IRQ, 0); if(unlikely(!irq)) { dev_err(&plat_dev->dev, "no irq resource specified\n"); goto unregister_rtc; } rtc_data->irq_no = irq->start; platform_set_drvdata(plat_dev, rtc_data); err = request_irq(rtc_data->irq_no, rtc_interrupt_handler, 0, "sprd_rtc", rtc_data->rtc); if(err){ printk(KERN_ERR "RTC regist irq error\n"); goto unregister_rtc; } sprd_creat_caliberate_attr(rtc_data->rtc->dev); sprd_rtc_hwrst_set(1); sprd_rtc_set_bit_spg_counter(SPG_CNT_8SECS_RESET, 1); sprd_rtc_check_power_down(&plat_dev->dev); sprd_rtc_open(&plat_dev->dev);//test return 0; unregister_rtc: rtc_device_unregister(rtc_data->rtc); disable_clk: clk_disable(rtc_data->clk); put_clk: clk_put(rtc_data->clk); kfree_data: kfree(rtc_data); return err; }