1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * cmt_speech.c - HSI CMT speech driver
4 *
5 * Copyright (C) 2008,2009,2010 Nokia Corporation. All rights reserved.
6 *
7 * Contact: Kai Vehmanen <kai.vehmanen@nokia.com>
8 * Original author: Peter Ujfalusi <peter.ujfalusi@nokia.com>
9 */
10
11#include <linux/errno.h>
12#include <linux/module.h>
13#include <linux/types.h>
14#include <linux/init.h>
15#include <linux/device.h>
16#include <linux/miscdevice.h>
17#include <linux/mm.h>
18#include <linux/slab.h>
19#include <linux/fs.h>
20#include <linux/poll.h>
21#include <linux/sched/signal.h>
22#include <linux/ioctl.h>
23#include <linux/uaccess.h>
24#include <linux/pm_qos.h>
25#include <linux/hsi/hsi.h>
26#include <linux/hsi/ssi_protocol.h>
27#include <linux/hsi/cs-protocol.h>
28
29#define CS_MMAP_SIZE	PAGE_SIZE
30
31struct char_queue {
32	struct list_head	list;
33	u32			msg;
34};
35
36struct cs_char {
37	unsigned int		opened;
38	struct hsi_client	*cl;
39	struct cs_hsi_iface	*hi;
40	struct list_head	chardev_queue;
41	struct list_head	dataind_queue;
42	int			dataind_pending;
43	/* mmap things */
44	unsigned long		mmap_base;
45	unsigned long		mmap_size;
46	spinlock_t		lock;
47	struct fasync_struct	*async_queue;
48	wait_queue_head_t	wait;
49	/* hsi channel ids */
50	int                     channel_id_cmd;
51	int                     channel_id_data;
52};
53
54#define SSI_CHANNEL_STATE_READING	1
55#define SSI_CHANNEL_STATE_WRITING	(1 << 1)
56#define SSI_CHANNEL_STATE_POLL		(1 << 2)
57#define SSI_CHANNEL_STATE_ERROR		(1 << 3)
58
59#define TARGET_MASK			0xf000000
60#define TARGET_REMOTE			(1 << CS_DOMAIN_SHIFT)
61#define TARGET_LOCAL			0
62
63/* Number of pre-allocated commands buffers */
64#define CS_MAX_CMDS		        4
65
66/*
67 * During data transfers, transactions must be handled
68 * within 20ms (fixed value in cmtspeech HSI protocol)
69 */
70#define CS_QOS_LATENCY_FOR_DATA_USEC	20000
71
72/* Timeout to wait for pending HSI transfers to complete */
73#define CS_HSI_TRANSFER_TIMEOUT_MS      500
74
75
76#define RX_PTR_BOUNDARY_SHIFT		8
77#define RX_PTR_MAX_SHIFT		(RX_PTR_BOUNDARY_SHIFT + \
78						CS_MAX_BUFFERS_SHIFT)
79struct cs_hsi_iface {
80	struct hsi_client		*cl;
81	struct hsi_client		*master;
82
83	unsigned int			iface_state;
84	unsigned int			wakeline_state;
85	unsigned int			control_state;
86	unsigned int			data_state;
87
88	/* state exposed to application */
89	struct cs_mmap_config_block	*mmap_cfg;
90
91	unsigned long			mmap_base;
92	unsigned long			mmap_size;
93
94	unsigned int			rx_slot;
95	unsigned int			tx_slot;
96
97	/* note: for security reasons, we do not trust the contents of
98	 * mmap_cfg, but instead duplicate the variables here */
99	unsigned int			buf_size;
100	unsigned int			rx_bufs;
101	unsigned int			tx_bufs;
102	unsigned int			rx_ptr_boundary;
103	unsigned int			rx_offsets[CS_MAX_BUFFERS];
104	unsigned int			tx_offsets[CS_MAX_BUFFERS];
105
106	/* size of aligned memory blocks */
107	unsigned int			slot_size;
108	unsigned int			flags;
109
110	struct list_head		cmdqueue;
111
112	struct hsi_msg			*data_rx_msg;
113	struct hsi_msg			*data_tx_msg;
114	wait_queue_head_t		datawait;
115
116	struct pm_qos_request           pm_qos_req;
117
118	spinlock_t			lock;
119};
120
121static struct cs_char cs_char_data;
122
123static void cs_hsi_read_on_control(struct cs_hsi_iface *hi);
124static void cs_hsi_read_on_data(struct cs_hsi_iface *hi);
125
126static inline void rx_ptr_shift_too_big(void)
127{
128	BUILD_BUG_ON((1LLU << RX_PTR_MAX_SHIFT) > UINT_MAX);
129}
130
131static void cs_notify(u32 message, struct list_head *head)
132{
133	struct char_queue *entry;
134
135	spin_lock(&cs_char_data.lock);
136
137	if (!cs_char_data.opened) {
138		spin_unlock(&cs_char_data.lock);
139		goto out;
140	}
141
142	entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
143	if (!entry) {
144		dev_err(&cs_char_data.cl->device,
145			"Can't allocate new entry for the queue.\n");
146		spin_unlock(&cs_char_data.lock);
147		goto out;
148	}
149
150	entry->msg = message;
151	list_add_tail(&entry->list, head);
152
153	spin_unlock(&cs_char_data.lock);
154
155	wake_up_interruptible(&cs_char_data.wait);
156	kill_fasync(&cs_char_data.async_queue, SIGIO, POLL_IN);
157
158out:
159	return;
160}
161
162static u32 cs_pop_entry(struct list_head *head)
163{
164	struct char_queue *entry;
165	u32 data;
166
167	entry = list_entry(head->next, struct char_queue, list);
168	data = entry->msg;
169	list_del(&entry->list);
170	kfree(entry);
171
172	return data;
173}
174
175static void cs_notify_control(u32 message)
176{
177	cs_notify(message, &cs_char_data.chardev_queue);
178}
179
180static void cs_notify_data(u32 message, int maxlength)
181{
182	cs_notify(message, &cs_char_data.dataind_queue);
183
184	spin_lock(&cs_char_data.lock);
185	cs_char_data.dataind_pending++;
186	while (cs_char_data.dataind_pending > maxlength &&
187				!list_empty(&cs_char_data.dataind_queue)) {
188		dev_dbg(&cs_char_data.cl->device, "data notification "
189		"queue overrun (%u entries)\n", cs_char_data.dataind_pending);
190
191		cs_pop_entry(&cs_char_data.dataind_queue);
192		cs_char_data.dataind_pending--;
193	}
194	spin_unlock(&cs_char_data.lock);
195}
196
197static inline void cs_set_cmd(struct hsi_msg *msg, u32 cmd)
198{
199	u32 *data = sg_virt(msg->sgt.sgl);
200	*data = cmd;
201}
202
203static inline u32 cs_get_cmd(struct hsi_msg *msg)
204{
205	u32 *data = sg_virt(msg->sgt.sgl);
206	return *data;
207}
208
209static void cs_release_cmd(struct hsi_msg *msg)
210{
211	struct cs_hsi_iface *hi = msg->context;
212
213	list_add_tail(&msg->link, &hi->cmdqueue);
214}
215
216static void cs_cmd_destructor(struct hsi_msg *msg)
217{
218	struct cs_hsi_iface *hi = msg->context;
219
220	spin_lock(&hi->lock);
221
222	dev_dbg(&cs_char_data.cl->device, "control cmd destructor\n");
223
224	if (hi->iface_state != CS_STATE_CLOSED)
225		dev_err(&hi->cl->device, "Cmd flushed while driver active\n");
226
227	if (msg->ttype == HSI_MSG_READ)
228		hi->control_state &=
229			~(SSI_CHANNEL_STATE_POLL | SSI_CHANNEL_STATE_READING);
230	else if (msg->ttype == HSI_MSG_WRITE &&
231			hi->control_state & SSI_CHANNEL_STATE_WRITING)
232		hi->control_state &= ~SSI_CHANNEL_STATE_WRITING;
233
234	cs_release_cmd(msg);
235
236	spin_unlock(&hi->lock);
237}
238
239static struct hsi_msg *cs_claim_cmd(struct cs_hsi_iface* ssi)
240{
241	struct hsi_msg *msg;
242
243	BUG_ON(list_empty(&ssi->cmdqueue));
244
245	msg = list_first_entry(&ssi->cmdqueue, struct hsi_msg, link);
246	list_del(&msg->link);
247	msg->destructor = cs_cmd_destructor;
248
249	return msg;
250}
251
252static void cs_free_cmds(struct cs_hsi_iface *ssi)
253{
254	struct hsi_msg *msg, *tmp;
255
256	list_for_each_entry_safe(msg, tmp, &ssi->cmdqueue, link) {
257		list_del(&msg->link);
258		msg->destructor = NULL;
259		kfree(sg_virt(msg->sgt.sgl));
260		hsi_free_msg(msg);
261	}
262}
263
264static int cs_alloc_cmds(struct cs_hsi_iface *hi)
265{
266	struct hsi_msg *msg;
267	u32 *buf;
268	unsigned int i;
269
270	INIT_LIST_HEAD(&hi->cmdqueue);
271
272	for (i = 0; i < CS_MAX_CMDS; i++) {
273		msg = hsi_alloc_msg(1, GFP_KERNEL);
274		if (!msg)
275			goto out;
276		buf = kmalloc(sizeof(*buf), GFP_KERNEL);
277		if (!buf) {
278			hsi_free_msg(msg);
279			goto out;
280		}
281		sg_init_one(msg->sgt.sgl, buf, sizeof(*buf));
282		msg->channel = cs_char_data.channel_id_cmd;
283		msg->context = hi;
284		list_add_tail(&msg->link, &hi->cmdqueue);
285	}
286
287	return 0;
288
289out:
290	cs_free_cmds(hi);
291	return -ENOMEM;
292}
293
294static void cs_hsi_data_destructor(struct hsi_msg *msg)
295{
296	struct cs_hsi_iface *hi = msg->context;
297	const char *dir = (msg->ttype == HSI_MSG_READ) ? "TX" : "RX";
298
299	dev_dbg(&cs_char_data.cl->device, "Freeing data %s message\n", dir);
300
301	spin_lock(&hi->lock);
302	if (hi->iface_state != CS_STATE_CLOSED)
303		dev_err(&cs_char_data.cl->device,
304				"Data %s flush while device active\n", dir);
305	if (msg->ttype == HSI_MSG_READ)
306		hi->data_state &=
307			~(SSI_CHANNEL_STATE_POLL | SSI_CHANNEL_STATE_READING);
308	else
309		hi->data_state &= ~SSI_CHANNEL_STATE_WRITING;
310
311	msg->status = HSI_STATUS_COMPLETED;
312	if (unlikely(waitqueue_active(&hi->datawait)))
313		wake_up_interruptible(&hi->datawait);
314
315	spin_unlock(&hi->lock);
316}
317
318static int cs_hsi_alloc_data(struct cs_hsi_iface *hi)
319{
320	struct hsi_msg *txmsg, *rxmsg;
321	int res = 0;
322
323	rxmsg = hsi_alloc_msg(1, GFP_KERNEL);
324	if (!rxmsg) {
325		res = -ENOMEM;
326		goto out1;
327	}
328	rxmsg->channel = cs_char_data.channel_id_data;
329	rxmsg->destructor = cs_hsi_data_destructor;
330	rxmsg->context = hi;
331
332	txmsg = hsi_alloc_msg(1, GFP_KERNEL);
333	if (!txmsg) {
334		res = -ENOMEM;
335		goto out2;
336	}
337	txmsg->channel = cs_char_data.channel_id_data;
338	txmsg->destructor = cs_hsi_data_destructor;
339	txmsg->context = hi;
340
341	hi->data_rx_msg = rxmsg;
342	hi->data_tx_msg = txmsg;
343
344	return 0;
345
346out2:
347	hsi_free_msg(rxmsg);
348out1:
349	return res;
350}
351
352static void cs_hsi_free_data_msg(struct hsi_msg *msg)
353{
354	WARN_ON(msg->status != HSI_STATUS_COMPLETED &&
355					msg->status != HSI_STATUS_ERROR);
356	hsi_free_msg(msg);
357}
358
359static void cs_hsi_free_data(struct cs_hsi_iface *hi)
360{
361	cs_hsi_free_data_msg(hi->data_rx_msg);
362	cs_hsi_free_data_msg(hi->data_tx_msg);
363}
364
365static inline void __cs_hsi_error_pre(struct cs_hsi_iface *hi,
366					struct hsi_msg *msg, const char *info,
367					unsigned int *state)
368{
369	spin_lock(&hi->lock);
370	dev_err(&hi->cl->device, "HSI %s error, msg %d, state %u\n",
371		info, msg->status, *state);
372}
373
374static inline void __cs_hsi_error_post(struct cs_hsi_iface *hi)
375{
376	spin_unlock(&hi->lock);
377}
378
379static inline void __cs_hsi_error_read_bits(unsigned int *state)
380{
381	*state |= SSI_CHANNEL_STATE_ERROR;
382	*state &= ~(SSI_CHANNEL_STATE_READING | SSI_CHANNEL_STATE_POLL);
383}
384
385static inline void __cs_hsi_error_write_bits(unsigned int *state)
386{
387	*state |= SSI_CHANNEL_STATE_ERROR;
388	*state &= ~SSI_CHANNEL_STATE_WRITING;
389}
390
391static void cs_hsi_control_read_error(struct cs_hsi_iface *hi,
392							struct hsi_msg *msg)
393{
394	__cs_hsi_error_pre(hi, msg, "control read", &hi->control_state);
395	cs_release_cmd(msg);
396	__cs_hsi_error_read_bits(&hi->control_state);
397	__cs_hsi_error_post(hi);
398}
399
400static void cs_hsi_control_write_error(struct cs_hsi_iface *hi,
401							struct hsi_msg *msg)
402{
403	__cs_hsi_error_pre(hi, msg, "control write", &hi->control_state);
404	cs_release_cmd(msg);
405	__cs_hsi_error_write_bits(&hi->control_state);
406	__cs_hsi_error_post(hi);
407
408}
409
410static void cs_hsi_data_read_error(struct cs_hsi_iface *hi, struct hsi_msg *msg)
411{
412	__cs_hsi_error_pre(hi, msg, "data read", &hi->data_state);
413	__cs_hsi_error_read_bits(&hi->data_state);
414	__cs_hsi_error_post(hi);
415}
416
417static void cs_hsi_data_write_error(struct cs_hsi_iface *hi,
418							struct hsi_msg *msg)
419{
420	__cs_hsi_error_pre(hi, msg, "data write", &hi->data_state);
421	__cs_hsi_error_write_bits(&hi->data_state);
422	__cs_hsi_error_post(hi);
423}
424
425static void cs_hsi_read_on_control_complete(struct hsi_msg *msg)
426{
427	u32 cmd = cs_get_cmd(msg);
428	struct cs_hsi_iface *hi = msg->context;
429
430	spin_lock(&hi->lock);
431	hi->control_state &= ~SSI_CHANNEL_STATE_READING;
432	if (msg->status == HSI_STATUS_ERROR) {
433		dev_err(&hi->cl->device, "Control RX error detected\n");
434		spin_unlock(&hi->lock);
435		cs_hsi_control_read_error(hi, msg);
436		goto out;
437	}
438	dev_dbg(&hi->cl->device, "Read on control: %08X\n", cmd);
439	cs_release_cmd(msg);
440	if (hi->flags & CS_FEAT_TSTAMP_RX_CTRL) {
441		struct timespec64 tspec;
442		struct cs_timestamp *tstamp =
443			&hi->mmap_cfg->tstamp_rx_ctrl;
444
445		ktime_get_ts64(&tspec);
446
447		tstamp->tv_sec = (__u32) tspec.tv_sec;
448		tstamp->tv_nsec = (__u32) tspec.tv_nsec;
449	}
450	spin_unlock(&hi->lock);
451
452	cs_notify_control(cmd);
453
454out:
455	cs_hsi_read_on_control(hi);
456}
457
458static void cs_hsi_peek_on_control_complete(struct hsi_msg *msg)
459{
460	struct cs_hsi_iface *hi = msg->context;
461	int ret;
462
463	if (msg->status == HSI_STATUS_ERROR) {
464		dev_err(&hi->cl->device, "Control peek RX error detected\n");
465		cs_hsi_control_read_error(hi, msg);
466		return;
467	}
468
469	WARN_ON(!(hi->control_state & SSI_CHANNEL_STATE_READING));
470
471	dev_dbg(&hi->cl->device, "Peek on control complete, reading\n");
472	msg->sgt.nents = 1;
473	msg->complete = cs_hsi_read_on_control_complete;
474	ret = hsi_async_read(hi->cl, msg);
475	if (ret)
476		cs_hsi_control_read_error(hi, msg);
477}
478
479static void cs_hsi_read_on_control(struct cs_hsi_iface *hi)
480{
481	struct hsi_msg *msg;
482	int ret;
483
484	spin_lock(&hi->lock);
485	if (hi->control_state & SSI_CHANNEL_STATE_READING) {
486		dev_err(&hi->cl->device, "Control read already pending (%d)\n",
487			hi->control_state);
488		spin_unlock(&hi->lock);
489		return;
490	}
491	if (hi->control_state & SSI_CHANNEL_STATE_ERROR) {
492		dev_err(&hi->cl->device, "Control read error (%d)\n",
493			hi->control_state);
494		spin_unlock(&hi->lock);
495		return;
496	}
497	hi->control_state |= SSI_CHANNEL_STATE_READING;
498	dev_dbg(&hi->cl->device, "Issuing RX on control\n");
499	msg = cs_claim_cmd(hi);
500	spin_unlock(&hi->lock);
501
502	msg->sgt.nents = 0;
503	msg->complete = cs_hsi_peek_on_control_complete;
504	ret = hsi_async_read(hi->cl, msg);
505	if (ret)
506		cs_hsi_control_read_error(hi, msg);
507}
508
509static void cs_hsi_write_on_control_complete(struct hsi_msg *msg)
510{
511	struct cs_hsi_iface *hi = msg->context;
512	if (msg->status == HSI_STATUS_COMPLETED) {
513		spin_lock(&hi->lock);
514		hi->control_state &= ~SSI_CHANNEL_STATE_WRITING;
515		cs_release_cmd(msg);
516		spin_unlock(&hi->lock);
517	} else if (msg->status == HSI_STATUS_ERROR) {
518		cs_hsi_control_write_error(hi, msg);
519	} else {
520		dev_err(&hi->cl->device,
521			"unexpected status in control write callback %d\n",
522			msg->status);
523	}
524}
525
526static int cs_hsi_write_on_control(struct cs_hsi_iface *hi, u32 message)
527{
528	struct hsi_msg *msg;
529	int ret;
530
531	spin_lock(&hi->lock);
532	if (hi->control_state & SSI_CHANNEL_STATE_ERROR) {
533		spin_unlock(&hi->lock);
534		return -EIO;
535	}
536	if (hi->control_state & SSI_CHANNEL_STATE_WRITING) {
537		dev_err(&hi->cl->device,
538			"Write still pending on control channel.\n");
539		spin_unlock(&hi->lock);
540		return -EBUSY;
541	}
542	hi->control_state |= SSI_CHANNEL_STATE_WRITING;
543	msg = cs_claim_cmd(hi);
544	spin_unlock(&hi->lock);
545
546	cs_set_cmd(msg, message);
547	msg->sgt.nents = 1;
548	msg->complete = cs_hsi_write_on_control_complete;
549	dev_dbg(&hi->cl->device,
550		"Sending control message %08X\n", message);
551	ret = hsi_async_write(hi->cl, msg);
552	if (ret) {
553		dev_err(&hi->cl->device,
554			"async_write failed with %d\n", ret);
555		cs_hsi_control_write_error(hi, msg);
556	}
557
558	/*
559	 * Make sure control read is always pending when issuing
560	 * new control writes. This is needed as the controller
561	 * may flush our messages if e.g. the peer device reboots
562	 * unexpectedly (and we cannot directly resubmit a new read from
563	 * the message destructor; see cs_cmd_destructor()).
564	 */
565	if (!(hi->control_state & SSI_CHANNEL_STATE_READING)) {
566		dev_err(&hi->cl->device, "Restarting control reads\n");
567		cs_hsi_read_on_control(hi);
568	}
569
570	return 0;
571}
572
573static void cs_hsi_read_on_data_complete(struct hsi_msg *msg)
574{
575	struct cs_hsi_iface *hi = msg->context;
576	u32 payload;
577
578	if (unlikely(msg->status == HSI_STATUS_ERROR)) {
579		cs_hsi_data_read_error(hi, msg);
580		return;
581	}
582
583	spin_lock(&hi->lock);
584	WARN_ON(!(hi->data_state & SSI_CHANNEL_STATE_READING));
585	hi->data_state &= ~SSI_CHANNEL_STATE_READING;
586	payload = CS_RX_DATA_RECEIVED;
587	payload |= hi->rx_slot;
588	hi->rx_slot++;
589	hi->rx_slot %= hi->rx_ptr_boundary;
590	/* expose current rx ptr in mmap area */
591	hi->mmap_cfg->rx_ptr = hi->rx_slot;
592	if (unlikely(waitqueue_active(&hi->datawait)))
593		wake_up_interruptible(&hi->datawait);
594	spin_unlock(&hi->lock);
595
596	cs_notify_data(payload, hi->rx_bufs);
597	cs_hsi_read_on_data(hi);
598}
599
600static void cs_hsi_peek_on_data_complete(struct hsi_msg *msg)
601{
602	struct cs_hsi_iface *hi = msg->context;
603	u32 *address;
604	int ret;
605
606	if (unlikely(msg->status == HSI_STATUS_ERROR)) {
607		cs_hsi_data_read_error(hi, msg);
608		return;
609	}
610	if (unlikely(hi->iface_state != CS_STATE_CONFIGURED)) {
611		dev_err(&hi->cl->device, "Data received in invalid state\n");
612		cs_hsi_data_read_error(hi, msg);
613		return;
614	}
615
616	spin_lock(&hi->lock);
617	WARN_ON(!(hi->data_state & SSI_CHANNEL_STATE_POLL));
618	hi->data_state &= ~SSI_CHANNEL_STATE_POLL;
619	hi->data_state |= SSI_CHANNEL_STATE_READING;
620	spin_unlock(&hi->lock);
621
622	address = (u32 *)(hi->mmap_base +
623				hi->rx_offsets[hi->rx_slot % hi->rx_bufs]);
624	sg_init_one(msg->sgt.sgl, address, hi->buf_size);
625	msg->sgt.nents = 1;
626	msg->complete = cs_hsi_read_on_data_complete;
627	ret = hsi_async_read(hi->cl, msg);
628	if (ret)
629		cs_hsi_data_read_error(hi, msg);
630}
631
632/*
633 * Read/write transaction is ongoing. Returns false if in
634 * SSI_CHANNEL_STATE_POLL state.
635 */
636static inline int cs_state_xfer_active(unsigned int state)
637{
638	return (state & SSI_CHANNEL_STATE_WRITING) ||
639		(state & SSI_CHANNEL_STATE_READING);
640}
641
642/*
643 * No pending read/writes
644 */
645static inline int cs_state_idle(unsigned int state)
646{
647	return !(state & ~SSI_CHANNEL_STATE_ERROR);
648}
649
650static void cs_hsi_read_on_data(struct cs_hsi_iface *hi)
651{
652	struct hsi_msg *rxmsg;
653	int ret;
654
655	spin_lock(&hi->lock);
656	if (hi->data_state &
657		(SSI_CHANNEL_STATE_READING | SSI_CHANNEL_STATE_POLL)) {
658		dev_dbg(&hi->cl->device, "Data read already pending (%u)\n",
659			hi->data_state);
660		spin_unlock(&hi->lock);
661		return;
662	}
663	hi->data_state |= SSI_CHANNEL_STATE_POLL;
664	spin_unlock(&hi->lock);
665
666	rxmsg = hi->data_rx_msg;
667	sg_init_one(rxmsg->sgt.sgl, (void *)hi->mmap_base, 0);
668	rxmsg->sgt.nents = 0;
669	rxmsg->complete = cs_hsi_peek_on_data_complete;
670
671	ret = hsi_async_read(hi->cl, rxmsg);
672	if (ret)
673		cs_hsi_data_read_error(hi, rxmsg);
674}
675
676static void cs_hsi_write_on_data_complete(struct hsi_msg *msg)
677{
678	struct cs_hsi_iface *hi = msg->context;
679
680	if (msg->status == HSI_STATUS_COMPLETED) {
681		spin_lock(&hi->lock);
682		hi->data_state &= ~SSI_CHANNEL_STATE_WRITING;
683		if (unlikely(waitqueue_active(&hi->datawait)))
684			wake_up_interruptible(&hi->datawait);
685		spin_unlock(&hi->lock);
686	} else {
687		cs_hsi_data_write_error(hi, msg);
688	}
689}
690
691static int cs_hsi_write_on_data(struct cs_hsi_iface *hi, unsigned int slot)
692{
693	u32 *address;
694	struct hsi_msg *txmsg;
695	int ret;
696
697	spin_lock(&hi->lock);
698	if (hi->iface_state != CS_STATE_CONFIGURED) {
699		dev_err(&hi->cl->device, "Not configured, aborting\n");
700		ret = -EINVAL;
701		goto error;
702	}
703	if (hi->data_state & SSI_CHANNEL_STATE_ERROR) {
704		dev_err(&hi->cl->device, "HSI error, aborting\n");
705		ret = -EIO;
706		goto error;
707	}
708	if (hi->data_state & SSI_CHANNEL_STATE_WRITING) {
709		dev_err(&hi->cl->device, "Write pending on data channel.\n");
710		ret = -EBUSY;
711		goto error;
712	}
713	hi->data_state |= SSI_CHANNEL_STATE_WRITING;
714	spin_unlock(&hi->lock);
715
716	hi->tx_slot = slot;
717	address = (u32 *)(hi->mmap_base + hi->tx_offsets[hi->tx_slot]);
718	txmsg = hi->data_tx_msg;
719	sg_init_one(txmsg->sgt.sgl, address, hi->buf_size);
720	txmsg->complete = cs_hsi_write_on_data_complete;
721	ret = hsi_async_write(hi->cl, txmsg);
722	if (ret)
723		cs_hsi_data_write_error(hi, txmsg);
724
725	return ret;
726
727error:
728	spin_unlock(&hi->lock);
729	if (ret == -EIO)
730		cs_hsi_data_write_error(hi, hi->data_tx_msg);
731
732	return ret;
733}
734
735static unsigned int cs_hsi_get_state(struct cs_hsi_iface *hi)
736{
737	return hi->iface_state;
738}
739
740static int cs_hsi_command(struct cs_hsi_iface *hi, u32 cmd)
741{
742	int ret = 0;
743
744	local_bh_disable();
745	switch (cmd & TARGET_MASK) {
746	case TARGET_REMOTE:
747		ret = cs_hsi_write_on_control(hi, cmd);
748		break;
749	case TARGET_LOCAL:
750		if ((cmd & CS_CMD_MASK) == CS_TX_DATA_READY)
751			ret = cs_hsi_write_on_data(hi, cmd & CS_PARAM_MASK);
752		else
753			ret = -EINVAL;
754		break;
755	default:
756		ret = -EINVAL;
757		break;
758	}
759	local_bh_enable();
760
761	return ret;
762}
763
764static void cs_hsi_set_wakeline(struct cs_hsi_iface *hi, bool new_state)
765{
766	int change = 0;
767
768	spin_lock_bh(&hi->lock);
769	if (hi->wakeline_state != new_state) {
770		hi->wakeline_state = new_state;
771		change = 1;
772		dev_dbg(&hi->cl->device, "setting wake line to %d (%p)\n",
773			new_state, hi->cl);
774	}
775	spin_unlock_bh(&hi->lock);
776
777	if (change) {
778		if (new_state)
779			ssip_slave_start_tx(hi->master);
780		else
781			ssip_slave_stop_tx(hi->master);
782	}
783
784	dev_dbg(&hi->cl->device, "wake line set to %d (%p)\n",
785		new_state, hi->cl);
786}
787
788static void set_buffer_sizes(struct cs_hsi_iface *hi, int rx_bufs, int tx_bufs)
789{
790	hi->rx_bufs = rx_bufs;
791	hi->tx_bufs = tx_bufs;
792	hi->mmap_cfg->rx_bufs = rx_bufs;
793	hi->mmap_cfg->tx_bufs = tx_bufs;
794
795	if (hi->flags & CS_FEAT_ROLLING_RX_COUNTER) {
796		/*
797		 * For more robust overrun detection, let the rx
798		 * pointer run in range 0..'boundary-1'. Boundary
799		 * is a multiple of rx_bufs, and limited in max size
800		 * by RX_PTR_MAX_SHIFT to allow for fast ptr-diff
801		 * calculation.
802		 */
803		hi->rx_ptr_boundary = (rx_bufs << RX_PTR_BOUNDARY_SHIFT);
804		hi->mmap_cfg->rx_ptr_boundary = hi->rx_ptr_boundary;
805	} else {
806		hi->rx_ptr_boundary = hi->rx_bufs;
807	}
808}
809
810static int check_buf_params(struct cs_hsi_iface *hi,
811					const struct cs_buffer_config *buf_cfg)
812{
813	size_t buf_size_aligned = L1_CACHE_ALIGN(buf_cfg->buf_size) *
814					(buf_cfg->rx_bufs + buf_cfg->tx_bufs);
815	size_t ctrl_size_aligned = L1_CACHE_ALIGN(sizeof(*hi->mmap_cfg));
816	int r = 0;
817
818	if (buf_cfg->rx_bufs > CS_MAX_BUFFERS ||
819					buf_cfg->tx_bufs > CS_MAX_BUFFERS) {
820		r = -EINVAL;
821	} else if ((buf_size_aligned + ctrl_size_aligned) >= hi->mmap_size) {
822		dev_err(&hi->cl->device, "No space for the requested buffer "
823			"configuration\n");
824		r = -ENOBUFS;
825	}
826
827	return r;
828}
829
830/*
831 * Block until pending data transfers have completed.
832 */
833static int cs_hsi_data_sync(struct cs_hsi_iface *hi)
834{
835	int r = 0;
836
837	spin_lock_bh(&hi->lock);
838
839	if (!cs_state_xfer_active(hi->data_state)) {
840		dev_dbg(&hi->cl->device, "hsi_data_sync break, idle\n");
841		goto out;
842	}
843
844	for (;;) {
845		int s;
846		DEFINE_WAIT(wait);
847		if (!cs_state_xfer_active(hi->data_state))
848			goto out;
849		if (signal_pending(current)) {
850			r = -ERESTARTSYS;
851			goto out;
852		}
853		/*
854		 * prepare_to_wait must be called with hi->lock held
855		 * so that callbacks can check for waitqueue_active()
856		 */
857		prepare_to_wait(&hi->datawait, &wait, TASK_INTERRUPTIBLE);
858		spin_unlock_bh(&hi->lock);
859		s = schedule_timeout(
860			msecs_to_jiffies(CS_HSI_TRANSFER_TIMEOUT_MS));
861		spin_lock_bh(&hi->lock);
862		finish_wait(&hi->datawait, &wait);
863		if (!s) {
864			dev_dbg(&hi->cl->device,
865				"hsi_data_sync timeout after %d ms\n",
866				CS_HSI_TRANSFER_TIMEOUT_MS);
867			r = -EIO;
868			goto out;
869		}
870	}
871
872out:
873	spin_unlock_bh(&hi->lock);
874	dev_dbg(&hi->cl->device, "hsi_data_sync done with res %d\n", r);
875
876	return r;
877}
878
879static void cs_hsi_data_enable(struct cs_hsi_iface *hi,
880					struct cs_buffer_config *buf_cfg)
881{
882	unsigned int data_start, i;
883
884	BUG_ON(hi->buf_size == 0);
885
886	set_buffer_sizes(hi, buf_cfg->rx_bufs, buf_cfg->tx_bufs);
887
888	hi->slot_size = L1_CACHE_ALIGN(hi->buf_size);
889	dev_dbg(&hi->cl->device,
890			"setting slot size to %u, buf size %u, align %u\n",
891			hi->slot_size, hi->buf_size, L1_CACHE_BYTES);
892
893	data_start = L1_CACHE_ALIGN(sizeof(*hi->mmap_cfg));
894	dev_dbg(&hi->cl->device,
895			"setting data start at %u, cfg block %u, align %u\n",
896			data_start, sizeof(*hi->mmap_cfg), L1_CACHE_BYTES);
897
898	for (i = 0; i < hi->mmap_cfg->rx_bufs; i++) {
899		hi->rx_offsets[i] = data_start + i * hi->slot_size;
900		hi->mmap_cfg->rx_offsets[i] = hi->rx_offsets[i];
901		dev_dbg(&hi->cl->device, "DL buf #%u at %u\n",
902					i, hi->rx_offsets[i]);
903	}
904	for (i = 0; i < hi->mmap_cfg->tx_bufs; i++) {
905		hi->tx_offsets[i] = data_start +
906			(i + hi->mmap_cfg->rx_bufs) * hi->slot_size;
907		hi->mmap_cfg->tx_offsets[i] = hi->tx_offsets[i];
908		dev_dbg(&hi->cl->device, "UL buf #%u at %u\n",
909					i, hi->rx_offsets[i]);
910	}
911
912	hi->iface_state = CS_STATE_CONFIGURED;
913}
914
915static void cs_hsi_data_disable(struct cs_hsi_iface *hi, int old_state)
916{
917	if (old_state == CS_STATE_CONFIGURED) {
918		dev_dbg(&hi->cl->device,
919			"closing data channel with slot size 0\n");
920		hi->iface_state = CS_STATE_OPENED;
921	}
922}
923
924static int cs_hsi_buf_config(struct cs_hsi_iface *hi,
925					struct cs_buffer_config *buf_cfg)
926{
927	int r = 0;
928	unsigned int old_state = hi->iface_state;
929
930	spin_lock_bh(&hi->lock);
931	/* Prevent new transactions during buffer reconfig */
932	if (old_state == CS_STATE_CONFIGURED)
933		hi->iface_state = CS_STATE_OPENED;
934	spin_unlock_bh(&hi->lock);
935
936	/*
937	 * make sure that no non-zero data reads are ongoing before
938	 * proceeding to change the buffer layout
939	 */
940	r = cs_hsi_data_sync(hi);
941	if (r < 0)
942		return r;
943
944	WARN_ON(cs_state_xfer_active(hi->data_state));
945
946	spin_lock_bh(&hi->lock);
947	r = check_buf_params(hi, buf_cfg);
948	if (r < 0)
949		goto error;
950
951	hi->buf_size = buf_cfg->buf_size;
952	hi->mmap_cfg->buf_size = hi->buf_size;
953	hi->flags = buf_cfg->flags;
954
955	hi->rx_slot = 0;
956	hi->tx_slot = 0;
957	hi->slot_size = 0;
958
959	if (hi->buf_size)
960		cs_hsi_data_enable(hi, buf_cfg);
961	else
962		cs_hsi_data_disable(hi, old_state);
963
964	spin_unlock_bh(&hi->lock);
965
966	if (old_state != hi->iface_state) {
967		if (hi->iface_state == CS_STATE_CONFIGURED) {
968			cpu_latency_qos_add_request(&hi->pm_qos_req,
969				CS_QOS_LATENCY_FOR_DATA_USEC);
970			local_bh_disable();
971			cs_hsi_read_on_data(hi);
972			local_bh_enable();
973		} else if (old_state == CS_STATE_CONFIGURED) {
974			cpu_latency_qos_remove_request(&hi->pm_qos_req);
975		}
976	}
977	return r;
978
979error:
980	spin_unlock_bh(&hi->lock);
981	return r;
982}
983
984static int cs_hsi_start(struct cs_hsi_iface **hi, struct hsi_client *cl,
985			unsigned long mmap_base, unsigned long mmap_size)
986{
987	int err = 0;
988	struct cs_hsi_iface *hsi_if = kzalloc(sizeof(*hsi_if), GFP_KERNEL);
989
990	dev_dbg(&cl->device, "cs_hsi_start\n");
991
992	if (!hsi_if) {
993		err = -ENOMEM;
994		goto leave0;
995	}
996	spin_lock_init(&hsi_if->lock);
997	hsi_if->cl = cl;
998	hsi_if->iface_state = CS_STATE_CLOSED;
999	hsi_if->mmap_cfg = (struct cs_mmap_config_block *)mmap_base;
1000	hsi_if->mmap_base = mmap_base;
1001	hsi_if->mmap_size = mmap_size;
1002	memset(hsi_if->mmap_cfg, 0, sizeof(*hsi_if->mmap_cfg));
1003	init_waitqueue_head(&hsi_if->datawait);
1004	err = cs_alloc_cmds(hsi_if);
1005	if (err < 0) {
1006		dev_err(&cl->device, "Unable to alloc HSI messages\n");
1007		goto leave1;
1008	}
1009	err = cs_hsi_alloc_data(hsi_if);
1010	if (err < 0) {
1011		dev_err(&cl->device, "Unable to alloc HSI messages for data\n");
1012		goto leave2;
1013	}
1014	err = hsi_claim_port(cl, 1);
1015	if (err < 0) {
1016		dev_err(&cl->device,
1017				"Could not open, HSI port already claimed\n");
1018		goto leave3;
1019	}
1020	hsi_if->master = ssip_slave_get_master(cl);
1021	if (IS_ERR(hsi_if->master)) {
1022		err = PTR_ERR(hsi_if->master);
1023		dev_err(&cl->device, "Could not get HSI master client\n");
1024		goto leave4;
1025	}
1026	if (!ssip_slave_running(hsi_if->master)) {
1027		err = -ENODEV;
1028		dev_err(&cl->device,
1029				"HSI port not initialized\n");
1030		goto leave4;
1031	}
1032
1033	hsi_if->iface_state = CS_STATE_OPENED;
1034	local_bh_disable();
1035	cs_hsi_read_on_control(hsi_if);
1036	local_bh_enable();
1037
1038	dev_dbg(&cl->device, "cs_hsi_start...done\n");
1039
1040	BUG_ON(!hi);
1041	*hi = hsi_if;
1042
1043	return 0;
1044
1045leave4:
1046	hsi_release_port(cl);
1047leave3:
1048	cs_hsi_free_data(hsi_if);
1049leave2:
1050	cs_free_cmds(hsi_if);
1051leave1:
1052	kfree(hsi_if);
1053leave0:
1054	dev_dbg(&cl->device, "cs_hsi_start...done/error\n\n");
1055
1056	return err;
1057}
1058
1059static void cs_hsi_stop(struct cs_hsi_iface *hi)
1060{
1061	dev_dbg(&hi->cl->device, "cs_hsi_stop\n");
1062	cs_hsi_set_wakeline(hi, 0);
1063	ssip_slave_put_master(hi->master);
1064
1065	/* hsi_release_port() needs to be called with CS_STATE_CLOSED */
1066	hi->iface_state = CS_STATE_CLOSED;
1067	hsi_release_port(hi->cl);
1068
1069	/*
1070	 * hsi_release_port() should flush out all the pending
1071	 * messages, so cs_state_idle() should be true for both
1072	 * control and data channels.
1073	 */
1074	WARN_ON(!cs_state_idle(hi->control_state));
1075	WARN_ON(!cs_state_idle(hi->data_state));
1076
1077	if (cpu_latency_qos_request_active(&hi->pm_qos_req))
1078		cpu_latency_qos_remove_request(&hi->pm_qos_req);
1079
1080	spin_lock_bh(&hi->lock);
1081	cs_hsi_free_data(hi);
1082	cs_free_cmds(hi);
1083	spin_unlock_bh(&hi->lock);
1084	kfree(hi);
1085}
1086
1087static vm_fault_t cs_char_vma_fault(struct vm_fault *vmf)
1088{
1089	struct cs_char *csdata = vmf->vma->vm_private_data;
1090	struct page *page;
1091
1092	page = virt_to_page((void *)csdata->mmap_base);
1093	get_page(page);
1094	vmf->page = page;
1095
1096	return 0;
1097}
1098
1099static const struct vm_operations_struct cs_char_vm_ops = {
1100	.fault	= cs_char_vma_fault,
1101};
1102
1103static int cs_char_fasync(int fd, struct file *file, int on)
1104{
1105	struct cs_char *csdata = file->private_data;
1106
1107	if (fasync_helper(fd, file, on, &csdata->async_queue) < 0)
1108		return -EIO;
1109
1110	return 0;
1111}
1112
1113static __poll_t cs_char_poll(struct file *file, poll_table *wait)
1114{
1115	struct cs_char *csdata = file->private_data;
1116	__poll_t ret = 0;
1117
1118	poll_wait(file, &cs_char_data.wait, wait);
1119	spin_lock_bh(&csdata->lock);
1120	if (!list_empty(&csdata->chardev_queue))
1121		ret = EPOLLIN | EPOLLRDNORM;
1122	else if (!list_empty(&csdata->dataind_queue))
1123		ret = EPOLLIN | EPOLLRDNORM;
1124	spin_unlock_bh(&csdata->lock);
1125
1126	return ret;
1127}
1128
1129static ssize_t cs_char_read(struct file *file, char __user *buf, size_t count,
1130								loff_t *unused)
1131{
1132	struct cs_char *csdata = file->private_data;
1133	u32 data;
1134	ssize_t retval;
1135
1136	if (count < sizeof(data))
1137		return -EINVAL;
1138
1139	for (;;) {
1140		DEFINE_WAIT(wait);
1141
1142		spin_lock_bh(&csdata->lock);
1143		if (!list_empty(&csdata->chardev_queue)) {
1144			data = cs_pop_entry(&csdata->chardev_queue);
1145		} else if (!list_empty(&csdata->dataind_queue)) {
1146			data = cs_pop_entry(&csdata->dataind_queue);
1147			csdata->dataind_pending--;
1148		} else {
1149			data = 0;
1150		}
1151		spin_unlock_bh(&csdata->lock);
1152
1153		if (data)
1154			break;
1155		if (file->f_flags & O_NONBLOCK) {
1156			retval = -EAGAIN;
1157			goto out;
1158		} else if (signal_pending(current)) {
1159			retval = -ERESTARTSYS;
1160			goto out;
1161		}
1162		prepare_to_wait_exclusive(&csdata->wait, &wait,
1163						TASK_INTERRUPTIBLE);
1164		schedule();
1165		finish_wait(&csdata->wait, &wait);
1166	}
1167
1168	retval = put_user(data, (u32 __user *)buf);
1169	if (!retval)
1170		retval = sizeof(data);
1171
1172out:
1173	return retval;
1174}
1175
1176static ssize_t cs_char_write(struct file *file, const char __user *buf,
1177						size_t count, loff_t *unused)
1178{
1179	struct cs_char *csdata = file->private_data;
1180	u32 data;
1181	int err;
1182	ssize_t	retval;
1183
1184	if (count < sizeof(data))
1185		return -EINVAL;
1186
1187	if (get_user(data, (u32 __user *)buf))
1188		retval = -EFAULT;
1189	else
1190		retval = count;
1191
1192	err = cs_hsi_command(csdata->hi, data);
1193	if (err < 0)
1194		retval = err;
1195
1196	return retval;
1197}
1198
1199static long cs_char_ioctl(struct file *file, unsigned int cmd,
1200				unsigned long arg)
1201{
1202	struct cs_char *csdata = file->private_data;
1203	int r = 0;
1204
1205	switch (cmd) {
1206	case CS_GET_STATE: {
1207		unsigned int state;
1208
1209		state = cs_hsi_get_state(csdata->hi);
1210		if (copy_to_user((void __user *)arg, &state, sizeof(state)))
1211			r = -EFAULT;
1212
1213		break;
1214	}
1215	case CS_SET_WAKELINE: {
1216		unsigned int state;
1217
1218		if (copy_from_user(&state, (void __user *)arg, sizeof(state))) {
1219			r = -EFAULT;
1220			break;
1221		}
1222
1223		if (state > 1) {
1224			r = -EINVAL;
1225			break;
1226		}
1227
1228		cs_hsi_set_wakeline(csdata->hi, !!state);
1229
1230		break;
1231	}
1232	case CS_GET_IF_VERSION: {
1233		unsigned int ifver = CS_IF_VERSION;
1234
1235		if (copy_to_user((void __user *)arg, &ifver, sizeof(ifver)))
1236			r = -EFAULT;
1237
1238		break;
1239	}
1240	case CS_CONFIG_BUFS: {
1241		struct cs_buffer_config buf_cfg;
1242
1243		if (copy_from_user(&buf_cfg, (void __user *)arg,
1244							sizeof(buf_cfg)))
1245			r = -EFAULT;
1246		else
1247			r = cs_hsi_buf_config(csdata->hi, &buf_cfg);
1248
1249		break;
1250	}
1251	default:
1252		r = -ENOTTY;
1253		break;
1254	}
1255
1256	return r;
1257}
1258
1259static int cs_char_mmap(struct file *file, struct vm_area_struct *vma)
1260{
1261	if (vma->vm_end < vma->vm_start)
1262		return -EINVAL;
1263
1264	if (vma_pages(vma) != 1)
1265		return -EINVAL;
1266
1267	vm_flags_set(vma, VM_IO | VM_DONTDUMP | VM_DONTEXPAND);
1268	vma->vm_ops = &cs_char_vm_ops;
1269	vma->vm_private_data = file->private_data;
1270
1271	return 0;
1272}
1273
1274static int cs_char_open(struct inode *unused, struct file *file)
1275{
1276	int ret = 0;
1277	unsigned long p;
1278
1279	spin_lock_bh(&cs_char_data.lock);
1280	if (cs_char_data.opened) {
1281		ret = -EBUSY;
1282		spin_unlock_bh(&cs_char_data.lock);
1283		goto out1;
1284	}
1285	cs_char_data.opened = 1;
1286	cs_char_data.dataind_pending = 0;
1287	spin_unlock_bh(&cs_char_data.lock);
1288
1289	p = get_zeroed_page(GFP_KERNEL);
1290	if (!p) {
1291		ret = -ENOMEM;
1292		goto out2;
1293	}
1294
1295	ret = cs_hsi_start(&cs_char_data.hi, cs_char_data.cl, p, CS_MMAP_SIZE);
1296	if (ret) {
1297		dev_err(&cs_char_data.cl->device, "Unable to initialize HSI\n");
1298		goto out3;
1299	}
1300
1301	/* these are only used in release so lock not needed */
1302	cs_char_data.mmap_base = p;
1303	cs_char_data.mmap_size = CS_MMAP_SIZE;
1304
1305	file->private_data = &cs_char_data;
1306
1307	return 0;
1308
1309out3:
1310	free_page(p);
1311out2:
1312	spin_lock_bh(&cs_char_data.lock);
1313	cs_char_data.opened = 0;
1314	spin_unlock_bh(&cs_char_data.lock);
1315out1:
1316	return ret;
1317}
1318
1319static void cs_free_char_queue(struct list_head *head)
1320{
1321	struct char_queue *entry;
1322	struct list_head *cursor, *next;
1323
1324	if (!list_empty(head)) {
1325		list_for_each_safe(cursor, next, head) {
1326			entry = list_entry(cursor, struct char_queue, list);
1327			list_del(&entry->list);
1328			kfree(entry);
1329		}
1330	}
1331
1332}
1333
1334static int cs_char_release(struct inode *unused, struct file *file)
1335{
1336	struct cs_char *csdata = file->private_data;
1337
1338	cs_hsi_stop(csdata->hi);
1339	spin_lock_bh(&csdata->lock);
1340	csdata->hi = NULL;
1341	free_page(csdata->mmap_base);
1342	cs_free_char_queue(&csdata->chardev_queue);
1343	cs_free_char_queue(&csdata->dataind_queue);
1344	csdata->opened = 0;
1345	spin_unlock_bh(&csdata->lock);
1346
1347	return 0;
1348}
1349
1350static const struct file_operations cs_char_fops = {
1351	.owner		= THIS_MODULE,
1352	.read		= cs_char_read,
1353	.write		= cs_char_write,
1354	.poll		= cs_char_poll,
1355	.unlocked_ioctl	= cs_char_ioctl,
1356	.mmap		= cs_char_mmap,
1357	.open		= cs_char_open,
1358	.release	= cs_char_release,
1359	.fasync		= cs_char_fasync,
1360};
1361
1362static struct miscdevice cs_char_miscdev = {
1363	.minor	= MISC_DYNAMIC_MINOR,
1364	.name	= "cmt_speech",
1365	.fops	= &cs_char_fops
1366};
1367
1368static int cs_hsi_client_probe(struct device *dev)
1369{
1370	int err = 0;
1371	struct hsi_client *cl = to_hsi_client(dev);
1372
1373	dev_dbg(dev, "hsi_client_probe\n");
1374	init_waitqueue_head(&cs_char_data.wait);
1375	spin_lock_init(&cs_char_data.lock);
1376	cs_char_data.opened = 0;
1377	cs_char_data.cl = cl;
1378	cs_char_data.hi = NULL;
1379	INIT_LIST_HEAD(&cs_char_data.chardev_queue);
1380	INIT_LIST_HEAD(&cs_char_data.dataind_queue);
1381
1382	cs_char_data.channel_id_cmd = hsi_get_channel_id_by_name(cl,
1383		"speech-control");
1384	if (cs_char_data.channel_id_cmd < 0) {
1385		err = cs_char_data.channel_id_cmd;
1386		dev_err(dev, "Could not get cmd channel (%d)\n", err);
1387		return err;
1388	}
1389
1390	cs_char_data.channel_id_data = hsi_get_channel_id_by_name(cl,
1391		"speech-data");
1392	if (cs_char_data.channel_id_data < 0) {
1393		err = cs_char_data.channel_id_data;
1394		dev_err(dev, "Could not get data channel (%d)\n", err);
1395		return err;
1396	}
1397
1398	err = misc_register(&cs_char_miscdev);
1399	if (err)
1400		dev_err(dev, "Failed to register: %d\n", err);
1401
1402	return err;
1403}
1404
1405static int cs_hsi_client_remove(struct device *dev)
1406{
1407	struct cs_hsi_iface *hi;
1408
1409	dev_dbg(dev, "hsi_client_remove\n");
1410	misc_deregister(&cs_char_miscdev);
1411	spin_lock_bh(&cs_char_data.lock);
1412	hi = cs_char_data.hi;
1413	cs_char_data.hi = NULL;
1414	spin_unlock_bh(&cs_char_data.lock);
1415	if (hi)
1416		cs_hsi_stop(hi);
1417
1418	return 0;
1419}
1420
1421static struct hsi_client_driver cs_hsi_driver = {
1422	.driver = {
1423		.name	= "cmt-speech",
1424		.owner	= THIS_MODULE,
1425		.probe	= cs_hsi_client_probe,
1426		.remove	= cs_hsi_client_remove,
1427	},
1428};
1429
1430static int __init cs_char_init(void)
1431{
1432	pr_info("CMT speech driver added\n");
1433	return hsi_register_client_driver(&cs_hsi_driver);
1434}
1435module_init(cs_char_init);
1436
1437static void __exit cs_char_exit(void)
1438{
1439	hsi_unregister_client_driver(&cs_hsi_driver);
1440	pr_info("CMT speech driver removed\n");
1441}
1442module_exit(cs_char_exit);
1443
1444MODULE_ALIAS("hsi:cmt-speech");
1445MODULE_AUTHOR("Kai Vehmanen <kai.vehmanen@nokia.com>");
1446MODULE_AUTHOR("Peter Ujfalusi <peter.ujfalusi@nokia.com>");
1447MODULE_DESCRIPTION("CMT speech driver");
1448MODULE_LICENSE("GPL v2");
1449