• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/bitmap.h>
14 #include <linux/errno.h>
15 #include <linux/sched.h>
16 #include <linux/kernel.h>
17 #include <linux/param.h>
18 #include <linux/string.h>
19 #include <linux/spinlock.h>
20 #include <linux/mm.h>
21 #include <linux/interrupt.h>
22 #include <linux/module.h>
23 #include <linux/delay.h>
24 #include <linux/ioport.h>
25 #include <linux/iopoll.h>
26 #include <linux/crc32.h>
27 #include <linux/mod_devicetable.h>
28 #include <linux/of.h>
29 #include <linux/platform_device.h>
30 #include <soc/fsl/qe/immap_qe.h>
31 #include <soc/fsl/qe/qe.h>
32 
33 static void qe_snums_init(void);
34 static int qe_sdma_init(void);
35 
36 static DEFINE_SPINLOCK(qe_lock);
37 DEFINE_SPINLOCK(cmxgcr_lock);
38 EXPORT_SYMBOL(cmxgcr_lock);
39 
40 /* We allocate this here because it is used almost exclusively for
41  * the communication processor devices.
42  */
43 struct qe_immap __iomem *qe_immr;
44 EXPORT_SYMBOL(qe_immr);
45 
46 static u8 snums[QE_NUM_OF_SNUM];	/* Dynamically allocated SNUMs */
47 static DECLARE_BITMAP(snum_state, QE_NUM_OF_SNUM);
48 static unsigned int qe_num_of_snum;
49 
50 static phys_addr_t qebase = -1;
51 
qe_get_device_node(void)52 static struct device_node *qe_get_device_node(void)
53 {
54 	struct device_node *qe;
55 
56 	/*
57 	 * Newer device trees have an "fsl,qe" compatible property for the QE
58 	 * node, but we still need to support older device trees.
59 	 */
60 	qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
61 	if (qe)
62 		return qe;
63 	return of_find_node_by_type(NULL, "qe");
64 }
65 
get_qe_base(void)66 static phys_addr_t get_qe_base(void)
67 {
68 	struct device_node *qe;
69 	int ret;
70 	struct resource res;
71 
72 	if (qebase != -1)
73 		return qebase;
74 
75 	qe = qe_get_device_node();
76 	if (!qe)
77 		return qebase;
78 
79 	ret = of_address_to_resource(qe, 0, &res);
80 	if (!ret)
81 		qebase = res.start;
82 	of_node_put(qe);
83 
84 	return qebase;
85 }
86 
qe_reset(void)87 void qe_reset(void)
88 {
89 	if (qe_immr == NULL)
90 		qe_immr = ioremap(get_qe_base(), QE_IMMAP_SIZE);
91 
92 	qe_snums_init();
93 
94 	qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
95 		     QE_CR_PROTOCOL_UNSPECIFIED, 0);
96 
97 	/* Reclaim the MURAM memory for our use. */
98 	qe_muram_init();
99 
100 	if (qe_sdma_init())
101 		panic("sdma init failed!");
102 }
103 
qe_issue_cmd(u32 cmd,u32 device,u8 mcn_protocol,u32 cmd_input)104 int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input)
105 {
106 	unsigned long flags;
107 	u8 mcn_shift = 0, dev_shift = 0;
108 	u32 val;
109 	int ret;
110 
111 	spin_lock_irqsave(&qe_lock, flags);
112 	if (cmd == QE_RESET) {
113 		iowrite32be((u32)(cmd | QE_CR_FLG), &qe_immr->cp.cecr);
114 	} else {
115 		if (cmd == QE_ASSIGN_PAGE) {
116 			/* Here device is the SNUM, not sub-block */
117 			dev_shift = QE_CR_SNUM_SHIFT;
118 		} else if (cmd == QE_ASSIGN_RISC) {
119 			/* Here device is the SNUM, and mcnProtocol is
120 			 * e_QeCmdRiscAssignment value */
121 			dev_shift = QE_CR_SNUM_SHIFT;
122 			mcn_shift = QE_CR_MCN_RISC_ASSIGN_SHIFT;
123 		} else {
124 			if (device == QE_CR_SUBBLOCK_USB)
125 				mcn_shift = QE_CR_MCN_USB_SHIFT;
126 			else
127 				mcn_shift = QE_CR_MCN_NORMAL_SHIFT;
128 		}
129 
130 		iowrite32be(cmd_input, &qe_immr->cp.cecdr);
131 		iowrite32be((cmd | QE_CR_FLG | ((u32)device << dev_shift) | (u32)mcn_protocol << mcn_shift),
132 			       &qe_immr->cp.cecr);
133 	}
134 
135 	/* wait for the QE_CR_FLG to clear */
136 	ret = readx_poll_timeout_atomic(ioread32be, &qe_immr->cp.cecr, val,
137 					(val & QE_CR_FLG) == 0, 0, 100);
138 	/* On timeout, ret is -ETIMEDOUT, otherwise it will be 0. */
139 	spin_unlock_irqrestore(&qe_lock, flags);
140 
141 	return ret == 0;
142 }
143 EXPORT_SYMBOL(qe_issue_cmd);
144 
145 /* Set a baud rate generator. This needs lots of work. There are
146  * 16 BRGs, which can be connected to the QE channels or output
147  * as clocks. The BRGs are in two different block of internal
148  * memory mapped space.
149  * The BRG clock is the QE clock divided by 2.
150  * It was set up long ago during the initial boot phase and is
151  * given to us.
152  * Baud rate clocks are zero-based in the driver code (as that maps
153  * to port numbers). Documentation uses 1-based numbering.
154  */
155 static unsigned int brg_clk = 0;
156 
157 #define CLK_GRAN	(1000)
158 #define CLK_GRAN_LIMIT	(5)
159 
qe_get_brg_clk(void)160 unsigned int qe_get_brg_clk(void)
161 {
162 	struct device_node *qe;
163 	u32 brg;
164 	unsigned int mod;
165 
166 	if (brg_clk)
167 		return brg_clk;
168 
169 	qe = qe_get_device_node();
170 	if (!qe)
171 		return brg_clk;
172 
173 	if (!of_property_read_u32(qe, "brg-frequency", &brg))
174 		brg_clk = brg;
175 
176 	of_node_put(qe);
177 
178 	/* round this if near to a multiple of CLK_GRAN */
179 	mod = brg_clk % CLK_GRAN;
180 	if (mod) {
181 		if (mod < CLK_GRAN_LIMIT)
182 			brg_clk -= mod;
183 		else if (mod > (CLK_GRAN - CLK_GRAN_LIMIT))
184 			brg_clk += CLK_GRAN - mod;
185 	}
186 
187 	return brg_clk;
188 }
189 EXPORT_SYMBOL(qe_get_brg_clk);
190 
191 #define PVR_VER_836x	0x8083
192 #define PVR_VER_832x	0x8084
193 
qe_general4_errata(void)194 static bool qe_general4_errata(void)
195 {
196 #ifdef CONFIG_PPC32
197 	return pvr_version_is(PVR_VER_836x) || pvr_version_is(PVR_VER_832x);
198 #endif
199 	return false;
200 }
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  */
qe_setbrg(enum qe_clock brg,unsigned int rate,unsigned int multiplier)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 (qe_general4_errata())
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 	iowrite32be(tempval, &qe_immr->brg.brgc[brg - QE_BRG1]);
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 */
qe_clock_source(const char * source)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  */
qe_snums_init(void)282 static void qe_snums_init(void)
283 {
284 	static const u8 snum_init_76[] = {
285 		0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,
286 		0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x88, 0x89,
287 		0x98, 0x99, 0xA8, 0xA9, 0xB8, 0xB9, 0xC8, 0xC9,
288 		0xD8, 0xD9, 0xE8, 0xE9, 0x44, 0x45, 0x4C, 0x4D,
289 		0x54, 0x55, 0x5C, 0x5D, 0x64, 0x65, 0x6C, 0x6D,
290 		0x74, 0x75, 0x7C, 0x7D, 0x84, 0x85, 0x8C, 0x8D,
291 		0x94, 0x95, 0x9C, 0x9D, 0xA4, 0xA5, 0xAC, 0xAD,
292 		0xB4, 0xB5, 0xBC, 0xBD, 0xC4, 0xC5, 0xCC, 0xCD,
293 		0xD4, 0xD5, 0xDC, 0xDD, 0xE4, 0xE5, 0xEC, 0xED,
294 		0xF4, 0xF5, 0xFC, 0xFD,
295 	};
296 	static const u8 snum_init_46[] = {
297 		0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,
298 		0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x88, 0x89,
299 		0x98, 0x99, 0xA8, 0xA9, 0xB8, 0xB9, 0xC8, 0xC9,
300 		0xD8, 0xD9, 0xE8, 0xE9, 0x08, 0x09, 0x18, 0x19,
301 		0x28, 0x29, 0x38, 0x39, 0x48, 0x49, 0x58, 0x59,
302 		0x68, 0x69, 0x78, 0x79, 0x80, 0x81,
303 	};
304 	struct device_node *qe;
305 	const u8 *snum_init;
306 	int i;
307 
308 	bitmap_zero(snum_state, QE_NUM_OF_SNUM);
309 	qe_num_of_snum = 28; /* The default number of snum for threads is 28 */
310 	qe = qe_get_device_node();
311 	if (qe) {
312 		i = of_property_read_variable_u8_array(qe, "fsl,qe-snums",
313 						       snums, 1, QE_NUM_OF_SNUM);
314 		if (i > 0) {
315 			of_node_put(qe);
316 			qe_num_of_snum = i;
317 			return;
318 		}
319 		/*
320 		 * Fall back to legacy binding of using the value of
321 		 * fsl,qe-num-snums to choose one of the static arrays
322 		 * above.
323 		 */
324 		of_property_read_u32(qe, "fsl,qe-num-snums", &qe_num_of_snum);
325 		of_node_put(qe);
326 	}
327 
328 	if (qe_num_of_snum == 76) {
329 		snum_init = snum_init_76;
330 	} else if (qe_num_of_snum == 28 || qe_num_of_snum == 46) {
331 		snum_init = snum_init_46;
332 	} else {
333 		pr_err("QE: unsupported value of fsl,qe-num-snums: %u\n", qe_num_of_snum);
334 		return;
335 	}
336 	memcpy(snums, snum_init, qe_num_of_snum);
337 }
338 
qe_get_snum(void)339 int qe_get_snum(void)
340 {
341 	unsigned long flags;
342 	int snum = -EBUSY;
343 	int i;
344 
345 	spin_lock_irqsave(&qe_lock, flags);
346 	i = find_first_zero_bit(snum_state, qe_num_of_snum);
347 	if (i < qe_num_of_snum) {
348 		set_bit(i, snum_state);
349 		snum = snums[i];
350 	}
351 	spin_unlock_irqrestore(&qe_lock, flags);
352 
353 	return snum;
354 }
355 EXPORT_SYMBOL(qe_get_snum);
356 
qe_put_snum(u8 snum)357 void qe_put_snum(u8 snum)
358 {
359 	const u8 *p = memchr(snums, snum, qe_num_of_snum);
360 
361 	if (p)
362 		clear_bit(p - snums, snum_state);
363 }
364 EXPORT_SYMBOL(qe_put_snum);
365 
qe_sdma_init(void)366 static int qe_sdma_init(void)
367 {
368 	struct sdma __iomem *sdma = &qe_immr->sdma;
369 	static s32 sdma_buf_offset = -ENOMEM;
370 
371 	/* allocate 2 internal temporary buffers (512 bytes size each) for
372 	 * the SDMA */
373 	if (sdma_buf_offset < 0) {
374 		sdma_buf_offset = qe_muram_alloc(512 * 2, 4096);
375 		if (sdma_buf_offset < 0)
376 			return -ENOMEM;
377 	}
378 
379 	iowrite32be((u32)sdma_buf_offset & QE_SDEBCR_BA_MASK,
380 		       &sdma->sdebcr);
381 	iowrite32be((QE_SDMR_GLB_1_MSK | (0x1 << QE_SDMR_CEN_SHIFT)),
382 		       &sdma->sdmr);
383 
384 	return 0;
385 }
386 
387 /* The maximum number of RISCs we support */
388 #define MAX_QE_RISC     4
389 
390 /* Firmware information stored here for qe_get_firmware_info() */
391 static struct qe_firmware_info qe_firmware_info;
392 
393 /*
394  * Set to 1 if QE firmware has been uploaded, and therefore
395  * qe_firmware_info contains valid data.
396  */
397 static int qe_firmware_uploaded;
398 
399 /*
400  * Upload a QE microcode
401  *
402  * This function is a worker function for qe_upload_firmware().  It does
403  * the actual uploading of the microcode.
404  */
qe_upload_microcode(const void * base,const struct qe_microcode * ucode)405 static void qe_upload_microcode(const void *base,
406 	const struct qe_microcode *ucode)
407 {
408 	const __be32 *code = base + be32_to_cpu(ucode->code_offset);
409 	unsigned int i;
410 
411 	if (ucode->major || ucode->minor || ucode->revision)
412 		printk(KERN_INFO "qe-firmware: "
413 			"uploading microcode '%s' version %u.%u.%u\n",
414 			ucode->id, ucode->major, ucode->minor, ucode->revision);
415 	else
416 		printk(KERN_INFO "qe-firmware: "
417 			"uploading microcode '%s'\n", ucode->id);
418 
419 	/* Use auto-increment */
420 	iowrite32be(be32_to_cpu(ucode->iram_offset) | QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR,
421 		       &qe_immr->iram.iadd);
422 
423 	for (i = 0; i < be32_to_cpu(ucode->count); i++)
424 		iowrite32be(be32_to_cpu(code[i]), &qe_immr->iram.idata);
425 
426 	/* Set I-RAM Ready Register */
427 	iowrite32be(QE_IRAM_READY, &qe_immr->iram.iready);
428 }
429 
430 /*
431  * Upload a microcode to the I-RAM at a specific address.
432  *
433  * See Documentation/powerpc/qe_firmware.rst for information on QE microcode
434  * uploading.
435  *
436  * Currently, only version 1 is supported, so the 'version' field must be
437  * set to 1.
438  *
439  * The SOC model and revision are not validated, they are only displayed for
440  * informational purposes.
441  *
442  * 'calc_size' is the calculated size, in bytes, of the firmware structure and
443  * all of the microcode structures, minus the CRC.
444  *
445  * 'length' is the size that the structure says it is, including the CRC.
446  */
qe_upload_firmware(const struct qe_firmware * firmware)447 int qe_upload_firmware(const struct qe_firmware *firmware)
448 {
449 	unsigned int i;
450 	unsigned int j;
451 	u32 crc;
452 	size_t calc_size;
453 	size_t length;
454 	const struct qe_header *hdr;
455 
456 	if (!firmware) {
457 		printk(KERN_ERR "qe-firmware: invalid pointer\n");
458 		return -EINVAL;
459 	}
460 
461 	hdr = &firmware->header;
462 	length = be32_to_cpu(hdr->length);
463 
464 	/* Check the magic */
465 	if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
466 	    (hdr->magic[2] != 'F')) {
467 		printk(KERN_ERR "qe-firmware: not a microcode\n");
468 		return -EPERM;
469 	}
470 
471 	/* Check the version */
472 	if (hdr->version != 1) {
473 		printk(KERN_ERR "qe-firmware: unsupported version\n");
474 		return -EPERM;
475 	}
476 
477 	/* Validate some of the fields */
478 	if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
479 		printk(KERN_ERR "qe-firmware: invalid data\n");
480 		return -EINVAL;
481 	}
482 
483 	/* Validate the length and check if there's a CRC */
484 	calc_size = struct_size(firmware, microcode, firmware->count);
485 
486 	for (i = 0; i < firmware->count; i++)
487 		/*
488 		 * For situations where the second RISC uses the same microcode
489 		 * as the first, the 'code_offset' and 'count' fields will be
490 		 * zero, so it's okay to add those.
491 		 */
492 		calc_size += sizeof(__be32) *
493 			be32_to_cpu(firmware->microcode[i].count);
494 
495 	/* Validate the length */
496 	if (length != calc_size + sizeof(__be32)) {
497 		printk(KERN_ERR "qe-firmware: invalid length\n");
498 		return -EPERM;
499 	}
500 
501 	/* Validate the CRC */
502 	crc = be32_to_cpu(*(__be32 *)((void *)firmware + calc_size));
503 	if (crc != crc32(0, firmware, calc_size)) {
504 		printk(KERN_ERR "qe-firmware: firmware CRC is invalid\n");
505 		return -EIO;
506 	}
507 
508 	/*
509 	 * If the microcode calls for it, split the I-RAM.
510 	 */
511 	if (!firmware->split)
512 		qe_setbits_be16(&qe_immr->cp.cercr, QE_CP_CERCR_CIR);
513 
514 	if (firmware->soc.model)
515 		printk(KERN_INFO
516 			"qe-firmware: firmware '%s' for %u V%u.%u\n",
517 			firmware->id, be16_to_cpu(firmware->soc.model),
518 			firmware->soc.major, firmware->soc.minor);
519 	else
520 		printk(KERN_INFO "qe-firmware: firmware '%s'\n",
521 			firmware->id);
522 
523 	/*
524 	 * The QE only supports one microcode per RISC, so clear out all the
525 	 * saved microcode information and put in the new.
526 	 */
527 	memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
528 	strscpy(qe_firmware_info.id, firmware->id, sizeof(qe_firmware_info.id));
529 	qe_firmware_info.extended_modes = be64_to_cpu(firmware->extended_modes);
530 	memcpy(qe_firmware_info.vtraps, firmware->vtraps,
531 		sizeof(firmware->vtraps));
532 
533 	/* Loop through each microcode. */
534 	for (i = 0; i < firmware->count; i++) {
535 		const struct qe_microcode *ucode = &firmware->microcode[i];
536 
537 		/* Upload a microcode if it's present */
538 		if (ucode->code_offset)
539 			qe_upload_microcode(firmware, ucode);
540 
541 		/* Program the traps for this processor */
542 		for (j = 0; j < 16; j++) {
543 			u32 trap = be32_to_cpu(ucode->traps[j]);
544 
545 			if (trap)
546 				iowrite32be(trap,
547 					       &qe_immr->rsp[i].tibcr[j]);
548 		}
549 
550 		/* Enable traps */
551 		iowrite32be(be32_to_cpu(ucode->eccr),
552 			       &qe_immr->rsp[i].eccr);
553 	}
554 
555 	qe_firmware_uploaded = 1;
556 
557 	return 0;
558 }
559 EXPORT_SYMBOL(qe_upload_firmware);
560 
561 /*
562  * Get info on the currently-loaded firmware
563  *
564  * This function also checks the device tree to see if the boot loader has
565  * uploaded a firmware already.
566  */
qe_get_firmware_info(void)567 struct qe_firmware_info *qe_get_firmware_info(void)
568 {
569 	static int initialized;
570 	struct device_node *qe;
571 	struct device_node *fw = NULL;
572 	const char *sprop;
573 
574 	/*
575 	 * If we haven't checked yet, and a driver hasn't uploaded a firmware
576 	 * yet, then check the device tree for information.
577 	 */
578 	if (qe_firmware_uploaded)
579 		return &qe_firmware_info;
580 
581 	if (initialized)
582 		return NULL;
583 
584 	initialized = 1;
585 
586 	qe = qe_get_device_node();
587 	if (!qe)
588 		return NULL;
589 
590 	/* Find the 'firmware' child node */
591 	fw = of_get_child_by_name(qe, "firmware");
592 	of_node_put(qe);
593 
594 	/* Did we find the 'firmware' node? */
595 	if (!fw)
596 		return NULL;
597 
598 	qe_firmware_uploaded = 1;
599 
600 	/* Copy the data into qe_firmware_info*/
601 	sprop = of_get_property(fw, "id", NULL);
602 	if (sprop)
603 		strscpy(qe_firmware_info.id, sprop,
604 			sizeof(qe_firmware_info.id));
605 
606 	of_property_read_u64(fw, "extended-modes",
607 			     &qe_firmware_info.extended_modes);
608 
609 	of_property_read_u32_array(fw, "virtual-traps", qe_firmware_info.vtraps,
610 				   ARRAY_SIZE(qe_firmware_info.vtraps));
611 
612 	of_node_put(fw);
613 
614 	return &qe_firmware_info;
615 }
616 EXPORT_SYMBOL(qe_get_firmware_info);
617 
qe_get_num_of_risc(void)618 unsigned int qe_get_num_of_risc(void)
619 {
620 	struct device_node *qe;
621 	unsigned int num_of_risc = 0;
622 
623 	qe = qe_get_device_node();
624 	if (!qe)
625 		return num_of_risc;
626 
627 	of_property_read_u32(qe, "fsl,qe-num-riscs", &num_of_risc);
628 
629 	of_node_put(qe);
630 
631 	return num_of_risc;
632 }
633 EXPORT_SYMBOL(qe_get_num_of_risc);
634 
qe_get_num_of_snums(void)635 unsigned int qe_get_num_of_snums(void)
636 {
637 	return qe_num_of_snum;
638 }
639 EXPORT_SYMBOL(qe_get_num_of_snums);
640 
qe_init(void)641 static int __init qe_init(void)
642 {
643 	struct device_node *np;
644 
645 	np = of_find_compatible_node(NULL, NULL, "fsl,qe");
646 	if (!np)
647 		return -ENODEV;
648 	qe_reset();
649 	of_node_put(np);
650 	return 0;
651 }
652 subsys_initcall(qe_init);
653 
654 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC_85xx)
qe_resume(struct platform_device * ofdev)655 static int qe_resume(struct platform_device *ofdev)
656 {
657 	if (!qe_alive_during_sleep())
658 		qe_reset();
659 	return 0;
660 }
661 
qe_probe(struct platform_device * ofdev)662 static int qe_probe(struct platform_device *ofdev)
663 {
664 	return 0;
665 }
666 
667 static const struct of_device_id qe_ids[] = {
668 	{ .compatible = "fsl,qe", },
669 	{ },
670 };
671 
672 static struct platform_driver qe_driver = {
673 	.driver = {
674 		.name = "fsl-qe",
675 		.of_match_table = qe_ids,
676 	},
677 	.probe = qe_probe,
678 	.resume = qe_resume,
679 };
680 
681 builtin_platform_driver(qe_driver);
682 #endif /* defined(CONFIG_SUSPEND) && defined(CONFIG_PPC_85xx) */
683