s32 cad_audio_enc_init(struct cad_func_tbl_type **func_ptr_tbl) { u32 i; struct q6_enc_session_data *node = NULL; static struct cad_func_tbl_type vtable = { cad_q6enc_open, cad_q6enc_close, cad_q6enc_write, cad_q6enc_read, cad_q6enc_ioctl }; memset(&q6_enc_data, 0, sizeof(q6_enc_data)); /* create session list */ for (i = 0; i < Q6_ENC_MAX_SESSION_COUNT; i++) { node = kmalloc(sizeof(struct q6_enc_session_data), GFP_KERNEL); if (node == NULL) { cad_audio_enc_dinit(); return CAD_RES_FAILURE; } memset(node, 0, sizeof(struct q6_enc_session_data)); if (cad_q6enc_session_init(node) != CAD_RES_SUCCESS) { cad_audio_enc_dinit(); return CAD_RES_FAILURE; } node->next = q6_enc_data.q6_enc_free_sessions; q6_enc_data.q6_enc_free_sessions = node; } *func_ptr_tbl = &vtable; return CAD_RES_SUCCESS; }
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); } }