• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * HMS Anybus-S Host Driver
4  *
5  * Copyright (C) 2018 Arcx Inc
6  */
7 
8 /*
9  * Architecture Overview
10  * =====================
11  * This driver (running on the CPU/SoC) and the Anybus-S card communicate
12  * by reading and writing data to/from the Anybus-S Dual-Port RAM (dpram).
13  * This is memory connected to both the SoC and Anybus-S card, which both sides
14  * can access freely and concurrently.
15  *
16  * Synchronization happens by means of two registers located in the dpram:
17  * IND_AB: written exclusively by the Anybus card; and
18  * IND_AP: written exclusively by this driver.
19  *
20  * Communication happens using one of the following mechanisms:
21  * 1. reserve, read/write, release dpram memory areas:
22  *	using an IND_AB/IND_AP protocol, the driver is able to reserve certain
23  *	memory areas. no dpram memory can be read or written except if reserved.
24  *	(with a few limited exceptions)
25  * 2. send and receive data structures via a shared mailbox:
26  *	using an IND_AB/IND_AP protocol, the driver and Anybus card are able to
27  *	exchange commands and responses using a shared mailbox.
28  * 3. receive software interrupts:
29  *	using an IND_AB/IND_AP protocol, the Anybus card is able to notify the
30  *	driver of certain events such as: bus online/offline, data available.
31  *	note that software interrupt event bits are located in a memory area
32  *	which must be reserved before it can be accessed.
33  *
34  * The manual[1] is silent on whether these mechanisms can happen concurrently,
35  * or how they should be synchronized. However, section 13 (Driver Example)
36  * provides the following suggestion for developing a driver:
37  * a) an interrupt handler which updates global variables;
38  * b) a continuously-running task handling area requests (1 above)
39  * c) a continuously-running task handling mailbox requests (2 above)
40  * The example conspicuously leaves out software interrupts (3 above), which
41  * is the thorniest issue to get right (see below).
42  *
43  * The naive, straightforward way to implement this would be:
44  * - create an isr which updates shared variables;
45  * - create a work_struct which handles software interrupts on a queue;
46  * - create a function which does reserve/update/unlock in a loop;
47  * - create a function which does mailbox send/receive in a loop;
48  * - call the above functions from the driver's read/write/ioctl;
49  * - synchronize using mutexes/spinlocks:
50  *	+ only one area request at a time
51  *	+ only one mailbox request at a time
52  *	+ protect AB_IND, AB_IND against data hazards (e.g. read-after-write)
53  *
54  * Unfortunately, the presence of the software interrupt causes subtle yet
55  * considerable synchronization issues; especially problematic is the
56  * requirement to reserve/release the area which contains the status bits.
57  *
58  * The driver architecture presented here sidesteps these synchronization issues
59  * by accessing the dpram from a single kernel thread only. User-space throws
60  * "tasks" (i.e. 1, 2 above) into a task queue, waits for their completion,
61  * and the kernel thread runs them to completion.
62  *
63  * Each task has a task_function, which is called/run by the queue thread.
64  * That function communicates with the Anybus card, and returns either
65  * 0 (OK), a negative error code (error), or -EINPROGRESS (waiting).
66  * On OK or error, the queue thread completes and dequeues the task,
67  * which also releases the user space thread which may still be waiting for it.
68  * On -EINPROGRESS (waiting), the queue thread will leave the task on the queue,
69  * and revisit (call again) whenever an interrupt event comes in.
70  *
71  * Each task has a state machine, which is run by calling its task_function.
72  * It ensures that the task will go through its various stages over time,
73  * returning -EINPROGRESS if it wants to wait for an event to happen.
74  *
75  * Note that according to the manual's driver example, the following operations
76  * may run independent of each other:
77  * - area reserve/read/write/release	(point 1 above)
78  * - mailbox operations			(point 2 above)
79  * - switching power on/off
80  *
81  * To allow them to run independently, each operation class gets its own queue.
82  *
83  * Userspace processes A, B, C, D post tasks to the appropriate queue,
84  * and wait for task completion:
85  *
86  *	process A	B	C	D
87  *		|	|	|	|
88  *		v	v	v	v
89  *	|<-----	========================================
90  *	|		|	   |		|
91  *	|		v	   v		v-------<-------+
92  *	|	+--------------------------------------+	|
93  *	|	| power q     | mbox q    | area q     |	|
94  *	|	|------------|------------|------------|	|
95  *	|	| task       | task       | task       |	|
96  *	|	| task       | task       | task       |	|
97  *	|	| task wait  | task wait  | task wait  |	|
98  *	|	+--------------------------------------+	|
99  *	|		^	   ^		^		|
100  *	|		|	   |		|		^
101  *	|	+--------------------------------------+	|
102  *	|	|	     queue thread	       |	|
103  *	|	|--------------------------------------|	|
104  *	|	| single-threaded:		       |	|
105  *	|	| loop:				       |	|
106  *	v	|   for each queue:		       |	|
107  *	|	|     run task state machine	       |	|
108  *	|	|     if task waiting:		       |	|
109  *	|	|       leave on queue		       |	|
110  *	|	|     if task done:		       |	|
111  *	|	|       complete task, remove from q   |	|
112  *	|	|   if software irq event bits set:    |	|
113  *	|	|     notify userspace		       |	|
114  *	|	|     post clear event bits task------>|>-------+
115  *	|	|   wait for IND_AB changed event OR   |
116  *	|	|            task added event	  OR   |
117  *	|	|	     timeout		       |
118  *	|	| end loop			       |
119  *	|	+--------------------------------------+
120  *	|	+		wake up		       +
121  *	|	+--------------------------------------+
122  *	|		^			^
123  *	|		|			|
124  *	+-------->-------			|
125  *						|
126  *		+--------------------------------------+
127  *		|	interrupt service routine      |
128  *		|--------------------------------------|
129  *		| wake up queue thread on IND_AB change|
130  *		+--------------------------------------+
131  *
132  * Note that the Anybus interrupt is dual-purpose:
133  * - after a reset, triggered when the card becomes ready;
134  * - during normal operation, triggered when AB_IND changes.
135  * This is why the interrupt service routine doesn't just wake up the
136  * queue thread, but also completes the card_boot completion.
137  *
138  * [1] https://www.anybus.com/docs/librariesprovider7/default-document-library/
139  *	manuals-design-guides/hms-hmsi-27-275.pdf
140  */
141 
142 #include <linux/kernel.h>
143 #include <linux/module.h>
144 #include <linux/init.h>
145 #include <linux/slab.h>
146 #include <linux/interrupt.h>
147 #include <linux/atomic.h>
148 #include <linux/kthread.h>
149 #include <linux/kfifo.h>
150 #include <linux/spinlock.h>
151 #include <linux/uaccess.h>
152 #include <linux/regmap.h>
153 #include <linux/of.h>
154 #include <linux/random.h>
155 #include <linux/kref.h>
156 #include <linux/of_address.h>
157 
158 /* move to <linux/anybuss-*.h> when taking this out of staging */
159 #include "anybuss-client.h"
160 #include "anybuss-controller.h"
161 
162 #define DPRAM_SIZE		0x800
163 #define MAX_MBOX_MSG_SZ		0x0FF
164 #define TIMEOUT			(HZ * 2)
165 #define MAX_DATA_AREA_SZ	0x200
166 #define MAX_FBCTRL_AREA_SZ	0x1BE
167 
168 #define REG_BOOTLOADER_V	0x7C0
169 #define REG_API_V		0x7C2
170 #define REG_FIELDBUS_V		0x7C4
171 #define REG_SERIAL_NO		0x7C6
172 #define REG_FIELDBUS_TYPE	0x7CC
173 #define REG_MODULE_SW_V		0x7CE
174 #define REG_IND_AB		0x7FF
175 #define REG_IND_AP		0x7FE
176 #define REG_EVENT_CAUSE		0x7ED
177 #define MBOX_IN_AREA		0x400
178 #define MBOX_OUT_AREA		0x520
179 #define DATA_IN_AREA		0x000
180 #define DATA_OUT_AREA		0x200
181 #define FBCTRL_AREA		0x640
182 
183 #define EVENT_CAUSE_DC          0x01
184 #define EVENT_CAUSE_FBOF        0x02
185 #define EVENT_CAUSE_FBON        0x04
186 
187 #define IND_AB_UPDATED		0x08
188 #define IND_AX_MIN		0x80
189 #define IND_AX_MOUT		0x40
190 #define IND_AX_IN		0x04
191 #define IND_AX_OUT		0x02
192 #define IND_AX_FBCTRL		0x01
193 #define IND_AP_LOCK		0x08
194 #define IND_AP_ACTION		0x10
195 #define IND_AX_EVNT		0x20
196 #define IND_AP_ABITS		(IND_AX_IN | IND_AX_OUT | \
197 					IND_AX_FBCTRL | \
198 					IND_AP_ACTION | IND_AP_LOCK)
199 
200 #define INFO_TYPE_FB		0x0002
201 #define INFO_TYPE_APP		0x0001
202 #define INFO_COMMAND		0x4000
203 
204 #define OP_MODE_FBFC		0x0002
205 #define OP_MODE_FBS		0x0004
206 #define OP_MODE_CD		0x0200
207 
208 #define CMD_START_INIT		0x0001
209 #define CMD_ANYBUS_INIT		0x0002
210 #define CMD_END_INIT		0x0003
211 
212 /*
213  * ---------------------------------------------------------------
214  * Anybus mailbox messages - definitions
215  * ---------------------------------------------------------------
216  * note that we're depending on the layout of these structures being
217  * exactly as advertised.
218  */
219 
220 struct anybus_mbox_hdr {
221 	__be16 id;
222 	__be16 info;
223 	__be16 cmd_num;
224 	__be16 data_size;
225 	__be16 frame_count;
226 	__be16 frame_num;
227 	__be16 offset_high;
228 	__be16 offset_low;
229 	__be16 extended[8];
230 };
231 
232 struct msg_anybus_init {
233 	__be16 input_io_len;
234 	__be16 input_dpram_len;
235 	__be16 input_total_len;
236 	__be16 output_io_len;
237 	__be16 output_dpram_len;
238 	__be16 output_total_len;
239 	__be16 op_mode;
240 	__be16 notif_config;
241 	__be16 wd_val;
242 };
243 
244 /* ------------- ref counted tasks ------------- */
245 
246 struct ab_task;
247 typedef int (*ab_task_fn_t)(struct anybuss_host *cd,
248 					struct ab_task *t);
249 typedef void (*ab_done_fn_t)(struct anybuss_host *cd);
250 
251 struct area_priv {
252 	bool is_write;
253 	u16 flags;
254 	u16 addr;
255 	size_t count;
256 	u8 buf[MAX_DATA_AREA_SZ];
257 };
258 
259 struct mbox_priv {
260 	struct anybus_mbox_hdr hdr;
261 	size_t msg_out_sz;
262 	size_t msg_in_sz;
263 	u8 msg[MAX_MBOX_MSG_SZ];
264 };
265 
266 struct ab_task {
267 	struct kmem_cache	*cache;
268 	struct kref		refcount;
269 	ab_task_fn_t		task_fn;
270 	ab_done_fn_t		done_fn;
271 	int			result;
272 	struct completion	done;
273 	unsigned long		start_jiffies;
274 	union {
275 		struct area_priv area_pd;
276 		struct mbox_priv mbox_pd;
277 	};
278 };
279 
ab_task_create_get(struct kmem_cache * cache,ab_task_fn_t task_fn)280 static struct ab_task *ab_task_create_get(struct kmem_cache *cache,
281 					  ab_task_fn_t task_fn)
282 {
283 	struct ab_task *t;
284 
285 	t = kmem_cache_alloc(cache, GFP_KERNEL);
286 	if (!t)
287 		return NULL;
288 	t->cache = cache;
289 	kref_init(&t->refcount);
290 	t->task_fn = task_fn;
291 	t->done_fn = NULL;
292 	t->result = 0;
293 	init_completion(&t->done);
294 	return t;
295 }
296 
__ab_task_destroy(struct kref * refcount)297 static void __ab_task_destroy(struct kref *refcount)
298 {
299 	struct ab_task *t = container_of(refcount, struct ab_task, refcount);
300 	struct kmem_cache *cache = t->cache;
301 
302 	kmem_cache_free(cache, t);
303 }
304 
ab_task_put(struct ab_task * t)305 static void ab_task_put(struct ab_task *t)
306 {
307 	kref_put(&t->refcount, __ab_task_destroy);
308 }
309 
__ab_task_get(struct ab_task * t)310 static struct ab_task *__ab_task_get(struct ab_task *t)
311 {
312 	kref_get(&t->refcount);
313 	return t;
314 }
315 
__ab_task_finish(struct ab_task * t,struct anybuss_host * cd)316 static void __ab_task_finish(struct ab_task *t, struct anybuss_host *cd)
317 {
318 	if (t->done_fn)
319 		t->done_fn(cd);
320 	complete(&t->done);
321 }
322 
323 static void
ab_task_dequeue_finish_put(struct kfifo * q,struct anybuss_host * cd)324 ab_task_dequeue_finish_put(struct kfifo *q, struct anybuss_host *cd)
325 {
326 	int ret;
327 	struct ab_task *t;
328 
329 	ret = kfifo_out(q, &t, sizeof(t));
330 	WARN_ON(!ret);
331 	__ab_task_finish(t, cd);
332 	ab_task_put(t);
333 }
334 
335 static int
ab_task_enqueue(struct ab_task * t,struct kfifo * q,spinlock_t * slock,wait_queue_head_t * wq)336 ab_task_enqueue(struct ab_task *t, struct kfifo *q, spinlock_t *slock,
337 		wait_queue_head_t *wq)
338 {
339 	int ret;
340 
341 	t->start_jiffies = jiffies;
342 	__ab_task_get(t);
343 	ret = kfifo_in_spinlocked(q, &t, sizeof(t), slock);
344 	if (!ret) {
345 		ab_task_put(t);
346 		return -ENOMEM;
347 	}
348 	wake_up(wq);
349 	return 0;
350 }
351 
352 static int
ab_task_enqueue_wait(struct ab_task * t,struct kfifo * q,spinlock_t * slock,wait_queue_head_t * wq)353 ab_task_enqueue_wait(struct ab_task *t, struct kfifo *q, spinlock_t *slock,
354 		     wait_queue_head_t *wq)
355 {
356 	int ret;
357 
358 	ret = ab_task_enqueue(t, q, slock, wq);
359 	if (ret)
360 		return ret;
361 	ret = wait_for_completion_interruptible(&t->done);
362 	if (ret)
363 		return ret;
364 	return t->result;
365 }
366 
367 /* ------------------------ anybus hardware ------------------------ */
368 
369 struct anybuss_host {
370 	struct device *dev;
371 	struct anybuss_client *client;
372 	void (*reset)(struct device *dev, bool assert);
373 	struct regmap *regmap;
374 	int irq;
375 	int host_idx;
376 	struct task_struct *qthread;
377 	wait_queue_head_t wq;
378 	struct completion card_boot;
379 	atomic_t ind_ab;
380 	spinlock_t qlock; /* protects IN side of powerq, mboxq, areaq */
381 	struct kmem_cache *qcache;
382 	struct kfifo qs[3];
383 	struct kfifo *powerq;
384 	struct kfifo *mboxq;
385 	struct kfifo *areaq;
386 	bool power_on;
387 	bool softint_pending;
388 };
389 
reset_assert(struct anybuss_host * cd)390 static void reset_assert(struct anybuss_host *cd)
391 {
392 	cd->reset(cd->dev, true);
393 }
394 
reset_deassert(struct anybuss_host * cd)395 static void reset_deassert(struct anybuss_host *cd)
396 {
397 	cd->reset(cd->dev, false);
398 }
399 
test_dpram(struct regmap * regmap)400 static int test_dpram(struct regmap *regmap)
401 {
402 	int i;
403 	unsigned int val;
404 
405 	for (i = 0; i < DPRAM_SIZE; i++)
406 		regmap_write(regmap, i, (u8)i);
407 	for (i = 0; i < DPRAM_SIZE; i++) {
408 		regmap_read(regmap, i, &val);
409 		if ((u8)val != (u8)i)
410 			return -EIO;
411 	}
412 	return 0;
413 }
414 
read_ind_ab(struct regmap * regmap)415 static int read_ind_ab(struct regmap *regmap)
416 {
417 	unsigned long timeout = jiffies + HZ / 2;
418 	unsigned int a, b, i = 0;
419 
420 	while (time_before_eq(jiffies, timeout)) {
421 		regmap_read(regmap, REG_IND_AB, &a);
422 		regmap_read(regmap, REG_IND_AB, &b);
423 		if (likely(a == b))
424 			return (int)a;
425 		if (i < 10) {
426 			cpu_relax();
427 			i++;
428 		} else {
429 			usleep_range(500, 1000);
430 		}
431 	}
432 	WARN(1, "IND_AB register not stable");
433 	return -ETIMEDOUT;
434 }
435 
write_ind_ap(struct regmap * regmap,unsigned int ind_ap)436 static int write_ind_ap(struct regmap *regmap, unsigned int ind_ap)
437 {
438 	unsigned long timeout = jiffies + HZ / 2;
439 	unsigned int v, i = 0;
440 
441 	while (time_before_eq(jiffies, timeout)) {
442 		regmap_write(regmap, REG_IND_AP, ind_ap);
443 		regmap_read(regmap, REG_IND_AP, &v);
444 		if (likely(ind_ap == v))
445 			return 0;
446 		if (i < 10) {
447 			cpu_relax();
448 			i++;
449 		} else {
450 			usleep_range(500, 1000);
451 		}
452 	}
453 	WARN(1, "IND_AP register not stable");
454 	return -ETIMEDOUT;
455 }
456 
irq_handler(int irq,void * data)457 static irqreturn_t irq_handler(int irq, void *data)
458 {
459 	struct anybuss_host *cd = data;
460 	int ind_ab;
461 
462 	/*
463 	 * irq handler needs exclusive access to the IND_AB register,
464 	 * because the act of reading the register acks the interrupt.
465 	 *
466 	 * store the register value in cd->ind_ab (an atomic_t), so that the
467 	 * queue thread is able to read it without causing an interrupt ack
468 	 * side-effect (and without spuriously acking an interrupt).
469 	 */
470 	ind_ab = read_ind_ab(cd->regmap);
471 	if (ind_ab < 0)
472 		return IRQ_NONE;
473 	atomic_set(&cd->ind_ab, ind_ab);
474 	complete(&cd->card_boot);
475 	wake_up(&cd->wq);
476 	return IRQ_HANDLED;
477 }
478 
479 /* ------------------------ power on/off tasks --------------------- */
480 
task_fn_power_off(struct anybuss_host * cd,struct ab_task * t)481 static int task_fn_power_off(struct anybuss_host *cd,
482 			     struct ab_task *t)
483 {
484 	struct anybuss_client *client = cd->client;
485 
486 	if (!cd->power_on)
487 		return 0;
488 	disable_irq(cd->irq);
489 	reset_assert(cd);
490 	atomic_set(&cd->ind_ab, IND_AB_UPDATED);
491 	if (client->on_online_changed)
492 		client->on_online_changed(client, false);
493 	cd->power_on = false;
494 	return 0;
495 }
496 
task_fn_power_on_2(struct anybuss_host * cd,struct ab_task * t)497 static int task_fn_power_on_2(struct anybuss_host *cd,
498 			      struct ab_task *t)
499 {
500 	if (completion_done(&cd->card_boot)) {
501 		cd->power_on = true;
502 		return 0;
503 	}
504 	if (time_after(jiffies, t->start_jiffies + TIMEOUT)) {
505 		disable_irq(cd->irq);
506 		reset_assert(cd);
507 		dev_err(cd->dev, "power on timed out");
508 		return -ETIMEDOUT;
509 	}
510 	return -EINPROGRESS;
511 }
512 
task_fn_power_on(struct anybuss_host * cd,struct ab_task * t)513 static int task_fn_power_on(struct anybuss_host *cd,
514 			    struct ab_task *t)
515 {
516 	unsigned int dummy;
517 
518 	if (cd->power_on)
519 		return 0;
520 	/*
521 	 * anybus docs: prevent false 'init done' interrupt by
522 	 * doing a dummy read of IND_AB register while in reset.
523 	 */
524 	regmap_read(cd->regmap, REG_IND_AB, &dummy);
525 	reinit_completion(&cd->card_boot);
526 	enable_irq(cd->irq);
527 	reset_deassert(cd);
528 	t->task_fn = task_fn_power_on_2;
529 	return -EINPROGRESS;
530 }
531 
anybuss_set_power(struct anybuss_client * client,bool power_on)532 int anybuss_set_power(struct anybuss_client *client, bool power_on)
533 {
534 	struct anybuss_host *cd = client->host;
535 	struct ab_task *t;
536 	int err;
537 
538 	t = ab_task_create_get(cd->qcache, power_on ?
539 				task_fn_power_on : task_fn_power_off);
540 	if (!t)
541 		return -ENOMEM;
542 	err = ab_task_enqueue_wait(t, cd->powerq, &cd->qlock, &cd->wq);
543 	ab_task_put(t);
544 	return err;
545 }
546 EXPORT_SYMBOL_GPL(anybuss_set_power);
547 
548 /* ---------------------------- area tasks ------------------------ */
549 
task_fn_area_3(struct anybuss_host * cd,struct ab_task * t)550 static int task_fn_area_3(struct anybuss_host *cd, struct ab_task *t)
551 {
552 	struct area_priv *pd = &t->area_pd;
553 
554 	if (!cd->power_on)
555 		return -EIO;
556 	if (atomic_read(&cd->ind_ab) & pd->flags) {
557 		/* area not released yet */
558 		if (time_after(jiffies, t->start_jiffies + TIMEOUT))
559 			return -ETIMEDOUT;
560 		return -EINPROGRESS;
561 	}
562 	return 0;
563 }
564 
task_fn_area_2(struct anybuss_host * cd,struct ab_task * t)565 static int task_fn_area_2(struct anybuss_host *cd, struct ab_task *t)
566 {
567 	struct area_priv *pd = &t->area_pd;
568 	unsigned int ind_ap;
569 	int ret;
570 
571 	if (!cd->power_on)
572 		return -EIO;
573 	regmap_read(cd->regmap, REG_IND_AP, &ind_ap);
574 	if (!(atomic_read(&cd->ind_ab) & pd->flags)) {
575 		/* we don't own the area yet */
576 		if (time_after(jiffies, t->start_jiffies + TIMEOUT)) {
577 			dev_warn(cd->dev, "timeout waiting for area");
578 			dump_stack();
579 			return -ETIMEDOUT;
580 		}
581 		return -EINPROGRESS;
582 	}
583 	/* we own the area, do what we're here to do */
584 	if (pd->is_write)
585 		regmap_bulk_write(cd->regmap, pd->addr, pd->buf,
586 				  pd->count);
587 	else
588 		regmap_bulk_read(cd->regmap, pd->addr, pd->buf,
589 				 pd->count);
590 	/* ask to release the area, must use unlocked release */
591 	ind_ap &= ~IND_AP_ABITS;
592 	ind_ap |= pd->flags;
593 	ret = write_ind_ap(cd->regmap, ind_ap);
594 	if (ret)
595 		return ret;
596 	t->task_fn = task_fn_area_3;
597 	return -EINPROGRESS;
598 }
599 
task_fn_area(struct anybuss_host * cd,struct ab_task * t)600 static int task_fn_area(struct anybuss_host *cd, struct ab_task *t)
601 {
602 	struct area_priv *pd = &t->area_pd;
603 	unsigned int ind_ap;
604 	int ret;
605 
606 	if (!cd->power_on)
607 		return -EIO;
608 	regmap_read(cd->regmap, REG_IND_AP, &ind_ap);
609 	/* ask to take the area */
610 	ind_ap &= ~IND_AP_ABITS;
611 	ind_ap |= pd->flags | IND_AP_ACTION | IND_AP_LOCK;
612 	ret = write_ind_ap(cd->regmap, ind_ap);
613 	if (ret)
614 		return ret;
615 	t->task_fn = task_fn_area_2;
616 	return -EINPROGRESS;
617 }
618 
619 static struct ab_task *
create_area_reader(struct kmem_cache * qcache,u16 flags,u16 addr,size_t count)620 create_area_reader(struct kmem_cache *qcache, u16 flags, u16 addr,
621 		   size_t count)
622 {
623 	struct ab_task *t;
624 	struct area_priv *ap;
625 
626 	t = ab_task_create_get(qcache, task_fn_area);
627 	if (!t)
628 		return NULL;
629 	ap = &t->area_pd;
630 	ap->flags = flags;
631 	ap->addr = addr;
632 	ap->is_write = false;
633 	ap->count = count;
634 	return t;
635 }
636 
637 static struct ab_task *
create_area_writer(struct kmem_cache * qcache,u16 flags,u16 addr,const void * buf,size_t count)638 create_area_writer(struct kmem_cache *qcache, u16 flags, u16 addr,
639 		   const void *buf, size_t count)
640 {
641 	struct ab_task *t;
642 	struct area_priv *ap;
643 
644 	t = ab_task_create_get(qcache, task_fn_area);
645 	if (!t)
646 		return NULL;
647 	ap = &t->area_pd;
648 	ap->flags = flags;
649 	ap->addr = addr;
650 	ap->is_write = true;
651 	ap->count = count;
652 	memcpy(ap->buf, buf, count);
653 	return t;
654 }
655 
656 static struct ab_task *
create_area_user_writer(struct kmem_cache * qcache,u16 flags,u16 addr,const void __user * buf,size_t count)657 create_area_user_writer(struct kmem_cache *qcache, u16 flags, u16 addr,
658 			const void __user *buf, size_t count)
659 {
660 	struct ab_task *t;
661 	struct area_priv *ap;
662 
663 	t = ab_task_create_get(qcache, task_fn_area);
664 	if (!t)
665 		return ERR_PTR(-ENOMEM);
666 	ap = &t->area_pd;
667 	ap->flags = flags;
668 	ap->addr = addr;
669 	ap->is_write = true;
670 	ap->count = count;
671 	if (copy_from_user(ap->buf, buf, count)) {
672 		ab_task_put(t);
673 		return ERR_PTR(-EFAULT);
674 	}
675 	return t;
676 }
677 
area_range_ok(u16 addr,size_t count,u16 area_start,size_t area_sz)678 static bool area_range_ok(u16 addr, size_t count, u16 area_start,
679 			  size_t area_sz)
680 {
681 	u16 area_end_ex = area_start + area_sz;
682 	u16 addr_end_ex;
683 
684 	if (addr < area_start)
685 		return false;
686 	if (addr >= area_end_ex)
687 		return false;
688 	addr_end_ex = addr + count;
689 	if (addr_end_ex > area_end_ex)
690 		return false;
691 	return true;
692 }
693 
694 /* -------------------------- mailbox tasks ----------------------- */
695 
task_fn_mbox_2(struct anybuss_host * cd,struct ab_task * t)696 static int task_fn_mbox_2(struct anybuss_host *cd, struct ab_task *t)
697 {
698 	struct mbox_priv *pd = &t->mbox_pd;
699 	unsigned int ind_ap;
700 
701 	if (!cd->power_on)
702 		return -EIO;
703 	regmap_read(cd->regmap, REG_IND_AP, &ind_ap);
704 	if (((atomic_read(&cd->ind_ab) ^ ind_ap) & IND_AX_MOUT) == 0) {
705 		/* output message not here */
706 		if (time_after(jiffies, t->start_jiffies + TIMEOUT))
707 			return -ETIMEDOUT;
708 		return -EINPROGRESS;
709 	}
710 	/* grab the returned header and msg */
711 	regmap_bulk_read(cd->regmap, MBOX_OUT_AREA, &pd->hdr,
712 			 sizeof(pd->hdr));
713 	regmap_bulk_read(cd->regmap, MBOX_OUT_AREA + sizeof(pd->hdr),
714 			 pd->msg, pd->msg_in_sz);
715 	/* tell anybus we've consumed the message */
716 	ind_ap ^= IND_AX_MOUT;
717 	return write_ind_ap(cd->regmap, ind_ap);
718 }
719 
task_fn_mbox(struct anybuss_host * cd,struct ab_task * t)720 static int task_fn_mbox(struct anybuss_host *cd, struct ab_task *t)
721 {
722 	struct mbox_priv *pd = &t->mbox_pd;
723 	unsigned int ind_ap;
724 	int ret;
725 
726 	if (!cd->power_on)
727 		return -EIO;
728 	regmap_read(cd->regmap, REG_IND_AP, &ind_ap);
729 	if ((atomic_read(&cd->ind_ab) ^ ind_ap) & IND_AX_MIN) {
730 		/* mbox input area busy */
731 		if (time_after(jiffies, t->start_jiffies + TIMEOUT))
732 			return -ETIMEDOUT;
733 		return -EINPROGRESS;
734 	}
735 	/* write the header and msg to input area */
736 	regmap_bulk_write(cd->regmap, MBOX_IN_AREA, &pd->hdr,
737 			  sizeof(pd->hdr));
738 	regmap_bulk_write(cd->regmap, MBOX_IN_AREA + sizeof(pd->hdr),
739 			  pd->msg, pd->msg_out_sz);
740 	/* tell anybus we gave it a message */
741 	ind_ap ^= IND_AX_MIN;
742 	ret = write_ind_ap(cd->regmap, ind_ap);
743 	if (ret)
744 		return ret;
745 	t->start_jiffies = jiffies;
746 	t->task_fn = task_fn_mbox_2;
747 	return -EINPROGRESS;
748 }
749 
log_invalid_other(struct device * dev,struct anybus_mbox_hdr * hdr)750 static void log_invalid_other(struct device *dev,
751 			      struct anybus_mbox_hdr *hdr)
752 {
753 	size_t ext_offs = ARRAY_SIZE(hdr->extended) - 1;
754 	u16 code = be16_to_cpu(hdr->extended[ext_offs]);
755 
756 	dev_err(dev, "   Invalid other: [0x%02X]", code);
757 }
758 
759 static const char * const EMSGS[] = {
760 	"Invalid Message ID",
761 	"Invalid Message Type",
762 	"Invalid Command",
763 	"Invalid Data Size",
764 	"Message Header Malformed (offset 008h)",
765 	"Message Header Malformed (offset 00Ah)",
766 	"Message Header Malformed (offset 00Ch - 00Dh)",
767 	"Invalid Address",
768 	"Invalid Response",
769 	"Flash Config Error",
770 };
771 
mbox_cmd_err(struct device * dev,struct mbox_priv * mpriv)772 static int mbox_cmd_err(struct device *dev, struct mbox_priv *mpriv)
773 {
774 	int i;
775 	u8 ecode;
776 	struct anybus_mbox_hdr *hdr = &mpriv->hdr;
777 	u16 info = be16_to_cpu(hdr->info);
778 	u8 *phdr = (u8 *)hdr;
779 	u8 *pmsg = mpriv->msg;
780 
781 	if (!(info & 0x8000))
782 		return 0;
783 	ecode = (info >> 8) & 0x0F;
784 	dev_err(dev, "mailbox command failed:");
785 	if (ecode == 0x0F)
786 		log_invalid_other(dev, hdr);
787 	else if (ecode < ARRAY_SIZE(EMSGS))
788 		dev_err(dev, "   Error code: %s (0x%02X)",
789 			EMSGS[ecode], ecode);
790 	else
791 		dev_err(dev, "   Error code: 0x%02X\n", ecode);
792 	dev_err(dev, "Failed command:");
793 	dev_err(dev, "Message Header:");
794 	for (i = 0; i < sizeof(mpriv->hdr); i += 2)
795 		dev_err(dev, "%02X%02X", phdr[i], phdr[i + 1]);
796 	dev_err(dev, "Message Data:");
797 	for (i = 0; i < mpriv->msg_in_sz; i += 2)
798 		dev_err(dev, "%02X%02X", pmsg[i], pmsg[i + 1]);
799 	dev_err(dev, "Stack dump:");
800 	dump_stack();
801 	return -EIO;
802 }
803 
_anybus_mbox_cmd(struct anybuss_host * cd,u16 cmd_num,bool is_fb_cmd,const void * msg_out,size_t msg_out_sz,void * msg_in,size_t msg_in_sz,const void * ext,size_t ext_sz)804 static int _anybus_mbox_cmd(struct anybuss_host *cd,
805 			    u16 cmd_num, bool is_fb_cmd,
806 				const void *msg_out, size_t msg_out_sz,
807 				void *msg_in, size_t msg_in_sz,
808 				const void *ext, size_t ext_sz)
809 {
810 	struct ab_task *t;
811 	struct mbox_priv *pd;
812 	struct anybus_mbox_hdr *h;
813 	size_t msg_sz = max(msg_in_sz, msg_out_sz);
814 	u16 info;
815 	int err;
816 
817 	if (msg_sz > MAX_MBOX_MSG_SZ)
818 		return -EINVAL;
819 	if (ext && ext_sz > sizeof(h->extended))
820 		return -EINVAL;
821 	t = ab_task_create_get(cd->qcache, task_fn_mbox);
822 	if (!t)
823 		return -ENOMEM;
824 	pd = &t->mbox_pd;
825 	h = &pd->hdr;
826 	info = is_fb_cmd ? INFO_TYPE_FB : INFO_TYPE_APP;
827 	/*
828 	 * prevent uninitialized memory in the header from being sent
829 	 * across the anybus
830 	 */
831 	memset(h, 0, sizeof(*h));
832 	h->info = cpu_to_be16(info | INFO_COMMAND);
833 	h->cmd_num = cpu_to_be16(cmd_num);
834 	h->data_size = cpu_to_be16(msg_out_sz);
835 	h->frame_count = cpu_to_be16(1);
836 	h->frame_num = cpu_to_be16(1);
837 	h->offset_high = cpu_to_be16(0);
838 	h->offset_low = cpu_to_be16(0);
839 	if (ext)
840 		memcpy(h->extended, ext, ext_sz);
841 	memcpy(pd->msg, msg_out, msg_out_sz);
842 	pd->msg_out_sz = msg_out_sz;
843 	pd->msg_in_sz = msg_in_sz;
844 	err = ab_task_enqueue_wait(t, cd->powerq, &cd->qlock, &cd->wq);
845 	if (err)
846 		goto out;
847 	/*
848 	 * mailbox mechanism worked ok, but maybe the mbox response
849 	 * contains an error ?
850 	 */
851 	err = mbox_cmd_err(cd->dev, pd);
852 	if (err)
853 		goto out;
854 	memcpy(msg_in, pd->msg, msg_in_sz);
855 out:
856 	ab_task_put(t);
857 	return err;
858 }
859 
860 /* ------------------------ anybus queues ------------------------ */
861 
process_q(struct anybuss_host * cd,struct kfifo * q)862 static void process_q(struct anybuss_host *cd, struct kfifo *q)
863 {
864 	struct ab_task *t;
865 	int ret;
866 
867 	ret = kfifo_out_peek(q, &t, sizeof(t));
868 	if (!ret)
869 		return;
870 	t->result = t->task_fn(cd, t);
871 	if (t->result != -EINPROGRESS)
872 		ab_task_dequeue_finish_put(q, cd);
873 }
874 
qs_have_work(struct kfifo * qs,size_t num)875 static bool qs_have_work(struct kfifo *qs, size_t num)
876 {
877 	size_t i;
878 	struct ab_task *t;
879 	int ret;
880 
881 	for (i = 0; i < num; i++, qs++) {
882 		ret = kfifo_out_peek(qs, &t, sizeof(t));
883 		if (ret && (t->result != -EINPROGRESS))
884 			return true;
885 	}
886 	return false;
887 }
888 
process_qs(struct anybuss_host * cd)889 static void process_qs(struct anybuss_host *cd)
890 {
891 	size_t i;
892 	struct kfifo *qs = cd->qs;
893 	size_t nqs = ARRAY_SIZE(cd->qs);
894 
895 	for (i = 0; i < nqs; i++, qs++)
896 		process_q(cd, qs);
897 }
898 
softint_ack(struct anybuss_host * cd)899 static void softint_ack(struct anybuss_host *cd)
900 {
901 	unsigned int ind_ap;
902 
903 	cd->softint_pending = false;
904 	if (!cd->power_on)
905 		return;
906 	regmap_read(cd->regmap, REG_IND_AP, &ind_ap);
907 	ind_ap &= ~IND_AX_EVNT;
908 	ind_ap |= atomic_read(&cd->ind_ab) & IND_AX_EVNT;
909 	write_ind_ap(cd->regmap, ind_ap);
910 }
911 
process_softint(struct anybuss_host * cd)912 static void process_softint(struct anybuss_host *cd)
913 {
914 	struct anybuss_client *client = cd->client;
915 	static const u8 zero;
916 	int ret;
917 	unsigned int ind_ap, ev;
918 	struct ab_task *t;
919 
920 	if (!cd->power_on)
921 		return;
922 	if (cd->softint_pending)
923 		return;
924 	regmap_read(cd->regmap, REG_IND_AP, &ind_ap);
925 	if (!((atomic_read(&cd->ind_ab) ^ ind_ap) & IND_AX_EVNT))
926 		return;
927 	/* process software interrupt */
928 	regmap_read(cd->regmap, REG_EVENT_CAUSE, &ev);
929 	if (ev & EVENT_CAUSE_FBON) {
930 		if (client->on_online_changed)
931 			client->on_online_changed(client, true);
932 		dev_dbg(cd->dev, "Fieldbus ON");
933 	}
934 	if (ev & EVENT_CAUSE_FBOF) {
935 		if (client->on_online_changed)
936 			client->on_online_changed(client, false);
937 		dev_dbg(cd->dev, "Fieldbus OFF");
938 	}
939 	if (ev & EVENT_CAUSE_DC) {
940 		if (client->on_area_updated)
941 			client->on_area_updated(client);
942 		dev_dbg(cd->dev, "Fieldbus data changed");
943 	}
944 	/*
945 	 * reset the event cause bits.
946 	 * this must be done while owning the fbctrl area, so we'll
947 	 * enqueue a task to do that.
948 	 */
949 	t = create_area_writer(cd->qcache, IND_AX_FBCTRL,
950 			       REG_EVENT_CAUSE, &zero, sizeof(zero));
951 	if (!t) {
952 		ret = -ENOMEM;
953 		goto out;
954 	}
955 	t->done_fn = softint_ack;
956 	ret = ab_task_enqueue(t, cd->powerq, &cd->qlock, &cd->wq);
957 	ab_task_put(t);
958 	cd->softint_pending = true;
959 out:
960 	WARN_ON(ret);
961 	if (ret)
962 		softint_ack(cd);
963 }
964 
qthread_fn(void * data)965 static int qthread_fn(void *data)
966 {
967 	struct anybuss_host *cd = data;
968 	struct kfifo *qs = cd->qs;
969 	size_t nqs = ARRAY_SIZE(cd->qs);
970 	unsigned int ind_ab;
971 
972 	/*
973 	 * this kernel thread has exclusive access to the anybus's memory.
974 	 * only exception: the IND_AB register, which is accessed exclusively
975 	 * by the interrupt service routine (ISR). This thread must not touch
976 	 * the IND_AB register, but it does require access to its value.
977 	 *
978 	 * the interrupt service routine stores the register's value in
979 	 * cd->ind_ab (an atomic_t), where we may safely access it, with the
980 	 * understanding that it can be modified by the ISR at any time.
981 	 */
982 
983 	while (!kthread_should_stop()) {
984 		/*
985 		 * make a local copy of IND_AB, so we can go around the loop
986 		 * again in case it changed while processing queues and softint.
987 		 */
988 		ind_ab = atomic_read(&cd->ind_ab);
989 		process_qs(cd);
990 		process_softint(cd);
991 		wait_event_timeout(cd->wq,
992 				   (atomic_read(&cd->ind_ab) != ind_ab) ||
993 				qs_have_work(qs, nqs) ||
994 				kthread_should_stop(),
995 			HZ);
996 		/*
997 		 * time out so even 'stuck' tasks will run eventually,
998 		 * and can time out.
999 		 */
1000 	}
1001 
1002 	return 0;
1003 }
1004 
1005 /* ------------------------ anybus exports ------------------------ */
1006 
anybuss_start_init(struct anybuss_client * client,const struct anybuss_memcfg * cfg)1007 int anybuss_start_init(struct anybuss_client *client,
1008 		       const struct anybuss_memcfg *cfg)
1009 {
1010 	int ret;
1011 	u16 op_mode;
1012 	struct anybuss_host *cd = client->host;
1013 	struct msg_anybus_init msg = {
1014 		.input_io_len = cpu_to_be16(cfg->input_io),
1015 		.input_dpram_len = cpu_to_be16(cfg->input_dpram),
1016 		.input_total_len = cpu_to_be16(cfg->input_total),
1017 		.output_io_len = cpu_to_be16(cfg->output_io),
1018 		.output_dpram_len = cpu_to_be16(cfg->output_dpram),
1019 		.output_total_len = cpu_to_be16(cfg->output_total),
1020 		.notif_config = cpu_to_be16(0x000F),
1021 		.wd_val = cpu_to_be16(0),
1022 	};
1023 
1024 	switch (cfg->offl_mode) {
1025 	case AB_OFFL_MODE_CLEAR:
1026 		op_mode = 0;
1027 		break;
1028 	case AB_OFFL_MODE_FREEZE:
1029 		op_mode = OP_MODE_FBFC;
1030 		break;
1031 	case AB_OFFL_MODE_SET:
1032 		op_mode = OP_MODE_FBS;
1033 		break;
1034 	default:
1035 		return -EINVAL;
1036 	}
1037 	msg.op_mode = cpu_to_be16(op_mode | OP_MODE_CD);
1038 	ret = _anybus_mbox_cmd(cd, CMD_START_INIT, false, NULL, 0,
1039 			       NULL, 0, NULL, 0);
1040 	if (ret)
1041 		return ret;
1042 	return _anybus_mbox_cmd(cd, CMD_ANYBUS_INIT, false,
1043 			&msg, sizeof(msg), NULL, 0, NULL, 0);
1044 }
1045 EXPORT_SYMBOL_GPL(anybuss_start_init);
1046 
anybuss_finish_init(struct anybuss_client * client)1047 int anybuss_finish_init(struct anybuss_client *client)
1048 {
1049 	struct anybuss_host *cd = client->host;
1050 
1051 	return _anybus_mbox_cmd(cd, CMD_END_INIT, false, NULL, 0,
1052 					NULL, 0, NULL, 0);
1053 }
1054 EXPORT_SYMBOL_GPL(anybuss_finish_init);
1055 
anybuss_read_fbctrl(struct anybuss_client * client,u16 addr,void * buf,size_t count)1056 int anybuss_read_fbctrl(struct anybuss_client *client, u16 addr,
1057 			void *buf, size_t count)
1058 {
1059 	struct anybuss_host *cd = client->host;
1060 	struct ab_task *t;
1061 	int ret;
1062 
1063 	if (count == 0)
1064 		return 0;
1065 	if (!area_range_ok(addr, count, FBCTRL_AREA,
1066 			   MAX_FBCTRL_AREA_SZ))
1067 		return -EFAULT;
1068 	t = create_area_reader(cd->qcache, IND_AX_FBCTRL, addr, count);
1069 	if (!t)
1070 		return -ENOMEM;
1071 	ret = ab_task_enqueue_wait(t, cd->powerq, &cd->qlock, &cd->wq);
1072 	if (ret)
1073 		goto out;
1074 	memcpy(buf, t->area_pd.buf, count);
1075 out:
1076 	ab_task_put(t);
1077 	return ret;
1078 }
1079 EXPORT_SYMBOL_GPL(anybuss_read_fbctrl);
1080 
anybuss_write_input(struct anybuss_client * client,const char __user * buf,size_t size,loff_t * offset)1081 int anybuss_write_input(struct anybuss_client *client,
1082 			const char __user *buf, size_t size,
1083 				loff_t *offset)
1084 {
1085 	ssize_t len = min_t(loff_t, MAX_DATA_AREA_SZ - *offset, size);
1086 	struct anybuss_host *cd = client->host;
1087 	struct ab_task *t;
1088 	int ret;
1089 
1090 	if (len <= 0)
1091 		return 0;
1092 	t = create_area_user_writer(cd->qcache, IND_AX_IN,
1093 				    DATA_IN_AREA + *offset, buf, len);
1094 	if (IS_ERR(t))
1095 		return PTR_ERR(t);
1096 	ret = ab_task_enqueue_wait(t, cd->powerq, &cd->qlock, &cd->wq);
1097 	ab_task_put(t);
1098 	if (ret)
1099 		return ret;
1100 	/* success */
1101 	*offset += len;
1102 	return len;
1103 }
1104 EXPORT_SYMBOL_GPL(anybuss_write_input);
1105 
anybuss_read_output(struct anybuss_client * client,char __user * buf,size_t size,loff_t * offset)1106 int anybuss_read_output(struct anybuss_client *client,
1107 			char __user *buf, size_t size,
1108 				loff_t *offset)
1109 {
1110 	ssize_t len = min_t(loff_t, MAX_DATA_AREA_SZ - *offset, size);
1111 	struct anybuss_host *cd = client->host;
1112 	struct ab_task *t;
1113 	int ret;
1114 
1115 	if (len <= 0)
1116 		return 0;
1117 	t = create_area_reader(cd->qcache, IND_AX_OUT,
1118 			       DATA_OUT_AREA + *offset, len);
1119 	if (!t)
1120 		return -ENOMEM;
1121 	ret = ab_task_enqueue_wait(t, cd->powerq, &cd->qlock, &cd->wq);
1122 	if (ret)
1123 		goto out;
1124 	if (copy_to_user(buf, t->area_pd.buf, len))
1125 		ret = -EFAULT;
1126 out:
1127 	ab_task_put(t);
1128 	if (ret)
1129 		return ret;
1130 	/* success */
1131 	*offset += len;
1132 	return len;
1133 }
1134 EXPORT_SYMBOL_GPL(anybuss_read_output);
1135 
anybuss_send_msg(struct anybuss_client * client,u16 cmd_num,const void * buf,size_t count)1136 int anybuss_send_msg(struct anybuss_client *client, u16 cmd_num,
1137 		     const void *buf, size_t count)
1138 {
1139 	struct anybuss_host *cd = client->host;
1140 
1141 	return _anybus_mbox_cmd(cd, cmd_num, true, buf, count, NULL, 0,
1142 					NULL, 0);
1143 }
1144 EXPORT_SYMBOL_GPL(anybuss_send_msg);
1145 
anybuss_send_ext(struct anybuss_client * client,u16 cmd_num,const void * buf,size_t count)1146 int anybuss_send_ext(struct anybuss_client *client, u16 cmd_num,
1147 		     const void *buf, size_t count)
1148 {
1149 	struct anybuss_host *cd = client->host;
1150 
1151 	return _anybus_mbox_cmd(cd, cmd_num, true, NULL, 0, NULL, 0,
1152 					buf, count);
1153 }
1154 EXPORT_SYMBOL_GPL(anybuss_send_ext);
1155 
anybuss_recv_msg(struct anybuss_client * client,u16 cmd_num,void * buf,size_t count)1156 int anybuss_recv_msg(struct anybuss_client *client, u16 cmd_num,
1157 		     void *buf, size_t count)
1158 {
1159 	struct anybuss_host *cd = client->host;
1160 
1161 	return _anybus_mbox_cmd(cd, cmd_num, true, NULL, 0, buf, count,
1162 					NULL, 0);
1163 }
1164 EXPORT_SYMBOL_GPL(anybuss_recv_msg);
1165 
1166 /* ------------------------ bus functions ------------------------ */
1167 
anybus_bus_match(struct device * dev,struct device_driver * drv)1168 static int anybus_bus_match(struct device *dev,
1169 			    struct device_driver *drv)
1170 {
1171 	struct anybuss_client_driver *adrv =
1172 		to_anybuss_client_driver(drv);
1173 	struct anybuss_client *adev =
1174 		to_anybuss_client(dev);
1175 
1176 	return adrv->anybus_id == be16_to_cpu(adev->anybus_id);
1177 }
1178 
anybus_bus_probe(struct device * dev)1179 static int anybus_bus_probe(struct device *dev)
1180 {
1181 	struct anybuss_client_driver *adrv =
1182 		to_anybuss_client_driver(dev->driver);
1183 	struct anybuss_client *adev =
1184 		to_anybuss_client(dev);
1185 
1186 	if (!adrv->probe)
1187 		return -ENODEV;
1188 	return adrv->probe(adev);
1189 }
1190 
anybus_bus_remove(struct device * dev)1191 static int anybus_bus_remove(struct device *dev)
1192 {
1193 	struct anybuss_client_driver *adrv =
1194 		to_anybuss_client_driver(dev->driver);
1195 
1196 	if (adrv->remove)
1197 		return adrv->remove(to_anybuss_client(dev));
1198 	return 0;
1199 }
1200 
1201 static struct bus_type anybus_bus = {
1202 	.name		= "anybuss",
1203 	.match		= anybus_bus_match,
1204 	.probe		= anybus_bus_probe,
1205 	.remove		= anybus_bus_remove,
1206 };
1207 
anybuss_client_driver_register(struct anybuss_client_driver * drv)1208 int anybuss_client_driver_register(struct anybuss_client_driver *drv)
1209 {
1210 	drv->driver.bus = &anybus_bus;
1211 	return driver_register(&drv->driver);
1212 }
1213 EXPORT_SYMBOL_GPL(anybuss_client_driver_register);
1214 
anybuss_client_driver_unregister(struct anybuss_client_driver * drv)1215 void anybuss_client_driver_unregister(struct anybuss_client_driver *drv)
1216 {
1217 	return driver_unregister(&drv->driver);
1218 }
1219 EXPORT_SYMBOL_GPL(anybuss_client_driver_unregister);
1220 
client_device_release(struct device * dev)1221 static void client_device_release(struct device *dev)
1222 {
1223 	kfree(to_anybuss_client(dev));
1224 }
1225 
taskq_alloc(struct device * dev,struct kfifo * q)1226 static int taskq_alloc(struct device *dev, struct kfifo *q)
1227 {
1228 	void *buf;
1229 	size_t size = 64 * sizeof(struct ab_task *);
1230 
1231 	buf = devm_kzalloc(dev, size, GFP_KERNEL);
1232 	if (!buf)
1233 		return -EIO;
1234 	return kfifo_init(q, buf, size);
1235 }
1236 
anybus_of_get_host_idx(struct device_node * np)1237 static int anybus_of_get_host_idx(struct device_node *np)
1238 {
1239 	const __be32 *host_idx;
1240 
1241 	host_idx = of_get_address(np, 0, NULL, NULL);
1242 	if (!host_idx)
1243 		return -ENOENT;
1244 	return __be32_to_cpu(*host_idx);
1245 }
1246 
1247 static struct device_node *
anybus_of_find_child_device(struct device * dev,int host_idx)1248 anybus_of_find_child_device(struct device *dev, int host_idx)
1249 {
1250 	struct device_node *node;
1251 
1252 	if (!dev || !dev->of_node)
1253 		return NULL;
1254 	for_each_child_of_node(dev->of_node, node) {
1255 		if (anybus_of_get_host_idx(node) == host_idx)
1256 			return node;
1257 	}
1258 	return NULL;
1259 }
1260 
1261 struct anybuss_host * __must_check
anybuss_host_common_probe(struct device * dev,const struct anybuss_ops * ops)1262 anybuss_host_common_probe(struct device *dev,
1263 			  const struct anybuss_ops *ops)
1264 {
1265 	int ret, i;
1266 	u8 val[4];
1267 	__be16 fieldbus_type;
1268 	struct anybuss_host *cd;
1269 
1270 	cd = devm_kzalloc(dev, sizeof(*cd), GFP_KERNEL);
1271 	if (!cd)
1272 		return ERR_PTR(-ENOMEM);
1273 	cd->dev = dev;
1274 	cd->host_idx = ops->host_idx;
1275 	init_completion(&cd->card_boot);
1276 	init_waitqueue_head(&cd->wq);
1277 	for (i = 0; i < ARRAY_SIZE(cd->qs); i++) {
1278 		ret = taskq_alloc(dev, &cd->qs[i]);
1279 		if (ret)
1280 			return ERR_PTR(ret);
1281 	}
1282 	if (WARN_ON(ARRAY_SIZE(cd->qs) < 3))
1283 		return ERR_PTR(-EINVAL);
1284 	cd->powerq = &cd->qs[0];
1285 	cd->mboxq = &cd->qs[1];
1286 	cd->areaq = &cd->qs[2];
1287 	cd->reset = ops->reset;
1288 	if (!cd->reset)
1289 		return ERR_PTR(-EINVAL);
1290 	cd->regmap = ops->regmap;
1291 	if (!cd->regmap)
1292 		return ERR_PTR(-EINVAL);
1293 	spin_lock_init(&cd->qlock);
1294 	cd->qcache = kmem_cache_create(dev_name(dev),
1295 				       sizeof(struct ab_task), 0, 0, NULL);
1296 	if (!cd->qcache)
1297 		return ERR_PTR(-ENOMEM);
1298 	cd->irq = ops->irq;
1299 	if (cd->irq <= 0) {
1300 		ret = -EINVAL;
1301 		goto err_qcache;
1302 	}
1303 	/*
1304 	 * use a dpram test to check if a card is present, this is only
1305 	 * possible while in reset.
1306 	 */
1307 	reset_assert(cd);
1308 	if (test_dpram(cd->regmap)) {
1309 		dev_err(dev, "no Anybus-S card in slot");
1310 		ret = -ENODEV;
1311 		goto err_qcache;
1312 	}
1313 	ret = devm_request_threaded_irq(dev, cd->irq, NULL, irq_handler,
1314 					IRQF_ONESHOT, dev_name(dev), cd);
1315 	if (ret) {
1316 		dev_err(dev, "could not request irq");
1317 		goto err_qcache;
1318 	}
1319 	/*
1320 	 * startup sequence:
1321 	 *   perform dummy IND_AB read to prevent false 'init done' irq
1322 	 *     (already done by test_dpram() above)
1323 	 *   release reset
1324 	 *   wait for first interrupt
1325 	 *   interrupt came in: ready to go !
1326 	 */
1327 	reset_deassert(cd);
1328 	if (!wait_for_completion_timeout(&cd->card_boot, TIMEOUT)) {
1329 		ret = -ETIMEDOUT;
1330 		goto err_reset;
1331 	}
1332 	/*
1333 	 * according to the anybus docs, we're allowed to read these
1334 	 * without handshaking / reserving the area
1335 	 */
1336 	dev_info(dev, "Anybus-S card detected");
1337 	regmap_bulk_read(cd->regmap, REG_BOOTLOADER_V, val, 2);
1338 	dev_info(dev, "Bootloader version: %02X%02X",
1339 		 val[0], val[1]);
1340 	regmap_bulk_read(cd->regmap, REG_API_V, val, 2);
1341 	dev_info(dev, "API version: %02X%02X", val[0], val[1]);
1342 	regmap_bulk_read(cd->regmap, REG_FIELDBUS_V, val, 2);
1343 	dev_info(dev, "Fieldbus version: %02X%02X", val[0], val[1]);
1344 	regmap_bulk_read(cd->regmap, REG_SERIAL_NO, val, 4);
1345 	dev_info(dev, "Serial number: %02X%02X%02X%02X",
1346 		 val[0], val[1], val[2], val[3]);
1347 	add_device_randomness(&val, 4);
1348 	regmap_bulk_read(cd->regmap, REG_FIELDBUS_TYPE, &fieldbus_type,
1349 			 sizeof(fieldbus_type));
1350 	dev_info(dev, "Fieldbus type: %04X", be16_to_cpu(fieldbus_type));
1351 	regmap_bulk_read(cd->regmap, REG_MODULE_SW_V, val, 2);
1352 	dev_info(dev, "Module SW version: %02X%02X",
1353 		 val[0], val[1]);
1354 	/* put card back reset until a client driver releases it */
1355 	disable_irq(cd->irq);
1356 	reset_assert(cd);
1357 	atomic_set(&cd->ind_ab, IND_AB_UPDATED);
1358 	/* fire up the queue thread */
1359 	cd->qthread = kthread_run(qthread_fn, cd, dev_name(dev));
1360 	if (IS_ERR(cd->qthread)) {
1361 		dev_err(dev, "could not create kthread");
1362 		ret = PTR_ERR(cd->qthread);
1363 		goto err_reset;
1364 	}
1365 	/*
1366 	 * now advertise that we've detected a client device (card).
1367 	 * the bus infrastructure will match it to a client driver.
1368 	 */
1369 	cd->client = kzalloc(sizeof(*cd->client), GFP_KERNEL);
1370 	if (!cd->client) {
1371 		ret = -ENOMEM;
1372 		goto err_kthread;
1373 	}
1374 	cd->client->anybus_id = fieldbus_type;
1375 	cd->client->host = cd;
1376 	cd->client->dev.bus = &anybus_bus;
1377 	cd->client->dev.parent = dev;
1378 	cd->client->dev.release = client_device_release;
1379 	cd->client->dev.of_node =
1380 		anybus_of_find_child_device(dev, cd->host_idx);
1381 	dev_set_name(&cd->client->dev, "anybuss.card%d", cd->host_idx);
1382 	ret = device_register(&cd->client->dev);
1383 	if (ret)
1384 		goto err_device;
1385 	return cd;
1386 err_device:
1387 	device_unregister(&cd->client->dev);
1388 err_kthread:
1389 	kthread_stop(cd->qthread);
1390 err_reset:
1391 	reset_assert(cd);
1392 err_qcache:
1393 	kmem_cache_destroy(cd->qcache);
1394 	return ERR_PTR(ret);
1395 }
1396 EXPORT_SYMBOL_GPL(anybuss_host_common_probe);
1397 
anybuss_host_common_remove(struct anybuss_host * host)1398 void anybuss_host_common_remove(struct anybuss_host *host)
1399 {
1400 	struct anybuss_host *cd = host;
1401 
1402 	device_unregister(&cd->client->dev);
1403 	kthread_stop(cd->qthread);
1404 	reset_assert(cd);
1405 	kmem_cache_destroy(cd->qcache);
1406 }
1407 EXPORT_SYMBOL_GPL(anybuss_host_common_remove);
1408 
host_release(struct device * dev,void * res)1409 static void host_release(struct device *dev, void *res)
1410 {
1411 	struct anybuss_host **dr = res;
1412 
1413 	anybuss_host_common_remove(*dr);
1414 }
1415 
1416 struct anybuss_host * __must_check
devm_anybuss_host_common_probe(struct device * dev,const struct anybuss_ops * ops)1417 devm_anybuss_host_common_probe(struct device *dev,
1418 			       const struct anybuss_ops *ops)
1419 {
1420 	struct anybuss_host **dr;
1421 	struct anybuss_host *host;
1422 
1423 	dr = devres_alloc(host_release, sizeof(struct anybuss_host *),
1424 			  GFP_KERNEL);
1425 	if (!dr)
1426 		return ERR_PTR(-ENOMEM);
1427 
1428 	host = anybuss_host_common_probe(dev, ops);
1429 	if (IS_ERR(host)) {
1430 		devres_free(dr);
1431 		return host;
1432 	}
1433 	*dr = host;
1434 	devres_add(dev, dr);
1435 	return host;
1436 }
1437 EXPORT_SYMBOL_GPL(devm_anybuss_host_common_probe);
1438 
anybus_init(void)1439 static int __init anybus_init(void)
1440 {
1441 	int ret;
1442 
1443 	ret = bus_register(&anybus_bus);
1444 	if (ret)
1445 		pr_err("could not register Anybus-S bus: %d\n", ret);
1446 	return ret;
1447 }
1448 module_init(anybus_init);
1449 
anybus_exit(void)1450 static void __exit anybus_exit(void)
1451 {
1452 	bus_unregister(&anybus_bus);
1453 }
1454 module_exit(anybus_exit);
1455 
1456 MODULE_DESCRIPTION("HMS Anybus-S Host Driver");
1457 MODULE_AUTHOR("Sven Van Asbroeck <TheSven73@gmail.com>");
1458 MODULE_LICENSE("GPL v2");
1459