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 = 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,
126 immrbar_virt_to_phys((void *)cmd_input));
127 out_be32(&qe_immr->cp.cecr,
128 (cmd | QE_CR_FLG | ((u32) device << dev_shift) | (u32)
129 mcn_protocol << mcn_shift));
132 /* wait for the QE_CR_FLG to clear */
133 while(in_be32(&qe_immr->cp.cecr) & QE_CR_FLG)
135 spin_unlock_irqrestore(&qe_lock, flags);
139 EXPORT_SYMBOL(qe_issue_cmd);
141 /* Set a baud rate generator. This needs lots of work. There are
142 * 16 BRGs, which can be connected to the QE channels or output
143 * as clocks. The BRGs are in two different block of internal
144 * memory mapped space.
145 * The baud rate clock is the system clock divided by something.
146 * It was set up long ago during the initial boot phase and is
148 * Baud rate clocks are zero-based in the driver code (as that maps
149 * to port numbers). Documentation uses 1-based numbering.
151 static unsigned int brg_clk = 0;
153 unsigned int get_brg_clk(void)
155 struct device_node *qe;
159 qe = of_find_node_by_type(NULL, "qe");
162 const u32 *prop = get_property(qe, "brg-frequency", &size);
169 /* This function is used by UARTS, or anything else that uses a 16x
172 void qe_setbrg(u32 brg, u32 rate)
175 u32 divisor, tempval;
178 bp = &qe_immr->brg.brgc1;
181 divisor = (get_brg_clk() / rate);
182 if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
187 tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
189 tempval |= QE_BRGC_DIV16;
191 out_be32(bp, tempval);
194 /* Initialize SNUMs (thread serial numbers) according to
195 * QE Module Control chapter, SNUM table
197 static void qe_snums_init(void)
200 static const u8 snum_init[] = {
201 0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,
202 0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x88, 0x89,
203 0x98, 0x99, 0xA8, 0xA9, 0xB8, 0xB9, 0xC8, 0xC9,
204 0xD8, 0xD9, 0xE8, 0xE9,
207 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
208 snums[i].num = snum_init[i];
209 snums[i].state = QE_SNUM_STATE_FREE;
213 int qe_get_snum(void)
219 spin_lock_irqsave(&qe_lock, flags);
220 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
221 if (snums[i].state == QE_SNUM_STATE_FREE) {
222 snums[i].state = QE_SNUM_STATE_USED;
227 spin_unlock_irqrestore(&qe_lock, flags);
231 EXPORT_SYMBOL(qe_get_snum);
233 void qe_put_snum(u8 snum)
237 for (i = 0; i < QE_NUM_OF_SNUM; i++) {
238 if (snums[i].num == snum) {
239 snums[i].state = QE_SNUM_STATE_FREE;
244 EXPORT_SYMBOL(qe_put_snum);
246 static int qe_sdma_init(void)
248 struct sdma *sdma = &qe_immr->sdma;
254 /* allocate 2 internal temporary buffers (512 bytes size each) for
256 sdma_buf_offset = qe_muram_alloc(512 * 2, 64);
257 if (IS_MURAM_ERR(sdma_buf_offset))
260 out_be32(&sdma->sdebcr, sdma_buf_offset & QE_SDEBCR_BA_MASK);
261 out_be32(&sdma->sdmr, (QE_SDMR_GLB_1_MSK | (0x1 >>
262 QE_SDMR_CEN_SHIFT)));
268 * muram_alloc / muram_free bits.
270 static DEFINE_SPINLOCK(qe_muram_lock);
272 /* 16 blocks should be enough to satisfy all requests
273 * until the memory subsystem goes up... */
274 static rh_block_t qe_boot_muram_rh_block[16];
275 static rh_info_t qe_muram_info;
277 static void qe_muram_init(void)
279 struct device_node *np;
284 /* initialize the info header */
285 rh_init(&qe_muram_info, 1,
286 sizeof(qe_boot_muram_rh_block) /
287 sizeof(qe_boot_muram_rh_block[0]), qe_boot_muram_rh_block);
289 /* Attach the usable muram area */
290 /* XXX: This is a subset of the available muram. It
291 * varies with the processor and the microcode patches activated.
293 if ((np = of_find_node_by_name(NULL, "data-only")) != NULL) {
294 address = *of_get_address(np, 0, &size, &flags);
296 rh_attach_region(&qe_muram_info,
297 (void *)address, (int)size);
301 /* This function returns an index into the MURAM area.
303 u32 qe_muram_alloc(u32 size, u32 align)
308 spin_lock_irqsave(&qe_muram_lock, flags);
309 start = rh_alloc_align(&qe_muram_info, size, align, "QE");
310 spin_unlock_irqrestore(&qe_muram_lock, flags);
314 EXPORT_SYMBOL(qe_muram_alloc);
316 int qe_muram_free(u32 offset)
321 spin_lock_irqsave(&qe_muram_lock, flags);
322 ret = rh_free(&qe_muram_info, (void *)offset);
323 spin_unlock_irqrestore(&qe_muram_lock, flags);
327 EXPORT_SYMBOL(qe_muram_free);
329 /* not sure if this is ever needed */
330 u32 qe_muram_alloc_fixed(u32 offset, u32 size)
335 spin_lock_irqsave(&qe_muram_lock, flags);
336 start = rh_alloc_fixed(&qe_muram_info, (void *)offset, size, "commproc");
337 spin_unlock_irqrestore(&qe_muram_lock, flags);
341 EXPORT_SYMBOL(qe_muram_alloc_fixed);
343 void qe_muram_dump(void)
345 rh_dump(&qe_muram_info);
347 EXPORT_SYMBOL(qe_muram_dump);
349 void *qe_muram_addr(u32 offset)
351 return (void *)&qe_immr->muram[offset];
353 EXPORT_SYMBOL(qe_muram_addr);