cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

cmt_speech.c (34212B)


      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(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	vma->vm_flags |= 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");