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