s32 cad_dtmf_init(struct cad_func_tbl_type **func_tbl) { u32 i; s32 rc = CAD_RES_SUCCESS; struct q6dtmf_session *session = NULL; static struct cad_func_tbl_type vtable = { cad_dtmf_open, cad_dtmf_close, NULL, NULL, cad_dtmf_ioctl }; memset(&q6_dtmf_data, 0, sizeof(q6_dtmf_data)); for (i = 0; i < CAD_DTMF_SESSION_MAX; i++) { session = kmalloc(sizeof(*session), GFP_KERNEL); if (session == NULL) { pr_err("Could not allocate memory for the session\n"); cad_dtmf_dinit(); rc = CAD_RES_FAILURE; goto done; } memset(session, 0, sizeof(*session)); if (cad_dtmf_session_init(session) != CAD_RES_SUCCESS) { pr_err("Call to dtmf session init failed\n"); cad_dtmf_dinit(); rc = CAD_RES_FAILURE; goto done; } session->next = q6_dtmf_data.free_session_list; q6_dtmf_data.free_session_list = session; } *func_tbl = &vtable; done: return rc; }
static void __exit cad_exit(void) { u8 ref_count; s32 i = 0; ref_count = release_ref_count(); if (ref_count == 0) { D("%s: %s called\n", MODULE_NAME, __func__); mutex_unlock(&cad.sync); while (i < CAD_MAX_SESSION) mutex_unlock(&cad.session_info[i++].sync); (void)cad_audio_dec_dinit(); (void)cad_audio_enc_dinit(); (void)cad_ard_dinit(); (void)cad_volume_dinit(); (void)cad_dtmf_dinit(); (void)cad_filter_eq_dinit(); iounmap(g_audio_mem); gpio_free(cad.aux_pcm.dout); gpio_free(cad.aux_pcm.din); gpio_free(cad.aux_pcm.syncout); gpio_free(cad.aux_pcm.clkin_a); gpio_free(cad.i2s_gpios.sdac_din); gpio_free(cad.i2s_gpios.sdac_dout); gpio_free(cad.i2s_gpios.sdac_wsout); gpio_free(cad.i2s_gpios.cc_i2s_clk); gpio_free(cad.i2s_gpios.audio_master_clkout); } else { pr_err("CAD not De-Initialized as cad_ref_ct = %d\n", cad_singleton.cad_ref_ct); } }