void hal_rtc_get_alarm(struct rtc_time *tm, struct rtc_wkalrm *alm)
{
	u16 irqen, pdn2;

	irqen = rtc_read(RTC_IRQ_EN);
	hal_rtc_get_alarm_time(tm);
	pdn2 = rtc_read(RTC_PDN2);
	alm->enabled = !!(irqen & RTC_IRQ_EN_AL);
	alm->pending = !!(pdn2 & RTC_PDN2_PWRON_ALARM);	/* return Power-On Alarm bit */
}
void hal_rtc_get_pwron_alarm(struct rtc_time *tm, struct rtc_wkalrm *alm)
{
	u16 pdn1, pdn2;


	pdn1 = rtc_read(RTC_PDN1);
	pdn2 = rtc_read(RTC_PDN2);

	alm->enabled = (pdn1 & RTC_PDN1_PWRON_TIME ? (pdn2 & RTC_PDN2_PWRON_LOGO ? 3 : 2) : 0);
	alm->pending = !!(pdn2 & RTC_PDN2_PWRON_ALARM);	/* return Power-On Alarm bit */

	hal_rtc_get_alarm_time(tm);
}
static int rtc_ops_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
{
    unsigned long flags;
    struct rtc_time *tm = &alm->time;

    spin_lock_irqsave(&rtc_lock, flags);
    hal_rtc_get_alarm_time(tm, alm);
    spin_unlock_irqrestore(&rtc_lock, flags);

    tm->tm_year += RTC_MIN_YEAR_OFFSET;
    tm->tm_mon--;

    rtc_xinfo("read al time = %04d/%02d/%02d %02d:%02d:%02d (%d)\n",
              tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
              tm->tm_hour, tm->tm_min, tm->tm_sec, alm->enabled);

    return 0;
}