2 * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved.
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)
9 * General Purpose functions for the global management of the
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.
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>
23 #include <linux/interrupt.h>
24 #include <linux/bootmem.h>
25 #include <linux/module.h>
26 #include <linux/delay.h>
27 #include <linux/ioport.h>
30 #include <asm/pgtable.h>
31 #include <asm/immap_qe.h>
34 #include <asm/rheap.h>
36 static void qe_snums_init(void);
37 static void qe_muram_init(void);
38 static int qe_sdma_init(void);
40 static DEFINE_SPINLOCK(qe_lock);
51 enum qe_snum_state state;
54 /* We allocate this here because it is used almost exclusively for
55 * the communication processor devices.
57 struct qe_immap *qe_immr = NULL;
58 EXPORT_SYMBOL(qe_immr);
60 static struct qe_snum snums[QE_NUM_OF_SNUM]; /* Dynamically allocated SNUMs */
62 static phys_addr_t qebase = -1;
64 phys_addr_t get_qe_base(void)
66 struct device_node *qe;
71 qe = of_find_node_by_type(NULL, "qe");
74 const void *prop = of_get_property(qe, "reg", &size);
75 qebase = of_translate_address(qe, prop);
82 EXPORT_SYMBOL(get_qe_base);
87 qe_immr = ioremap(get_qe_base(), QE_IMMAP_SIZE);
91 qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
92 QE_CR_PROTOCOL_UNSPECIFIED, 0);
94 /* Reclaim the MURAM memory for our use. */
98 panic("sdma init failed!");
101 int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input)
104 u8 mcn_shift = 0, dev_shift = 0;
106 spin_lock_irqsave(&qe_lock, flags);
107 if (cmd == QE_RESET) {
108 out_be32(&qe_immr->cp.cecr, (u32) (cmd | QE_CR_FLG));
110 if (cmd == QE_ASSIGN_PAGE) {
111 /* Here device is the SNUM, not sub-block */
112 dev_shift = QE_CR_SNUM_SHIFT;
113 } else if (cmd == QE_ASSIGN_RISC) {
114 /* Here device is the SNUM, and mcnProtocol is
115 * e_QeCmdRiscAssignment value */
116 dev_shift = QE_CR_SNUM_SHIFT;
117 mcn_shift = QE_CR_MCN_RISC_ASSIGN_SHIFT;
119 if (device == QE_CR_SUBBLOCK_USB)
120 mcn_shift = QE_CR_MCN_USB_SHIFT;
122 mcn_shift = QE_CR_MCN_NORMAL_SHIFT;
125 out_be32(&qe_immr->cp.cecdr, cmd_input);
126 out_be32(&qe_immr->cp.cecr,
127 (cmd | QE_CR_FLG | ((u32) device << dev_shift) | (u32)
128 mcn_protocol << mcn_shift));
131 /* wait for the QE_CR_FLG to clear */
132 while(in_be32(&qe_immr->cp.cecr) & QE_CR_FLG)
134 spin_unlock_irqrestore(&qe_lock, flags);
138 EXPORT_SYMBOL(qe_issue_cmd);
140 /* Set a baud rate generator. This needs lots of work. There are
141 * 16 BRGs, which can be connected to the QE channels or output
142 * as clocks. The BRGs are in two different block of internal
143 * memory mapped space.
144 * The BRG clock is the QE clock divided by 2.
145 * It was set up long ago during the initial boot phase and is
147 * Baud rate clocks are zero-based in the driver code (as that maps
148 * to port numbers). Documentation uses 1-based numbering.
150 static unsigned int brg_clk = 0;
152 unsigned int get_brg_clk(void)
154 struct device_node *qe;
158 qe = of_find_node_by_type(NULL, "qe");
161 const u32 *prop = of_get_property(qe, "brg-frequency", &size);
168 /* Program the BRG to the given sampling rate and multiplier
170 * @brg: the BRG, QE_BRG1 - QE_BRG16
171 * @rate: the desired sampling rate
172 * @multiplier: corresponds to the value programmed in GUMR_L[RDCR] or
173 * GUMR_L[TDCR]. E.g., if this BRG is the RX clock, and GUMR_L[RDCR]=01,
174 * then 'multiplier' should be 8.
176 int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier)
178 u32 divisor, tempval;
181 if ((brg < QE_BRG1) || (brg > QE_BRG16))
184 divisor = get_brg_clk() / (rate * multiplier);
186 if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
187 div16 = QE_BRGC_DIV16;
191 /* Errata QE_General4, which affects some MPC832x and MPC836x SOCs, says
192 that the BRG divisor must be even if you're not using divide-by-16
194 if (!div16 && (divisor & 1))
197 tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) |
198 QE_BRGC_ENABLE | div16;
200 out_be32(&qe_immr->brg.brgc[brg - QE_BRG1], tempval);
204 EXPORT_SYMBOL(qe_setbrg);
206 /* Convert a string to a QE clock source enum
208 * This function takes a string, typically from a property in the device
209 * tree, and returns the corresponding "enum qe_clock" value.
211 enum qe_clock qe_clock_source(const char *source)
215 if (strcasecmp(source, "none") == 0)
218 if (strncasecmp(source, "brg", 3) == 0) {
219 i = simple_strtoul(source + 3, NULL, 10);
220 if ((i >= 1) && (i <= 16))
221 return (QE_BRG1 - 1) + i;
226 if (strncasecmp(source, "clk", 3) == 0) {
227 i = simple_strtoul(source + 3, NULL, 10);
228 if ((i >= 1) && (i <= 24))
229 return (QE_CLK1 - 1) + i;
236 EXPORT_SYMBOL(qe_clock_source);
238 /* Initialize SNUMs (thread serial numbers) according to
239 * QE Module Control chapter, SNUM table
241 static void qe_snums_init(void)
244 static const u8 snum_init[] = {
245 0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,
246 0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x88, 0x89,
247 0x98, 0x99, 0xA8, 0xA9, 0xB8, 0xB9, 0xC8, 0xC9,
248 0xD8, 0xD9, 0xE8, 0xE9,
251 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
252 snums[i].num = snum_init[i];
253 snums[i].state = QE_SNUM_STATE_FREE;
257 int qe_get_snum(void)
263 spin_lock_irqsave(&qe_lock, flags);
264 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
265 if (snums[i].state == QE_SNUM_STATE_FREE) {
266 snums[i].state = QE_SNUM_STATE_USED;
271 spin_unlock_irqrestore(&qe_lock, flags);
275 EXPORT_SYMBOL(qe_get_snum);
277 void qe_put_snum(u8 snum)
281 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
282 if (snums[i].num == snum) {
283 snums[i].state = QE_SNUM_STATE_FREE;
288 EXPORT_SYMBOL(qe_put_snum);
290 static int qe_sdma_init(void)
292 struct sdma *sdma = &qe_immr->sdma;
293 unsigned long sdma_buf_offset;
298 /* allocate 2 internal temporary buffers (512 bytes size each) for
300 sdma_buf_offset = qe_muram_alloc(512 * 2, 4096);
301 if (IS_ERR_VALUE(sdma_buf_offset))
304 out_be32(&sdma->sdebcr, (u32) sdma_buf_offset & QE_SDEBCR_BA_MASK);
305 out_be32(&sdma->sdmr, (QE_SDMR_GLB_1_MSK |
306 (0x1 << QE_SDMR_CEN_SHIFT)));
312 * muram_alloc / muram_free bits.
314 static DEFINE_SPINLOCK(qe_muram_lock);
316 /* 16 blocks should be enough to satisfy all requests
317 * until the memory subsystem goes up... */
318 static rh_block_t qe_boot_muram_rh_block[16];
319 static rh_info_t qe_muram_info;
321 static void qe_muram_init(void)
323 struct device_node *np;
328 /* initialize the info header */
329 rh_init(&qe_muram_info, 1,
330 sizeof(qe_boot_muram_rh_block) /
331 sizeof(qe_boot_muram_rh_block[0]), qe_boot_muram_rh_block);
333 /* Attach the usable muram area */
334 /* XXX: This is a subset of the available muram. It
335 * varies with the processor and the microcode patches activated.
337 if ((np = of_find_node_by_name(NULL, "data-only")) != NULL) {
338 address = *of_get_address(np, 0, &size, &flags);
340 rh_attach_region(&qe_muram_info, address, (int) size);
344 /* This function returns an index into the MURAM area.
346 unsigned long qe_muram_alloc(int size, int align)
351 spin_lock_irqsave(&qe_muram_lock, flags);
352 start = rh_alloc_align(&qe_muram_info, size, align, "QE");
353 spin_unlock_irqrestore(&qe_muram_lock, flags);
357 EXPORT_SYMBOL(qe_muram_alloc);
359 int qe_muram_free(unsigned long offset)
364 spin_lock_irqsave(&qe_muram_lock, flags);
365 ret = rh_free(&qe_muram_info, offset);
366 spin_unlock_irqrestore(&qe_muram_lock, flags);
370 EXPORT_SYMBOL(qe_muram_free);
372 /* not sure if this is ever needed */
373 unsigned long qe_muram_alloc_fixed(unsigned long offset, int size)
378 spin_lock_irqsave(&qe_muram_lock, flags);
379 start = rh_alloc_fixed(&qe_muram_info, offset, size, "commproc");
380 spin_unlock_irqrestore(&qe_muram_lock, flags);
384 EXPORT_SYMBOL(qe_muram_alloc_fixed);
386 void qe_muram_dump(void)
388 rh_dump(&qe_muram_info);
390 EXPORT_SYMBOL(qe_muram_dump);
392 void *qe_muram_addr(unsigned long offset)
394 return (void *)&qe_immr->muram[offset];
396 EXPORT_SYMBOL(qe_muram_addr);