static void fiq_glue_setup_helper(void *info) { struct fiq_glue_handler *handler = info; fiq_glue_setup(handler->fiq, handler, __get_cpu_var(fiq_stack) + THREAD_START_SP, fiq_return_handler); }
void fiq_glue_resume(void) { if (!current_handler) return; fiq_glue_setup(current_handler->fiq, current_handler, __get_cpu_var(fiq_stack) + THREAD_START_SP); if (current_handler->resume) current_handler->resume(current_handler); }
int msm_fiq_set_handler(void (*func)(void *data, void *regs), void *data) { unsigned long flags; int ret = -ENOMEM; local_irq_save(flags); if (fiq_func == 0) { fiq_func = func; fiq_glue_setup(func, data, fiq_stack + 255); set_fiq_handler(&fiq_glue, (&fiq_glue_end - &fiq_glue)); ret = 0; } local_irq_restore(flags); return ret; }
int msm_fiq_set_handler(void (*func)(void *data, void *regs, void *svc_sp), void *data) { unsigned long flags; int ret = -ENOMEM; if (!fiq_stack) fiq_stack = kzalloc(THREAD_SIZE, GFP_KERNEL); if (!fiq_stack) return -ENOMEM; local_irq_save(flags); if (fiq_func == 0) { fiq_func = func; fiq_data = data; fiq_glue_setup(func, data, fiq_stack + THREAD_START_SP); set_fiq_handler(&fiq_glue, (&fiq_glue_end - &fiq_glue)); ret = 0; } local_irq_restore(flags); return ret; }
void msm_fiq_exit_sleep(void) { if (fiq_stack) fiq_glue_setup(fiq_func, fiq_data, fiq_stack + THREAD_START_SP); }