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;
}
Example #2
0
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);
	}
}