xref: /linux/drivers/soc/fsl/qe/qe.c (revision f79e4d5f92a129a1159c973735007d4ddc8541f3)
1 /*
2  * Copyright (C) 2006-2010 Freescale Semiconductor, Inc. All rights reserved.
3  *
4  * Authors: 	Shlomi Gridish <gridish@freescale.com>
5  * 		Li Yang <leoli@freescale.com>
6  * Based on cpm2_common.c from Dan Malek (dmalek@jlc.net)
7  *
8  * Description:
9  * General Purpose functions for the global management of the
10  * QUICC Engine (QE).
11  *
12  * This program is free software; you can redistribute  it and/or modify it
13  * under  the terms of  the GNU General  Public License as published by the
14  * Free Software Foundation;  either version 2 of the  License, or (at your
15  * option) any later version.
16  */
17 #include <linux/errno.h>
18 #include <linux/sched.h>
19 #include <linux/kernel.h>
20 #include <linux/param.h>
21 #include <linux/string.h>
22 #include <linux/spinlock.h>
23 #include <linux/mm.h>
24 #include <linux/interrupt.h>
25 #include <linux/module.h>
26 #include <linux/delay.h>
27 #include <linux/ioport.h>
28 #include <linux/crc32.h>
29 #include <linux/mod_devicetable.h>
30 #include <linux/of_platform.h>
31 #include <asm/irq.h>
32 #include <asm/page.h>
33 #include <asm/pgtable.h>
34 #include <soc/fsl/qe/immap_qe.h>
35 #include <soc/fsl/qe/qe.h>
36 #include <asm/prom.h>
37 #include <asm/rheap.h>
38 
39 static void qe_snums_init(void);
40 static int qe_sdma_init(void);
41 
42 static DEFINE_SPINLOCK(qe_lock);
43 DEFINE_SPINLOCK(cmxgcr_lock);
44 EXPORT_SYMBOL(cmxgcr_lock);
45 
46 /* QE snum state */
47 enum qe_snum_state {
48 	QE_SNUM_STATE_USED,
49 	QE_SNUM_STATE_FREE
50 };
51 
52 /* QE snum */
53 struct qe_snum {
54 	u8 num;
55 	enum qe_snum_state state;
56 };
57 
58 /* We allocate this here because it is used almost exclusively for
59  * the communication processor devices.
60  */
61 struct qe_immap __iomem *qe_immr;
62 EXPORT_SYMBOL(qe_immr);
63 
64 static struct qe_snum snums[QE_NUM_OF_SNUM];	/* Dynamically allocated SNUMs */
65 static unsigned int qe_num_of_snum;
66 
67 static phys_addr_t qebase = -1;
68 
69 static phys_addr_t get_qe_base(void)
70 {
71 	struct device_node *qe;
72 	int ret;
73 	struct resource res;
74 
75 	if (qebase != -1)
76 		return qebase;
77 
78 	qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
79 	if (!qe) {
80 		qe = of_find_node_by_type(NULL, "qe");
81 		if (!qe)
82 			return qebase;
83 	}
84 
85 	ret = of_address_to_resource(qe, 0, &res);
86 	if (!ret)
87 		qebase = res.start;
88 	of_node_put(qe);
89 
90 	return qebase;
91 }
92 
93 void qe_reset(void)
94 {
95 	if (qe_immr == NULL)
96 		qe_immr = ioremap(get_qe_base(), QE_IMMAP_SIZE);
97 
98 	qe_snums_init();
99 
100 	qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
101 		     QE_CR_PROTOCOL_UNSPECIFIED, 0);
102 
103 	/* Reclaim the MURAM memory for our use. */
104 	qe_muram_init();
105 
106 	if (qe_sdma_init())
107 		panic("sdma init failed!");
108 }
109 
110 int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input)
111 {
112 	unsigned long flags;
113 	u8 mcn_shift = 0, dev_shift = 0;
114 	u32 ret;
115 
116 	spin_lock_irqsave(&qe_lock, flags);
117 	if (cmd == QE_RESET) {
118 		out_be32(&qe_immr->cp.cecr, (u32) (cmd | QE_CR_FLG));
119 	} else {
120 		if (cmd == QE_ASSIGN_PAGE) {
121 			/* Here device is the SNUM, not sub-block */
122 			dev_shift = QE_CR_SNUM_SHIFT;
123 		} else if (cmd == QE_ASSIGN_RISC) {
124 			/* Here device is the SNUM, and mcnProtocol is
125 			 * e_QeCmdRiscAssignment value */
126 			dev_shift = QE_CR_SNUM_SHIFT;
127 			mcn_shift = QE_CR_MCN_RISC_ASSIGN_SHIFT;
128 		} else {
129 			if (device == QE_CR_SUBBLOCK_USB)
130 				mcn_shift = QE_CR_MCN_USB_SHIFT;
131 			else
132 				mcn_shift = QE_CR_MCN_NORMAL_SHIFT;
133 		}
134 
135 		out_be32(&qe_immr->cp.cecdr, cmd_input);
136 		out_be32(&qe_immr->cp.cecr,
137 			 (cmd | QE_CR_FLG | ((u32) device << dev_shift) | (u32)
138 			  mcn_protocol << mcn_shift));
139 	}
140 
141 	/* wait for the QE_CR_FLG to clear */
142 	ret = spin_event_timeout((in_be32(&qe_immr->cp.cecr) & QE_CR_FLG) == 0,
143 			   100, 0);
144 	/* On timeout (e.g. failure), the expression will be false (ret == 0),
145 	   otherwise it will be true (ret == 1). */
146 	spin_unlock_irqrestore(&qe_lock, flags);
147 
148 	return ret == 1;
149 }
150 EXPORT_SYMBOL(qe_issue_cmd);
151 
152 /* Set a baud rate generator. This needs lots of work. There are
153  * 16 BRGs, which can be connected to the QE channels or output
154  * as clocks. The BRGs are in two different block of internal
155  * memory mapped space.
156  * The BRG clock is the QE clock divided by 2.
157  * It was set up long ago during the initial boot phase and is
158  * is given to us.
159  * Baud rate clocks are zero-based in the driver code (as that maps
160  * to port numbers). Documentation uses 1-based numbering.
161  */
162 static unsigned int brg_clk = 0;
163 
164 #define CLK_GRAN	(1000)
165 #define CLK_GRAN_LIMIT	(5)
166 
167 unsigned int qe_get_brg_clk(void)
168 {
169 	struct device_node *qe;
170 	int size;
171 	const u32 *prop;
172 	unsigned int mod;
173 
174 	if (brg_clk)
175 		return brg_clk;
176 
177 	qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
178 	if (!qe) {
179 		qe = of_find_node_by_type(NULL, "qe");
180 		if (!qe)
181 			return brg_clk;
182 	}
183 
184 	prop = of_get_property(qe, "brg-frequency", &size);
185 	if (prop && size == sizeof(*prop))
186 		brg_clk = *prop;
187 
188 	of_node_put(qe);
189 
190 	/* round this if near to a multiple of CLK_GRAN */
191 	mod = brg_clk % CLK_GRAN;
192 	if (mod) {
193 		if (mod < CLK_GRAN_LIMIT)
194 			brg_clk -= mod;
195 		else if (mod > (CLK_GRAN - CLK_GRAN_LIMIT))
196 			brg_clk += CLK_GRAN - mod;
197 	}
198 
199 	return brg_clk;
200 }
201 EXPORT_SYMBOL(qe_get_brg_clk);
202 
203 #define PVR_VER_836x	0x8083
204 #define PVR_VER_832x	0x8084
205 
206 /* Program the BRG to the given sampling rate and multiplier
207  *
208  * @brg: the BRG, QE_BRG1 - QE_BRG16
209  * @rate: the desired sampling rate
210  * @multiplier: corresponds to the value programmed in GUMR_L[RDCR] or
211  * GUMR_L[TDCR].  E.g., if this BRG is the RX clock, and GUMR_L[RDCR]=01,
212  * then 'multiplier' should be 8.
213  */
214 int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier)
215 {
216 	u32 divisor, tempval;
217 	u32 div16 = 0;
218 
219 	if ((brg < QE_BRG1) || (brg > QE_BRG16))
220 		return -EINVAL;
221 
222 	divisor = qe_get_brg_clk() / (rate * multiplier);
223 
224 	if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
225 		div16 = QE_BRGC_DIV16;
226 		divisor /= 16;
227 	}
228 
229 	/* Errata QE_General4, which affects some MPC832x and MPC836x SOCs, says
230 	   that the BRG divisor must be even if you're not using divide-by-16
231 	   mode. */
232 	if (pvr_version_is(PVR_VER_836x) || pvr_version_is(PVR_VER_832x))
233 		if (!div16 && (divisor & 1) && (divisor > 3))
234 			divisor++;
235 
236 	tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) |
237 		QE_BRGC_ENABLE | div16;
238 
239 	out_be32(&qe_immr->brg.brgc[brg - QE_BRG1], tempval);
240 
241 	return 0;
242 }
243 EXPORT_SYMBOL(qe_setbrg);
244 
245 /* Convert a string to a QE clock source enum
246  *
247  * This function takes a string, typically from a property in the device
248  * tree, and returns the corresponding "enum qe_clock" value.
249 */
250 enum qe_clock qe_clock_source(const char *source)
251 {
252 	unsigned int i;
253 
254 	if (strcasecmp(source, "none") == 0)
255 		return QE_CLK_NONE;
256 
257 	if (strcmp(source, "tsync_pin") == 0)
258 		return QE_TSYNC_PIN;
259 
260 	if (strcmp(source, "rsync_pin") == 0)
261 		return QE_RSYNC_PIN;
262 
263 	if (strncasecmp(source, "brg", 3) == 0) {
264 		i = simple_strtoul(source + 3, NULL, 10);
265 		if ((i >= 1) && (i <= 16))
266 			return (QE_BRG1 - 1) + i;
267 		else
268 			return QE_CLK_DUMMY;
269 	}
270 
271 	if (strncasecmp(source, "clk", 3) == 0) {
272 		i = simple_strtoul(source + 3, NULL, 10);
273 		if ((i >= 1) && (i <= 24))
274 			return (QE_CLK1 - 1) + i;
275 		else
276 			return QE_CLK_DUMMY;
277 	}
278 
279 	return QE_CLK_DUMMY;
280 }
281 EXPORT_SYMBOL(qe_clock_source);
282 
283 /* Initialize SNUMs (thread serial numbers) according to
284  * QE Module Control chapter, SNUM table
285  */
286 static void qe_snums_init(void)
287 {
288 	int i;
289 	static const u8 snum_init_76[] = {
290 		0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,
291 		0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x88, 0x89,
292 		0x98, 0x99, 0xA8, 0xA9, 0xB8, 0xB9, 0xC8, 0xC9,
293 		0xD8, 0xD9, 0xE8, 0xE9, 0x44, 0x45, 0x4C, 0x4D,
294 		0x54, 0x55, 0x5C, 0x5D, 0x64, 0x65, 0x6C, 0x6D,
295 		0x74, 0x75, 0x7C, 0x7D, 0x84, 0x85, 0x8C, 0x8D,
296 		0x94, 0x95, 0x9C, 0x9D, 0xA4, 0xA5, 0xAC, 0xAD,
297 		0xB4, 0xB5, 0xBC, 0xBD, 0xC4, 0xC5, 0xCC, 0xCD,
298 		0xD4, 0xD5, 0xDC, 0xDD, 0xE4, 0xE5, 0xEC, 0xED,
299 		0xF4, 0xF5, 0xFC, 0xFD,
300 	};
301 	static const u8 snum_init_46[] = {
302 		0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,
303 		0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x88, 0x89,
304 		0x98, 0x99, 0xA8, 0xA9, 0xB8, 0xB9, 0xC8, 0xC9,
305 		0xD8, 0xD9, 0xE8, 0xE9, 0x08, 0x09, 0x18, 0x19,
306 		0x28, 0x29, 0x38, 0x39, 0x48, 0x49, 0x58, 0x59,
307 		0x68, 0x69, 0x78, 0x79, 0x80, 0x81,
308 	};
309 	static const u8 *snum_init;
310 
311 	qe_num_of_snum = qe_get_num_of_snums();
312 
313 	if (qe_num_of_snum == 76)
314 		snum_init = snum_init_76;
315 	else
316 		snum_init = snum_init_46;
317 
318 	for (i = 0; i < qe_num_of_snum; i++) {
319 		snums[i].num = snum_init[i];
320 		snums[i].state = QE_SNUM_STATE_FREE;
321 	}
322 }
323 
324 int qe_get_snum(void)
325 {
326 	unsigned long flags;
327 	int snum = -EBUSY;
328 	int i;
329 
330 	spin_lock_irqsave(&qe_lock, flags);
331 	for (i = 0; i < qe_num_of_snum; i++) {
332 		if (snums[i].state == QE_SNUM_STATE_FREE) {
333 			snums[i].state = QE_SNUM_STATE_USED;
334 			snum = snums[i].num;
335 			break;
336 		}
337 	}
338 	spin_unlock_irqrestore(&qe_lock, flags);
339 
340 	return snum;
341 }
342 EXPORT_SYMBOL(qe_get_snum);
343 
344 void qe_put_snum(u8 snum)
345 {
346 	int i;
347 
348 	for (i = 0; i < qe_num_of_snum; i++) {
349 		if (snums[i].num == snum) {
350 			snums[i].state = QE_SNUM_STATE_FREE;
351 			break;
352 		}
353 	}
354 }
355 EXPORT_SYMBOL(qe_put_snum);
356 
357 static int qe_sdma_init(void)
358 {
359 	struct sdma __iomem *sdma = &qe_immr->sdma;
360 	static unsigned long sdma_buf_offset = (unsigned long)-ENOMEM;
361 
362 	if (!sdma)
363 		return -ENODEV;
364 
365 	/* allocate 2 internal temporary buffers (512 bytes size each) for
366 	 * the SDMA */
367 	if (IS_ERR_VALUE(sdma_buf_offset)) {
368 		sdma_buf_offset = qe_muram_alloc(512 * 2, 4096);
369 		if (IS_ERR_VALUE(sdma_buf_offset))
370 			return -ENOMEM;
371 	}
372 
373 	out_be32(&sdma->sdebcr, (u32) sdma_buf_offset & QE_SDEBCR_BA_MASK);
374  	out_be32(&sdma->sdmr, (QE_SDMR_GLB_1_MSK |
375  					(0x1 << QE_SDMR_CEN_SHIFT)));
376 
377 	return 0;
378 }
379 
380 /* The maximum number of RISCs we support */
381 #define MAX_QE_RISC     4
382 
383 /* Firmware information stored here for qe_get_firmware_info() */
384 static struct qe_firmware_info qe_firmware_info;
385 
386 /*
387  * Set to 1 if QE firmware has been uploaded, and therefore
388  * qe_firmware_info contains valid data.
389  */
390 static int qe_firmware_uploaded;
391 
392 /*
393  * Upload a QE microcode
394  *
395  * This function is a worker function for qe_upload_firmware().  It does
396  * the actual uploading of the microcode.
397  */
398 static void qe_upload_microcode(const void *base,
399 	const struct qe_microcode *ucode)
400 {
401 	const __be32 *code = base + be32_to_cpu(ucode->code_offset);
402 	unsigned int i;
403 
404 	if (ucode->major || ucode->minor || ucode->revision)
405 		printk(KERN_INFO "qe-firmware: "
406 			"uploading microcode '%s' version %u.%u.%u\n",
407 			ucode->id, ucode->major, ucode->minor, ucode->revision);
408 	else
409 		printk(KERN_INFO "qe-firmware: "
410 			"uploading microcode '%s'\n", ucode->id);
411 
412 	/* Use auto-increment */
413 	out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
414 		QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
415 
416 	for (i = 0; i < be32_to_cpu(ucode->count); i++)
417 		out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
418 
419 	/* Set I-RAM Ready Register */
420 	out_be32(&qe_immr->iram.iready, be32_to_cpu(QE_IRAM_READY));
421 }
422 
423 /*
424  * Upload a microcode to the I-RAM at a specific address.
425  *
426  * See Documentation/powerpc/qe_firmware.txt for information on QE microcode
427  * uploading.
428  *
429  * Currently, only version 1 is supported, so the 'version' field must be
430  * set to 1.
431  *
432  * The SOC model and revision are not validated, they are only displayed for
433  * informational purposes.
434  *
435  * 'calc_size' is the calculated size, in bytes, of the firmware structure and
436  * all of the microcode structures, minus the CRC.
437  *
438  * 'length' is the size that the structure says it is, including the CRC.
439  */
440 int qe_upload_firmware(const struct qe_firmware *firmware)
441 {
442 	unsigned int i;
443 	unsigned int j;
444 	u32 crc;
445 	size_t calc_size = sizeof(struct qe_firmware);
446 	size_t length;
447 	const struct qe_header *hdr;
448 
449 	if (!firmware) {
450 		printk(KERN_ERR "qe-firmware: invalid pointer\n");
451 		return -EINVAL;
452 	}
453 
454 	hdr = &firmware->header;
455 	length = be32_to_cpu(hdr->length);
456 
457 	/* Check the magic */
458 	if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
459 	    (hdr->magic[2] != 'F')) {
460 		printk(KERN_ERR "qe-firmware: not a microcode\n");
461 		return -EPERM;
462 	}
463 
464 	/* Check the version */
465 	if (hdr->version != 1) {
466 		printk(KERN_ERR "qe-firmware: unsupported version\n");
467 		return -EPERM;
468 	}
469 
470 	/* Validate some of the fields */
471 	if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
472 		printk(KERN_ERR "qe-firmware: invalid data\n");
473 		return -EINVAL;
474 	}
475 
476 	/* Validate the length and check if there's a CRC */
477 	calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
478 
479 	for (i = 0; i < firmware->count; i++)
480 		/*
481 		 * For situations where the second RISC uses the same microcode
482 		 * as the first, the 'code_offset' and 'count' fields will be
483 		 * zero, so it's okay to add those.
484 		 */
485 		calc_size += sizeof(__be32) *
486 			be32_to_cpu(firmware->microcode[i].count);
487 
488 	/* Validate the length */
489 	if (length != calc_size + sizeof(__be32)) {
490 		printk(KERN_ERR "qe-firmware: invalid length\n");
491 		return -EPERM;
492 	}
493 
494 	/* Validate the CRC */
495 	crc = be32_to_cpu(*(__be32 *)((void *)firmware + calc_size));
496 	if (crc != crc32(0, firmware, calc_size)) {
497 		printk(KERN_ERR "qe-firmware: firmware CRC is invalid\n");
498 		return -EIO;
499 	}
500 
501 	/*
502 	 * If the microcode calls for it, split the I-RAM.
503 	 */
504 	if (!firmware->split)
505 		setbits16(&qe_immr->cp.cercr, QE_CP_CERCR_CIR);
506 
507 	if (firmware->soc.model)
508 		printk(KERN_INFO
509 			"qe-firmware: firmware '%s' for %u V%u.%u\n",
510 			firmware->id, be16_to_cpu(firmware->soc.model),
511 			firmware->soc.major, firmware->soc.minor);
512 	else
513 		printk(KERN_INFO "qe-firmware: firmware '%s'\n",
514 			firmware->id);
515 
516 	/*
517 	 * The QE only supports one microcode per RISC, so clear out all the
518 	 * saved microcode information and put in the new.
519 	 */
520 	memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
521 	strlcpy(qe_firmware_info.id, firmware->id, sizeof(qe_firmware_info.id));
522 	qe_firmware_info.extended_modes = firmware->extended_modes;
523 	memcpy(qe_firmware_info.vtraps, firmware->vtraps,
524 		sizeof(firmware->vtraps));
525 
526 	/* Loop through each microcode. */
527 	for (i = 0; i < firmware->count; i++) {
528 		const struct qe_microcode *ucode = &firmware->microcode[i];
529 
530 		/* Upload a microcode if it's present */
531 		if (ucode->code_offset)
532 			qe_upload_microcode(firmware, ucode);
533 
534 		/* Program the traps for this processor */
535 		for (j = 0; j < 16; j++) {
536 			u32 trap = be32_to_cpu(ucode->traps[j]);
537 
538 			if (trap)
539 				out_be32(&qe_immr->rsp[i].tibcr[j], trap);
540 		}
541 
542 		/* Enable traps */
543 		out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
544 	}
545 
546 	qe_firmware_uploaded = 1;
547 
548 	return 0;
549 }
550 EXPORT_SYMBOL(qe_upload_firmware);
551 
552 /*
553  * Get info on the currently-loaded firmware
554  *
555  * This function also checks the device tree to see if the boot loader has
556  * uploaded a firmware already.
557  */
558 struct qe_firmware_info *qe_get_firmware_info(void)
559 {
560 	static int initialized;
561 	struct property *prop;
562 	struct device_node *qe;
563 	struct device_node *fw = NULL;
564 	const char *sprop;
565 	unsigned int i;
566 
567 	/*
568 	 * If we haven't checked yet, and a driver hasn't uploaded a firmware
569 	 * yet, then check the device tree for information.
570 	 */
571 	if (qe_firmware_uploaded)
572 		return &qe_firmware_info;
573 
574 	if (initialized)
575 		return NULL;
576 
577 	initialized = 1;
578 
579 	/*
580 	 * Newer device trees have an "fsl,qe" compatible property for the QE
581 	 * node, but we still need to support older device trees.
582 	*/
583 	qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
584 	if (!qe) {
585 		qe = of_find_node_by_type(NULL, "qe");
586 		if (!qe)
587 			return NULL;
588 	}
589 
590 	/* Find the 'firmware' child node */
591 	for_each_child_of_node(qe, fw) {
592 		if (strcmp(fw->name, "firmware") == 0)
593 			break;
594 	}
595 
596 	of_node_put(qe);
597 
598 	/* Did we find the 'firmware' node? */
599 	if (!fw)
600 		return NULL;
601 
602 	qe_firmware_uploaded = 1;
603 
604 	/* Copy the data into qe_firmware_info*/
605 	sprop = of_get_property(fw, "id", NULL);
606 	if (sprop)
607 		strlcpy(qe_firmware_info.id, sprop,
608 			sizeof(qe_firmware_info.id));
609 
610 	prop = of_find_property(fw, "extended-modes", NULL);
611 	if (prop && (prop->length == sizeof(u64))) {
612 		const u64 *iprop = prop->value;
613 
614 		qe_firmware_info.extended_modes = *iprop;
615 	}
616 
617 	prop = of_find_property(fw, "virtual-traps", NULL);
618 	if (prop && (prop->length == 32)) {
619 		const u32 *iprop = prop->value;
620 
621 		for (i = 0; i < ARRAY_SIZE(qe_firmware_info.vtraps); i++)
622 			qe_firmware_info.vtraps[i] = iprop[i];
623 	}
624 
625 	of_node_put(fw);
626 
627 	return &qe_firmware_info;
628 }
629 EXPORT_SYMBOL(qe_get_firmware_info);
630 
631 unsigned int qe_get_num_of_risc(void)
632 {
633 	struct device_node *qe;
634 	int size;
635 	unsigned int num_of_risc = 0;
636 	const u32 *prop;
637 
638 	qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
639 	if (!qe) {
640 		/* Older devices trees did not have an "fsl,qe"
641 		 * compatible property, so we need to look for
642 		 * the QE node by name.
643 		 */
644 		qe = of_find_node_by_type(NULL, "qe");
645 		if (!qe)
646 			return num_of_risc;
647 	}
648 
649 	prop = of_get_property(qe, "fsl,qe-num-riscs", &size);
650 	if (prop && size == sizeof(*prop))
651 		num_of_risc = *prop;
652 
653 	of_node_put(qe);
654 
655 	return num_of_risc;
656 }
657 EXPORT_SYMBOL(qe_get_num_of_risc);
658 
659 unsigned int qe_get_num_of_snums(void)
660 {
661 	struct device_node *qe;
662 	int size;
663 	unsigned int num_of_snums;
664 	const u32 *prop;
665 
666 	num_of_snums = 28; /* The default number of snum for threads is 28 */
667 	qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
668 	if (!qe) {
669 		/* Older devices trees did not have an "fsl,qe"
670 		 * compatible property, so we need to look for
671 		 * the QE node by name.
672 		 */
673 		qe = of_find_node_by_type(NULL, "qe");
674 		if (!qe)
675 			return num_of_snums;
676 	}
677 
678 	prop = of_get_property(qe, "fsl,qe-num-snums", &size);
679 	if (prop && size == sizeof(*prop)) {
680 		num_of_snums = *prop;
681 		if ((num_of_snums < 28) || (num_of_snums > QE_NUM_OF_SNUM)) {
682 			/* No QE ever has fewer than 28 SNUMs */
683 			pr_err("QE: number of snum is invalid\n");
684 			of_node_put(qe);
685 			return -EINVAL;
686 		}
687 	}
688 
689 	of_node_put(qe);
690 
691 	return num_of_snums;
692 }
693 EXPORT_SYMBOL(qe_get_num_of_snums);
694 
695 static int __init qe_init(void)
696 {
697 	struct device_node *np;
698 
699 	np = of_find_compatible_node(NULL, NULL, "fsl,qe");
700 	if (!np)
701 		return -ENODEV;
702 	qe_reset();
703 	of_node_put(np);
704 	return 0;
705 }
706 subsys_initcall(qe_init);
707 
708 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC_85xx)
709 static int qe_resume(struct platform_device *ofdev)
710 {
711 	if (!qe_alive_during_sleep())
712 		qe_reset();
713 	return 0;
714 }
715 
716 static int qe_probe(struct platform_device *ofdev)
717 {
718 	return 0;
719 }
720 
721 static const struct of_device_id qe_ids[] = {
722 	{ .compatible = "fsl,qe", },
723 	{ },
724 };
725 
726 static struct platform_driver qe_driver = {
727 	.driver = {
728 		.name = "fsl-qe",
729 		.of_match_table = qe_ids,
730 	},
731 	.probe = qe_probe,
732 	.resume = qe_resume,
733 };
734 
735 builtin_platform_driver(qe_driver);
736 #endif /* defined(CONFIG_SUSPEND) && defined(CONFIG_PPC_85xx) */
737