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