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;
}
Пример #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);
	}
}