/* * module init function */ static int __init hps_init(void) { int r = 0; hps_warn("hps_init\n"); //hps_cpu_init() must before hps_core_init() r = hps_cpu_init(); if (r) hps_error("hps_cpu_init fail(%d)\n", r); r = hps_core_init(); if (r) hps_error("hps_core_init fail(%d)\n", r); r = hps_procfs_init(); if (r) hps_error("hps_procfs_init fail(%d)\n", r); #ifdef CONFIG_HAS_EARLYSUSPEND register_early_suspend(&hps_ctxt.es_handler); #endif //#ifdef CONFIG_HAS_EARLYSUSPEND r = platform_device_register(&hotplug_strategy_pdev); if (r) hps_error("platform_device_register fail(%d)\n", r); r = platform_driver_register(&hps_ctxt.pdrv); if (r) hps_error("platform_driver_register fail(%d)\n", r); hps_ctxt.init_state = INIT_STATE_DONE; return r; }
/* * init */ int hps_core_init(void) { int r = 0; hps_warn("hps_core_init\n"); if (hps_ctxt.periodical_by == HPS_PERIODICAL_BY_TIMER) { /*init timer */ init_timer(&hps_ctxt.tmr_list); /*init_timer_deferrable(&hps_ctxt.tmr_list); */ hps_ctxt.tmr_list.function = (void *)&_hps_timer_callback; hps_ctxt.tmr_list.data = (unsigned long)&hps_ctxt; hps_ctxt.tmr_list.expires = jiffies + msecs_to_jiffies(HPS_TIMER_INTERVAL_MS); add_timer(&hps_ctxt.tmr_list); } else if (hps_ctxt.periodical_by == HPS_PERIODICAL_BY_HR_TIMER) { ktime = ktime_set(0, MS_TO_NS(HPS_TIMER_INTERVAL_MS)); /*init Hrtimer */ hrtimer_init(&hps_ctxt.hr_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); hps_ctxt.hr_timer.function = (void *)&_hps_timer_callback; hrtimer_start(&hps_ctxt.hr_timer, ktime, HRTIMER_MODE_REL); } /* init and start task */ r = hps_task_start(); if (r) hps_error("hps_task_start fail(%d)\n", r); return r; }
/* * module exit function */ static void __exit hps_exit(void) { int r = 0; hps_warn("hps_exit\n"); hps_ctxt.init_state = INIT_STATE_NOT_READY; r = hps_core_deinit(); if (r) hps_error("hps_core_deinit fail(%d)\n", r); }
/* * deinit */ int hps_core_deinit(void) { int r = 0; hps_warn("hps_core_deinit\n"); if (hps_ctxt.periodical_by == HPS_PERIODICAL_BY_TIMER) { /*deinit timer */ del_timer_sync(&hps_ctxt.tmr_list); } else if (hps_ctxt.periodical_by == HPS_PERIODICAL_BY_HR_TIMER) { /*deinit timer */ r = hrtimer_cancel(&hps_ctxt.hr_timer); if (r) hps_error("hps hr timer delete error!\n"); } hps_task_stop(); return r; }