int stmmac_close_ext_timer(void) { rtc_irq_set_state(stmmac_rtc, &stmmac_task, 0); rtc_irq_unregister(stmmac_rtc, &stmmac_task); rtc_class_close(stmmac_rtc); return 0; }
int stmmac_open_ext_timer(struct net_device *dev, struct stmmac_timer *tm) { stmmac_task.private_data = dev; stmmac_task.func = stmmac_timer_handler; stmmac_rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE); if (stmmac_rtc == NULL) { pr_error("open rtc device failed\n"); return -ENODEV; } rtc_irq_register(stmmac_rtc, &stmmac_task); /* Periodic mode is not supported */ if ((rtc_irq_set_freq(stmmac_rtc, &stmmac_task, tm->freq) < 0)) { pr_error("set periodic failed\n"); rtc_irq_unregister(stmmac_rtc, &stmmac_task); rtc_class_close(stmmac_rtc); return -1; } STMMAC_TIMER_MSG(CONFIG_RTC_HCTOSYS_DEVICE, tm->freq); tm->timer_start = stmmac_rtc_start; tm->timer_stop = stmmac_rtc_stop; return 0; }
static void alarmtimer_rtc_remove_device(struct device *dev, struct class_interface *class_intf) { if (rtcdev && dev == &rtcdev->dev) { rtc_irq_unregister(rtcdev, &alarmtimer_rtc_task); rtcdev = NULL; } }