1/*
2 * HSI character device driver, implements the character device
3 * interface.
4 *
5 * Copyright (C) 2010 Nokia Corporation. All rights reserved.
6 *
7 * Contact: Andras Domokos <andras.domokos@nokia.com>
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * version 2 as published by the Free Software Foundation.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21 * 02110-1301 USA
22 */
23
24#include <linux/errno.h>
25#include <linux/types.h>
26#include <linux/atomic.h>
27#include <linux/kernel.h>
28#include <linux/init.h>
29#include <linux/module.h>
30#include <linux/mutex.h>
31#include <linux/list.h>
32#include <linux/slab.h>
33#include <linux/kmemleak.h>
34#include <linux/ioctl.h>
35#include <linux/wait.h>
36#include <linux/fs.h>
37#include <linux/sched.h>
38#include <linux/device.h>
39#include <linux/cdev.h>
40#include <linux/uaccess.h>
41#include <linux/scatterlist.h>
42#include <linux/stat.h>
43#include <linux/hsi/hsi.h>
44#include <linux/hsi/hsi_char.h>
45
46#define HSC_DEVS		16 /* Num of channels */
47#define HSC_MSGS		4
48
49#define HSC_RXBREAK		0
50
51#define HSC_ID_BITS		6
52#define HSC_PORT_ID_BITS	4
53#define HSC_ID_MASK		3
54#define HSC_PORT_ID_MASK	3
55#define HSC_CH_MASK		0xf
56
57/*
58 * We support up to 4 controllers that can have up to 4
59 * ports, which should currently be more than enough.
60 */
61#define HSC_BASEMINOR(id, port_id) \
62		((((id) & HSC_ID_MASK) << HSC_ID_BITS) | \
63		(((port_id) & HSC_PORT_ID_MASK) << HSC_PORT_ID_BITS))
64
65enum {
66	HSC_CH_OPEN,
67	HSC_CH_READ,
68	HSC_CH_WRITE,
69	HSC_CH_WLINE,
70};
71
72enum {
73	HSC_RX,
74	HSC_TX,
75};
76
77struct hsc_client_data;
78/**
79 * struct hsc_channel - hsi_char internal channel data
80 * @ch: channel number
81 * @flags: Keeps state of the channel (open/close, reading, writing)
82 * @free_msgs_list: List of free HSI messages/requests
83 * @rx_msgs_queue: List of pending RX requests
84 * @tx_msgs_queue: List of pending TX requests
85 * @lock: Serialize access to the lists
86 * @cl: reference to the associated hsi_client
87 * @cl_data: reference to the client data that this channels belongs to
88 * @rx_wait: RX requests wait queue
89 * @tx_wait: TX requests wait queue
90 */
91struct hsc_channel {
92	unsigned int		ch;
93	unsigned long		flags;
94	struct list_head	free_msgs_list;
95	struct list_head	rx_msgs_queue;
96	struct list_head	tx_msgs_queue;
97	spinlock_t		lock;
98	struct hsi_client	*cl;
99	struct hsc_client_data *cl_data;
100	wait_queue_head_t	rx_wait;
101	wait_queue_head_t	tx_wait;
102};
103
104/**
105 * struct hsc_client_data - hsi_char internal client data
106 * @cdev: Characther device associated to the hsi_client
107 * @lock: Lock to serialize open/close access
108 * @flags: Keeps track of port state (rx hwbreak armed)
109 * @usecnt: Use count for claiming the HSI port (mutex protected)
110 * @cl: Referece to the HSI client
111 * @channels: Array of channels accessible by the client
112 */
113struct hsc_client_data {
114	struct cdev		cdev;
115	struct mutex		lock;
116	unsigned long		flags;
117	unsigned int		usecnt;
118	struct hsi_client	*cl;
119	struct hsc_channel	channels[HSC_DEVS];
120};
121
122/* Stores the major number dynamically allocated for hsi_char */
123static unsigned int hsc_major;
124/* Maximum buffer size that hsi_char will accept from userspace */
125static unsigned int max_data_size = 0x1000;
126module_param(max_data_size, uint, 0);
127MODULE_PARM_DESC(max_data_size, "max read/write data size [4,8..65536] (^2)");
128
129static void hsc_add_tail(struct hsc_channel *channel, struct hsi_msg *msg,
130							struct list_head *queue)
131{
132	unsigned long flags;
133
134	spin_lock_irqsave(&channel->lock, flags);
135	list_add_tail(&msg->link, queue);
136	spin_unlock_irqrestore(&channel->lock, flags);
137}
138
139static struct hsi_msg *hsc_get_first_msg(struct hsc_channel *channel,
140							struct list_head *queue)
141{
142	struct hsi_msg *msg = NULL;
143	unsigned long flags;
144
145	spin_lock_irqsave(&channel->lock, flags);
146
147	if (list_empty(queue))
148		goto out;
149
150	msg = list_first_entry(queue, struct hsi_msg, link);
151	list_del(&msg->link);
152out:
153	spin_unlock_irqrestore(&channel->lock, flags);
154
155	return msg;
156}
157
158static inline void hsc_msg_free(struct hsi_msg *msg)
159{
160	kfree(sg_virt(msg->sgt.sgl));
161	hsi_free_msg(msg);
162}
163
164static void hsc_free_list(struct list_head *list)
165{
166	struct hsi_msg *msg, *tmp;
167
168	list_for_each_entry_safe(msg, tmp, list, link) {
169		list_del(&msg->link);
170		hsc_msg_free(msg);
171	}
172}
173
174static void hsc_reset_list(struct hsc_channel *channel, struct list_head *l)
175{
176	unsigned long flags;
177	LIST_HEAD(list);
178
179	spin_lock_irqsave(&channel->lock, flags);
180	list_splice_init(l, &list);
181	spin_unlock_irqrestore(&channel->lock, flags);
182
183	hsc_free_list(&list);
184}
185
186static inline struct hsi_msg *hsc_msg_alloc(unsigned int alloc_size)
187{
188	struct hsi_msg *msg;
189	void *buf;
190
191	msg = hsi_alloc_msg(1, GFP_KERNEL);
192	if (!msg)
193		goto out;
194	buf = kmalloc(alloc_size, GFP_KERNEL);
195	if (!buf) {
196		hsi_free_msg(msg);
197		goto out;
198	}
199	sg_init_one(msg->sgt.sgl, buf, alloc_size);
200	/* Ignore false positive, due to sg pointer handling */
201	kmemleak_ignore(buf);
202
203	return msg;
204out:
205	return NULL;
206}
207
208static inline int hsc_msgs_alloc(struct hsc_channel *channel)
209{
210	struct hsi_msg *msg;
211	int i;
212
213	for (i = 0; i < HSC_MSGS; i++) {
214		msg = hsc_msg_alloc(max_data_size);
215		if (!msg)
216			goto out;
217		msg->channel = channel->ch;
218		list_add_tail(&msg->link, &channel->free_msgs_list);
219	}
220
221	return 0;
222out:
223	hsc_free_list(&channel->free_msgs_list);
224
225	return -ENOMEM;
226}
227
228static inline unsigned int hsc_msg_len_get(struct hsi_msg *msg)
229{
230	return msg->sgt.sgl->length;
231}
232
233static inline void hsc_msg_len_set(struct hsi_msg *msg, unsigned int len)
234{
235	msg->sgt.sgl->length = len;
236}
237
238static void hsc_rx_completed(struct hsi_msg *msg)
239{
240	struct hsc_client_data *cl_data = hsi_client_drvdata(msg->cl);
241	struct hsc_channel *channel = cl_data->channels + msg->channel;
242
243	if (test_bit(HSC_CH_READ, &channel->flags)) {
244		hsc_add_tail(channel, msg, &channel->rx_msgs_queue);
245		wake_up(&channel->rx_wait);
246	} else {
247		hsc_add_tail(channel, msg, &channel->free_msgs_list);
248	}
249}
250
251static void hsc_rx_msg_destructor(struct hsi_msg *msg)
252{
253	msg->status = HSI_STATUS_ERROR;
254	hsc_msg_len_set(msg, 0);
255	hsc_rx_completed(msg);
256}
257
258static void hsc_tx_completed(struct hsi_msg *msg)
259{
260	struct hsc_client_data *cl_data = hsi_client_drvdata(msg->cl);
261	struct hsc_channel *channel = cl_data->channels + msg->channel;
262
263	if (test_bit(HSC_CH_WRITE, &channel->flags)) {
264		hsc_add_tail(channel, msg, &channel->tx_msgs_queue);
265		wake_up(&channel->tx_wait);
266	} else {
267		hsc_add_tail(channel, msg, &channel->free_msgs_list);
268	}
269}
270
271static void hsc_tx_msg_destructor(struct hsi_msg *msg)
272{
273	msg->status = HSI_STATUS_ERROR;
274	hsc_msg_len_set(msg, 0);
275	hsc_tx_completed(msg);
276}
277
278static void hsc_break_req_destructor(struct hsi_msg *msg)
279{
280	struct hsc_client_data *cl_data = hsi_client_drvdata(msg->cl);
281
282	hsi_free_msg(msg);
283	clear_bit(HSC_RXBREAK, &cl_data->flags);
284}
285
286static void hsc_break_received(struct hsi_msg *msg)
287{
288	struct hsc_client_data *cl_data = hsi_client_drvdata(msg->cl);
289	struct hsc_channel *channel = cl_data->channels;
290	int i, ret;
291
292	/* Broadcast HWBREAK on all channels */
293	for (i = 0; i < HSC_DEVS; i++, channel++) {
294		struct hsi_msg *msg2;
295
296		if (!test_bit(HSC_CH_READ, &channel->flags))
297			continue;
298		msg2 = hsc_get_first_msg(channel, &channel->free_msgs_list);
299		if (!msg2)
300			continue;
301		clear_bit(HSC_CH_READ, &channel->flags);
302		hsc_msg_len_set(msg2, 0);
303		msg2->status = HSI_STATUS_COMPLETED;
304		hsc_add_tail(channel, msg2, &channel->rx_msgs_queue);
305		wake_up(&channel->rx_wait);
306	}
307	hsi_flush(msg->cl);
308	ret = hsi_async_read(msg->cl, msg);
309	if (ret < 0)
310		hsc_break_req_destructor(msg);
311}
312
313static int hsc_break_request(struct hsi_client *cl)
314{
315	struct hsc_client_data *cl_data = hsi_client_drvdata(cl);
316	struct hsi_msg *msg;
317	int ret;
318
319	if (test_and_set_bit(HSC_RXBREAK, &cl_data->flags))
320		return -EBUSY;
321
322	msg = hsi_alloc_msg(0, GFP_KERNEL);
323	if (!msg) {
324		clear_bit(HSC_RXBREAK, &cl_data->flags);
325		return -ENOMEM;
326	}
327	msg->break_frame = 1;
328	msg->complete = hsc_break_received;
329	msg->destructor = hsc_break_req_destructor;
330	ret = hsi_async_read(cl, msg);
331	if (ret < 0)
332		hsc_break_req_destructor(msg);
333
334	return ret;
335}
336
337static int hsc_break_send(struct hsi_client *cl)
338{
339	struct hsi_msg *msg;
340	int ret;
341
342	msg = hsi_alloc_msg(0, GFP_ATOMIC);
343	if (!msg)
344		return -ENOMEM;
345	msg->break_frame = 1;
346	msg->complete = hsi_free_msg;
347	msg->destructor = hsi_free_msg;
348	ret = hsi_async_write(cl, msg);
349	if (ret < 0)
350		hsi_free_msg(msg);
351
352	return ret;
353}
354
355static int hsc_rx_set(struct hsi_client *cl, struct hsc_rx_config *rxc)
356{
357	struct hsi_config tmp;
358	int ret;
359
360	if ((rxc->mode != HSI_MODE_STREAM) && (rxc->mode != HSI_MODE_FRAME))
361		return -EINVAL;
362	if ((rxc->channels == 0) || (rxc->channels > HSC_DEVS))
363		return -EINVAL;
364	if (rxc->channels & (rxc->channels - 1))
365		return -EINVAL;
366	if ((rxc->flow != HSI_FLOW_SYNC) && (rxc->flow != HSI_FLOW_PIPE))
367		return -EINVAL;
368	tmp = cl->rx_cfg;
369	cl->rx_cfg.mode = rxc->mode;
370	cl->rx_cfg.num_hw_channels = rxc->channels;
371	cl->rx_cfg.flow = rxc->flow;
372	ret = hsi_setup(cl);
373	if (ret < 0) {
374		cl->rx_cfg = tmp;
375		return ret;
376	}
377	if (rxc->mode == HSI_MODE_FRAME)
378		hsc_break_request(cl);
379
380	return ret;
381}
382
383static inline void hsc_rx_get(struct hsi_client *cl, struct hsc_rx_config *rxc)
384{
385	rxc->mode = cl->rx_cfg.mode;
386	rxc->channels = cl->rx_cfg.num_hw_channels;
387	rxc->flow = cl->rx_cfg.flow;
388}
389
390static int hsc_tx_set(struct hsi_client *cl, struct hsc_tx_config *txc)
391{
392	struct hsi_config tmp;
393	int ret;
394
395	if ((txc->mode != HSI_MODE_STREAM) && (txc->mode != HSI_MODE_FRAME))
396		return -EINVAL;
397	if ((txc->channels == 0) || (txc->channels > HSC_DEVS))
398		return -EINVAL;
399	if (txc->channels & (txc->channels - 1))
400		return -EINVAL;
401	if ((txc->arb_mode != HSI_ARB_RR) && (txc->arb_mode != HSI_ARB_PRIO))
402		return -EINVAL;
403	tmp = cl->tx_cfg;
404	cl->tx_cfg.mode = txc->mode;
405	cl->tx_cfg.num_hw_channels = txc->channels;
406	cl->tx_cfg.speed = txc->speed;
407	cl->tx_cfg.arb_mode = txc->arb_mode;
408	ret = hsi_setup(cl);
409	if (ret < 0) {
410		cl->tx_cfg = tmp;
411		return ret;
412	}
413
414	return ret;
415}
416
417static inline void hsc_tx_get(struct hsi_client *cl, struct hsc_tx_config *txc)
418{
419	txc->mode = cl->tx_cfg.mode;
420	txc->channels = cl->tx_cfg.num_hw_channels;
421	txc->speed = cl->tx_cfg.speed;
422	txc->arb_mode = cl->tx_cfg.arb_mode;
423}
424
425static ssize_t hsc_read(struct file *file, char __user *buf, size_t len,
426						loff_t *ppos __maybe_unused)
427{
428	struct hsc_channel *channel = file->private_data;
429	struct hsi_msg *msg;
430	ssize_t ret;
431
432	if (len == 0)
433		return 0;
434	if (!IS_ALIGNED(len, sizeof(u32)))
435		return -EINVAL;
436	if (len > max_data_size)
437		len = max_data_size;
438	if (channel->ch >= channel->cl->rx_cfg.num_hw_channels)
439		return -ECHRNG;
440	if (test_and_set_bit(HSC_CH_READ, &channel->flags))
441		return -EBUSY;
442	msg = hsc_get_first_msg(channel, &channel->free_msgs_list);
443	if (!msg) {
444		ret = -ENOSPC;
445		goto out;
446	}
447	hsc_msg_len_set(msg, len);
448	msg->complete = hsc_rx_completed;
449	msg->destructor = hsc_rx_msg_destructor;
450	ret = hsi_async_read(channel->cl, msg);
451	if (ret < 0) {
452		hsc_add_tail(channel, msg, &channel->free_msgs_list);
453		goto out;
454	}
455
456	ret = wait_event_interruptible(channel->rx_wait,
457					!list_empty(&channel->rx_msgs_queue));
458	if (ret < 0) {
459		clear_bit(HSC_CH_READ, &channel->flags);
460		hsi_flush(channel->cl);
461		return -EINTR;
462	}
463
464	msg = hsc_get_first_msg(channel, &channel->rx_msgs_queue);
465	if (msg) {
466		if (msg->status != HSI_STATUS_ERROR) {
467			ret = copy_to_user((void __user *)buf,
468			sg_virt(msg->sgt.sgl), hsc_msg_len_get(msg));
469			if (ret)
470				ret = -EFAULT;
471			else
472				ret = hsc_msg_len_get(msg);
473		} else {
474			ret = -EIO;
475		}
476		hsc_add_tail(channel, msg, &channel->free_msgs_list);
477	}
478out:
479	clear_bit(HSC_CH_READ, &channel->flags);
480
481	return ret;
482}
483
484static ssize_t hsc_write(struct file *file, const char __user *buf, size_t len,
485						loff_t *ppos __maybe_unused)
486{
487	struct hsc_channel *channel = file->private_data;
488	struct hsi_msg *msg;
489	ssize_t ret;
490
491	if ((len == 0) || !IS_ALIGNED(len, sizeof(u32)))
492		return -EINVAL;
493	if (len > max_data_size)
494		len = max_data_size;
495	if (channel->ch >= channel->cl->tx_cfg.num_hw_channels)
496		return -ECHRNG;
497	if (test_and_set_bit(HSC_CH_WRITE, &channel->flags))
498		return -EBUSY;
499	msg = hsc_get_first_msg(channel, &channel->free_msgs_list);
500	if (!msg) {
501		clear_bit(HSC_CH_WRITE, &channel->flags);
502		return -ENOSPC;
503	}
504	if (copy_from_user(sg_virt(msg->sgt.sgl), (void __user *)buf, len)) {
505		ret = -EFAULT;
506		goto out;
507	}
508	hsc_msg_len_set(msg, len);
509	msg->complete = hsc_tx_completed;
510	msg->destructor = hsc_tx_msg_destructor;
511	ret = hsi_async_write(channel->cl, msg);
512	if (ret < 0)
513		goto out;
514
515	ret = wait_event_interruptible(channel->tx_wait,
516					!list_empty(&channel->tx_msgs_queue));
517	if (ret < 0) {
518		clear_bit(HSC_CH_WRITE, &channel->flags);
519		hsi_flush(channel->cl);
520		return -EINTR;
521	}
522
523	msg = hsc_get_first_msg(channel, &channel->tx_msgs_queue);
524	if (msg) {
525		if (msg->status == HSI_STATUS_ERROR)
526			ret = -EIO;
527		else
528			ret = hsc_msg_len_get(msg);
529
530		hsc_add_tail(channel, msg, &channel->free_msgs_list);
531	}
532out:
533	clear_bit(HSC_CH_WRITE, &channel->flags);
534
535	return ret;
536}
537
538static long hsc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
539{
540	struct hsc_channel *channel = file->private_data;
541	unsigned int state;
542	struct hsc_rx_config rxc;
543	struct hsc_tx_config txc;
544	long ret = 0;
545
546	switch (cmd) {
547	case HSC_RESET:
548		hsi_flush(channel->cl);
549		break;
550	case HSC_SET_PM:
551		if (copy_from_user(&state, (void __user *)arg, sizeof(state)))
552			return -EFAULT;
553		if (state == HSC_PM_DISABLE) {
554			if (test_and_set_bit(HSC_CH_WLINE, &channel->flags))
555				return -EINVAL;
556			ret = hsi_start_tx(channel->cl);
557		} else if (state == HSC_PM_ENABLE) {
558			if (!test_and_clear_bit(HSC_CH_WLINE, &channel->flags))
559				return -EINVAL;
560			ret = hsi_stop_tx(channel->cl);
561		} else {
562			ret = -EINVAL;
563		}
564		break;
565	case HSC_SEND_BREAK:
566		return hsc_break_send(channel->cl);
567	case HSC_SET_RX:
568		if (copy_from_user(&rxc, (void __user *)arg, sizeof(rxc)))
569			return -EFAULT;
570		return hsc_rx_set(channel->cl, &rxc);
571	case HSC_GET_RX:
572		hsc_rx_get(channel->cl, &rxc);
573		if (copy_to_user((void __user *)arg, &rxc, sizeof(rxc)))
574			return -EFAULT;
575		break;
576	case HSC_SET_TX:
577		if (copy_from_user(&txc, (void __user *)arg, sizeof(txc)))
578			return -EFAULT;
579		return hsc_tx_set(channel->cl, &txc);
580	case HSC_GET_TX:
581		hsc_tx_get(channel->cl, &txc);
582		if (copy_to_user((void __user *)arg, &txc, sizeof(txc)))
583			return -EFAULT;
584		break;
585	default:
586		return -ENOIOCTLCMD;
587	}
588
589	return ret;
590}
591
592static inline void __hsc_port_release(struct hsc_client_data *cl_data)
593{
594	BUG_ON(cl_data->usecnt == 0);
595
596	if (--cl_data->usecnt == 0) {
597		hsi_flush(cl_data->cl);
598		hsi_release_port(cl_data->cl);
599	}
600}
601
602static int hsc_open(struct inode *inode, struct file *file)
603{
604	struct hsc_client_data *cl_data;
605	struct hsc_channel *channel;
606	int ret = 0;
607
608	pr_debug("open, minor = %d\n", iminor(inode));
609
610	cl_data = container_of(inode->i_cdev, struct hsc_client_data, cdev);
611	mutex_lock(&cl_data->lock);
612	channel = cl_data->channels + (iminor(inode) & HSC_CH_MASK);
613
614	if (test_and_set_bit(HSC_CH_OPEN, &channel->flags)) {
615		ret = -EBUSY;
616		goto out;
617	}
618	/*
619	 * Check if we have already claimed the port associated to the HSI
620	 * client. If not then try to claim it, else increase its refcount
621	 */
622	if (cl_data->usecnt == 0) {
623		ret = hsi_claim_port(cl_data->cl, 0);
624		if (ret < 0)
625			goto out;
626		hsi_setup(cl_data->cl);
627	}
628	cl_data->usecnt++;
629
630	ret = hsc_msgs_alloc(channel);
631	if (ret < 0) {
632		__hsc_port_release(cl_data);
633		goto out;
634	}
635
636	file->private_data = channel;
637	mutex_unlock(&cl_data->lock);
638
639	return ret;
640out:
641	mutex_unlock(&cl_data->lock);
642
643	return ret;
644}
645
646static int hsc_release(struct inode *inode __maybe_unused, struct file *file)
647{
648	struct hsc_channel *channel = file->private_data;
649	struct hsc_client_data *cl_data = channel->cl_data;
650
651	mutex_lock(&cl_data->lock);
652	file->private_data = NULL;
653	if (test_and_clear_bit(HSC_CH_WLINE, &channel->flags))
654		hsi_stop_tx(channel->cl);
655	__hsc_port_release(cl_data);
656	hsc_reset_list(channel, &channel->rx_msgs_queue);
657	hsc_reset_list(channel, &channel->tx_msgs_queue);
658	hsc_reset_list(channel, &channel->free_msgs_list);
659	clear_bit(HSC_CH_READ, &channel->flags);
660	clear_bit(HSC_CH_WRITE, &channel->flags);
661	clear_bit(HSC_CH_OPEN, &channel->flags);
662	wake_up(&channel->rx_wait);
663	wake_up(&channel->tx_wait);
664	mutex_unlock(&cl_data->lock);
665
666	return 0;
667}
668
669static const struct file_operations hsc_fops = {
670	.owner		= THIS_MODULE,
671	.read		= hsc_read,
672	.write		= hsc_write,
673	.unlocked_ioctl	= hsc_ioctl,
674	.open		= hsc_open,
675	.release	= hsc_release,
676};
677
678static void hsc_channel_init(struct hsc_channel *channel)
679{
680	init_waitqueue_head(&channel->rx_wait);
681	init_waitqueue_head(&channel->tx_wait);
682	spin_lock_init(&channel->lock);
683	INIT_LIST_HEAD(&channel->free_msgs_list);
684	INIT_LIST_HEAD(&channel->rx_msgs_queue);
685	INIT_LIST_HEAD(&channel->tx_msgs_queue);
686}
687
688static int hsc_probe(struct device *dev)
689{
690	const char devname[] = "hsi_char";
691	struct hsc_client_data *cl_data;
692	struct hsc_channel *channel;
693	struct hsi_client *cl = to_hsi_client(dev);
694	unsigned int hsc_baseminor;
695	dev_t hsc_dev;
696	int ret;
697	int i;
698
699	cl_data = kzalloc(sizeof(*cl_data), GFP_KERNEL);
700	if (!cl_data) {
701		dev_err(dev, "Could not allocate hsc_client_data\n");
702		return -ENOMEM;
703	}
704	hsc_baseminor = HSC_BASEMINOR(hsi_id(cl), hsi_port_id(cl));
705	if (!hsc_major) {
706		ret = alloc_chrdev_region(&hsc_dev, hsc_baseminor,
707						HSC_DEVS, devname);
708		if (ret == 0)
709			hsc_major = MAJOR(hsc_dev);
710	} else {
711		hsc_dev = MKDEV(hsc_major, hsc_baseminor);
712		ret = register_chrdev_region(hsc_dev, HSC_DEVS, devname);
713	}
714	if (ret < 0) {
715		dev_err(dev, "Device %s allocation failed %d\n",
716					hsc_major ? "minor" : "major", ret);
717		goto out1;
718	}
719	mutex_init(&cl_data->lock);
720	hsi_client_set_drvdata(cl, cl_data);
721	cdev_init(&cl_data->cdev, &hsc_fops);
722	cl_data->cdev.owner = THIS_MODULE;
723	cl_data->cl = cl;
724	for (i = 0, channel = cl_data->channels; i < HSC_DEVS; i++, channel++) {
725		hsc_channel_init(channel);
726		channel->ch = i;
727		channel->cl = cl;
728		channel->cl_data = cl_data;
729	}
730
731	/* 1 hsi client -> N char devices (one for each channel) */
732	ret = cdev_add(&cl_data->cdev, hsc_dev, HSC_DEVS);
733	if (ret) {
734		dev_err(dev, "Could not add char device %d\n", ret);
735		goto out2;
736	}
737
738	return 0;
739out2:
740	unregister_chrdev_region(hsc_dev, HSC_DEVS);
741out1:
742	kfree(cl_data);
743
744	return ret;
745}
746
747static int hsc_remove(struct device *dev)
748{
749	struct hsi_client *cl = to_hsi_client(dev);
750	struct hsc_client_data *cl_data = hsi_client_drvdata(cl);
751	dev_t hsc_dev = cl_data->cdev.dev;
752
753	cdev_del(&cl_data->cdev);
754	unregister_chrdev_region(hsc_dev, HSC_DEVS);
755	hsi_client_set_drvdata(cl, NULL);
756	kfree(cl_data);
757
758	return 0;
759}
760
761static struct hsi_client_driver hsc_driver = {
762	.driver = {
763		.name	= "hsi_char",
764		.owner	= THIS_MODULE,
765		.probe	= hsc_probe,
766		.remove	= hsc_remove,
767	},
768};
769
770static int __init hsc_init(void)
771{
772	int ret;
773
774	if ((max_data_size < 4) || (max_data_size > 0x10000) ||
775		(max_data_size & (max_data_size - 1))) {
776		pr_err("Invalid max read/write data size");
777		return -EINVAL;
778	}
779
780	ret = hsi_register_client_driver(&hsc_driver);
781	if (ret) {
782		pr_err("Error while registering HSI/SSI driver %d", ret);
783		return ret;
784	}
785
786	pr_info("HSI/SSI char device loaded\n");
787
788	return 0;
789}
790module_init(hsc_init);
791
792static void __exit hsc_exit(void)
793{
794	hsi_unregister_client_driver(&hsc_driver);
795	pr_info("HSI char device removed\n");
796}
797module_exit(hsc_exit);
798
799MODULE_AUTHOR("Andras Domokos <andras.domokos@nokia.com>");
800MODULE_ALIAS("hsi:hsi_char");
801MODULE_DESCRIPTION("HSI character device");
802MODULE_LICENSE("GPL v2");
803