Statistics
| Branch: | Revision:

root / hw / omap2.c @ f5654039

History | View | Annotate | Download (84.8 kB)

1 827df9f3 balrog
/*
2 827df9f3 balrog
 * TI OMAP processors emulation.
3 827df9f3 balrog
 *
4 827df9f3 balrog
 * Copyright (C) 2007-2008 Nokia Corporation
5 827df9f3 balrog
 * Written by Andrzej Zaborowski <andrew@openedhand.com>
6 827df9f3 balrog
 *
7 827df9f3 balrog
 * This program is free software; you can redistribute it and/or
8 827df9f3 balrog
 * modify it under the terms of the GNU General Public License as
9 827df9f3 balrog
 * published by the Free Software Foundation; either version 2 or
10 827df9f3 balrog
 * (at your option) version 3 of the License.
11 827df9f3 balrog
 *
12 827df9f3 balrog
 * This program is distributed in the hope that it will be useful,
13 827df9f3 balrog
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 827df9f3 balrog
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 827df9f3 balrog
 * GNU General Public License for more details.
16 827df9f3 balrog
 *
17 fad6cb1a aurel32
 * You should have received a copy of the GNU General Public License along
18 8167ee88 Blue Swirl
 * with this program; if not, see <http://www.gnu.org/licenses/>.
19 827df9f3 balrog
 */
20 666daa68 Markus Armbruster
21 666daa68 Markus Armbruster
#include "blockdev.h"
22 827df9f3 balrog
#include "hw.h"
23 827df9f3 balrog
#include "arm-misc.h"
24 827df9f3 balrog
#include "omap.h"
25 827df9f3 balrog
#include "sysemu.h"
26 827df9f3 balrog
#include "qemu-timer.h"
27 827df9f3 balrog
#include "qemu-char.h"
28 827df9f3 balrog
#include "flash.h"
29 afbb5194 balrog
#include "soc_dma.h"
30 77831c20 Juha Riihimäki
#include "sysbus.h"
31 99570a40 balrog
#include "audio/audio.h"
32 827df9f3 balrog
33 99570a40 balrog
/* Enhanced Audio Controller (CODEC only) */
34 99570a40 balrog
struct omap_eac_s {
35 99570a40 balrog
    qemu_irq irq;
36 99570a40 balrog
37 99570a40 balrog
    uint16_t sysconfig;
38 99570a40 balrog
    uint8_t config[4];
39 99570a40 balrog
    uint8_t control;
40 99570a40 balrog
    uint8_t address;
41 99570a40 balrog
    uint16_t data;
42 99570a40 balrog
    uint8_t vtol;
43 99570a40 balrog
    uint8_t vtsl;
44 99570a40 balrog
    uint16_t mixer;
45 99570a40 balrog
    uint16_t gain[4];
46 99570a40 balrog
    uint8_t att;
47 99570a40 balrog
    uint16_t max[7];
48 99570a40 balrog
49 99570a40 balrog
    struct {
50 99570a40 balrog
        qemu_irq txdrq;
51 99570a40 balrog
        qemu_irq rxdrq;
52 99570a40 balrog
        uint32_t (*txrx)(void *opaque, uint32_t, int);
53 99570a40 balrog
        void *opaque;
54 99570a40 balrog
55 99570a40 balrog
#define EAC_BUF_LEN 1024
56 99570a40 balrog
        uint32_t rxbuf[EAC_BUF_LEN];
57 ab17b46d balrog
        int rxoff;
58 99570a40 balrog
        int rxlen;
59 99570a40 balrog
        int rxavail;
60 99570a40 balrog
        uint32_t txbuf[EAC_BUF_LEN];
61 99570a40 balrog
        int txlen;
62 99570a40 balrog
        int txavail;
63 99570a40 balrog
64 99570a40 balrog
        int enable;
65 99570a40 balrog
        int rate;
66 99570a40 balrog
67 99570a40 balrog
        uint16_t config[4];
68 99570a40 balrog
69 99570a40 balrog
        /* These need to be moved to the actual codec */
70 99570a40 balrog
        QEMUSoundCard card;
71 99570a40 balrog
        SWVoiceIn *in_voice;
72 99570a40 balrog
        SWVoiceOut *out_voice;
73 99570a40 balrog
        int hw_enable;
74 99570a40 balrog
    } codec;
75 99570a40 balrog
76 99570a40 balrog
    struct {
77 99570a40 balrog
        uint8_t control;
78 99570a40 balrog
        uint16_t config;
79 99570a40 balrog
    } modem, bt;
80 99570a40 balrog
};
81 99570a40 balrog
82 99570a40 balrog
static inline void omap_eac_interrupt_update(struct omap_eac_s *s)
83 99570a40 balrog
{
84 99570a40 balrog
    qemu_set_irq(s->irq, (s->codec.config[1] >> 14) & 1);        /* AURDI */
85 99570a40 balrog
}
86 99570a40 balrog
87 99570a40 balrog
static inline void omap_eac_in_dmarequest_update(struct omap_eac_s *s)
88 99570a40 balrog
{
89 ab17b46d balrog
    qemu_set_irq(s->codec.rxdrq, (s->codec.rxavail || s->codec.rxlen) &&
90 99570a40 balrog
                    ((s->codec.config[1] >> 12) & 1));                /* DMAREN */
91 99570a40 balrog
}
92 99570a40 balrog
93 99570a40 balrog
static inline void omap_eac_out_dmarequest_update(struct omap_eac_s *s)
94 99570a40 balrog
{
95 99570a40 balrog
    qemu_set_irq(s->codec.txdrq, s->codec.txlen < s->codec.txavail &&
96 99570a40 balrog
                    ((s->codec.config[1] >> 11) & 1));                /* DMAWEN */
97 99570a40 balrog
}
98 99570a40 balrog
99 99570a40 balrog
static inline void omap_eac_in_refill(struct omap_eac_s *s)
100 99570a40 balrog
{
101 ab17b46d balrog
    int left = MIN(EAC_BUF_LEN - s->codec.rxlen, s->codec.rxavail) << 2;
102 ab17b46d balrog
    int start = ((s->codec.rxoff + s->codec.rxlen) & (EAC_BUF_LEN - 1)) << 2;
103 ab17b46d balrog
    int leftwrap = MIN(left, (EAC_BUF_LEN << 2) - start);
104 ab17b46d balrog
    int recv = 1;
105 ab17b46d balrog
    uint8_t *buf = (uint8_t *) s->codec.rxbuf + start;
106 ab17b46d balrog
107 ab17b46d balrog
    left -= leftwrap;
108 ab17b46d balrog
    start = 0;
109 ab17b46d balrog
    while (leftwrap && (recv = AUD_read(s->codec.in_voice, buf + start,
110 ab17b46d balrog
                                    leftwrap)) > 0) {        /* Be defensive */
111 ab17b46d balrog
        start += recv;
112 ab17b46d balrog
        leftwrap -= recv;
113 ab17b46d balrog
    }
114 ab17b46d balrog
    if (recv <= 0)
115 ab17b46d balrog
        s->codec.rxavail = 0;
116 ab17b46d balrog
    else
117 ab17b46d balrog
        s->codec.rxavail -= start >> 2;
118 ab17b46d balrog
    s->codec.rxlen += start >> 2;
119 ab17b46d balrog
120 ab17b46d balrog
    if (recv > 0 && left > 0) {
121 ab17b46d balrog
        start = 0;
122 ab17b46d balrog
        while (left && (recv = AUD_read(s->codec.in_voice,
123 ab17b46d balrog
                                        (uint8_t *) s->codec.rxbuf + start,
124 ab17b46d balrog
                                        left)) > 0) {        /* Be defensive */
125 ab17b46d balrog
            start += recv;
126 ab17b46d balrog
            left -= recv;
127 ab17b46d balrog
        }
128 ab17b46d balrog
        if (recv <= 0)
129 ab17b46d balrog
            s->codec.rxavail = 0;
130 ab17b46d balrog
        else
131 ab17b46d balrog
            s->codec.rxavail -= start >> 2;
132 ab17b46d balrog
        s->codec.rxlen += start >> 2;
133 ab17b46d balrog
    }
134 99570a40 balrog
}
135 99570a40 balrog
136 99570a40 balrog
static inline void omap_eac_out_empty(struct omap_eac_s *s)
137 99570a40 balrog
{
138 ab17b46d balrog
    int left = s->codec.txlen << 2;
139 ab17b46d balrog
    int start = 0;
140 ab17b46d balrog
    int sent = 1;
141 ab17b46d balrog
142 ab17b46d balrog
    while (left && (sent = AUD_write(s->codec.out_voice,
143 ab17b46d balrog
                                    (uint8_t *) s->codec.txbuf + start,
144 ab17b46d balrog
                                    left)) > 0) {        /* Be defensive */
145 ab17b46d balrog
        start += sent;
146 ab17b46d balrog
        left -= sent;
147 ab17b46d balrog
    }
148 99570a40 balrog
149 ab17b46d balrog
    if (!sent) {
150 ab17b46d balrog
        s->codec.txavail = 0;
151 ab17b46d balrog
        omap_eac_out_dmarequest_update(s);
152 ab17b46d balrog
    }
153 99570a40 balrog
154 ab17b46d balrog
    if (start)
155 ab17b46d balrog
        s->codec.txlen = 0;
156 99570a40 balrog
}
157 99570a40 balrog
158 99570a40 balrog
static void omap_eac_in_cb(void *opaque, int avail_b)
159 99570a40 balrog
{
160 99570a40 balrog
    struct omap_eac_s *s = (struct omap_eac_s *) opaque;
161 99570a40 balrog
162 99570a40 balrog
    s->codec.rxavail = avail_b >> 2;
163 ab17b46d balrog
    omap_eac_in_refill(s);
164 99570a40 balrog
    /* TODO: possibly discard current buffer if overrun */
165 ab17b46d balrog
    omap_eac_in_dmarequest_update(s);
166 99570a40 balrog
}
167 99570a40 balrog
168 99570a40 balrog
static void omap_eac_out_cb(void *opaque, int free_b)
169 99570a40 balrog
{
170 99570a40 balrog
    struct omap_eac_s *s = (struct omap_eac_s *) opaque;
171 99570a40 balrog
172 99570a40 balrog
    s->codec.txavail = free_b >> 2;
173 ab17b46d balrog
    if (s->codec.txlen)
174 ab17b46d balrog
        omap_eac_out_empty(s);
175 ab17b46d balrog
    else
176 ab17b46d balrog
        omap_eac_out_dmarequest_update(s);
177 99570a40 balrog
}
178 99570a40 balrog
179 99570a40 balrog
static void omap_eac_enable_update(struct omap_eac_s *s)
180 99570a40 balrog
{
181 99570a40 balrog
    s->codec.enable = !(s->codec.config[1] & 1) &&                /* EACPWD */
182 99570a40 balrog
            (s->codec.config[1] & 2) &&                                /* AUDEN */
183 99570a40 balrog
            s->codec.hw_enable;
184 99570a40 balrog
}
185 99570a40 balrog
186 99570a40 balrog
static const int omap_eac_fsint[4] = {
187 99570a40 balrog
    8000,
188 99570a40 balrog
    11025,
189 99570a40 balrog
    22050,
190 99570a40 balrog
    44100,
191 99570a40 balrog
};
192 99570a40 balrog
193 99570a40 balrog
static const int omap_eac_fsint2[8] = {
194 99570a40 balrog
    8000,
195 99570a40 balrog
    11025,
196 99570a40 balrog
    22050,
197 99570a40 balrog
    44100,
198 99570a40 balrog
    48000,
199 99570a40 balrog
    0, 0, 0,
200 99570a40 balrog
};
201 99570a40 balrog
202 99570a40 balrog
static const int omap_eac_fsint3[16] = {
203 99570a40 balrog
    8000,
204 99570a40 balrog
    11025,
205 99570a40 balrog
    16000,
206 99570a40 balrog
    22050,
207 99570a40 balrog
    24000,
208 99570a40 balrog
    32000,
209 99570a40 balrog
    44100,
210 99570a40 balrog
    48000,
211 99570a40 balrog
    0, 0, 0, 0, 0, 0, 0, 0,
212 99570a40 balrog
};
213 99570a40 balrog
214 99570a40 balrog
static void omap_eac_rate_update(struct omap_eac_s *s)
215 99570a40 balrog
{
216 99570a40 balrog
    int fsint[3];
217 99570a40 balrog
218 99570a40 balrog
    fsint[2] = (s->codec.config[3] >> 9) & 0xf;
219 99570a40 balrog
    fsint[1] = (s->codec.config[2] >> 0) & 0x7;
220 99570a40 balrog
    fsint[0] = (s->codec.config[0] >> 6) & 0x3;
221 99570a40 balrog
    if (fsint[2] < 0xf)
222 99570a40 balrog
        s->codec.rate = omap_eac_fsint3[fsint[2]];
223 99570a40 balrog
    else if (fsint[1] < 0x7)
224 99570a40 balrog
        s->codec.rate = omap_eac_fsint2[fsint[1]];
225 99570a40 balrog
    else
226 99570a40 balrog
        s->codec.rate = omap_eac_fsint[fsint[0]];
227 99570a40 balrog
}
228 99570a40 balrog
229 99570a40 balrog
static void omap_eac_volume_update(struct omap_eac_s *s)
230 99570a40 balrog
{
231 99570a40 balrog
    /* TODO */
232 99570a40 balrog
}
233 99570a40 balrog
234 99570a40 balrog
static void omap_eac_format_update(struct omap_eac_s *s)
235 99570a40 balrog
{
236 1ea879e5 malc
    struct audsettings fmt;
237 99570a40 balrog
238 ab17b46d balrog
    /* The hardware buffers at most one sample */
239 ab17b46d balrog
    if (s->codec.rxlen)
240 ab17b46d balrog
        s->codec.rxlen = 1;
241 99570a40 balrog
242 99570a40 balrog
    if (s->codec.in_voice) {
243 99570a40 balrog
        AUD_set_active_in(s->codec.in_voice, 0);
244 99570a40 balrog
        AUD_close_in(&s->codec.card, s->codec.in_voice);
245 b9d38e95 Blue Swirl
        s->codec.in_voice = NULL;
246 99570a40 balrog
    }
247 99570a40 balrog
    if (s->codec.out_voice) {
248 ab17b46d balrog
        omap_eac_out_empty(s);
249 99570a40 balrog
        AUD_set_active_out(s->codec.out_voice, 0);
250 99570a40 balrog
        AUD_close_out(&s->codec.card, s->codec.out_voice);
251 b9d38e95 Blue Swirl
        s->codec.out_voice = NULL;
252 ab17b46d balrog
        s->codec.txavail = 0;
253 99570a40 balrog
    }
254 ab17b46d balrog
    /* Discard what couldn't be written */
255 ab17b46d balrog
    s->codec.txlen = 0;
256 99570a40 balrog
257 99570a40 balrog
    omap_eac_enable_update(s);
258 99570a40 balrog
    if (!s->codec.enable)
259 99570a40 balrog
        return;
260 99570a40 balrog
261 99570a40 balrog
    omap_eac_rate_update(s);
262 99570a40 balrog
    fmt.endianness = ((s->codec.config[0] >> 8) & 1);                /* LI_BI */
263 99570a40 balrog
    fmt.nchannels = ((s->codec.config[0] >> 10) & 1) ? 2 : 1;        /* MN_ST */
264 99570a40 balrog
    fmt.freq = s->codec.rate;
265 99570a40 balrog
    /* TODO: signedness possibly depends on the CODEC hardware - or
266 99570a40 balrog
     * does I2S specify it?  */
267 99570a40 balrog
    /* All register writes are 16 bits so we we store 16-bit samples
268 99570a40 balrog
     * in the buffers regardless of AGCFR[B8_16] value.  */
269 99570a40 balrog
    fmt.fmt = AUD_FMT_U16;
270 99570a40 balrog
271 99570a40 balrog
    s->codec.in_voice = AUD_open_in(&s->codec.card, s->codec.in_voice,
272 99570a40 balrog
                    "eac.codec.in", s, omap_eac_in_cb, &fmt);
273 99570a40 balrog
    s->codec.out_voice = AUD_open_out(&s->codec.card, s->codec.out_voice,
274 99570a40 balrog
                    "eac.codec.out", s, omap_eac_out_cb, &fmt);
275 99570a40 balrog
276 99570a40 balrog
    omap_eac_volume_update(s);
277 99570a40 balrog
278 99570a40 balrog
    AUD_set_active_in(s->codec.in_voice, 1);
279 99570a40 balrog
    AUD_set_active_out(s->codec.out_voice, 1);
280 99570a40 balrog
}
281 99570a40 balrog
282 99570a40 balrog
static void omap_eac_reset(struct omap_eac_s *s)
283 99570a40 balrog
{
284 99570a40 balrog
    s->sysconfig = 0;
285 99570a40 balrog
    s->config[0] = 0x0c;
286 99570a40 balrog
    s->config[1] = 0x09;
287 99570a40 balrog
    s->config[2] = 0xab;
288 99570a40 balrog
    s->config[3] = 0x03;
289 99570a40 balrog
    s->control = 0x00;
290 99570a40 balrog
    s->address = 0x00;
291 99570a40 balrog
    s->data = 0x0000;
292 99570a40 balrog
    s->vtol = 0x00;
293 99570a40 balrog
    s->vtsl = 0x00;
294 99570a40 balrog
    s->mixer = 0x0000;
295 99570a40 balrog
    s->gain[0] = 0xe7e7;
296 99570a40 balrog
    s->gain[1] = 0x6767;
297 99570a40 balrog
    s->gain[2] = 0x6767;
298 99570a40 balrog
    s->gain[3] = 0x6767;
299 99570a40 balrog
    s->att = 0xce;
300 99570a40 balrog
    s->max[0] = 0;
301 99570a40 balrog
    s->max[1] = 0;
302 99570a40 balrog
    s->max[2] = 0;
303 99570a40 balrog
    s->max[3] = 0;
304 99570a40 balrog
    s->max[4] = 0;
305 99570a40 balrog
    s->max[5] = 0;
306 99570a40 balrog
    s->max[6] = 0;
307 99570a40 balrog
308 99570a40 balrog
    s->modem.control = 0x00;
309 99570a40 balrog
    s->modem.config = 0x0000;
310 99570a40 balrog
    s->bt.control = 0x00;
311 99570a40 balrog
    s->bt.config = 0x0000;
312 99570a40 balrog
    s->codec.config[0] = 0x0649;
313 99570a40 balrog
    s->codec.config[1] = 0x0000;
314 99570a40 balrog
    s->codec.config[2] = 0x0007;
315 99570a40 balrog
    s->codec.config[3] = 0x1ffc;
316 ab17b46d balrog
    s->codec.rxoff = 0;
317 99570a40 balrog
    s->codec.rxlen = 0;
318 99570a40 balrog
    s->codec.txlen = 0;
319 99570a40 balrog
    s->codec.rxavail = 0;
320 99570a40 balrog
    s->codec.txavail = 0;
321 99570a40 balrog
322 99570a40 balrog
    omap_eac_format_update(s);
323 99570a40 balrog
    omap_eac_interrupt_update(s);
324 99570a40 balrog
}
325 99570a40 balrog
326 c227f099 Anthony Liguori
static uint32_t omap_eac_read(void *opaque, target_phys_addr_t addr)
327 99570a40 balrog
{
328 99570a40 balrog
    struct omap_eac_s *s = (struct omap_eac_s *) opaque;
329 ab17b46d balrog
    uint32_t ret;
330 99570a40 balrog
331 8da3ff18 pbrook
    switch (addr) {
332 99570a40 balrog
    case 0x000:        /* CPCFR1 */
333 99570a40 balrog
        return s->config[0];
334 99570a40 balrog
    case 0x004:        /* CPCFR2 */
335 99570a40 balrog
        return s->config[1];
336 99570a40 balrog
    case 0x008:        /* CPCFR3 */
337 99570a40 balrog
        return s->config[2];
338 99570a40 balrog
    case 0x00c:        /* CPCFR4 */
339 99570a40 balrog
        return s->config[3];
340 99570a40 balrog
341 99570a40 balrog
    case 0x010:        /* CPTCTL */
342 99570a40 balrog
        return s->control | ((s->codec.rxavail + s->codec.rxlen > 0) << 7) |
343 99570a40 balrog
                ((s->codec.txlen < s->codec.txavail) << 5);
344 99570a40 balrog
345 99570a40 balrog
    case 0x014:        /* CPTTADR */
346 99570a40 balrog
        return s->address;
347 99570a40 balrog
    case 0x018:        /* CPTDATL */
348 99570a40 balrog
        return s->data & 0xff;
349 99570a40 balrog
    case 0x01c:        /* CPTDATH */
350 99570a40 balrog
        return s->data >> 8;
351 99570a40 balrog
    case 0x020:        /* CPTVSLL */
352 99570a40 balrog
        return s->vtol;
353 99570a40 balrog
    case 0x024:        /* CPTVSLH */
354 99570a40 balrog
        return s->vtsl | (3 << 5);        /* CRDY1 | CRDY2 */
355 99570a40 balrog
    case 0x040:        /* MPCTR */
356 99570a40 balrog
        return s->modem.control;
357 99570a40 balrog
    case 0x044:        /* MPMCCFR */
358 99570a40 balrog
        return s->modem.config;
359 99570a40 balrog
    case 0x060:        /* BPCTR */
360 99570a40 balrog
        return s->bt.control;
361 99570a40 balrog
    case 0x064:        /* BPMCCFR */
362 99570a40 balrog
        return s->bt.config;
363 99570a40 balrog
    case 0x080:        /* AMSCFR */
364 99570a40 balrog
        return s->mixer;
365 99570a40 balrog
    case 0x084:        /* AMVCTR */
366 99570a40 balrog
        return s->gain[0];
367 99570a40 balrog
    case 0x088:        /* AM1VCTR */
368 99570a40 balrog
        return s->gain[1];
369 99570a40 balrog
    case 0x08c:        /* AM2VCTR */
370 99570a40 balrog
        return s->gain[2];
371 99570a40 balrog
    case 0x090:        /* AM3VCTR */
372 99570a40 balrog
        return s->gain[3];
373 99570a40 balrog
    case 0x094:        /* ASTCTR */
374 99570a40 balrog
        return s->att;
375 99570a40 balrog
    case 0x098:        /* APD1LCR */
376 99570a40 balrog
        return s->max[0];
377 99570a40 balrog
    case 0x09c:        /* APD1RCR */
378 99570a40 balrog
        return s->max[1];
379 99570a40 balrog
    case 0x0a0:        /* APD2LCR */
380 99570a40 balrog
        return s->max[2];
381 99570a40 balrog
    case 0x0a4:        /* APD2RCR */
382 99570a40 balrog
        return s->max[3];
383 99570a40 balrog
    case 0x0a8:        /* APD3LCR */
384 99570a40 balrog
        return s->max[4];
385 99570a40 balrog
    case 0x0ac:        /* APD3RCR */
386 99570a40 balrog
        return s->max[5];
387 99570a40 balrog
    case 0x0b0:        /* APD4R */
388 99570a40 balrog
        return s->max[6];
389 99570a40 balrog
    case 0x0b4:        /* ADWR */
390 99570a40 balrog
        /* This should be write-only?  Docs list it as read-only.  */
391 99570a40 balrog
        return 0x0000;
392 99570a40 balrog
    case 0x0b8:        /* ADRDR */
393 ab17b46d balrog
        if (likely(s->codec.rxlen > 1)) {
394 ab17b46d balrog
            ret = s->codec.rxbuf[s->codec.rxoff ++];
395 ab17b46d balrog
            s->codec.rxlen --;
396 ab17b46d balrog
            s->codec.rxoff &= EAC_BUF_LEN - 1;
397 ab17b46d balrog
            return ret;
398 ab17b46d balrog
        } else if (s->codec.rxlen) {
399 ab17b46d balrog
            ret = s->codec.rxbuf[s->codec.rxoff ++];
400 ab17b46d balrog
            s->codec.rxlen --;
401 ab17b46d balrog
            s->codec.rxoff &= EAC_BUF_LEN - 1;
402 99570a40 balrog
            if (s->codec.rxavail)
403 99570a40 balrog
                omap_eac_in_refill(s);
404 ab17b46d balrog
            omap_eac_in_dmarequest_update(s);
405 ab17b46d balrog
            return ret;
406 99570a40 balrog
        }
407 99570a40 balrog
        return 0x0000;
408 99570a40 balrog
    case 0x0bc:        /* AGCFR */
409 99570a40 balrog
        return s->codec.config[0];
410 99570a40 balrog
    case 0x0c0:        /* AGCTR */
411 99570a40 balrog
        return s->codec.config[1] | ((s->codec.config[1] & 2) << 14);
412 99570a40 balrog
    case 0x0c4:        /* AGCFR2 */
413 99570a40 balrog
        return s->codec.config[2];
414 99570a40 balrog
    case 0x0c8:        /* AGCFR3 */
415 99570a40 balrog
        return s->codec.config[3];
416 99570a40 balrog
    case 0x0cc:        /* MBPDMACTR */
417 99570a40 balrog
    case 0x0d0:        /* MPDDMARR */
418 99570a40 balrog
    case 0x0d8:        /* MPUDMARR */
419 99570a40 balrog
    case 0x0e4:        /* BPDDMARR */
420 99570a40 balrog
    case 0x0ec:        /* BPUDMARR */
421 99570a40 balrog
        return 0x0000;
422 99570a40 balrog
423 99570a40 balrog
    case 0x100:        /* VERSION_NUMBER */
424 99570a40 balrog
        return 0x0010;
425 99570a40 balrog
426 99570a40 balrog
    case 0x104:        /* SYSCONFIG */
427 99570a40 balrog
        return s->sysconfig;
428 99570a40 balrog
429 99570a40 balrog
    case 0x108:        /* SYSSTATUS */
430 99570a40 balrog
        return 1 | 0xe;                                        /* RESETDONE | stuff */
431 99570a40 balrog
    }
432 99570a40 balrog
433 99570a40 balrog
    OMAP_BAD_REG(addr);
434 99570a40 balrog
    return 0;
435 99570a40 balrog
}
436 99570a40 balrog
437 c227f099 Anthony Liguori
static void omap_eac_write(void *opaque, target_phys_addr_t addr,
438 99570a40 balrog
                uint32_t value)
439 99570a40 balrog
{
440 99570a40 balrog
    struct omap_eac_s *s = (struct omap_eac_s *) opaque;
441 99570a40 balrog
442 8da3ff18 pbrook
    switch (addr) {
443 99570a40 balrog
    case 0x098:        /* APD1LCR */
444 99570a40 balrog
    case 0x09c:        /* APD1RCR */
445 99570a40 balrog
    case 0x0a0:        /* APD2LCR */
446 99570a40 balrog
    case 0x0a4:        /* APD2RCR */
447 99570a40 balrog
    case 0x0a8:        /* APD3LCR */
448 99570a40 balrog
    case 0x0ac:        /* APD3RCR */
449 99570a40 balrog
    case 0x0b0:        /* APD4R */
450 99570a40 balrog
    case 0x0b8:        /* ADRDR */
451 99570a40 balrog
    case 0x0d0:        /* MPDDMARR */
452 99570a40 balrog
    case 0x0d8:        /* MPUDMARR */
453 99570a40 balrog
    case 0x0e4:        /* BPDDMARR */
454 99570a40 balrog
    case 0x0ec:        /* BPUDMARR */
455 99570a40 balrog
    case 0x100:        /* VERSION_NUMBER */
456 99570a40 balrog
    case 0x108:        /* SYSSTATUS */
457 99570a40 balrog
        OMAP_RO_REG(addr);
458 99570a40 balrog
        return;
459 99570a40 balrog
460 99570a40 balrog
    case 0x000:        /* CPCFR1 */
461 99570a40 balrog
        s->config[0] = value & 0xff;
462 99570a40 balrog
        omap_eac_format_update(s);
463 99570a40 balrog
        break;
464 99570a40 balrog
    case 0x004:        /* CPCFR2 */
465 99570a40 balrog
        s->config[1] = value & 0xff;
466 99570a40 balrog
        omap_eac_format_update(s);
467 99570a40 balrog
        break;
468 99570a40 balrog
    case 0x008:        /* CPCFR3 */
469 99570a40 balrog
        s->config[2] = value & 0xff;
470 99570a40 balrog
        omap_eac_format_update(s);
471 99570a40 balrog
        break;
472 99570a40 balrog
    case 0x00c:        /* CPCFR4 */
473 99570a40 balrog
        s->config[3] = value & 0xff;
474 99570a40 balrog
        omap_eac_format_update(s);
475 99570a40 balrog
        break;
476 99570a40 balrog
477 99570a40 balrog
    case 0x010:        /* CPTCTL */
478 99570a40 balrog
        /* Assuming TXF and TXE bits are read-only... */
479 99570a40 balrog
        s->control = value & 0x5f;
480 99570a40 balrog
        omap_eac_interrupt_update(s);
481 99570a40 balrog
        break;
482 99570a40 balrog
483 99570a40 balrog
    case 0x014:        /* CPTTADR */
484 99570a40 balrog
        s->address = value & 0xff;
485 99570a40 balrog
        break;
486 99570a40 balrog
    case 0x018:        /* CPTDATL */
487 99570a40 balrog
        s->data &= 0xff00;
488 99570a40 balrog
        s->data |= value & 0xff;
489 99570a40 balrog
        break;
490 99570a40 balrog
    case 0x01c:        /* CPTDATH */
491 99570a40 balrog
        s->data &= 0x00ff;
492 99570a40 balrog
        s->data |= value << 8;
493 99570a40 balrog
        break;
494 99570a40 balrog
    case 0x020:        /* CPTVSLL */
495 99570a40 balrog
        s->vtol = value & 0xf8;
496 99570a40 balrog
        break;
497 99570a40 balrog
    case 0x024:        /* CPTVSLH */
498 99570a40 balrog
        s->vtsl = value & 0x9f;
499 99570a40 balrog
        break;
500 99570a40 balrog
    case 0x040:        /* MPCTR */
501 99570a40 balrog
        s->modem.control = value & 0x8f;
502 99570a40 balrog
        break;
503 99570a40 balrog
    case 0x044:        /* MPMCCFR */
504 99570a40 balrog
        s->modem.config = value & 0x7fff;
505 99570a40 balrog
        break;
506 99570a40 balrog
    case 0x060:        /* BPCTR */
507 99570a40 balrog
        s->bt.control = value & 0x8f;
508 99570a40 balrog
        break;
509 99570a40 balrog
    case 0x064:        /* BPMCCFR */
510 99570a40 balrog
        s->bt.config = value & 0x7fff;
511 99570a40 balrog
        break;
512 99570a40 balrog
    case 0x080:        /* AMSCFR */
513 99570a40 balrog
        s->mixer = value & 0x0fff;
514 99570a40 balrog
        break;
515 99570a40 balrog
    case 0x084:        /* AMVCTR */
516 99570a40 balrog
        s->gain[0] = value & 0xffff;
517 99570a40 balrog
        break;
518 99570a40 balrog
    case 0x088:        /* AM1VCTR */
519 99570a40 balrog
        s->gain[1] = value & 0xff7f;
520 99570a40 balrog
        break;
521 99570a40 balrog
    case 0x08c:        /* AM2VCTR */
522 99570a40 balrog
        s->gain[2] = value & 0xff7f;
523 99570a40 balrog
        break;
524 99570a40 balrog
    case 0x090:        /* AM3VCTR */
525 99570a40 balrog
        s->gain[3] = value & 0xff7f;
526 99570a40 balrog
        break;
527 99570a40 balrog
    case 0x094:        /* ASTCTR */
528 99570a40 balrog
        s->att = value & 0xff;
529 99570a40 balrog
        break;
530 99570a40 balrog
531 99570a40 balrog
    case 0x0b4:        /* ADWR */
532 99570a40 balrog
        s->codec.txbuf[s->codec.txlen ++] = value;
533 99570a40 balrog
        if (unlikely(s->codec.txlen == EAC_BUF_LEN ||
534 99570a40 balrog
                                s->codec.txlen == s->codec.txavail)) {
535 99570a40 balrog
            if (s->codec.txavail)
536 99570a40 balrog
                omap_eac_out_empty(s);
537 ab17b46d balrog
            /* Discard what couldn't be written */
538 ab17b46d balrog
            s->codec.txlen = 0;
539 99570a40 balrog
        }
540 99570a40 balrog
        break;
541 99570a40 balrog
542 99570a40 balrog
    case 0x0bc:        /* AGCFR */
543 99570a40 balrog
        s->codec.config[0] = value & 0x07ff;
544 99570a40 balrog
        omap_eac_format_update(s);
545 99570a40 balrog
        break;
546 99570a40 balrog
    case 0x0c0:        /* AGCTR */
547 99570a40 balrog
        s->codec.config[1] = value & 0x780f;
548 99570a40 balrog
        omap_eac_format_update(s);
549 99570a40 balrog
        break;
550 99570a40 balrog
    case 0x0c4:        /* AGCFR2 */
551 99570a40 balrog
        s->codec.config[2] = value & 0x003f;
552 99570a40 balrog
        omap_eac_format_update(s);
553 99570a40 balrog
        break;
554 99570a40 balrog
    case 0x0c8:        /* AGCFR3 */
555 99570a40 balrog
        s->codec.config[3] = value & 0xffff;
556 99570a40 balrog
        omap_eac_format_update(s);
557 99570a40 balrog
        break;
558 99570a40 balrog
    case 0x0cc:        /* MBPDMACTR */
559 99570a40 balrog
    case 0x0d4:        /* MPDDMAWR */
560 99570a40 balrog
    case 0x0e0:        /* MPUDMAWR */
561 99570a40 balrog
    case 0x0e8:        /* BPDDMAWR */
562 99570a40 balrog
    case 0x0f0:        /* BPUDMAWR */
563 99570a40 balrog
        break;
564 99570a40 balrog
565 99570a40 balrog
    case 0x104:        /* SYSCONFIG */
566 99570a40 balrog
        if (value & (1 << 1))                                /* SOFTRESET */
567 99570a40 balrog
            omap_eac_reset(s);
568 99570a40 balrog
        s->sysconfig = value & 0x31d;
569 99570a40 balrog
        break;
570 99570a40 balrog
571 99570a40 balrog
    default:
572 99570a40 balrog
        OMAP_BAD_REG(addr);
573 99570a40 balrog
        return;
574 99570a40 balrog
    }
575 99570a40 balrog
}
576 99570a40 balrog
577 d60efc6b Blue Swirl
static CPUReadMemoryFunc * const omap_eac_readfn[] = {
578 99570a40 balrog
    omap_badwidth_read16,
579 99570a40 balrog
    omap_eac_read,
580 99570a40 balrog
    omap_badwidth_read16,
581 99570a40 balrog
};
582 99570a40 balrog
583 d60efc6b Blue Swirl
static CPUWriteMemoryFunc * const omap_eac_writefn[] = {
584 99570a40 balrog
    omap_badwidth_write16,
585 99570a40 balrog
    omap_eac_write,
586 99570a40 balrog
    omap_badwidth_write16,
587 99570a40 balrog
};
588 99570a40 balrog
589 c1ff227b cmchao
static struct omap_eac_s *omap_eac_init(struct omap_target_agent_s *ta,
590 99570a40 balrog
                qemu_irq irq, qemu_irq *drq, omap_clk fclk, omap_clk iclk)
591 99570a40 balrog
{
592 99570a40 balrog
    int iomemtype;
593 99570a40 balrog
    struct omap_eac_s *s = (struct omap_eac_s *)
594 7267c094 Anthony Liguori
            g_malloc0(sizeof(struct omap_eac_s));
595 99570a40 balrog
596 99570a40 balrog
    s->irq = irq;
597 99570a40 balrog
    s->codec.rxdrq = *drq ++;
598 22ed1d34 Blue Swirl
    s->codec.txdrq = *drq;
599 99570a40 balrog
    omap_eac_reset(s);
600 99570a40 balrog
601 1a7dafce malc
    AUD_register_card("OMAP EAC", &s->codec.card);
602 99570a40 balrog
603 1eed09cb Avi Kivity
    iomemtype = cpu_register_io_memory(omap_eac_readfn,
604 2507c12a Alexander Graf
                    omap_eac_writefn, s, DEVICE_NATIVE_ENDIAN);
605 8da3ff18 pbrook
    omap_l4_attach(ta, 0, iomemtype);
606 99570a40 balrog
607 99570a40 balrog
    return s;
608 99570a40 balrog
}
609 99570a40 balrog
610 54585ffe balrog
/* STI/XTI (emulation interface) console - reverse engineered only */
611 54585ffe balrog
struct omap_sti_s {
612 54585ffe balrog
    qemu_irq irq;
613 54585ffe balrog
    CharDriverState *chr;
614 54585ffe balrog
615 54585ffe balrog
    uint32_t sysconfig;
616 54585ffe balrog
    uint32_t systest;
617 54585ffe balrog
    uint32_t irqst;
618 54585ffe balrog
    uint32_t irqen;
619 54585ffe balrog
    uint32_t clkcontrol;
620 54585ffe balrog
    uint32_t serial_config;
621 54585ffe balrog
};
622 54585ffe balrog
623 54585ffe balrog
#define STI_TRACE_CONSOLE_CHANNEL        239
624 54585ffe balrog
#define STI_TRACE_CONTROL_CHANNEL        253
625 54585ffe balrog
626 54585ffe balrog
static inline void omap_sti_interrupt_update(struct omap_sti_s *s)
627 54585ffe balrog
{
628 54585ffe balrog
    qemu_set_irq(s->irq, s->irqst & s->irqen);
629 54585ffe balrog
}
630 54585ffe balrog
631 54585ffe balrog
static void omap_sti_reset(struct omap_sti_s *s)
632 54585ffe balrog
{
633 54585ffe balrog
    s->sysconfig = 0;
634 54585ffe balrog
    s->irqst = 0;
635 54585ffe balrog
    s->irqen = 0;
636 54585ffe balrog
    s->clkcontrol = 0;
637 54585ffe balrog
    s->serial_config = 0;
638 54585ffe balrog
639 54585ffe balrog
    omap_sti_interrupt_update(s);
640 54585ffe balrog
}
641 54585ffe balrog
642 c227f099 Anthony Liguori
static uint32_t omap_sti_read(void *opaque, target_phys_addr_t addr)
643 54585ffe balrog
{
644 54585ffe balrog
    struct omap_sti_s *s = (struct omap_sti_s *) opaque;
645 54585ffe balrog
646 8da3ff18 pbrook
    switch (addr) {
647 54585ffe balrog
    case 0x00:        /* STI_REVISION */
648 54585ffe balrog
        return 0x10;
649 54585ffe balrog
650 54585ffe balrog
    case 0x10:        /* STI_SYSCONFIG */
651 54585ffe balrog
        return s->sysconfig;
652 54585ffe balrog
653 54585ffe balrog
    case 0x14:        /* STI_SYSSTATUS / STI_RX_STATUS / XTI_SYSSTATUS */
654 54585ffe balrog
        return 0x00;
655 54585ffe balrog
656 54585ffe balrog
    case 0x18:        /* STI_IRQSTATUS */
657 54585ffe balrog
        return s->irqst;
658 54585ffe balrog
659 54585ffe balrog
    case 0x1c:        /* STI_IRQSETEN / STI_IRQCLREN */
660 54585ffe balrog
        return s->irqen;
661 54585ffe balrog
662 54585ffe balrog
    case 0x24:        /* STI_ER / STI_DR / XTI_TRACESELECT */
663 54585ffe balrog
    case 0x28:        /* STI_RX_DR / XTI_RXDATA */
664 e927bb00 balrog
        /* TODO */
665 e927bb00 balrog
        return 0;
666 54585ffe balrog
667 54585ffe balrog
    case 0x2c:        /* STI_CLK_CTRL / XTI_SCLKCRTL */
668 54585ffe balrog
        return s->clkcontrol;
669 54585ffe balrog
670 54585ffe balrog
    case 0x30:        /* STI_SERIAL_CFG / XTI_SCONFIG */
671 54585ffe balrog
        return s->serial_config;
672 54585ffe balrog
    }
673 54585ffe balrog
674 54585ffe balrog
    OMAP_BAD_REG(addr);
675 54585ffe balrog
    return 0;
676 54585ffe balrog
}
677 54585ffe balrog
678 c227f099 Anthony Liguori
static void omap_sti_write(void *opaque, target_phys_addr_t addr,
679 54585ffe balrog
                uint32_t value)
680 54585ffe balrog
{
681 54585ffe balrog
    struct omap_sti_s *s = (struct omap_sti_s *) opaque;
682 54585ffe balrog
683 8da3ff18 pbrook
    switch (addr) {
684 54585ffe balrog
    case 0x00:        /* STI_REVISION */
685 54585ffe balrog
    case 0x14:        /* STI_SYSSTATUS / STI_RX_STATUS / XTI_SYSSTATUS */
686 54585ffe balrog
        OMAP_RO_REG(addr);
687 54585ffe balrog
        return;
688 54585ffe balrog
689 54585ffe balrog
    case 0x10:        /* STI_SYSCONFIG */
690 54585ffe balrog
        if (value & (1 << 1))                                /* SOFTRESET */
691 54585ffe balrog
            omap_sti_reset(s);
692 54585ffe balrog
        s->sysconfig = value & 0xfe;
693 54585ffe balrog
        break;
694 54585ffe balrog
695 54585ffe balrog
    case 0x18:        /* STI_IRQSTATUS */
696 54585ffe balrog
        s->irqst &= ~value;
697 54585ffe balrog
        omap_sti_interrupt_update(s);
698 54585ffe balrog
        break;
699 54585ffe balrog
700 54585ffe balrog
    case 0x1c:        /* STI_IRQSETEN / STI_IRQCLREN */
701 54585ffe balrog
        s->irqen = value & 0xffff;
702 54585ffe balrog
        omap_sti_interrupt_update(s);
703 54585ffe balrog
        break;
704 54585ffe balrog
705 54585ffe balrog
    case 0x2c:        /* STI_CLK_CTRL / XTI_SCLKCRTL */
706 54585ffe balrog
        s->clkcontrol = value & 0xff;
707 54585ffe balrog
        break;
708 54585ffe balrog
709 54585ffe balrog
    case 0x30:        /* STI_SERIAL_CFG / XTI_SCONFIG */
710 54585ffe balrog
        s->serial_config = value & 0xff;
711 54585ffe balrog
        break;
712 54585ffe balrog
713 54585ffe balrog
    case 0x24:        /* STI_ER / STI_DR / XTI_TRACESELECT */
714 54585ffe balrog
    case 0x28:        /* STI_RX_DR / XTI_RXDATA */
715 e927bb00 balrog
        /* TODO */
716 e927bb00 balrog
        return;
717 e927bb00 balrog
718 54585ffe balrog
    default:
719 54585ffe balrog
        OMAP_BAD_REG(addr);
720 54585ffe balrog
        return;
721 54585ffe balrog
    }
722 54585ffe balrog
}
723 54585ffe balrog
724 d60efc6b Blue Swirl
static CPUReadMemoryFunc * const omap_sti_readfn[] = {
725 54585ffe balrog
    omap_badwidth_read32,
726 54585ffe balrog
    omap_badwidth_read32,
727 54585ffe balrog
    omap_sti_read,
728 54585ffe balrog
};
729 54585ffe balrog
730 d60efc6b Blue Swirl
static CPUWriteMemoryFunc * const omap_sti_writefn[] = {
731 54585ffe balrog
    omap_badwidth_write32,
732 54585ffe balrog
    omap_badwidth_write32,
733 54585ffe balrog
    omap_sti_write,
734 54585ffe balrog
};
735 54585ffe balrog
736 c227f099 Anthony Liguori
static uint32_t omap_sti_fifo_read(void *opaque, target_phys_addr_t addr)
737 54585ffe balrog
{
738 54585ffe balrog
    OMAP_BAD_REG(addr);
739 54585ffe balrog
    return 0;
740 54585ffe balrog
}
741 54585ffe balrog
742 c227f099 Anthony Liguori
static void omap_sti_fifo_write(void *opaque, target_phys_addr_t addr,
743 54585ffe balrog
                uint32_t value)
744 54585ffe balrog
{
745 54585ffe balrog
    struct omap_sti_s *s = (struct omap_sti_s *) opaque;
746 8da3ff18 pbrook
    int ch = addr >> 6;
747 54585ffe balrog
    uint8_t byte = value;
748 54585ffe balrog
749 54585ffe balrog
    if (ch == STI_TRACE_CONTROL_CHANNEL) {
750 54585ffe balrog
        /* Flush channel <i>value</i>.  */
751 2cc6e0a1 Anthony Liguori
        qemu_chr_fe_write(s->chr, (const uint8_t *) "\r", 1);
752 54585ffe balrog
    } else if (ch == STI_TRACE_CONSOLE_CHANNEL || 1) {
753 54585ffe balrog
        if (value == 0xc0 || value == 0xc3) {
754 54585ffe balrog
            /* Open channel <i>ch</i>.  */
755 54585ffe balrog
        } else if (value == 0x00)
756 2cc6e0a1 Anthony Liguori
            qemu_chr_fe_write(s->chr, (const uint8_t *) "\n", 1);
757 54585ffe balrog
        else
758 2cc6e0a1 Anthony Liguori
            qemu_chr_fe_write(s->chr, &byte, 1);
759 54585ffe balrog
    }
760 54585ffe balrog
}
761 54585ffe balrog
762 d60efc6b Blue Swirl
static CPUReadMemoryFunc * const omap_sti_fifo_readfn[] = {
763 54585ffe balrog
    omap_sti_fifo_read,
764 54585ffe balrog
    omap_badwidth_read8,
765 54585ffe balrog
    omap_badwidth_read8,
766 54585ffe balrog
};
767 54585ffe balrog
768 d60efc6b Blue Swirl
static CPUWriteMemoryFunc * const omap_sti_fifo_writefn[] = {
769 54585ffe balrog
    omap_sti_fifo_write,
770 54585ffe balrog
    omap_badwidth_write8,
771 54585ffe balrog
    omap_badwidth_write8,
772 54585ffe balrog
};
773 54585ffe balrog
774 b1d8e52e blueswir1
static struct omap_sti_s *omap_sti_init(struct omap_target_agent_s *ta,
775 c227f099 Anthony Liguori
                target_phys_addr_t channel_base, qemu_irq irq, omap_clk clk,
776 54585ffe balrog
                CharDriverState *chr)
777 54585ffe balrog
{
778 54585ffe balrog
    int iomemtype;
779 54585ffe balrog
    struct omap_sti_s *s = (struct omap_sti_s *)
780 7267c094 Anthony Liguori
            g_malloc0(sizeof(struct omap_sti_s));
781 54585ffe balrog
782 54585ffe balrog
    s->irq = irq;
783 54585ffe balrog
    omap_sti_reset(s);
784 54585ffe balrog
785 27143a44 Anthony Liguori
    s->chr = chr ?: qemu_chr_new("null", "null", NULL);
786 54585ffe balrog
787 1eed09cb Avi Kivity
    iomemtype = l4_register_io_memory(omap_sti_readfn,
788 54585ffe balrog
                    omap_sti_writefn, s);
789 8da3ff18 pbrook
    omap_l4_attach(ta, 0, iomemtype);
790 54585ffe balrog
791 1eed09cb Avi Kivity
    iomemtype = cpu_register_io_memory(omap_sti_fifo_readfn,
792 2507c12a Alexander Graf
                    omap_sti_fifo_writefn, s, DEVICE_NATIVE_ENDIAN);
793 8da3ff18 pbrook
    cpu_register_physical_memory(channel_base, 0x10000, iomemtype);
794 54585ffe balrog
795 54585ffe balrog
    return s;
796 54585ffe balrog
}
797 54585ffe balrog
798 827df9f3 balrog
/* L4 Interconnect */
799 827df9f3 balrog
#define L4TA(n)                (n)
800 827df9f3 balrog
#define L4TAO(n)        ((n) + 39)
801 827df9f3 balrog
802 2c1d9ecb cmchao
static const struct omap_l4_region_s omap_l4_region[125] = {
803 827df9f3 balrog
    [  1] = { 0x40800,  0x800, 32          }, /* Initiator agent */
804 827df9f3 balrog
    [  2] = { 0x41000, 0x1000, 32          }, /* Link agent */
805 827df9f3 balrog
    [  0] = { 0x40000,  0x800, 32          }, /* Address and protection */
806 827df9f3 balrog
    [  3] = { 0x00000, 0x1000, 32 | 16 | 8 }, /* System Control and Pinout */
807 827df9f3 balrog
    [  4] = { 0x01000, 0x1000, 32 | 16 | 8 }, /* L4TAO1 */
808 827df9f3 balrog
    [  5] = { 0x04000, 0x1000, 32 | 16     }, /* 32K Timer */
809 827df9f3 balrog
    [  6] = { 0x05000, 0x1000, 32 | 16 | 8 }, /* L4TAO2 */
810 827df9f3 balrog
    [  7] = { 0x08000,  0x800, 32          }, /* PRCM Region A */
811 827df9f3 balrog
    [  8] = { 0x08800,  0x800, 32          }, /* PRCM Region B */
812 827df9f3 balrog
    [  9] = { 0x09000, 0x1000, 32 | 16 | 8 }, /* L4TAO */
813 827df9f3 balrog
    [ 10] = { 0x12000, 0x1000, 32 | 16 | 8 }, /* Test (BCM) */
814 827df9f3 balrog
    [ 11] = { 0x13000, 0x1000, 32 | 16 | 8 }, /* L4TA1 */
815 827df9f3 balrog
    [ 12] = { 0x14000, 0x1000, 32          }, /* Test/emulation (TAP) */
816 827df9f3 balrog
    [ 13] = { 0x15000, 0x1000, 32 | 16 | 8 }, /* L4TA2 */
817 827df9f3 balrog
    [ 14] = { 0x18000, 0x1000, 32 | 16 | 8 }, /* GPIO1 */
818 827df9f3 balrog
    [ 16] = { 0x1a000, 0x1000, 32 | 16 | 8 }, /* GPIO2 */
819 827df9f3 balrog
    [ 18] = { 0x1c000, 0x1000, 32 | 16 | 8 }, /* GPIO3 */
820 827df9f3 balrog
    [ 19] = { 0x1e000, 0x1000, 32 | 16 | 8 }, /* GPIO4 */
821 827df9f3 balrog
    [ 15] = { 0x19000, 0x1000, 32 | 16 | 8 }, /* Quad GPIO TOP */
822 827df9f3 balrog
    [ 17] = { 0x1b000, 0x1000, 32 | 16 | 8 }, /* L4TA3 */
823 827df9f3 balrog
    [ 20] = { 0x20000, 0x1000, 32 | 16 | 8 }, /* WD Timer 1 (Secure) */
824 827df9f3 balrog
    [ 22] = { 0x22000, 0x1000, 32 | 16 | 8 }, /* WD Timer 2 (OMAP) */
825 827df9f3 balrog
    [ 21] = { 0x21000, 0x1000, 32 | 16 | 8 }, /* Dual WD timer TOP */
826 827df9f3 balrog
    [ 23] = { 0x23000, 0x1000, 32 | 16 | 8 }, /* L4TA4 */
827 827df9f3 balrog
    [ 24] = { 0x28000, 0x1000, 32 | 16 | 8 }, /* GP Timer 1 */
828 827df9f3 balrog
    [ 25] = { 0x29000, 0x1000, 32 | 16 | 8 }, /* L4TA7 */
829 827df9f3 balrog
    [ 26] = { 0x48000, 0x2000, 32 | 16 | 8 }, /* Emulation (ARM11ETB) */
830 827df9f3 balrog
    [ 27] = { 0x4a000, 0x1000, 32 | 16 | 8 }, /* L4TA9 */
831 827df9f3 balrog
    [ 28] = { 0x50000,  0x400, 32 | 16 | 8 }, /* Display top */
832 827df9f3 balrog
    [ 29] = { 0x50400,  0x400, 32 | 16 | 8 }, /* Display control */
833 827df9f3 balrog
    [ 30] = { 0x50800,  0x400, 32 | 16 | 8 }, /* Display RFBI */
834 827df9f3 balrog
    [ 31] = { 0x50c00,  0x400, 32 | 16 | 8 }, /* Display encoder */
835 827df9f3 balrog
    [ 32] = { 0x51000, 0x1000, 32 | 16 | 8 }, /* L4TA10 */
836 827df9f3 balrog
    [ 33] = { 0x52000,  0x400, 32 | 16 | 8 }, /* Camera top */
837 827df9f3 balrog
    [ 34] = { 0x52400,  0x400, 32 | 16 | 8 }, /* Camera core */
838 827df9f3 balrog
    [ 35] = { 0x52800,  0x400, 32 | 16 | 8 }, /* Camera DMA */
839 827df9f3 balrog
    [ 36] = { 0x52c00,  0x400, 32 | 16 | 8 }, /* Camera MMU */
840 827df9f3 balrog
    [ 37] = { 0x53000, 0x1000, 32 | 16 | 8 }, /* L4TA11 */
841 827df9f3 balrog
    [ 38] = { 0x56000, 0x1000, 32 | 16 | 8 }, /* sDMA */
842 827df9f3 balrog
    [ 39] = { 0x57000, 0x1000, 32 | 16 | 8 }, /* L4TA12 */
843 827df9f3 balrog
    [ 40] = { 0x58000, 0x1000, 32 | 16 | 8 }, /* SSI top */
844 827df9f3 balrog
    [ 41] = { 0x59000, 0x1000, 32 | 16 | 8 }, /* SSI GDD */
845 827df9f3 balrog
    [ 42] = { 0x5a000, 0x1000, 32 | 16 | 8 }, /* SSI Port1 */
846 827df9f3 balrog
    [ 43] = { 0x5b000, 0x1000, 32 | 16 | 8 }, /* SSI Port2 */
847 827df9f3 balrog
    [ 44] = { 0x5c000, 0x1000, 32 | 16 | 8 }, /* L4TA13 */
848 827df9f3 balrog
    [ 45] = { 0x5e000, 0x1000, 32 | 16 | 8 }, /* USB OTG */
849 827df9f3 balrog
    [ 46] = { 0x5f000, 0x1000, 32 | 16 | 8 }, /* L4TAO4 */
850 827df9f3 balrog
    [ 47] = { 0x60000, 0x1000, 32 | 16 | 8 }, /* Emulation (WIN_TRACER1SDRC) */
851 827df9f3 balrog
    [ 48] = { 0x61000, 0x1000, 32 | 16 | 8 }, /* L4TA14 */
852 827df9f3 balrog
    [ 49] = { 0x62000, 0x1000, 32 | 16 | 8 }, /* Emulation (WIN_TRACER2GPMC) */
853 827df9f3 balrog
    [ 50] = { 0x63000, 0x1000, 32 | 16 | 8 }, /* L4TA15 */
854 827df9f3 balrog
    [ 51] = { 0x64000, 0x1000, 32 | 16 | 8 }, /* Emulation (WIN_TRACER3OCM) */
855 827df9f3 balrog
    [ 52] = { 0x65000, 0x1000, 32 | 16 | 8 }, /* L4TA16 */
856 827df9f3 balrog
    [ 53] = { 0x66000,  0x300, 32 | 16 | 8 }, /* Emulation (WIN_TRACER4L4) */
857 827df9f3 balrog
    [ 54] = { 0x67000, 0x1000, 32 | 16 | 8 }, /* L4TA17 */
858 827df9f3 balrog
    [ 55] = { 0x68000, 0x1000, 32 | 16 | 8 }, /* Emulation (XTI) */
859 827df9f3 balrog
    [ 56] = { 0x69000, 0x1000, 32 | 16 | 8 }, /* L4TA18 */
860 827df9f3 balrog
    [ 57] = { 0x6a000, 0x1000,      16 | 8 }, /* UART1 */
861 827df9f3 balrog
    [ 58] = { 0x6b000, 0x1000, 32 | 16 | 8 }, /* L4TA19 */
862 827df9f3 balrog
    [ 59] = { 0x6c000, 0x1000,      16 | 8 }, /* UART2 */
863 827df9f3 balrog
    [ 60] = { 0x6d000, 0x1000, 32 | 16 | 8 }, /* L4TA20 */
864 827df9f3 balrog
    [ 61] = { 0x6e000, 0x1000,      16 | 8 }, /* UART3 */
865 827df9f3 balrog
    [ 62] = { 0x6f000, 0x1000, 32 | 16 | 8 }, /* L4TA21 */
866 827df9f3 balrog
    [ 63] = { 0x70000, 0x1000,      16     }, /* I2C1 */
867 827df9f3 balrog
    [ 64] = { 0x71000, 0x1000, 32 | 16 | 8 }, /* L4TAO5 */
868 827df9f3 balrog
    [ 65] = { 0x72000, 0x1000,      16     }, /* I2C2 */
869 827df9f3 balrog
    [ 66] = { 0x73000, 0x1000, 32 | 16 | 8 }, /* L4TAO6 */
870 827df9f3 balrog
    [ 67] = { 0x74000, 0x1000,      16     }, /* McBSP1 */
871 827df9f3 balrog
    [ 68] = { 0x75000, 0x1000, 32 | 16 | 8 }, /* L4TAO7 */
872 827df9f3 balrog
    [ 69] = { 0x76000, 0x1000,      16     }, /* McBSP2 */
873 827df9f3 balrog
    [ 70] = { 0x77000, 0x1000, 32 | 16 | 8 }, /* L4TAO8 */
874 827df9f3 balrog
    [ 71] = { 0x24000, 0x1000, 32 | 16 | 8 }, /* WD Timer 3 (DSP) */
875 827df9f3 balrog
    [ 72] = { 0x25000, 0x1000, 32 | 16 | 8 }, /* L4TA5 */
876 827df9f3 balrog
    [ 73] = { 0x26000, 0x1000, 32 | 16 | 8 }, /* WD Timer 4 (IVA) */
877 827df9f3 balrog
    [ 74] = { 0x27000, 0x1000, 32 | 16 | 8 }, /* L4TA6 */
878 827df9f3 balrog
    [ 75] = { 0x2a000, 0x1000, 32 | 16 | 8 }, /* GP Timer 2 */
879 827df9f3 balrog
    [ 76] = { 0x2b000, 0x1000, 32 | 16 | 8 }, /* L4TA8 */
880 827df9f3 balrog
    [ 77] = { 0x78000, 0x1000, 32 | 16 | 8 }, /* GP Timer 3 */
881 827df9f3 balrog
    [ 78] = { 0x79000, 0x1000, 32 | 16 | 8 }, /* L4TA22 */
882 827df9f3 balrog
    [ 79] = { 0x7a000, 0x1000, 32 | 16 | 8 }, /* GP Timer 4 */
883 827df9f3 balrog
    [ 80] = { 0x7b000, 0x1000, 32 | 16 | 8 }, /* L4TA23 */
884 827df9f3 balrog
    [ 81] = { 0x7c000, 0x1000, 32 | 16 | 8 }, /* GP Timer 5 */
885 827df9f3 balrog
    [ 82] = { 0x7d000, 0x1000, 32 | 16 | 8 }, /* L4TA24 */
886 827df9f3 balrog
    [ 83] = { 0x7e000, 0x1000, 32 | 16 | 8 }, /* GP Timer 6 */
887 827df9f3 balrog
    [ 84] = { 0x7f000, 0x1000, 32 | 16 | 8 }, /* L4TA25 */
888 827df9f3 balrog
    [ 85] = { 0x80000, 0x1000, 32 | 16 | 8 }, /* GP Timer 7 */
889 827df9f3 balrog
    [ 86] = { 0x81000, 0x1000, 32 | 16 | 8 }, /* L4TA26 */
890 827df9f3 balrog
    [ 87] = { 0x82000, 0x1000, 32 | 16 | 8 }, /* GP Timer 8 */
891 827df9f3 balrog
    [ 88] = { 0x83000, 0x1000, 32 | 16 | 8 }, /* L4TA27 */
892 827df9f3 balrog
    [ 89] = { 0x84000, 0x1000, 32 | 16 | 8 }, /* GP Timer 9 */
893 827df9f3 balrog
    [ 90] = { 0x85000, 0x1000, 32 | 16 | 8 }, /* L4TA28 */
894 827df9f3 balrog
    [ 91] = { 0x86000, 0x1000, 32 | 16 | 8 }, /* GP Timer 10 */
895 827df9f3 balrog
    [ 92] = { 0x87000, 0x1000, 32 | 16 | 8 }, /* L4TA29 */
896 827df9f3 balrog
    [ 93] = { 0x88000, 0x1000, 32 | 16 | 8 }, /* GP Timer 11 */
897 827df9f3 balrog
    [ 94] = { 0x89000, 0x1000, 32 | 16 | 8 }, /* L4TA30 */
898 827df9f3 balrog
    [ 95] = { 0x8a000, 0x1000, 32 | 16 | 8 }, /* GP Timer 12 */
899 827df9f3 balrog
    [ 96] = { 0x8b000, 0x1000, 32 | 16 | 8 }, /* L4TA31 */
900 827df9f3 balrog
    [ 97] = { 0x90000, 0x1000,      16     }, /* EAC */
901 827df9f3 balrog
    [ 98] = { 0x91000, 0x1000, 32 | 16 | 8 }, /* L4TA32 */
902 827df9f3 balrog
    [ 99] = { 0x92000, 0x1000,      16     }, /* FAC */
903 827df9f3 balrog
    [100] = { 0x93000, 0x1000, 32 | 16 | 8 }, /* L4TA33 */
904 827df9f3 balrog
    [101] = { 0x94000, 0x1000, 32 | 16 | 8 }, /* IPC (MAILBOX) */
905 827df9f3 balrog
    [102] = { 0x95000, 0x1000, 32 | 16 | 8 }, /* L4TA34 */
906 827df9f3 balrog
    [103] = { 0x98000, 0x1000, 32 | 16 | 8 }, /* SPI1 */
907 827df9f3 balrog
    [104] = { 0x99000, 0x1000, 32 | 16 | 8 }, /* L4TA35 */
908 827df9f3 balrog
    [105] = { 0x9a000, 0x1000, 32 | 16 | 8 }, /* SPI2 */
909 827df9f3 balrog
    [106] = { 0x9b000, 0x1000, 32 | 16 | 8 }, /* L4TA36 */
910 827df9f3 balrog
    [107] = { 0x9c000, 0x1000,      16 | 8 }, /* MMC SDIO */
911 827df9f3 balrog
    [108] = { 0x9d000, 0x1000, 32 | 16 | 8 }, /* L4TAO9 */
912 827df9f3 balrog
    [109] = { 0x9e000, 0x1000, 32 | 16 | 8 }, /* MS_PRO */
913 827df9f3 balrog
    [110] = { 0x9f000, 0x1000, 32 | 16 | 8 }, /* L4TAO10 */
914 827df9f3 balrog
    [111] = { 0xa0000, 0x1000, 32          }, /* RNG */
915 827df9f3 balrog
    [112] = { 0xa1000, 0x1000, 32 | 16 | 8 }, /* L4TAO11 */
916 827df9f3 balrog
    [113] = { 0xa2000, 0x1000, 32          }, /* DES3DES */
917 827df9f3 balrog
    [114] = { 0xa3000, 0x1000, 32 | 16 | 8 }, /* L4TAO12 */
918 827df9f3 balrog
    [115] = { 0xa4000, 0x1000, 32          }, /* SHA1MD5 */
919 827df9f3 balrog
    [116] = { 0xa5000, 0x1000, 32 | 16 | 8 }, /* L4TAO13 */
920 827df9f3 balrog
    [117] = { 0xa6000, 0x1000, 32          }, /* AES */
921 827df9f3 balrog
    [118] = { 0xa7000, 0x1000, 32 | 16 | 8 }, /* L4TA37 */
922 827df9f3 balrog
    [119] = { 0xa8000, 0x2000, 32          }, /* PKA */
923 827df9f3 balrog
    [120] = { 0xaa000, 0x1000, 32 | 16 | 8 }, /* L4TA38 */
924 827df9f3 balrog
    [121] = { 0xb0000, 0x1000, 32          }, /* MG */
925 827df9f3 balrog
    [122] = { 0xb1000, 0x1000, 32 | 16 | 8 },
926 827df9f3 balrog
    [123] = { 0xb2000, 0x1000, 32          }, /* HDQ/1-Wire */
927 827df9f3 balrog
    [124] = { 0xb3000, 0x1000, 32 | 16 | 8 }, /* L4TA39 */
928 827df9f3 balrog
};
929 827df9f3 balrog
930 2c1d9ecb cmchao
static const struct omap_l4_agent_info_s omap_l4_agent_info[54] = {
931 827df9f3 balrog
    { 0,           0, 3, 2 }, /* L4IA initiatior agent */
932 827df9f3 balrog
    { L4TAO(1),    3, 2, 1 }, /* Control and pinout module */
933 827df9f3 balrog
    { L4TAO(2),    5, 2, 1 }, /* 32K timer */
934 827df9f3 balrog
    { L4TAO(3),    7, 3, 2 }, /* PRCM */
935 827df9f3 balrog
    { L4TA(1),    10, 2, 1 }, /* BCM */
936 827df9f3 balrog
    { L4TA(2),    12, 2, 1 }, /* Test JTAG */
937 827df9f3 balrog
    { L4TA(3),    14, 6, 3 }, /* Quad GPIO */
938 827df9f3 balrog
    { L4TA(4),    20, 4, 3 }, /* WD timer 1/2 */
939 827df9f3 balrog
    { L4TA(7),    24, 2, 1 }, /* GP timer 1 */
940 827df9f3 balrog
    { L4TA(9),    26, 2, 1 }, /* ATM11 ETB */
941 827df9f3 balrog
    { L4TA(10),   28, 5, 4 }, /* Display subsystem */
942 827df9f3 balrog
    { L4TA(11),   33, 5, 4 }, /* Camera subsystem */
943 827df9f3 balrog
    { L4TA(12),   38, 2, 1 }, /* sDMA */
944 827df9f3 balrog
    { L4TA(13),   40, 5, 4 }, /* SSI */
945 827df9f3 balrog
    { L4TAO(4),   45, 2, 1 }, /* USB */
946 827df9f3 balrog
    { L4TA(14),   47, 2, 1 }, /* Win Tracer1 */
947 827df9f3 balrog
    { L4TA(15),   49, 2, 1 }, /* Win Tracer2 */
948 827df9f3 balrog
    { L4TA(16),   51, 2, 1 }, /* Win Tracer3 */
949 827df9f3 balrog
    { L4TA(17),   53, 2, 1 }, /* Win Tracer4 */
950 827df9f3 balrog
    { L4TA(18),   55, 2, 1 }, /* XTI */
951 827df9f3 balrog
    { L4TA(19),   57, 2, 1 }, /* UART1 */
952 827df9f3 balrog
    { L4TA(20),   59, 2, 1 }, /* UART2 */
953 827df9f3 balrog
    { L4TA(21),   61, 2, 1 }, /* UART3 */
954 827df9f3 balrog
    { L4TAO(5),   63, 2, 1 }, /* I2C1 */
955 827df9f3 balrog
    { L4TAO(6),   65, 2, 1 }, /* I2C2 */
956 827df9f3 balrog
    { L4TAO(7),   67, 2, 1 }, /* McBSP1 */
957 827df9f3 balrog
    { L4TAO(8),   69, 2, 1 }, /* McBSP2 */
958 827df9f3 balrog
    { L4TA(5),    71, 2, 1 }, /* WD Timer 3 (DSP) */
959 827df9f3 balrog
    { L4TA(6),    73, 2, 1 }, /* WD Timer 4 (IVA) */
960 827df9f3 balrog
    { L4TA(8),    75, 2, 1 }, /* GP Timer 2 */
961 827df9f3 balrog
    { L4TA(22),   77, 2, 1 }, /* GP Timer 3 */
962 827df9f3 balrog
    { L4TA(23),   79, 2, 1 }, /* GP Timer 4 */
963 827df9f3 balrog
    { L4TA(24),   81, 2, 1 }, /* GP Timer 5 */
964 827df9f3 balrog
    { L4TA(25),   83, 2, 1 }, /* GP Timer 6 */
965 827df9f3 balrog
    { L4TA(26),   85, 2, 1 }, /* GP Timer 7 */
966 827df9f3 balrog
    { L4TA(27),   87, 2, 1 }, /* GP Timer 8 */
967 827df9f3 balrog
    { L4TA(28),   89, 2, 1 }, /* GP Timer 9 */
968 827df9f3 balrog
    { L4TA(29),   91, 2, 1 }, /* GP Timer 10 */
969 827df9f3 balrog
    { L4TA(30),   93, 2, 1 }, /* GP Timer 11 */
970 827df9f3 balrog
    { L4TA(31),   95, 2, 1 }, /* GP Timer 12 */
971 827df9f3 balrog
    { L4TA(32),   97, 2, 1 }, /* EAC */
972 827df9f3 balrog
    { L4TA(33),   99, 2, 1 }, /* FAC */
973 827df9f3 balrog
    { L4TA(34),  101, 2, 1 }, /* IPC */
974 827df9f3 balrog
    { L4TA(35),  103, 2, 1 }, /* SPI1 */
975 827df9f3 balrog
    { L4TA(36),  105, 2, 1 }, /* SPI2 */
976 827df9f3 balrog
    { L4TAO(9),  107, 2, 1 }, /* MMC SDIO */
977 827df9f3 balrog
    { L4TAO(10), 109, 2, 1 },
978 827df9f3 balrog
    { L4TAO(11), 111, 2, 1 }, /* RNG */
979 827df9f3 balrog
    { L4TAO(12), 113, 2, 1 }, /* DES3DES */
980 827df9f3 balrog
    { L4TAO(13), 115, 2, 1 }, /* SHA1MD5 */
981 827df9f3 balrog
    { L4TA(37),  117, 2, 1 }, /* AES */
982 827df9f3 balrog
    { L4TA(38),  119, 2, 1 }, /* PKA */
983 827df9f3 balrog
    { -1,        121, 2, 1 },
984 827df9f3 balrog
    { L4TA(39),  123, 2, 1 }, /* HDQ/1-Wire */
985 827df9f3 balrog
};
986 827df9f3 balrog
987 2c1d9ecb cmchao
#define omap_l4ta(bus, cs)        \
988 2c1d9ecb cmchao
    omap_l4ta_get(bus, omap_l4_region, omap_l4_agent_info, L4TA(cs))
989 2c1d9ecb cmchao
#define omap_l4tao(bus, cs)        \
990 2c1d9ecb cmchao
    omap_l4ta_get(bus, omap_l4_region, omap_l4_agent_info, L4TAO(cs))
991 827df9f3 balrog
992 827df9f3 balrog
/* Power, Reset, and Clock Management */
993 827df9f3 balrog
struct omap_prcm_s {
994 827df9f3 balrog
    qemu_irq irq[3];
995 827df9f3 balrog
    struct omap_mpu_state_s *mpu;
996 827df9f3 balrog
997 827df9f3 balrog
    uint32_t irqst[3];
998 827df9f3 balrog
    uint32_t irqen[3];
999 827df9f3 balrog
1000 827df9f3 balrog
    uint32_t sysconfig;
1001 827df9f3 balrog
    uint32_t voltctrl;
1002 827df9f3 balrog
    uint32_t scratch[20];
1003 827df9f3 balrog
1004 827df9f3 balrog
    uint32_t clksrc[1];
1005 827df9f3 balrog
    uint32_t clkout[1];
1006 827df9f3 balrog
    uint32_t clkemul[1];
1007 827df9f3 balrog
    uint32_t clkpol[1];
1008 827df9f3 balrog
    uint32_t clksel[8];
1009 827df9f3 balrog
    uint32_t clken[12];
1010 827df9f3 balrog
    uint32_t clkctrl[4];
1011 827df9f3 balrog
    uint32_t clkidle[7];
1012 827df9f3 balrog
    uint32_t setuptime[2];
1013 827df9f3 balrog
1014 827df9f3 balrog
    uint32_t wkup[3];
1015 827df9f3 balrog
    uint32_t wken[3];
1016 827df9f3 balrog
    uint32_t wkst[3];
1017 827df9f3 balrog
    uint32_t rst[4];
1018 827df9f3 balrog
    uint32_t rstctrl[1];
1019 827df9f3 balrog
    uint32_t power[4];
1020 827df9f3 balrog
    uint32_t rsttime_wkup;
1021 827df9f3 balrog
1022 827df9f3 balrog
    uint32_t ev;
1023 827df9f3 balrog
    uint32_t evtime[2];
1024 51fec3cc balrog
1025 51fec3cc balrog
    int dpll_lock, apll_lock[2];
1026 827df9f3 balrog
};
1027 827df9f3 balrog
1028 827df9f3 balrog
static void omap_prcm_int_update(struct omap_prcm_s *s, int dom)
1029 827df9f3 balrog
{
1030 827df9f3 balrog
    qemu_set_irq(s->irq[dom], s->irqst[dom] & s->irqen[dom]);
1031 827df9f3 balrog
    /* XXX or is the mask applied before PRCM_IRQSTATUS_* ? */
1032 827df9f3 balrog
}
1033 827df9f3 balrog
1034 c227f099 Anthony Liguori
static uint32_t omap_prcm_read(void *opaque, target_phys_addr_t addr)
1035 827df9f3 balrog
{
1036 827df9f3 balrog
    struct omap_prcm_s *s = (struct omap_prcm_s *) opaque;
1037 51fec3cc balrog
    uint32_t ret;
1038 827df9f3 balrog
1039 8da3ff18 pbrook
    switch (addr) {
1040 827df9f3 balrog
    case 0x000:        /* PRCM_REVISION */
1041 827df9f3 balrog
        return 0x10;
1042 827df9f3 balrog
1043 827df9f3 balrog
    case 0x010:        /* PRCM_SYSCONFIG */
1044 827df9f3 balrog
        return s->sysconfig;
1045 827df9f3 balrog
1046 827df9f3 balrog
    case 0x018:        /* PRCM_IRQSTATUS_MPU */
1047 827df9f3 balrog
        return s->irqst[0];
1048 827df9f3 balrog
1049 827df9f3 balrog
    case 0x01c:        /* PRCM_IRQENABLE_MPU */
1050 827df9f3 balrog
        return s->irqen[0];
1051 827df9f3 balrog
1052 827df9f3 balrog
    case 0x050:        /* PRCM_VOLTCTRL */
1053 827df9f3 balrog
        return s->voltctrl;
1054 827df9f3 balrog
    case 0x054:        /* PRCM_VOLTST */
1055 827df9f3 balrog
        return s->voltctrl & 3;
1056 827df9f3 balrog
1057 827df9f3 balrog
    case 0x060:        /* PRCM_CLKSRC_CTRL */
1058 827df9f3 balrog
        return s->clksrc[0];
1059 827df9f3 balrog
    case 0x070:        /* PRCM_CLKOUT_CTRL */
1060 827df9f3 balrog
        return s->clkout[0];
1061 827df9f3 balrog
    case 0x078:        /* PRCM_CLKEMUL_CTRL */
1062 827df9f3 balrog
        return s->clkemul[0];
1063 827df9f3 balrog
    case 0x080:        /* PRCM_CLKCFG_CTRL */
1064 827df9f3 balrog
    case 0x084:        /* PRCM_CLKCFG_STATUS */
1065 827df9f3 balrog
        return 0;
1066 827df9f3 balrog
1067 827df9f3 balrog
    case 0x090:        /* PRCM_VOLTSETUP */
1068 827df9f3 balrog
        return s->setuptime[0];
1069 827df9f3 balrog
1070 827df9f3 balrog
    case 0x094:        /* PRCM_CLKSSETUP */
1071 827df9f3 balrog
        return s->setuptime[1];
1072 827df9f3 balrog
1073 827df9f3 balrog
    case 0x098:        /* PRCM_POLCTRL */
1074 827df9f3 balrog
        return s->clkpol[0];
1075 827df9f3 balrog
1076 827df9f3 balrog
    case 0x0b0:        /* GENERAL_PURPOSE1 */
1077 827df9f3 balrog
    case 0x0b4:        /* GENERAL_PURPOSE2 */
1078 827df9f3 balrog
    case 0x0b8:        /* GENERAL_PURPOSE3 */
1079 827df9f3 balrog
    case 0x0bc:        /* GENERAL_PURPOSE4 */
1080 827df9f3 balrog
    case 0x0c0:        /* GENERAL_PURPOSE5 */
1081 827df9f3 balrog
    case 0x0c4:        /* GENERAL_PURPOSE6 */
1082 827df9f3 balrog
    case 0x0c8:        /* GENERAL_PURPOSE7 */
1083 827df9f3 balrog
    case 0x0cc:        /* GENERAL_PURPOSE8 */
1084 827df9f3 balrog
    case 0x0d0:        /* GENERAL_PURPOSE9 */
1085 827df9f3 balrog
    case 0x0d4:        /* GENERAL_PURPOSE10 */
1086 827df9f3 balrog
    case 0x0d8:        /* GENERAL_PURPOSE11 */
1087 827df9f3 balrog
    case 0x0dc:        /* GENERAL_PURPOSE12 */
1088 827df9f3 balrog
    case 0x0e0:        /* GENERAL_PURPOSE13 */
1089 827df9f3 balrog
    case 0x0e4:        /* GENERAL_PURPOSE14 */
1090 827df9f3 balrog
    case 0x0e8:        /* GENERAL_PURPOSE15 */
1091 827df9f3 balrog
    case 0x0ec:        /* GENERAL_PURPOSE16 */
1092 827df9f3 balrog
    case 0x0f0:        /* GENERAL_PURPOSE17 */
1093 827df9f3 balrog
    case 0x0f4:        /* GENERAL_PURPOSE18 */
1094 827df9f3 balrog
    case 0x0f8:        /* GENERAL_PURPOSE19 */
1095 827df9f3 balrog
    case 0x0fc:        /* GENERAL_PURPOSE20 */
1096 8da3ff18 pbrook
        return s->scratch[(addr - 0xb0) >> 2];
1097 827df9f3 balrog
1098 827df9f3 balrog
    case 0x140:        /* CM_CLKSEL_MPU */
1099 827df9f3 balrog
        return s->clksel[0];
1100 827df9f3 balrog
    case 0x148:        /* CM_CLKSTCTRL_MPU */
1101 827df9f3 balrog
        return s->clkctrl[0];
1102 827df9f3 balrog
1103 827df9f3 balrog
    case 0x158:        /* RM_RSTST_MPU */
1104 827df9f3 balrog
        return s->rst[0];
1105 827df9f3 balrog
    case 0x1c8:        /* PM_WKDEP_MPU */
1106 827df9f3 balrog
        return s->wkup[0];
1107 827df9f3 balrog
    case 0x1d4:        /* PM_EVGENCTRL_MPU */
1108 827df9f3 balrog
        return s->ev;
1109 827df9f3 balrog
    case 0x1d8:        /* PM_EVEGENONTIM_MPU */
1110 827df9f3 balrog
        return s->evtime[0];
1111 827df9f3 balrog
    case 0x1dc:        /* PM_EVEGENOFFTIM_MPU */
1112 827df9f3 balrog
        return s->evtime[1];
1113 827df9f3 balrog
    case 0x1e0:        /* PM_PWSTCTRL_MPU */
1114 827df9f3 balrog
        return s->power[0];
1115 827df9f3 balrog
    case 0x1e4:        /* PM_PWSTST_MPU */
1116 827df9f3 balrog
        return 0;
1117 827df9f3 balrog
1118 827df9f3 balrog
    case 0x200:        /* CM_FCLKEN1_CORE */
1119 827df9f3 balrog
        return s->clken[0];
1120 827df9f3 balrog
    case 0x204:        /* CM_FCLKEN2_CORE */
1121 827df9f3 balrog
        return s->clken[1];
1122 827df9f3 balrog
    case 0x210:        /* CM_ICLKEN1_CORE */
1123 827df9f3 balrog
        return s->clken[2];
1124 827df9f3 balrog
    case 0x214:        /* CM_ICLKEN2_CORE */
1125 827df9f3 balrog
        return s->clken[3];
1126 827df9f3 balrog
    case 0x21c:        /* CM_ICLKEN4_CORE */
1127 827df9f3 balrog
        return s->clken[4];
1128 827df9f3 balrog
1129 827df9f3 balrog
    case 0x220:        /* CM_IDLEST1_CORE */
1130 827df9f3 balrog
        /* TODO: check the actual iclk status */
1131 827df9f3 balrog
        return 0x7ffffff9;
1132 827df9f3 balrog
    case 0x224:        /* CM_IDLEST2_CORE */
1133 827df9f3 balrog
        /* TODO: check the actual iclk status */
1134 827df9f3 balrog
        return 0x00000007;
1135 827df9f3 balrog
    case 0x22c:        /* CM_IDLEST4_CORE */
1136 827df9f3 balrog
        /* TODO: check the actual iclk status */
1137 827df9f3 balrog
        return 0x0000001f;
1138 827df9f3 balrog
1139 827df9f3 balrog
    case 0x230:        /* CM_AUTOIDLE1_CORE */
1140 827df9f3 balrog
        return s->clkidle[0];
1141 827df9f3 balrog
    case 0x234:        /* CM_AUTOIDLE2_CORE */
1142 827df9f3 balrog
        return s->clkidle[1];
1143 827df9f3 balrog
    case 0x238:        /* CM_AUTOIDLE3_CORE */
1144 827df9f3 balrog
        return s->clkidle[2];
1145 827df9f3 balrog
    case 0x23c:        /* CM_AUTOIDLE4_CORE */
1146 827df9f3 balrog
        return s->clkidle[3];
1147 827df9f3 balrog
1148 827df9f3 balrog
    case 0x240:        /* CM_CLKSEL1_CORE */
1149 827df9f3 balrog
        return s->clksel[1];
1150 827df9f3 balrog
    case 0x244:        /* CM_CLKSEL2_CORE */
1151 827df9f3 balrog
        return s->clksel[2];
1152 827df9f3 balrog
1153 827df9f3 balrog
    case 0x248:        /* CM_CLKSTCTRL_CORE */
1154 827df9f3 balrog
        return s->clkctrl[1];
1155 827df9f3 balrog
1156 827df9f3 balrog
    case 0x2a0:        /* PM_WKEN1_CORE */
1157 827df9f3 balrog
        return s->wken[0];
1158 827df9f3 balrog
    case 0x2a4:        /* PM_WKEN2_CORE */
1159 827df9f3 balrog
        return s->wken[1];
1160 827df9f3 balrog
1161 827df9f3 balrog
    case 0x2b0:        /* PM_WKST1_CORE */
1162 827df9f3 balrog
        return s->wkst[0];
1163 827df9f3 balrog
    case 0x2b4:        /* PM_WKST2_CORE */
1164 827df9f3 balrog
        return s->wkst[1];
1165 827df9f3 balrog
    case 0x2c8:        /* PM_WKDEP_CORE */
1166 827df9f3 balrog
        return 0x1e;
1167 827df9f3 balrog
1168 827df9f3 balrog
    case 0x2e0:        /* PM_PWSTCTRL_CORE */
1169 827df9f3 balrog
        return s->power[1];
1170 827df9f3 balrog
    case 0x2e4:        /* PM_PWSTST_CORE */
1171 827df9f3 balrog
        return 0x000030 | (s->power[1] & 0xfc00);
1172 827df9f3 balrog
1173 827df9f3 balrog
    case 0x300:        /* CM_FCLKEN_GFX */
1174 827df9f3 balrog
        return s->clken[5];
1175 827df9f3 balrog
    case 0x310:        /* CM_ICLKEN_GFX */
1176 827df9f3 balrog
        return s->clken[6];
1177 827df9f3 balrog
    case 0x320:        /* CM_IDLEST_GFX */
1178 827df9f3 balrog
        /* TODO: check the actual iclk status */
1179 827df9f3 balrog
        return 0x00000001;
1180 827df9f3 balrog
    case 0x340:        /* CM_CLKSEL_GFX */
1181 827df9f3 balrog
        return s->clksel[3];
1182 827df9f3 balrog
    case 0x348:        /* CM_CLKSTCTRL_GFX */
1183 827df9f3 balrog
        return s->clkctrl[2];
1184 827df9f3 balrog
    case 0x350:        /* RM_RSTCTRL_GFX */
1185 827df9f3 balrog
        return s->rstctrl[0];
1186 827df9f3 balrog
    case 0x358:        /* RM_RSTST_GFX */
1187 827df9f3 balrog
        return s->rst[1];
1188 827df9f3 balrog
    case 0x3c8:        /* PM_WKDEP_GFX */
1189 827df9f3 balrog
        return s->wkup[1];
1190 827df9f3 balrog
1191 827df9f3 balrog
    case 0x3e0:        /* PM_PWSTCTRL_GFX */
1192 827df9f3 balrog
        return s->power[2];
1193 827df9f3 balrog
    case 0x3e4:        /* PM_PWSTST_GFX */
1194 827df9f3 balrog
        return s->power[2] & 3;
1195 827df9f3 balrog
1196 827df9f3 balrog
    case 0x400:        /* CM_FCLKEN_WKUP */
1197 827df9f3 balrog
        return s->clken[7];
1198 827df9f3 balrog
    case 0x410:        /* CM_ICLKEN_WKUP */
1199 827df9f3 balrog
        return s->clken[8];
1200 827df9f3 balrog
    case 0x420:        /* CM_IDLEST_WKUP */
1201 827df9f3 balrog
        /* TODO: check the actual iclk status */
1202 827df9f3 balrog
        return 0x0000003f;
1203 827df9f3 balrog
    case 0x430:        /* CM_AUTOIDLE_WKUP */
1204 827df9f3 balrog
        return s->clkidle[4];
1205 827df9f3 balrog
    case 0x440:        /* CM_CLKSEL_WKUP */
1206 827df9f3 balrog
        return s->clksel[4];
1207 827df9f3 balrog
    case 0x450:        /* RM_RSTCTRL_WKUP */
1208 827df9f3 balrog
        return 0;
1209 827df9f3 balrog
    case 0x454:        /* RM_RSTTIME_WKUP */
1210 827df9f3 balrog
        return s->rsttime_wkup;
1211 827df9f3 balrog
    case 0x458:        /* RM_RSTST_WKUP */
1212 827df9f3 balrog
        return s->rst[2];
1213 827df9f3 balrog
    case 0x4a0:        /* PM_WKEN_WKUP */
1214 827df9f3 balrog
        return s->wken[2];
1215 827df9f3 balrog
    case 0x4b0:        /* PM_WKST_WKUP */
1216 827df9f3 balrog
        return s->wkst[2];
1217 827df9f3 balrog
1218 827df9f3 balrog
    case 0x500:        /* CM_CLKEN_PLL */
1219 827df9f3 balrog
        return s->clken[9];
1220 827df9f3 balrog
    case 0x520:        /* CM_IDLEST_CKGEN */
1221 51fec3cc balrog
        ret = 0x0000070 | (s->apll_lock[0] << 9) | (s->apll_lock[1] << 8);
1222 827df9f3 balrog
        if (!(s->clksel[6] & 3))
1223 51fec3cc balrog
            /* Core uses 32-kHz clock */
1224 51fec3cc balrog
            ret |= 3 << 0;
1225 51fec3cc balrog
        else if (!s->dpll_lock)
1226 51fec3cc balrog
            /* DPLL not locked, core uses ref_clk */
1227 51fec3cc balrog
            ret |= 1 << 0;
1228 51fec3cc balrog
        else
1229 51fec3cc balrog
            /* Core uses DPLL */
1230 51fec3cc balrog
            ret |= 2 << 0;
1231 51fec3cc balrog
        return ret;
1232 827df9f3 balrog
    case 0x530:        /* CM_AUTOIDLE_PLL */
1233 827df9f3 balrog
        return s->clkidle[5];
1234 827df9f3 balrog
    case 0x540:        /* CM_CLKSEL1_PLL */
1235 827df9f3 balrog
        return s->clksel[5];
1236 827df9f3 balrog
    case 0x544:        /* CM_CLKSEL2_PLL */
1237 827df9f3 balrog
        return s->clksel[6];
1238 827df9f3 balrog
1239 827df9f3 balrog
    case 0x800:        /* CM_FCLKEN_DSP */
1240 827df9f3 balrog
        return s->clken[10];
1241 827df9f3 balrog
    case 0x810:        /* CM_ICLKEN_DSP */
1242 827df9f3 balrog
        return s->clken[11];
1243 827df9f3 balrog
    case 0x820:        /* CM_IDLEST_DSP */
1244 827df9f3 balrog
        /* TODO: check the actual iclk status */
1245 827df9f3 balrog
        return 0x00000103;
1246 827df9f3 balrog
    case 0x830:        /* CM_AUTOIDLE_DSP */
1247 827df9f3 balrog
        return s->clkidle[6];
1248 827df9f3 balrog
    case 0x840:        /* CM_CLKSEL_DSP */
1249 827df9f3 balrog
        return s->clksel[7];
1250 827df9f3 balrog
    case 0x848:        /* CM_CLKSTCTRL_DSP */
1251 827df9f3 balrog
        return s->clkctrl[3];
1252 827df9f3 balrog
    case 0x850:        /* RM_RSTCTRL_DSP */
1253 827df9f3 balrog
        return 0;
1254 827df9f3 balrog
    case 0x858:        /* RM_RSTST_DSP */
1255 827df9f3 balrog
        return s->rst[3];
1256 827df9f3 balrog
    case 0x8c8:        /* PM_WKDEP_DSP */
1257 827df9f3 balrog
        return s->wkup[2];
1258 827df9f3 balrog
    case 0x8e0:        /* PM_PWSTCTRL_DSP */
1259 827df9f3 balrog
        return s->power[3];
1260 827df9f3 balrog
    case 0x8e4:        /* PM_PWSTST_DSP */
1261 827df9f3 balrog
        return 0x008030 | (s->power[3] & 0x3003);
1262 827df9f3 balrog
1263 827df9f3 balrog
    case 0x8f0:        /* PRCM_IRQSTATUS_DSP */
1264 827df9f3 balrog
        return s->irqst[1];
1265 827df9f3 balrog
    case 0x8f4:        /* PRCM_IRQENABLE_DSP */
1266 827df9f3 balrog
        return s->irqen[1];
1267 827df9f3 balrog
1268 827df9f3 balrog
    case 0x8f8:        /* PRCM_IRQSTATUS_IVA */
1269 827df9f3 balrog
        return s->irqst[2];
1270 827df9f3 balrog
    case 0x8fc:        /* PRCM_IRQENABLE_IVA */
1271 827df9f3 balrog
        return s->irqen[2];
1272 827df9f3 balrog
    }
1273 827df9f3 balrog
1274 827df9f3 balrog
    OMAP_BAD_REG(addr);
1275 827df9f3 balrog
    return 0;
1276 827df9f3 balrog
}
1277 827df9f3 balrog
1278 51fec3cc balrog
static void omap_prcm_apll_update(struct omap_prcm_s *s)
1279 51fec3cc balrog
{
1280 51fec3cc balrog
    int mode[2];
1281 51fec3cc balrog
1282 51fec3cc balrog
    mode[0] = (s->clken[9] >> 6) & 3;
1283 51fec3cc balrog
    s->apll_lock[0] = (mode[0] == 3);
1284 51fec3cc balrog
    mode[1] = (s->clken[9] >> 2) & 3;
1285 51fec3cc balrog
    s->apll_lock[1] = (mode[1] == 3);
1286 51fec3cc balrog
    /* TODO: update clocks */
1287 51fec3cc balrog
1288 16d55035 Blue Swirl
    if (mode[0] == 1 || mode[0] == 2 || mode[1] == 1 || mode[1] == 2)
1289 51fec3cc balrog
        fprintf(stderr, "%s: bad EN_54M_PLL or bad EN_96M_PLL\n",
1290 51fec3cc balrog
                        __FUNCTION__);
1291 51fec3cc balrog
}
1292 51fec3cc balrog
1293 51fec3cc balrog
static void omap_prcm_dpll_update(struct omap_prcm_s *s)
1294 51fec3cc balrog
{
1295 51fec3cc balrog
    omap_clk dpll = omap_findclk(s->mpu, "dpll");
1296 51fec3cc balrog
    omap_clk dpll_x2 = omap_findclk(s->mpu, "dpll");
1297 51fec3cc balrog
    omap_clk core = omap_findclk(s->mpu, "core_clk");
1298 51fec3cc balrog
    int mode = (s->clken[9] >> 0) & 3;
1299 51fec3cc balrog
    int mult, div;
1300 51fec3cc balrog
1301 51fec3cc balrog
    mult = (s->clksel[5] >> 12) & 0x3ff;
1302 51fec3cc balrog
    div = (s->clksel[5] >> 8) & 0xf;
1303 51fec3cc balrog
    if (mult == 0 || mult == 1)
1304 51fec3cc balrog
        mode = 1;        /* Bypass */
1305 51fec3cc balrog
1306 51fec3cc balrog
    s->dpll_lock = 0;
1307 51fec3cc balrog
    switch (mode) {
1308 51fec3cc balrog
    case 0:
1309 51fec3cc balrog
        fprintf(stderr, "%s: bad EN_DPLL\n", __FUNCTION__);
1310 51fec3cc balrog
        break;
1311 51fec3cc balrog
    case 1:        /* Low-power bypass mode (Default) */
1312 51fec3cc balrog
    case 2:        /* Fast-relock bypass mode */
1313 51fec3cc balrog
        omap_clk_setrate(dpll, 1, 1);
1314 51fec3cc balrog
        omap_clk_setrate(dpll_x2, 1, 1);
1315 51fec3cc balrog
        break;
1316 51fec3cc balrog
    case 3:        /* Lock mode */
1317 51fec3cc balrog
        s->dpll_lock = 1; /* After 20 FINT cycles (ref_clk / (div + 1)).  */
1318 51fec3cc balrog
1319 51fec3cc balrog
        omap_clk_setrate(dpll, div + 1, mult);
1320 51fec3cc balrog
        omap_clk_setrate(dpll_x2, div + 1, mult * 2);
1321 51fec3cc balrog
        break;
1322 51fec3cc balrog
    }
1323 51fec3cc balrog
1324 51fec3cc balrog
    switch ((s->clksel[6] >> 0) & 3) {
1325 51fec3cc balrog
    case 0:
1326 51fec3cc balrog
        omap_clk_reparent(core, omap_findclk(s->mpu, "clk32-kHz"));
1327 51fec3cc balrog
        break;
1328 51fec3cc balrog
    case 1:
1329 51fec3cc balrog
        omap_clk_reparent(core, dpll);
1330 51fec3cc balrog
        break;
1331 51fec3cc balrog
    case 2:
1332 51fec3cc balrog
        /* Default */
1333 51fec3cc balrog
        omap_clk_reparent(core, dpll_x2);
1334 51fec3cc balrog
        break;
1335 51fec3cc balrog
    case 3:
1336 51fec3cc balrog
        fprintf(stderr, "%s: bad CORE_CLK_SRC\n", __FUNCTION__);
1337 51fec3cc balrog
        break;
1338 51fec3cc balrog
    }
1339 51fec3cc balrog
}
1340 51fec3cc balrog
1341 c227f099 Anthony Liguori
static void omap_prcm_write(void *opaque, target_phys_addr_t addr,
1342 827df9f3 balrog
                uint32_t value)
1343 827df9f3 balrog
{
1344 827df9f3 balrog
    struct omap_prcm_s *s = (struct omap_prcm_s *) opaque;
1345 827df9f3 balrog
1346 8da3ff18 pbrook
    switch (addr) {
1347 827df9f3 balrog
    case 0x000:        /* PRCM_REVISION */
1348 827df9f3 balrog
    case 0x054:        /* PRCM_VOLTST */
1349 827df9f3 balrog
    case 0x084:        /* PRCM_CLKCFG_STATUS */
1350 827df9f3 balrog
    case 0x1e4:        /* PM_PWSTST_MPU */
1351 827df9f3 balrog
    case 0x220:        /* CM_IDLEST1_CORE */
1352 827df9f3 balrog
    case 0x224:        /* CM_IDLEST2_CORE */
1353 827df9f3 balrog
    case 0x22c:        /* CM_IDLEST4_CORE */
1354 827df9f3 balrog
    case 0x2c8:        /* PM_WKDEP_CORE */
1355 827df9f3 balrog
    case 0x2e4:        /* PM_PWSTST_CORE */
1356 827df9f3 balrog
    case 0x320:        /* CM_IDLEST_GFX */
1357 827df9f3 balrog
    case 0x3e4:        /* PM_PWSTST_GFX */
1358 827df9f3 balrog
    case 0x420:        /* CM_IDLEST_WKUP */
1359 827df9f3 balrog
    case 0x520:        /* CM_IDLEST_CKGEN */
1360 827df9f3 balrog
    case 0x820:        /* CM_IDLEST_DSP */
1361 827df9f3 balrog
    case 0x8e4:        /* PM_PWSTST_DSP */
1362 827df9f3 balrog
        OMAP_RO_REG(addr);
1363 827df9f3 balrog
        return;
1364 827df9f3 balrog
1365 827df9f3 balrog
    case 0x010:        /* PRCM_SYSCONFIG */
1366 827df9f3 balrog
        s->sysconfig = value & 1;
1367 827df9f3 balrog
        break;
1368 827df9f3 balrog
1369 827df9f3 balrog
    case 0x018:        /* PRCM_IRQSTATUS_MPU */
1370 827df9f3 balrog
        s->irqst[0] &= ~value;
1371 827df9f3 balrog
        omap_prcm_int_update(s, 0);
1372 827df9f3 balrog
        break;
1373 827df9f3 balrog
    case 0x01c:        /* PRCM_IRQENABLE_MPU */
1374 827df9f3 balrog
        s->irqen[0] = value & 0x3f;
1375 827df9f3 balrog
        omap_prcm_int_update(s, 0);
1376 827df9f3 balrog
        break;
1377 827df9f3 balrog
1378 827df9f3 balrog
    case 0x050:        /* PRCM_VOLTCTRL */
1379 827df9f3 balrog
        s->voltctrl = value & 0xf1c3;
1380 827df9f3 balrog
        break;
1381 827df9f3 balrog
1382 827df9f3 balrog
    case 0x060:        /* PRCM_CLKSRC_CTRL */
1383 827df9f3 balrog
        s->clksrc[0] = value & 0xdb;
1384 827df9f3 balrog
        /* TODO update clocks */
1385 827df9f3 balrog
        break;
1386 827df9f3 balrog
1387 827df9f3 balrog
    case 0x070:        /* PRCM_CLKOUT_CTRL */
1388 827df9f3 balrog
        s->clkout[0] = value & 0xbbbb;
1389 827df9f3 balrog
        /* TODO update clocks */
1390 827df9f3 balrog
        break;
1391 827df9f3 balrog
1392 827df9f3 balrog
    case 0x078:        /* PRCM_CLKEMUL_CTRL */
1393 827df9f3 balrog
        s->clkemul[0] = value & 1;
1394 827df9f3 balrog
        /* TODO update clocks */
1395 827df9f3 balrog
        break;
1396 827df9f3 balrog
1397 827df9f3 balrog
    case 0x080:        /* PRCM_CLKCFG_CTRL */
1398 827df9f3 balrog
        break;
1399 827df9f3 balrog
1400 827df9f3 balrog
    case 0x090:        /* PRCM_VOLTSETUP */
1401 827df9f3 balrog
        s->setuptime[0] = value & 0xffff;
1402 827df9f3 balrog
        break;
1403 827df9f3 balrog
    case 0x094:        /* PRCM_CLKSSETUP */
1404 827df9f3 balrog
        s->setuptime[1] = value & 0xffff;
1405 827df9f3 balrog
        break;
1406 827df9f3 balrog
1407 827df9f3 balrog
    case 0x098:        /* PRCM_POLCTRL */
1408 827df9f3 balrog
        s->clkpol[0] = value & 0x701;
1409 827df9f3 balrog
        break;
1410 827df9f3 balrog
1411 827df9f3 balrog
    case 0x0b0:        /* GENERAL_PURPOSE1 */
1412 827df9f3 balrog
    case 0x0b4:        /* GENERAL_PURPOSE2 */
1413 827df9f3 balrog
    case 0x0b8:        /* GENERAL_PURPOSE3 */
1414 827df9f3 balrog
    case 0x0bc:        /* GENERAL_PURPOSE4 */
1415 827df9f3 balrog
    case 0x0c0:        /* GENERAL_PURPOSE5 */
1416 827df9f3 balrog
    case 0x0c4:        /* GENERAL_PURPOSE6 */
1417 827df9f3 balrog
    case 0x0c8:        /* GENERAL_PURPOSE7 */
1418 827df9f3 balrog
    case 0x0cc:        /* GENERAL_PURPOSE8 */
1419 827df9f3 balrog
    case 0x0d0:        /* GENERAL_PURPOSE9 */
1420 827df9f3 balrog
    case 0x0d4:        /* GENERAL_PURPOSE10 */
1421 827df9f3 balrog
    case 0x0d8:        /* GENERAL_PURPOSE11 */
1422 827df9f3 balrog
    case 0x0dc:        /* GENERAL_PURPOSE12 */
1423 827df9f3 balrog
    case 0x0e0:        /* GENERAL_PURPOSE13 */
1424 827df9f3 balrog
    case 0x0e4:        /* GENERAL_PURPOSE14 */
1425 827df9f3 balrog
    case 0x0e8:        /* GENERAL_PURPOSE15 */
1426 827df9f3 balrog
    case 0x0ec:        /* GENERAL_PURPOSE16 */
1427 827df9f3 balrog
    case 0x0f0:        /* GENERAL_PURPOSE17 */
1428 827df9f3 balrog
    case 0x0f4:        /* GENERAL_PURPOSE18 */
1429 827df9f3 balrog
    case 0x0f8:        /* GENERAL_PURPOSE19 */
1430 827df9f3 balrog
    case 0x0fc:        /* GENERAL_PURPOSE20 */
1431 8da3ff18 pbrook
        s->scratch[(addr - 0xb0) >> 2] = value;
1432 827df9f3 balrog
        break;
1433 827df9f3 balrog
1434 827df9f3 balrog
    case 0x140:        /* CM_CLKSEL_MPU */
1435 827df9f3 balrog
        s->clksel[0] = value & 0x1f;
1436 827df9f3 balrog
        /* TODO update clocks */
1437 827df9f3 balrog
        break;
1438 827df9f3 balrog
    case 0x148:        /* CM_CLKSTCTRL_MPU */
1439 827df9f3 balrog
        s->clkctrl[0] = value & 0x1f;
1440 827df9f3 balrog
        break;
1441 827df9f3 balrog
1442 827df9f3 balrog
    case 0x158:        /* RM_RSTST_MPU */
1443 827df9f3 balrog
        s->rst[0] &= ~value;
1444 827df9f3 balrog
        break;
1445 827df9f3 balrog
    case 0x1c8:        /* PM_WKDEP_MPU */
1446 827df9f3 balrog
        s->wkup[0] = value & 0x15;
1447 827df9f3 balrog
        break;
1448 827df9f3 balrog
1449 827df9f3 balrog
    case 0x1d4:        /* PM_EVGENCTRL_MPU */
1450 827df9f3 balrog
        s->ev = value & 0x1f;
1451 827df9f3 balrog
        break;
1452 827df9f3 balrog
    case 0x1d8:        /* PM_EVEGENONTIM_MPU */
1453 827df9f3 balrog
        s->evtime[0] = value;
1454 827df9f3 balrog
        break;
1455 827df9f3 balrog
    case 0x1dc:        /* PM_EVEGENOFFTIM_MPU */
1456 827df9f3 balrog
        s->evtime[1] = value;
1457 827df9f3 balrog
        break;
1458 827df9f3 balrog
1459 827df9f3 balrog
    case 0x1e0:        /* PM_PWSTCTRL_MPU */
1460 827df9f3 balrog
        s->power[0] = value & 0xc0f;
1461 827df9f3 balrog
        break;
1462 827df9f3 balrog
1463 827df9f3 balrog
    case 0x200:        /* CM_FCLKEN1_CORE */
1464 827df9f3 balrog
        s->clken[0] = value & 0xbfffffff;
1465 827df9f3 balrog
        /* TODO update clocks */
1466 99570a40 balrog
        /* The EN_EAC bit only gets/puts func_96m_clk.  */
1467 827df9f3 balrog
        break;
1468 827df9f3 balrog
    case 0x204:        /* CM_FCLKEN2_CORE */
1469 827df9f3 balrog
        s->clken[1] = value & 0x00000007;
1470 827df9f3 balrog
        /* TODO update clocks */
1471 827df9f3 balrog
        break;
1472 827df9f3 balrog
    case 0x210:        /* CM_ICLKEN1_CORE */
1473 827df9f3 balrog
        s->clken[2] = value & 0xfffffff9;
1474 827df9f3 balrog
        /* TODO update clocks */
1475 99570a40 balrog
        /* The EN_EAC bit only gets/puts core_l4_iclk.  */
1476 827df9f3 balrog
        break;
1477 827df9f3 balrog
    case 0x214:        /* CM_ICLKEN2_CORE */
1478 827df9f3 balrog
        s->clken[3] = value & 0x00000007;
1479 827df9f3 balrog
        /* TODO update clocks */
1480 827df9f3 balrog
        break;
1481 827df9f3 balrog
    case 0x21c:        /* CM_ICLKEN4_CORE */
1482 827df9f3 balrog
        s->clken[4] = value & 0x0000001f;
1483 827df9f3 balrog
        /* TODO update clocks */
1484 827df9f3 balrog
        break;
1485 827df9f3 balrog
1486 827df9f3 balrog
    case 0x230:        /* CM_AUTOIDLE1_CORE */
1487 827df9f3 balrog
        s->clkidle[0] = value & 0xfffffff9;
1488 827df9f3 balrog
        /* TODO update clocks */
1489 827df9f3 balrog
        break;
1490 827df9f3 balrog
    case 0x234:        /* CM_AUTOIDLE2_CORE */
1491 827df9f3 balrog
        s->clkidle[1] = value & 0x00000007;
1492 827df9f3 balrog
        /* TODO update clocks */
1493 827df9f3 balrog
        break;
1494 827df9f3 balrog
    case 0x238:        /* CM_AUTOIDLE3_CORE */
1495 827df9f3 balrog
        s->clkidle[2] = value & 0x00000007;
1496 827df9f3 balrog
        /* TODO update clocks */
1497 827df9f3 balrog
        break;
1498 827df9f3 balrog
    case 0x23c:        /* CM_AUTOIDLE4_CORE */
1499 827df9f3 balrog
        s->clkidle[3] = value & 0x0000001f;
1500 827df9f3 balrog
        /* TODO update clocks */
1501 827df9f3 balrog
        break;
1502 827df9f3 balrog
1503 827df9f3 balrog
    case 0x240:        /* CM_CLKSEL1_CORE */
1504 827df9f3 balrog
        s->clksel[1] = value & 0x0fffbf7f;
1505 827df9f3 balrog
        /* TODO update clocks */
1506 827df9f3 balrog
        break;
1507 827df9f3 balrog
1508 827df9f3 balrog
    case 0x244:        /* CM_CLKSEL2_CORE */
1509 827df9f3 balrog
        s->clksel[2] = value & 0x00fffffc;
1510 827df9f3 balrog
        /* TODO update clocks */
1511 827df9f3 balrog
        break;
1512 827df9f3 balrog
1513 827df9f3 balrog
    case 0x248:        /* CM_CLKSTCTRL_CORE */
1514 827df9f3 balrog
        s->clkctrl[1] = value & 0x7;
1515 827df9f3 balrog
        break;
1516 827df9f3 balrog
1517 827df9f3 balrog
    case 0x2a0:        /* PM_WKEN1_CORE */
1518 827df9f3 balrog
        s->wken[0] = value & 0x04667ff8;
1519 827df9f3 balrog
        break;
1520 827df9f3 balrog
    case 0x2a4:        /* PM_WKEN2_CORE */
1521 827df9f3 balrog
        s->wken[1] = value & 0x00000005;
1522 827df9f3 balrog
        break;
1523 827df9f3 balrog
1524 827df9f3 balrog
    case 0x2b0:        /* PM_WKST1_CORE */
1525 827df9f3 balrog
        s->wkst[0] &= ~value;
1526 827df9f3 balrog
        break;
1527 827df9f3 balrog
    case 0x2b4:        /* PM_WKST2_CORE */
1528 827df9f3 balrog
        s->wkst[1] &= ~value;
1529 827df9f3 balrog
        break;
1530 827df9f3 balrog
1531 827df9f3 balrog
    case 0x2e0:        /* PM_PWSTCTRL_CORE */
1532 827df9f3 balrog
        s->power[1] = (value & 0x00fc3f) | (1 << 2);
1533 827df9f3 balrog
        break;
1534 827df9f3 balrog
1535 827df9f3 balrog
    case 0x300:        /* CM_FCLKEN_GFX */
1536 827df9f3 balrog
        s->clken[5] = value & 6;
1537 827df9f3 balrog
        /* TODO update clocks */
1538 827df9f3 balrog
        break;
1539 827df9f3 balrog
    case 0x310:        /* CM_ICLKEN_GFX */
1540 827df9f3 balrog
        s->clken[6] = value & 1;
1541 827df9f3 balrog
        /* TODO update clocks */
1542 827df9f3 balrog
        break;
1543 827df9f3 balrog
    case 0x340:        /* CM_CLKSEL_GFX */
1544 827df9f3 balrog
        s->clksel[3] = value & 7;
1545 827df9f3 balrog
        /* TODO update clocks */
1546 827df9f3 balrog
        break;
1547 827df9f3 balrog
    case 0x348:        /* CM_CLKSTCTRL_GFX */
1548 827df9f3 balrog
        s->clkctrl[2] = value & 1;
1549 827df9f3 balrog
        break;
1550 827df9f3 balrog
    case 0x350:        /* RM_RSTCTRL_GFX */
1551 827df9f3 balrog
        s->rstctrl[0] = value & 1;
1552 827df9f3 balrog
        /* TODO: reset */
1553 827df9f3 balrog
        break;
1554 827df9f3 balrog
    case 0x358:        /* RM_RSTST_GFX */
1555 827df9f3 balrog
        s->rst[1] &= ~value;
1556 827df9f3 balrog
        break;
1557 827df9f3 balrog
    case 0x3c8:        /* PM_WKDEP_GFX */
1558 827df9f3 balrog
        s->wkup[1] = value & 0x13;
1559 827df9f3 balrog
        break;
1560 827df9f3 balrog
    case 0x3e0:        /* PM_PWSTCTRL_GFX */
1561 827df9f3 balrog
        s->power[2] = (value & 0x00c0f) | (3 << 2);
1562 827df9f3 balrog
        break;
1563 827df9f3 balrog
1564 827df9f3 balrog
    case 0x400:        /* CM_FCLKEN_WKUP */
1565 827df9f3 balrog
        s->clken[7] = value & 0xd;
1566 827df9f3 balrog
        /* TODO update clocks */
1567 827df9f3 balrog
        break;
1568 827df9f3 balrog
    case 0x410:        /* CM_ICLKEN_WKUP */
1569 827df9f3 balrog
        s->clken[8] = value & 0x3f;
1570 827df9f3 balrog
        /* TODO update clocks */
1571 827df9f3 balrog
        break;
1572 827df9f3 balrog
    case 0x430:        /* CM_AUTOIDLE_WKUP */
1573 827df9f3 balrog
        s->clkidle[4] = value & 0x0000003f;
1574 827df9f3 balrog
        /* TODO update clocks */
1575 827df9f3 balrog
        break;
1576 827df9f3 balrog
    case 0x440:        /* CM_CLKSEL_WKUP */
1577 827df9f3 balrog
        s->clksel[4] = value & 3;
1578 827df9f3 balrog
        /* TODO update clocks */
1579 827df9f3 balrog
        break;
1580 827df9f3 balrog
    case 0x450:        /* RM_RSTCTRL_WKUP */
1581 827df9f3 balrog
        /* TODO: reset */
1582 827df9f3 balrog
        if (value & 2)
1583 827df9f3 balrog
            qemu_system_reset_request();
1584 827df9f3 balrog
        break;
1585 827df9f3 balrog
    case 0x454:        /* RM_RSTTIME_WKUP */
1586 827df9f3 balrog
        s->rsttime_wkup = value & 0x1fff;
1587 827df9f3 balrog
        break;
1588 827df9f3 balrog
    case 0x458:        /* RM_RSTST_WKUP */
1589 827df9f3 balrog
        s->rst[2] &= ~value;
1590 827df9f3 balrog
        break;
1591 827df9f3 balrog
    case 0x4a0:        /* PM_WKEN_WKUP */
1592 827df9f3 balrog
        s->wken[2] = value & 0x00000005;
1593 827df9f3 balrog
        break;
1594 827df9f3 balrog
    case 0x4b0:        /* PM_WKST_WKUP */
1595 827df9f3 balrog
        s->wkst[2] &= ~value;
1596 827df9f3 balrog
        break;
1597 827df9f3 balrog
1598 827df9f3 balrog
    case 0x500:        /* CM_CLKEN_PLL */
1599 51fec3cc balrog
        if (value & 0xffffff30)
1600 51fec3cc balrog
            fprintf(stderr, "%s: write 0s in CM_CLKEN_PLL for "
1601 51fec3cc balrog
                            "future compatiblity\n", __FUNCTION__);
1602 51fec3cc balrog
        if ((s->clken[9] ^ value) & 0xcc) {
1603 51fec3cc balrog
            s->clken[9] &= ~0xcc;
1604 51fec3cc balrog
            s->clken[9] |= value & 0xcc;
1605 51fec3cc balrog
            omap_prcm_apll_update(s);
1606 51fec3cc balrog
        }
1607 51fec3cc balrog
        if ((s->clken[9] ^ value) & 3) {
1608 51fec3cc balrog
            s->clken[9] &= ~3;
1609 51fec3cc balrog
            s->clken[9] |= value & 3;
1610 51fec3cc balrog
            omap_prcm_dpll_update(s);
1611 51fec3cc balrog
        }
1612 827df9f3 balrog
        break;
1613 827df9f3 balrog
    case 0x530:        /* CM_AUTOIDLE_PLL */
1614 827df9f3 balrog
        s->clkidle[5] = value & 0x000000cf;
1615 827df9f3 balrog
        /* TODO update clocks */
1616 827df9f3 balrog
        break;
1617 827df9f3 balrog
    case 0x540:        /* CM_CLKSEL1_PLL */
1618 51fec3cc balrog
        if (value & 0xfc4000d7)
1619 51fec3cc balrog
            fprintf(stderr, "%s: write 0s in CM_CLKSEL1_PLL for "
1620 51fec3cc balrog
                            "future compatiblity\n", __FUNCTION__);
1621 51fec3cc balrog
        if ((s->clksel[5] ^ value) & 0x003fff00) {
1622 51fec3cc balrog
            s->clksel[5] = value & 0x03bfff28;
1623 51fec3cc balrog
            omap_prcm_dpll_update(s);
1624 51fec3cc balrog
        }
1625 51fec3cc balrog
        /* TODO update the other clocks */
1626 51fec3cc balrog
1627 827df9f3 balrog
        s->clksel[5] = value & 0x03bfff28;
1628 827df9f3 balrog
        break;
1629 827df9f3 balrog
    case 0x544:        /* CM_CLKSEL2_PLL */
1630 51fec3cc balrog
        if (value & ~3)
1631 51fec3cc balrog
            fprintf(stderr, "%s: write 0s in CM_CLKSEL2_PLL[31:2] for "
1632 51fec3cc balrog
                            "future compatiblity\n", __FUNCTION__);
1633 51fec3cc balrog
        if (s->clksel[6] != (value & 3)) {
1634 51fec3cc balrog
            s->clksel[6] = value & 3;
1635 51fec3cc balrog
            omap_prcm_dpll_update(s);
1636 51fec3cc balrog
        }
1637 827df9f3 balrog
        break;
1638 827df9f3 balrog
1639 827df9f3 balrog
    case 0x800:        /* CM_FCLKEN_DSP */
1640 827df9f3 balrog
        s->clken[10] = value & 0x501;
1641 827df9f3 balrog
        /* TODO update clocks */
1642 827df9f3 balrog
        break;
1643 827df9f3 balrog
    case 0x810:        /* CM_ICLKEN_DSP */
1644 827df9f3 balrog
        s->clken[11] = value & 0x2;
1645 827df9f3 balrog
        /* TODO update clocks */
1646 827df9f3 balrog
        break;
1647 827df9f3 balrog
    case 0x830:        /* CM_AUTOIDLE_DSP */
1648 827df9f3 balrog
        s->clkidle[6] = value & 0x2;
1649 827df9f3 balrog
        /* TODO update clocks */
1650 827df9f3 balrog
        break;
1651 827df9f3 balrog
    case 0x840:        /* CM_CLKSEL_DSP */
1652 827df9f3 balrog
        s->clksel[7] = value & 0x3fff;
1653 827df9f3 balrog
        /* TODO update clocks */
1654 827df9f3 balrog
        break;
1655 827df9f3 balrog
    case 0x848:        /* CM_CLKSTCTRL_DSP */
1656 827df9f3 balrog
        s->clkctrl[3] = value & 0x101;
1657 827df9f3 balrog
        break;
1658 827df9f3 balrog
    case 0x850:        /* RM_RSTCTRL_DSP */
1659 827df9f3 balrog
        /* TODO: reset */
1660 827df9f3 balrog
        break;
1661 827df9f3 balrog
    case 0x858:        /* RM_RSTST_DSP */
1662 827df9f3 balrog
        s->rst[3] &= ~value;
1663 827df9f3 balrog
        break;
1664 827df9f3 balrog
    case 0x8c8:        /* PM_WKDEP_DSP */
1665 827df9f3 balrog
        s->wkup[2] = value & 0x13;
1666 827df9f3 balrog
        break;
1667 827df9f3 balrog
    case 0x8e0:        /* PM_PWSTCTRL_DSP */
1668 827df9f3 balrog
        s->power[3] = (value & 0x03017) | (3 << 2);
1669 827df9f3 balrog
        break;
1670 827df9f3 balrog
1671 827df9f3 balrog
    case 0x8f0:        /* PRCM_IRQSTATUS_DSP */
1672 827df9f3 balrog
        s->irqst[1] &= ~value;
1673 827df9f3 balrog
        omap_prcm_int_update(s, 1);
1674 827df9f3 balrog
        break;
1675 827df9f3 balrog
    case 0x8f4:        /* PRCM_IRQENABLE_DSP */
1676 827df9f3 balrog
        s->irqen[1] = value & 0x7;
1677 827df9f3 balrog
        omap_prcm_int_update(s, 1);
1678 827df9f3 balrog
        break;
1679 827df9f3 balrog
1680 827df9f3 balrog
    case 0x8f8:        /* PRCM_IRQSTATUS_IVA */
1681 827df9f3 balrog
        s->irqst[2] &= ~value;
1682 827df9f3 balrog
        omap_prcm_int_update(s, 2);
1683 827df9f3 balrog
        break;
1684 827df9f3 balrog
    case 0x8fc:        /* PRCM_IRQENABLE_IVA */
1685 827df9f3 balrog
        s->irqen[2] = value & 0x7;
1686 827df9f3 balrog
        omap_prcm_int_update(s, 2);
1687 827df9f3 balrog
        break;
1688 827df9f3 balrog
1689 827df9f3 balrog
    default:
1690 827df9f3 balrog
        OMAP_BAD_REG(addr);
1691 827df9f3 balrog
        return;
1692 827df9f3 balrog
    }
1693 827df9f3 balrog
}
1694 827df9f3 balrog
1695 d60efc6b Blue Swirl
static CPUReadMemoryFunc * const omap_prcm_readfn[] = {
1696 827df9f3 balrog
    omap_badwidth_read32,
1697 827df9f3 balrog
    omap_badwidth_read32,
1698 827df9f3 balrog
    omap_prcm_read,
1699 827df9f3 balrog
};
1700 827df9f3 balrog
1701 d60efc6b Blue Swirl
static CPUWriteMemoryFunc * const omap_prcm_writefn[] = {
1702 827df9f3 balrog
    omap_badwidth_write32,
1703 827df9f3 balrog
    omap_badwidth_write32,
1704 827df9f3 balrog
    omap_prcm_write,
1705 827df9f3 balrog
};
1706 827df9f3 balrog
1707 827df9f3 balrog
static void omap_prcm_reset(struct omap_prcm_s *s)
1708 827df9f3 balrog
{
1709 827df9f3 balrog
    s->sysconfig = 0;
1710 827df9f3 balrog
    s->irqst[0] = 0;
1711 827df9f3 balrog
    s->irqst[1] = 0;
1712 827df9f3 balrog
    s->irqst[2] = 0;
1713 827df9f3 balrog
    s->irqen[0] = 0;
1714 827df9f3 balrog
    s->irqen[1] = 0;
1715 827df9f3 balrog
    s->irqen[2] = 0;
1716 827df9f3 balrog
    s->voltctrl = 0x1040;
1717 827df9f3 balrog
    s->ev = 0x14;
1718 827df9f3 balrog
    s->evtime[0] = 0;
1719 827df9f3 balrog
    s->evtime[1] = 0;
1720 827df9f3 balrog
    s->clkctrl[0] = 0;
1721 827df9f3 balrog
    s->clkctrl[1] = 0;
1722 827df9f3 balrog
    s->clkctrl[2] = 0;
1723 827df9f3 balrog
    s->clkctrl[3] = 0;
1724 827df9f3 balrog
    s->clken[1] = 7;
1725 827df9f3 balrog
    s->clken[3] = 7;
1726 827df9f3 balrog
    s->clken[4] = 0;
1727 827df9f3 balrog
    s->clken[5] = 0;
1728 827df9f3 balrog
    s->clken[6] = 0;
1729 827df9f3 balrog
    s->clken[7] = 0xc;
1730 827df9f3 balrog
    s->clken[8] = 0x3e;
1731 827df9f3 balrog
    s->clken[9] = 0x0d;
1732 827df9f3 balrog
    s->clken[10] = 0;
1733 827df9f3 balrog
    s->clken[11] = 0;
1734 827df9f3 balrog
    s->clkidle[0] = 0;
1735 827df9f3 balrog
    s->clkidle[2] = 7;
1736 827df9f3 balrog
    s->clkidle[3] = 0;
1737 827df9f3 balrog
    s->clkidle[4] = 0;
1738 827df9f3 balrog
    s->clkidle[5] = 0x0c;
1739 827df9f3 balrog
    s->clkidle[6] = 0;
1740 827df9f3 balrog
    s->clksel[0] = 0x01;
1741 827df9f3 balrog
    s->clksel[1] = 0x02100121;
1742 827df9f3 balrog
    s->clksel[2] = 0x00000000;
1743 827df9f3 balrog
    s->clksel[3] = 0x01;
1744 827df9f3 balrog
    s->clksel[4] = 0;
1745 827df9f3 balrog
    s->clksel[7] = 0x0121;
1746 827df9f3 balrog
    s->wkup[0] = 0x15;
1747 827df9f3 balrog
    s->wkup[1] = 0x13;
1748 827df9f3 balrog
    s->wkup[2] = 0x13;
1749 827df9f3 balrog
    s->wken[0] = 0x04667ff8;
1750 827df9f3 balrog
    s->wken[1] = 0x00000005;
1751 827df9f3 balrog
    s->wken[2] = 5;
1752 827df9f3 balrog
    s->wkst[0] = 0;
1753 827df9f3 balrog
    s->wkst[1] = 0;
1754 827df9f3 balrog
    s->wkst[2] = 0;
1755 827df9f3 balrog
    s->power[0] = 0x00c;
1756 827df9f3 balrog
    s->power[1] = 4;
1757 827df9f3 balrog
    s->power[2] = 0x0000c;
1758 827df9f3 balrog
    s->power[3] = 0x14;
1759 827df9f3 balrog
    s->rstctrl[0] = 1;
1760 827df9f3 balrog
    s->rst[3] = 1;
1761 51fec3cc balrog
    omap_prcm_apll_update(s);
1762 51fec3cc balrog
    omap_prcm_dpll_update(s);
1763 827df9f3 balrog
}
1764 827df9f3 balrog
1765 827df9f3 balrog
static void omap_prcm_coldreset(struct omap_prcm_s *s)
1766 827df9f3 balrog
{
1767 827df9f3 balrog
    s->setuptime[0] = 0;
1768 827df9f3 balrog
    s->setuptime[1] = 0;
1769 827df9f3 balrog
    memset(&s->scratch, 0, sizeof(s->scratch));
1770 827df9f3 balrog
    s->rst[0] = 0x01;
1771 827df9f3 balrog
    s->rst[1] = 0x00;
1772 827df9f3 balrog
    s->rst[2] = 0x01;
1773 827df9f3 balrog
    s->clken[0] = 0;
1774 827df9f3 balrog
    s->clken[2] = 0;
1775 827df9f3 balrog
    s->clkidle[1] = 0;
1776 827df9f3 balrog
    s->clksel[5] = 0;
1777 827df9f3 balrog
    s->clksel[6] = 2;
1778 827df9f3 balrog
    s->clksrc[0] = 0x43;
1779 827df9f3 balrog
    s->clkout[0] = 0x0303;
1780 827df9f3 balrog
    s->clkemul[0] = 0;
1781 827df9f3 balrog
    s->clkpol[0] = 0x100;
1782 827df9f3 balrog
    s->rsttime_wkup = 0x1002;
1783 827df9f3 balrog
1784 827df9f3 balrog
    omap_prcm_reset(s);
1785 827df9f3 balrog
}
1786 827df9f3 balrog
1787 c1ff227b cmchao
static struct omap_prcm_s *omap_prcm_init(struct omap_target_agent_s *ta,
1788 827df9f3 balrog
                qemu_irq mpu_int, qemu_irq dsp_int, qemu_irq iva_int,
1789 827df9f3 balrog
                struct omap_mpu_state_s *mpu)
1790 827df9f3 balrog
{
1791 827df9f3 balrog
    int iomemtype;
1792 827df9f3 balrog
    struct omap_prcm_s *s = (struct omap_prcm_s *)
1793 7267c094 Anthony Liguori
            g_malloc0(sizeof(struct omap_prcm_s));
1794 827df9f3 balrog
1795 827df9f3 balrog
    s->irq[0] = mpu_int;
1796 827df9f3 balrog
    s->irq[1] = dsp_int;
1797 827df9f3 balrog
    s->irq[2] = iva_int;
1798 827df9f3 balrog
    s->mpu = mpu;
1799 827df9f3 balrog
    omap_prcm_coldreset(s);
1800 827df9f3 balrog
1801 1eed09cb Avi Kivity
    iomemtype = l4_register_io_memory(omap_prcm_readfn,
1802 827df9f3 balrog
                    omap_prcm_writefn, s);
1803 8da3ff18 pbrook
    omap_l4_attach(ta, 0, iomemtype);
1804 827df9f3 balrog
    omap_l4_attach(ta, 1, iomemtype);
1805 827df9f3 balrog
1806 827df9f3 balrog
    return s;
1807 827df9f3 balrog
}
1808 827df9f3 balrog
1809 827df9f3 balrog
/* System and Pinout control */
1810 827df9f3 balrog
struct omap_sysctl_s {
1811 827df9f3 balrog
    struct omap_mpu_state_s *mpu;
1812 827df9f3 balrog
1813 827df9f3 balrog
    uint32_t sysconfig;
1814 827df9f3 balrog
    uint32_t devconfig;
1815 827df9f3 balrog
    uint32_t psaconfig;
1816 827df9f3 balrog
    uint32_t padconf[0x45];
1817 827df9f3 balrog
    uint8_t obs;
1818 827df9f3 balrog
    uint32_t msuspendmux[5];
1819 827df9f3 balrog
};
1820 827df9f3 balrog
1821 c227f099 Anthony Liguori
static uint32_t omap_sysctl_read8(void *opaque, target_phys_addr_t addr)
1822 f451387a balrog
{
1823 f451387a balrog
1824 f451387a balrog
    struct omap_sysctl_s *s = (struct omap_sysctl_s *) opaque;
1825 f451387a balrog
    int pad_offset, byte_offset;
1826 f451387a balrog
    int value;
1827 f451387a balrog
1828 8da3ff18 pbrook
    switch (addr) {
1829 f451387a balrog
    case 0x030 ... 0x140:        /* CONTROL_PADCONF - only used in the POP */
1830 8da3ff18 pbrook
        pad_offset = (addr - 0x30) >> 2;
1831 8da3ff18 pbrook
        byte_offset = (addr - 0x30) & (4 - 1);
1832 f451387a balrog
1833 f451387a balrog
        value = s->padconf[pad_offset];
1834 f451387a balrog
        value = (value >> (byte_offset * 8)) & 0xff;
1835 f451387a balrog
1836 f451387a balrog
        return value;
1837 f451387a balrog
1838 f451387a balrog
    default:
1839 f451387a balrog
        break;
1840 f451387a balrog
    }
1841 f451387a balrog
1842 f451387a balrog
    OMAP_BAD_REG(addr);
1843 f451387a balrog
    return 0;
1844 f451387a balrog
}
1845 f451387a balrog
1846 c227f099 Anthony Liguori
static uint32_t omap_sysctl_read(void *opaque, target_phys_addr_t addr)
1847 827df9f3 balrog
{
1848 827df9f3 balrog
    struct omap_sysctl_s *s = (struct omap_sysctl_s *) opaque;
1849 827df9f3 balrog
1850 8da3ff18 pbrook
    switch (addr) {
1851 827df9f3 balrog
    case 0x000:        /* CONTROL_REVISION */
1852 827df9f3 balrog
        return 0x20;
1853 827df9f3 balrog
1854 827df9f3 balrog
    case 0x010:        /* CONTROL_SYSCONFIG */
1855 827df9f3 balrog
        return s->sysconfig;
1856 827df9f3 balrog
1857 827df9f3 balrog
    case 0x030 ... 0x140:        /* CONTROL_PADCONF - only used in the POP */
1858 8da3ff18 pbrook
        return s->padconf[(addr - 0x30) >> 2];
1859 827df9f3 balrog
1860 827df9f3 balrog
    case 0x270:        /* CONTROL_DEBOBS */
1861 827df9f3 balrog
        return s->obs;
1862 827df9f3 balrog
1863 827df9f3 balrog
    case 0x274:        /* CONTROL_DEVCONF */
1864 827df9f3 balrog
        return s->devconfig;
1865 827df9f3 balrog
1866 827df9f3 balrog
    case 0x28c:        /* CONTROL_EMU_SUPPORT */
1867 827df9f3 balrog
        return 0;
1868 827df9f3 balrog
1869 827df9f3 balrog
    case 0x290:        /* CONTROL_MSUSPENDMUX_0 */
1870 827df9f3 balrog
        return s->msuspendmux[0];
1871 827df9f3 balrog
    case 0x294:        /* CONTROL_MSUSPENDMUX_1 */
1872 827df9f3 balrog
        return s->msuspendmux[1];
1873 827df9f3 balrog
    case 0x298:        /* CONTROL_MSUSPENDMUX_2 */
1874 827df9f3 balrog
        return s->msuspendmux[2];
1875 827df9f3 balrog
    case 0x29c:        /* CONTROL_MSUSPENDMUX_3 */
1876 827df9f3 balrog
        return s->msuspendmux[3];
1877 827df9f3 balrog
    case 0x2a0:        /* CONTROL_MSUSPENDMUX_4 */
1878 827df9f3 balrog
        return s->msuspendmux[4];
1879 827df9f3 balrog
    case 0x2a4:        /* CONTROL_MSUSPENDMUX_5 */
1880 827df9f3 balrog
        return 0;
1881 827df9f3 balrog
1882 827df9f3 balrog
    case 0x2b8:        /* CONTROL_PSA_CTRL */
1883 827df9f3 balrog
        return s->psaconfig;
1884 827df9f3 balrog
    case 0x2bc:        /* CONTROL_PSA_CMD */
1885 827df9f3 balrog
    case 0x2c0:        /* CONTROL_PSA_VALUE */
1886 827df9f3 balrog
        return 0;
1887 827df9f3 balrog
1888 827df9f3 balrog
    case 0x2b0:        /* CONTROL_SEC_CTRL */
1889 827df9f3 balrog
        return 0x800000f1;
1890 827df9f3 balrog
    case 0x2d0:        /* CONTROL_SEC_EMU */
1891 827df9f3 balrog
        return 0x80000015;
1892 827df9f3 balrog
    case 0x2d4:        /* CONTROL_SEC_TAP */
1893 827df9f3 balrog
        return 0x8000007f;
1894 827df9f3 balrog
    case 0x2b4:        /* CONTROL_SEC_TEST */
1895 827df9f3 balrog
    case 0x2f0:        /* CONTROL_SEC_STATUS */
1896 827df9f3 balrog
    case 0x2f4:        /* CONTROL_SEC_ERR_STATUS */
1897 827df9f3 balrog
        /* Secure mode is not present on general-pusrpose device.  Outside
1898 827df9f3 balrog
         * secure mode these values cannot be read or written.  */
1899 827df9f3 balrog
        return 0;
1900 827df9f3 balrog
1901 827df9f3 balrog
    case 0x2d8:        /* CONTROL_OCM_RAM_PERM */
1902 827df9f3 balrog
        return 0xff;
1903 827df9f3 balrog
    case 0x2dc:        /* CONTROL_OCM_PUB_RAM_ADD */
1904 827df9f3 balrog
    case 0x2e0:        /* CONTROL_EXT_SEC_RAM_START_ADD */
1905 827df9f3 balrog
    case 0x2e4:        /* CONTROL_EXT_SEC_RAM_STOP_ADD */
1906 827df9f3 balrog
        /* No secure mode so no Extended Secure RAM present.  */
1907 827df9f3 balrog
        return 0;
1908 827df9f3 balrog
1909 827df9f3 balrog
    case 0x2f8:        /* CONTROL_STATUS */
1910 827df9f3 balrog
        /* Device Type => General-purpose */
1911 827df9f3 balrog
        return 0x0300;
1912 827df9f3 balrog
    case 0x2fc:        /* CONTROL_GENERAL_PURPOSE_STATUS */
1913 827df9f3 balrog
1914 827df9f3 balrog
    case 0x300:        /* CONTROL_RPUB_KEY_H_0 */
1915 827df9f3 balrog
    case 0x304:        /* CONTROL_RPUB_KEY_H_1 */
1916 827df9f3 balrog
    case 0x308:        /* CONTROL_RPUB_KEY_H_2 */
1917 827df9f3 balrog
    case 0x30c:        /* CONTROL_RPUB_KEY_H_3 */
1918 827df9f3 balrog
        return 0xdecafbad;
1919 827df9f3 balrog
1920 827df9f3 balrog
    case 0x310:        /* CONTROL_RAND_KEY_0 */
1921 827df9f3 balrog
    case 0x314:        /* CONTROL_RAND_KEY_1 */
1922 827df9f3 balrog
    case 0x318:        /* CONTROL_RAND_KEY_2 */
1923 827df9f3 balrog
    case 0x31c:        /* CONTROL_RAND_KEY_3 */
1924 827df9f3 balrog
    case 0x320:        /* CONTROL_CUST_KEY_0 */
1925 827df9f3 balrog
    case 0x324:        /* CONTROL_CUST_KEY_1 */
1926 827df9f3 balrog
    case 0x330:        /* CONTROL_TEST_KEY_0 */
1927 827df9f3 balrog
    case 0x334:        /* CONTROL_TEST_KEY_1 */
1928 827df9f3 balrog
    case 0x338:        /* CONTROL_TEST_KEY_2 */
1929 827df9f3 balrog
    case 0x33c:        /* CONTROL_TEST_KEY_3 */
1930 827df9f3 balrog
    case 0x340:        /* CONTROL_TEST_KEY_4 */
1931 827df9f3 balrog
    case 0x344:        /* CONTROL_TEST_KEY_5 */
1932 827df9f3 balrog
    case 0x348:        /* CONTROL_TEST_KEY_6 */
1933 827df9f3 balrog
    case 0x34c:        /* CONTROL_TEST_KEY_7 */
1934 827df9f3 balrog
    case 0x350:        /* CONTROL_TEST_KEY_8 */
1935 827df9f3 balrog
    case 0x354:        /* CONTROL_TEST_KEY_9 */
1936 827df9f3 balrog
        /* Can only be accessed in secure mode and when C_FieldAccEnable
1937 827df9f3 balrog
         * bit is set in CONTROL_SEC_CTRL.
1938 827df9f3 balrog
         * TODO: otherwise an interconnect access error is generated.  */
1939 827df9f3 balrog
        return 0;
1940 827df9f3 balrog
    }
1941 827df9f3 balrog
1942 827df9f3 balrog
    OMAP_BAD_REG(addr);
1943 827df9f3 balrog
    return 0;
1944 827df9f3 balrog
}
1945 827df9f3 balrog
1946 c227f099 Anthony Liguori
static void omap_sysctl_write8(void *opaque, target_phys_addr_t addr,
1947 f451387a balrog
                uint32_t value)
1948 f451387a balrog
{
1949 f451387a balrog
    struct omap_sysctl_s *s = (struct omap_sysctl_s *) opaque;
1950 f451387a balrog
    int pad_offset, byte_offset;
1951 f451387a balrog
    int prev_value;
1952 f451387a balrog
1953 8da3ff18 pbrook
    switch (addr) {
1954 f451387a balrog
    case 0x030 ... 0x140:        /* CONTROL_PADCONF - only used in the POP */
1955 8da3ff18 pbrook
        pad_offset = (addr - 0x30) >> 2;
1956 8da3ff18 pbrook
        byte_offset = (addr - 0x30) & (4 - 1);
1957 f451387a balrog
1958 f451387a balrog
        prev_value = s->padconf[pad_offset];
1959 f451387a balrog
        prev_value &= ~(0xff << (byte_offset * 8));
1960 f451387a balrog
        prev_value |= ((value & 0x1f1f1f1f) << (byte_offset * 8)) & 0x1f1f1f1f;
1961 f451387a balrog
        s->padconf[pad_offset] = prev_value;
1962 f451387a balrog
        break;
1963 f451387a balrog
1964 f451387a balrog
    default:
1965 f451387a balrog
        OMAP_BAD_REG(addr);
1966 f451387a balrog
        break;
1967 f451387a balrog
    }
1968 f451387a balrog
}
1969 f451387a balrog
1970 c227f099 Anthony Liguori
static void omap_sysctl_write(void *opaque, target_phys_addr_t addr,
1971 827df9f3 balrog
                uint32_t value)
1972 827df9f3 balrog
{
1973 827df9f3 balrog
    struct omap_sysctl_s *s = (struct omap_sysctl_s *) opaque;
1974 827df9f3 balrog
1975 8da3ff18 pbrook
    switch (addr) {
1976 827df9f3 balrog
    case 0x000:        /* CONTROL_REVISION */
1977 827df9f3 balrog
    case 0x2a4:        /* CONTROL_MSUSPENDMUX_5 */
1978 827df9f3 balrog
    case 0x2c0:        /* CONTROL_PSA_VALUE */
1979 827df9f3 balrog
    case 0x2f8:        /* CONTROL_STATUS */
1980 827df9f3 balrog
    case 0x2fc:        /* CONTROL_GENERAL_PURPOSE_STATUS */
1981 827df9f3 balrog
    case 0x300:        /* CONTROL_RPUB_KEY_H_0 */
1982 827df9f3 balrog
    case 0x304:        /* CONTROL_RPUB_KEY_H_1 */
1983 827df9f3 balrog
    case 0x308:        /* CONTROL_RPUB_KEY_H_2 */
1984 827df9f3 balrog
    case 0x30c:        /* CONTROL_RPUB_KEY_H_3 */
1985 827df9f3 balrog
    case 0x310:        /* CONTROL_RAND_KEY_0 */
1986 827df9f3 balrog
    case 0x314:        /* CONTROL_RAND_KEY_1 */
1987 827df9f3 balrog
    case 0x318:        /* CONTROL_RAND_KEY_2 */
1988 827df9f3 balrog
    case 0x31c:        /* CONTROL_RAND_KEY_3 */
1989 827df9f3 balrog
    case 0x320:        /* CONTROL_CUST_KEY_0 */
1990 827df9f3 balrog
    case 0x324:        /* CONTROL_CUST_KEY_1 */
1991 827df9f3 balrog
    case 0x330:        /* CONTROL_TEST_KEY_0 */
1992 827df9f3 balrog
    case 0x334:        /* CONTROL_TEST_KEY_1 */
1993 827df9f3 balrog
    case 0x338:        /* CONTROL_TEST_KEY_2 */
1994 827df9f3 balrog
    case 0x33c:        /* CONTROL_TEST_KEY_3 */
1995 827df9f3 balrog
    case 0x340:        /* CONTROL_TEST_KEY_4 */
1996 827df9f3 balrog
    case 0x344:        /* CONTROL_TEST_KEY_5 */
1997 827df9f3 balrog
    case 0x348:        /* CONTROL_TEST_KEY_6 */
1998 827df9f3 balrog
    case 0x34c:        /* CONTROL_TEST_KEY_7 */
1999 827df9f3 balrog
    case 0x350:        /* CONTROL_TEST_KEY_8 */
2000 827df9f3 balrog
    case 0x354:        /* CONTROL_TEST_KEY_9 */
2001 827df9f3 balrog
        OMAP_RO_REG(addr);
2002 827df9f3 balrog
        return;
2003 827df9f3 balrog
2004 827df9f3 balrog
    case 0x010:        /* CONTROL_SYSCONFIG */
2005 827df9f3 balrog
        s->sysconfig = value & 0x1e;
2006 827df9f3 balrog
        break;
2007 827df9f3 balrog
2008 827df9f3 balrog
    case 0x030 ... 0x140:        /* CONTROL_PADCONF - only used in the POP */
2009 827df9f3 balrog
        /* XXX: should check constant bits */
2010 8da3ff18 pbrook
        s->padconf[(addr - 0x30) >> 2] = value & 0x1f1f1f1f;
2011 827df9f3 balrog
        break;
2012 827df9f3 balrog
2013 827df9f3 balrog
    case 0x270:        /* CONTROL_DEBOBS */
2014 827df9f3 balrog
        s->obs = value & 0xff;
2015 827df9f3 balrog
        break;
2016 827df9f3 balrog
2017 827df9f3 balrog
    case 0x274:        /* CONTROL_DEVCONF */
2018 827df9f3 balrog
        s->devconfig = value & 0xffffc7ff;
2019 827df9f3 balrog
        break;
2020 827df9f3 balrog
2021 827df9f3 balrog
    case 0x28c:        /* CONTROL_EMU_SUPPORT */
2022 827df9f3 balrog
        break;
2023 827df9f3 balrog
2024 827df9f3 balrog
    case 0x290:        /* CONTROL_MSUSPENDMUX_0 */
2025 827df9f3 balrog
        s->msuspendmux[0] = value & 0x3fffffff;
2026 827df9f3 balrog
        break;
2027 827df9f3 balrog
    case 0x294:        /* CONTROL_MSUSPENDMUX_1 */
2028 827df9f3 balrog
        s->msuspendmux[1] = value & 0x3fffffff;
2029 827df9f3 balrog
        break;
2030 827df9f3 balrog
    case 0x298:        /* CONTROL_MSUSPENDMUX_2 */
2031 827df9f3 balrog
        s->msuspendmux[2] = value & 0x3fffffff;
2032 827df9f3 balrog
        break;
2033 827df9f3 balrog
    case 0x29c:        /* CONTROL_MSUSPENDMUX_3 */
2034 827df9f3 balrog
        s->msuspendmux[3] = value & 0x3fffffff;
2035 827df9f3 balrog
        break;
2036 827df9f3 balrog
    case 0x2a0:        /* CONTROL_MSUSPENDMUX_4 */
2037 827df9f3 balrog
        s->msuspendmux[4] = value & 0x3fffffff;
2038 827df9f3 balrog
        break;
2039 827df9f3 balrog
2040 827df9f3 balrog
    case 0x2b8:        /* CONTROL_PSA_CTRL */
2041 827df9f3 balrog
        s->psaconfig = value & 0x1c;
2042 827df9f3 balrog
        s->psaconfig |= (value & 0x20) ? 2 : 1;
2043 827df9f3 balrog
        break;
2044 827df9f3 balrog
    case 0x2bc:        /* CONTROL_PSA_CMD */
2045 827df9f3 balrog
        break;
2046 827df9f3 balrog
2047 827df9f3 balrog
    case 0x2b0:        /* CONTROL_SEC_CTRL */
2048 827df9f3 balrog
    case 0x2b4:        /* CONTROL_SEC_TEST */
2049 827df9f3 balrog
    case 0x2d0:        /* CONTROL_SEC_EMU */
2050 827df9f3 balrog
    case 0x2d4:        /* CONTROL_SEC_TAP */
2051 827df9f3 balrog
    case 0x2d8:        /* CONTROL_OCM_RAM_PERM */
2052 827df9f3 balrog
    case 0x2dc:        /* CONTROL_OCM_PUB_RAM_ADD */
2053 827df9f3 balrog
    case 0x2e0:        /* CONTROL_EXT_SEC_RAM_START_ADD */
2054 827df9f3 balrog
    case 0x2e4:        /* CONTROL_EXT_SEC_RAM_STOP_ADD */
2055 827df9f3 balrog
    case 0x2f0:        /* CONTROL_SEC_STATUS */
2056 827df9f3 balrog
    case 0x2f4:        /* CONTROL_SEC_ERR_STATUS */
2057 827df9f3 balrog
        break;
2058 827df9f3 balrog
2059 827df9f3 balrog
    default:
2060 827df9f3 balrog
        OMAP_BAD_REG(addr);
2061 827df9f3 balrog
        return;
2062 827df9f3 balrog
    }
2063 827df9f3 balrog
}
2064 827df9f3 balrog
2065 d60efc6b Blue Swirl
static CPUReadMemoryFunc * const omap_sysctl_readfn[] = {
2066 f451387a balrog
    omap_sysctl_read8,
2067 827df9f3 balrog
    omap_badwidth_read32,        /* TODO */
2068 827df9f3 balrog
    omap_sysctl_read,
2069 827df9f3 balrog
};
2070 827df9f3 balrog
2071 d60efc6b Blue Swirl
static CPUWriteMemoryFunc * const omap_sysctl_writefn[] = {
2072 f451387a balrog
    omap_sysctl_write8,
2073 827df9f3 balrog
    omap_badwidth_write32,        /* TODO */
2074 827df9f3 balrog
    omap_sysctl_write,
2075 827df9f3 balrog
};
2076 827df9f3 balrog
2077 827df9f3 balrog
static void omap_sysctl_reset(struct omap_sysctl_s *s)
2078 827df9f3 balrog
{
2079 827df9f3 balrog
    /* (power-on reset) */
2080 827df9f3 balrog
    s->sysconfig = 0;
2081 827df9f3 balrog
    s->obs = 0;
2082 827df9f3 balrog
    s->devconfig = 0x0c000000;
2083 827df9f3 balrog
    s->msuspendmux[0] = 0x00000000;
2084 827df9f3 balrog
    s->msuspendmux[1] = 0x00000000;
2085 827df9f3 balrog
    s->msuspendmux[2] = 0x00000000;
2086 827df9f3 balrog
    s->msuspendmux[3] = 0x00000000;
2087 827df9f3 balrog
    s->msuspendmux[4] = 0x00000000;
2088 827df9f3 balrog
    s->psaconfig = 1;
2089 827df9f3 balrog
2090 827df9f3 balrog
    s->padconf[0x00] = 0x000f0f0f;
2091 827df9f3 balrog
    s->padconf[0x01] = 0x00000000;
2092 827df9f3 balrog
    s->padconf[0x02] = 0x00000000;
2093 827df9f3 balrog
    s->padconf[0x03] = 0x00000000;
2094 827df9f3 balrog
    s->padconf[0x04] = 0x00000000;
2095 827df9f3 balrog
    s->padconf[0x05] = 0x00000000;
2096 827df9f3 balrog
    s->padconf[0x06] = 0x00000000;
2097 827df9f3 balrog
    s->padconf[0x07] = 0x00000000;
2098 827df9f3 balrog
    s->padconf[0x08] = 0x08080800;
2099 827df9f3 balrog
    s->padconf[0x09] = 0x08080808;
2100 827df9f3 balrog
    s->padconf[0x0a] = 0x08080808;
2101 827df9f3 balrog
    s->padconf[0x0b] = 0x08080808;
2102 827df9f3 balrog
    s->padconf[0x0c] = 0x08080808;
2103 827df9f3 balrog
    s->padconf[0x0d] = 0x08080800;
2104 827df9f3 balrog
    s->padconf[0x0e] = 0x08080808;
2105 827df9f3 balrog
    s->padconf[0x0f] = 0x08080808;
2106 827df9f3 balrog
    s->padconf[0x10] = 0x18181808;        /* | 0x07070700 if SBoot3 */
2107 827df9f3 balrog
    s->padconf[0x11] = 0x18181818;        /* | 0x07070707 if SBoot3 */
2108 827df9f3 balrog
    s->padconf[0x12] = 0x18181818;        /* | 0x07070707 if SBoot3 */
2109 827df9f3 balrog
    s->padconf[0x13] = 0x18181818;        /* | 0x07070707 if SBoot3 */
2110 827df9f3 balrog
    s->padconf[0x14] = 0x18181818;        /* | 0x00070707 if SBoot3 */
2111 827df9f3 balrog
    s->padconf[0x15] = 0x18181818;
2112 827df9f3 balrog
    s->padconf[0x16] = 0x18181818;        /* | 0x07000000 if SBoot3 */
2113 827df9f3 balrog
    s->padconf[0x17] = 0x1f001f00;
2114 827df9f3 balrog
    s->padconf[0x18] = 0x1f1f1f1f;
2115 827df9f3 balrog
    s->padconf[0x19] = 0x00000000;
2116 827df9f3 balrog
    s->padconf[0x1a] = 0x1f180000;
2117 827df9f3 balrog
    s->padconf[0x1b] = 0x00001f1f;
2118 827df9f3 balrog
    s->padconf[0x1c] = 0x1f001f00;
2119 827df9f3 balrog
    s->padconf[0x1d] = 0x00000000;
2120 827df9f3 balrog
    s->padconf[0x1e] = 0x00000000;
2121 827df9f3 balrog
    s->padconf[0x1f] = 0x08000000;
2122 827df9f3 balrog
    s->padconf[0x20] = 0x08080808;
2123 827df9f3 balrog
    s->padconf[0x21] = 0x08080808;
2124 827df9f3 balrog
    s->padconf[0x22] = 0x0f080808;
2125 827df9f3 balrog
    s->padconf[0x23] = 0x0f0f0f0f;
2126 827df9f3 balrog
    s->padconf[0x24] = 0x000f0f0f;
2127 827df9f3 balrog
    s->padconf[0x25] = 0x1f1f1f0f;
2128 827df9f3 balrog
    s->padconf[0x26] = 0x080f0f1f;
2129 827df9f3 balrog
    s->padconf[0x27] = 0x070f1808;
2130 827df9f3 balrog
    s->padconf[0x28] = 0x0f070707;
2131 827df9f3 balrog
    s->padconf[0x29] = 0x000f0f1f;
2132 827df9f3 balrog
    s->padconf[0x2a] = 0x0f0f0f1f;
2133 827df9f3 balrog
    s->padconf[0x2b] = 0x08000000;
2134 827df9f3 balrog
    s->padconf[0x2c] = 0x0000001f;
2135 827df9f3 balrog
    s->padconf[0x2d] = 0x0f0f1f00;
2136 827df9f3 balrog
    s->padconf[0x2e] = 0x1f1f0f0f;
2137 827df9f3 balrog
    s->padconf[0x2f] = 0x0f1f1f1f;
2138 827df9f3 balrog
    s->padconf[0x30] = 0x0f0f0f0f;
2139 827df9f3 balrog
    s->padconf[0x31] = 0x0f1f0f1f;
2140 827df9f3 balrog
    s->padconf[0x32] = 0x0f0f0f0f;
2141 827df9f3 balrog
    s->padconf[0x33] = 0x0f1f0f1f;
2142 827df9f3 balrog
    s->padconf[0x34] = 0x1f1f0f0f;
2143 827df9f3 balrog
    s->padconf[0x35] = 0x0f0f1f1f;
2144 827df9f3 balrog
    s->padconf[0x36] = 0x0f0f1f0f;
2145 827df9f3 balrog
    s->padconf[0x37] = 0x0f0f0f0f;
2146 827df9f3 balrog
    s->padconf[0x38] = 0x1f18180f;
2147 827df9f3 balrog
    s->padconf[0x39] = 0x1f1f1f1f;
2148 827df9f3 balrog
    s->padconf[0x3a] = 0x00001f1f;
2149 827df9f3 balrog
    s->padconf[0x3b] = 0x00000000;
2150 827df9f3 balrog
    s->padconf[0x3c] = 0x00000000;
2151 827df9f3 balrog
    s->padconf[0x3d] = 0x0f0f0f0f;
2152 827df9f3 balrog
    s->padconf[0x3e] = 0x18000f0f;
2153 827df9f3 balrog
    s->padconf[0x3f] = 0x00070000;
2154 827df9f3 balrog
    s->padconf[0x40] = 0x00000707;
2155 827df9f3 balrog
    s->padconf[0x41] = 0x0f1f0700;
2156 827df9f3 balrog
    s->padconf[0x42] = 0x1f1f070f;
2157 827df9f3 balrog
    s->padconf[0x43] = 0x0008081f;
2158 827df9f3 balrog
    s->padconf[0x44] = 0x00000800;
2159 827df9f3 balrog
}
2160 827df9f3 balrog
2161 c1ff227b cmchao
static struct omap_sysctl_s *omap_sysctl_init(struct omap_target_agent_s *ta,
2162 827df9f3 balrog
                omap_clk iclk, struct omap_mpu_state_s *mpu)
2163 827df9f3 balrog
{
2164 827df9f3 balrog
    int iomemtype;
2165 827df9f3 balrog
    struct omap_sysctl_s *s = (struct omap_sysctl_s *)
2166 7267c094 Anthony Liguori
            g_malloc0(sizeof(struct omap_sysctl_s));
2167 827df9f3 balrog
2168 827df9f3 balrog
    s->mpu = mpu;
2169 827df9f3 balrog
    omap_sysctl_reset(s);
2170 827df9f3 balrog
2171 1eed09cb Avi Kivity
    iomemtype = l4_register_io_memory(omap_sysctl_readfn,
2172 827df9f3 balrog
                    omap_sysctl_writefn, s);
2173 8da3ff18 pbrook
    omap_l4_attach(ta, 0, iomemtype);
2174 827df9f3 balrog
2175 827df9f3 balrog
    return s;
2176 827df9f3 balrog
}
2177 827df9f3 balrog
2178 827df9f3 balrog
/* General chip reset */
2179 827df9f3 balrog
static void omap2_mpu_reset(void *opaque)
2180 827df9f3 balrog
{
2181 827df9f3 balrog
    struct omap_mpu_state_s *mpu = (struct omap_mpu_state_s *) opaque;
2182 827df9f3 balrog
2183 827df9f3 balrog
    omap_dma_reset(mpu->dma);
2184 827df9f3 balrog
    omap_prcm_reset(mpu->prcm);
2185 827df9f3 balrog
    omap_sysctl_reset(mpu->sysc);
2186 827df9f3 balrog
    omap_gp_timer_reset(mpu->gptimer[0]);
2187 827df9f3 balrog
    omap_gp_timer_reset(mpu->gptimer[1]);
2188 827df9f3 balrog
    omap_gp_timer_reset(mpu->gptimer[2]);
2189 827df9f3 balrog
    omap_gp_timer_reset(mpu->gptimer[3]);
2190 827df9f3 balrog
    omap_gp_timer_reset(mpu->gptimer[4]);
2191 827df9f3 balrog
    omap_gp_timer_reset(mpu->gptimer[5]);
2192 827df9f3 balrog
    omap_gp_timer_reset(mpu->gptimer[6]);
2193 827df9f3 balrog
    omap_gp_timer_reset(mpu->gptimer[7]);
2194 827df9f3 balrog
    omap_gp_timer_reset(mpu->gptimer[8]);
2195 827df9f3 balrog
    omap_gp_timer_reset(mpu->gptimer[9]);
2196 827df9f3 balrog
    omap_gp_timer_reset(mpu->gptimer[10]);
2197 827df9f3 balrog
    omap_gp_timer_reset(mpu->gptimer[11]);
2198 011d87d0 cmchao
    omap_synctimer_reset(mpu->synctimer);
2199 827df9f3 balrog
    omap_sdrc_reset(mpu->sdrc);
2200 827df9f3 balrog
    omap_gpmc_reset(mpu->gpmc);
2201 827df9f3 balrog
    omap_dss_reset(mpu->dss);
2202 827df9f3 balrog
    omap_uart_reset(mpu->uart[0]);
2203 827df9f3 balrog
    omap_uart_reset(mpu->uart[1]);
2204 827df9f3 balrog
    omap_uart_reset(mpu->uart[2]);
2205 827df9f3 balrog
    omap_mmc_reset(mpu->mmc);
2206 827df9f3 balrog
    omap_mcspi_reset(mpu->mcspi[0]);
2207 827df9f3 balrog
    omap_mcspi_reset(mpu->mcspi[1]);
2208 827df9f3 balrog
    omap_i2c_reset(mpu->i2c[0]);
2209 827df9f3 balrog
    omap_i2c_reset(mpu->i2c[1]);
2210 827df9f3 balrog
    cpu_reset(mpu->env);
2211 827df9f3 balrog
}
2212 827df9f3 balrog
2213 827df9f3 balrog
static int omap2_validate_addr(struct omap_mpu_state_s *s,
2214 c227f099 Anthony Liguori
                target_phys_addr_t addr)
2215 827df9f3 balrog
{
2216 827df9f3 balrog
    return 1;
2217 827df9f3 balrog
}
2218 827df9f3 balrog
2219 827df9f3 balrog
static const struct dma_irq_map omap2_dma_irq_map[] = {
2220 827df9f3 balrog
    { 0, OMAP_INT_24XX_SDMA_IRQ0 },
2221 827df9f3 balrog
    { 0, OMAP_INT_24XX_SDMA_IRQ1 },
2222 827df9f3 balrog
    { 0, OMAP_INT_24XX_SDMA_IRQ2 },
2223 827df9f3 balrog
    { 0, OMAP_INT_24XX_SDMA_IRQ3 },
2224 827df9f3 balrog
};
2225 827df9f3 balrog
2226 827df9f3 balrog
struct omap_mpu_state_s *omap2420_mpu_init(unsigned long sdram_size,
2227 3023f332 aliguori
                const char *core)
2228 827df9f3 balrog
{
2229 827df9f3 balrog
    struct omap_mpu_state_s *s = (struct omap_mpu_state_s *)
2230 7267c094 Anthony Liguori
            g_malloc0(sizeof(struct omap_mpu_state_s));
2231 c227f099 Anthony Liguori
    ram_addr_t sram_base, q2_base;
2232 827df9f3 balrog
    qemu_irq *cpu_irq;
2233 827df9f3 balrog
    qemu_irq dma_irqs[4];
2234 751c6a17 Gerd Hoffmann
    DriveInfo *dinfo;
2235 827df9f3 balrog
    int i;
2236 77831c20 Juha Riihimäki
    SysBusDevice *busdev;
2237 77831c20 Juha Riihimäki
    struct omap_target_agent_s *ta;
2238 827df9f3 balrog
2239 827df9f3 balrog
    /* Core */
2240 827df9f3 balrog
    s->mpu_model = omap2420;
2241 827df9f3 balrog
    s->env = cpu_init(core ?: "arm1136-r2");
2242 827df9f3 balrog
    if (!s->env) {
2243 827df9f3 balrog
        fprintf(stderr, "Unable to find CPU definition\n");
2244 827df9f3 balrog
        exit(1);
2245 827df9f3 balrog
    }
2246 827df9f3 balrog
    s->sdram_size = sdram_size;
2247 827df9f3 balrog
    s->sram_size = OMAP242X_SRAM_SIZE;
2248 827df9f3 balrog
2249 827df9f3 balrog
    s->wakeup = qemu_allocate_irqs(omap_mpu_wakeup, s, 1)[0];
2250 827df9f3 balrog
2251 827df9f3 balrog
    /* Clocks */
2252 827df9f3 balrog
    omap_clk_init(s);
2253 827df9f3 balrog
2254 827df9f3 balrog
    /* Memory-mapped stuff */
2255 827df9f3 balrog
    cpu_register_physical_memory(OMAP2_Q2_BASE, s->sdram_size,
2256 1724f049 Alex Williamson
                    (q2_base = qemu_ram_alloc(NULL, "omap2.dram",
2257 1724f049 Alex Williamson
                                              s->sdram_size)) | IO_MEM_RAM);
2258 827df9f3 balrog
    cpu_register_physical_memory(OMAP2_SRAM_BASE, s->sram_size,
2259 1724f049 Alex Williamson
                    (sram_base = qemu_ram_alloc(NULL, "omap2.sram",
2260 1724f049 Alex Williamson
                                                s->sram_size)) | IO_MEM_RAM);
2261 827df9f3 balrog
2262 827df9f3 balrog
    s->l4 = omap_l4_init(OMAP2_L4_BASE, 54);
2263 827df9f3 balrog
2264 827df9f3 balrog
    /* Actually mapped at any 2K boundary in the ARM11 private-peripheral if */
2265 827df9f3 balrog
    cpu_irq = arm_pic_init_cpu(s->env);
2266 0919ac78 Peter Maydell
    s->ih[0] = qdev_create(NULL, "omap2-intc");
2267 0919ac78 Peter Maydell
    qdev_prop_set_uint8(s->ih[0], "revision", 0x21);
2268 0919ac78 Peter Maydell
    qdev_prop_set_ptr(s->ih[0], "fclk", omap_findclk(s, "mpu_intc_fclk"));
2269 0919ac78 Peter Maydell
    qdev_prop_set_ptr(s->ih[0], "iclk", omap_findclk(s, "mpu_intc_iclk"));
2270 0919ac78 Peter Maydell
    qdev_init_nofail(s->ih[0]);
2271 0919ac78 Peter Maydell
    busdev = sysbus_from_qdev(s->ih[0]);
2272 0919ac78 Peter Maydell
    sysbus_connect_irq(busdev, 0, cpu_irq[ARM_PIC_CPU_IRQ]);
2273 0919ac78 Peter Maydell
    sysbus_connect_irq(busdev, 1, cpu_irq[ARM_PIC_CPU_FIQ]);
2274 0919ac78 Peter Maydell
    sysbus_mmio_map(busdev, 0, 0x480fe000);
2275 827df9f3 balrog
    s->prcm = omap_prcm_init(omap_l4tao(s->l4, 3),
2276 0919ac78 Peter Maydell
                             qdev_get_gpio_in(s->ih[0],
2277 0919ac78 Peter Maydell
                                              OMAP_INT_24XX_PRCM_MPU_IRQ),
2278 0919ac78 Peter Maydell
                             NULL, NULL, s);
2279 827df9f3 balrog
2280 827df9f3 balrog
    s->sysc = omap_sysctl_init(omap_l4tao(s->l4, 1),
2281 827df9f3 balrog
                    omap_findclk(s, "omapctrl_iclk"), s);
2282 827df9f3 balrog
2283 0919ac78 Peter Maydell
    for (i = 0; i < 4; i++) {
2284 0919ac78 Peter Maydell
        dma_irqs[i] = qdev_get_gpio_in(s->ih[omap2_dma_irq_map[i].ih],
2285 0919ac78 Peter Maydell
                                       omap2_dma_irq_map[i].intr);
2286 0919ac78 Peter Maydell
    }
2287 827df9f3 balrog
    s->dma = omap_dma4_init(0x48056000, dma_irqs, s, 256, 32,
2288 827df9f3 balrog
                    omap_findclk(s, "sdma_iclk"),
2289 827df9f3 balrog
                    omap_findclk(s, "sdma_fclk"));
2290 827df9f3 balrog
    s->port->addr_valid = omap2_validate_addr;
2291 827df9f3 balrog
2292 afbb5194 balrog
    /* Register SDRAM and SRAM ports for fast DMA transfers.  */
2293 90aeba9d Avi Kivity
    soc_dma_port_add_mem(s->dma, qemu_get_ram_ptr(q2_base),
2294 90aeba9d Avi Kivity
                         OMAP2_Q2_BASE, s->sdram_size);
2295 90aeba9d Avi Kivity
    soc_dma_port_add_mem(s->dma, qemu_get_ram_ptr(sram_base),
2296 90aeba9d Avi Kivity
                         OMAP2_SRAM_BASE, s->sram_size);
2297 afbb5194 balrog
2298 827df9f3 balrog
    s->uart[0] = omap2_uart_init(omap_l4ta(s->l4, 19),
2299 0919ac78 Peter Maydell
                                 qdev_get_gpio_in(s->ih[0],
2300 0919ac78 Peter Maydell
                                                  OMAP_INT_24XX_UART1_IRQ),
2301 827df9f3 balrog
                    omap_findclk(s, "uart1_fclk"),
2302 827df9f3 balrog
                    omap_findclk(s, "uart1_iclk"),
2303 827df9f3 balrog
                    s->drq[OMAP24XX_DMA_UART1_TX],
2304 6a8aabd3 Stefan Weil
                    s->drq[OMAP24XX_DMA_UART1_RX],
2305 6a8aabd3 Stefan Weil
                    "uart1",
2306 6a8aabd3 Stefan Weil
                    serial_hds[0]);
2307 827df9f3 balrog
    s->uart[1] = omap2_uart_init(omap_l4ta(s->l4, 20),
2308 0919ac78 Peter Maydell
                                 qdev_get_gpio_in(s->ih[0],
2309 0919ac78 Peter Maydell
                                                  OMAP_INT_24XX_UART2_IRQ),
2310 827df9f3 balrog
                    omap_findclk(s, "uart2_fclk"),
2311 827df9f3 balrog
                    omap_findclk(s, "uart2_iclk"),
2312 827df9f3 balrog
                    s->drq[OMAP24XX_DMA_UART2_TX],
2313 827df9f3 balrog
                    s->drq[OMAP24XX_DMA_UART2_RX],
2314 6a8aabd3 Stefan Weil
                    "uart2",
2315 b9d38e95 Blue Swirl
                    serial_hds[0] ? serial_hds[1] : NULL);
2316 827df9f3 balrog
    s->uart[2] = omap2_uart_init(omap_l4ta(s->l4, 21),
2317 0919ac78 Peter Maydell
                                 qdev_get_gpio_in(s->ih[0],
2318 0919ac78 Peter Maydell
                                                  OMAP_INT_24XX_UART3_IRQ),
2319 827df9f3 balrog
                    omap_findclk(s, "uart3_fclk"),
2320 827df9f3 balrog
                    omap_findclk(s, "uart3_iclk"),
2321 827df9f3 balrog
                    s->drq[OMAP24XX_DMA_UART3_TX],
2322 827df9f3 balrog
                    s->drq[OMAP24XX_DMA_UART3_RX],
2323 6a8aabd3 Stefan Weil
                    "uart3",
2324 b9d38e95 Blue Swirl
                    serial_hds[0] && serial_hds[1] ? serial_hds[2] : NULL);
2325 827df9f3 balrog
2326 827df9f3 balrog
    s->gptimer[0] = omap_gp_timer_init(omap_l4ta(s->l4, 7),
2327 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPTIMER1),
2328 827df9f3 balrog
                    omap_findclk(s, "wu_gpt1_clk"),
2329 827df9f3 balrog
                    omap_findclk(s, "wu_l4_iclk"));
2330 827df9f3 balrog
    s->gptimer[1] = omap_gp_timer_init(omap_l4ta(s->l4, 8),
2331 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPTIMER2),
2332 827df9f3 balrog
                    omap_findclk(s, "core_gpt2_clk"),
2333 827df9f3 balrog
                    omap_findclk(s, "core_l4_iclk"));
2334 827df9f3 balrog
    s->gptimer[2] = omap_gp_timer_init(omap_l4ta(s->l4, 22),
2335 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPTIMER3),
2336 827df9f3 balrog
                    omap_findclk(s, "core_gpt3_clk"),
2337 827df9f3 balrog
                    omap_findclk(s, "core_l4_iclk"));
2338 827df9f3 balrog
    s->gptimer[3] = omap_gp_timer_init(omap_l4ta(s->l4, 23),
2339 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPTIMER4),
2340 827df9f3 balrog
                    omap_findclk(s, "core_gpt4_clk"),
2341 827df9f3 balrog
                    omap_findclk(s, "core_l4_iclk"));
2342 827df9f3 balrog
    s->gptimer[4] = omap_gp_timer_init(omap_l4ta(s->l4, 24),
2343 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPTIMER5),
2344 827df9f3 balrog
                    omap_findclk(s, "core_gpt5_clk"),
2345 827df9f3 balrog
                    omap_findclk(s, "core_l4_iclk"));
2346 827df9f3 balrog
    s->gptimer[5] = omap_gp_timer_init(omap_l4ta(s->l4, 25),
2347 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPTIMER6),
2348 827df9f3 balrog
                    omap_findclk(s, "core_gpt6_clk"),
2349 827df9f3 balrog
                    omap_findclk(s, "core_l4_iclk"));
2350 827df9f3 balrog
    s->gptimer[6] = omap_gp_timer_init(omap_l4ta(s->l4, 26),
2351 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPTIMER7),
2352 827df9f3 balrog
                    omap_findclk(s, "core_gpt7_clk"),
2353 827df9f3 balrog
                    omap_findclk(s, "core_l4_iclk"));
2354 827df9f3 balrog
    s->gptimer[7] = omap_gp_timer_init(omap_l4ta(s->l4, 27),
2355 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPTIMER8),
2356 827df9f3 balrog
                    omap_findclk(s, "core_gpt8_clk"),
2357 827df9f3 balrog
                    omap_findclk(s, "core_l4_iclk"));
2358 827df9f3 balrog
    s->gptimer[8] = omap_gp_timer_init(omap_l4ta(s->l4, 28),
2359 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPTIMER9),
2360 827df9f3 balrog
                    omap_findclk(s, "core_gpt9_clk"),
2361 827df9f3 balrog
                    omap_findclk(s, "core_l4_iclk"));
2362 827df9f3 balrog
    s->gptimer[9] = omap_gp_timer_init(omap_l4ta(s->l4, 29),
2363 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPTIMER10),
2364 827df9f3 balrog
                    omap_findclk(s, "core_gpt10_clk"),
2365 827df9f3 balrog
                    omap_findclk(s, "core_l4_iclk"));
2366 827df9f3 balrog
    s->gptimer[10] = omap_gp_timer_init(omap_l4ta(s->l4, 30),
2367 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPTIMER11),
2368 827df9f3 balrog
                    omap_findclk(s, "core_gpt11_clk"),
2369 827df9f3 balrog
                    omap_findclk(s, "core_l4_iclk"));
2370 827df9f3 balrog
    s->gptimer[11] = omap_gp_timer_init(omap_l4ta(s->l4, 31),
2371 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPTIMER12),
2372 827df9f3 balrog
                    omap_findclk(s, "core_gpt12_clk"),
2373 827df9f3 balrog
                    omap_findclk(s, "core_l4_iclk"));
2374 827df9f3 balrog
2375 827df9f3 balrog
    omap_tap_init(omap_l4ta(s->l4, 2), s);
2376 827df9f3 balrog
2377 011d87d0 cmchao
    s->synctimer = omap_synctimer_init(omap_l4tao(s->l4, 2), s,
2378 827df9f3 balrog
                    omap_findclk(s, "clk32-kHz"),
2379 827df9f3 balrog
                    omap_findclk(s, "core_l4_iclk"));
2380 827df9f3 balrog
2381 827df9f3 balrog
    s->i2c[0] = omap2_i2c_init(omap_l4tao(s->l4, 5),
2382 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_I2C1_IRQ),
2383 827df9f3 balrog
                    &s->drq[OMAP24XX_DMA_I2C1_TX],
2384 827df9f3 balrog
                    omap_findclk(s, "i2c1.fclk"),
2385 827df9f3 balrog
                    omap_findclk(s, "i2c1.iclk"));
2386 827df9f3 balrog
    s->i2c[1] = omap2_i2c_init(omap_l4tao(s->l4, 6),
2387 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_I2C2_IRQ),
2388 827df9f3 balrog
                    &s->drq[OMAP24XX_DMA_I2C2_TX],
2389 827df9f3 balrog
                    omap_findclk(s, "i2c2.fclk"),
2390 827df9f3 balrog
                    omap_findclk(s, "i2c2.iclk"));
2391 827df9f3 balrog
2392 77831c20 Juha Riihimäki
    s->gpio = qdev_create(NULL, "omap2-gpio");
2393 77831c20 Juha Riihimäki
    qdev_prop_set_int32(s->gpio, "mpu_model", s->mpu_model);
2394 77831c20 Juha Riihimäki
    qdev_prop_set_ptr(s->gpio, "iclk", omap_findclk(s, "gpio_iclk"));
2395 77831c20 Juha Riihimäki
    qdev_prop_set_ptr(s->gpio, "fclk0", omap_findclk(s, "gpio1_dbclk"));
2396 77831c20 Juha Riihimäki
    qdev_prop_set_ptr(s->gpio, "fclk1", omap_findclk(s, "gpio2_dbclk"));
2397 77831c20 Juha Riihimäki
    qdev_prop_set_ptr(s->gpio, "fclk2", omap_findclk(s, "gpio3_dbclk"));
2398 77831c20 Juha Riihimäki
    qdev_prop_set_ptr(s->gpio, "fclk3", omap_findclk(s, "gpio4_dbclk"));
2399 77831c20 Juha Riihimäki
    if (s->mpu_model == omap2430) {
2400 77831c20 Juha Riihimäki
        qdev_prop_set_ptr(s->gpio, "fclk4", omap_findclk(s, "gpio5_dbclk"));
2401 77831c20 Juha Riihimäki
    }
2402 77831c20 Juha Riihimäki
    qdev_init_nofail(s->gpio);
2403 77831c20 Juha Riihimäki
    busdev = sysbus_from_qdev(s->gpio);
2404 0919ac78 Peter Maydell
    sysbus_connect_irq(busdev, 0,
2405 0919ac78 Peter Maydell
                       qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPIO_BANK1));
2406 0919ac78 Peter Maydell
    sysbus_connect_irq(busdev, 3,
2407 0919ac78 Peter Maydell
                       qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPIO_BANK2));
2408 0919ac78 Peter Maydell
    sysbus_connect_irq(busdev, 6,
2409 0919ac78 Peter Maydell
                       qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPIO_BANK3));
2410 0919ac78 Peter Maydell
    sysbus_connect_irq(busdev, 9,
2411 0919ac78 Peter Maydell
                       qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPIO_BANK4));
2412 f45b885f Peter Maydell
    if (s->mpu_model == omap2430) {
2413 f45b885f Peter Maydell
        sysbus_connect_irq(busdev, 12,
2414 f45b885f Peter Maydell
                           qdev_get_gpio_in(s->ih[0],
2415 f45b885f Peter Maydell
                                            OMAP_INT_243X_GPIO_BANK5));
2416 f45b885f Peter Maydell
    }
2417 77831c20 Juha Riihimäki
    ta = omap_l4ta(s->l4, 3);
2418 77831c20 Juha Riihimäki
    sysbus_mmio_map(busdev, 0, omap_l4_region_base(ta, 1));
2419 77831c20 Juha Riihimäki
    sysbus_mmio_map(busdev, 1, omap_l4_region_base(ta, 0));
2420 77831c20 Juha Riihimäki
    sysbus_mmio_map(busdev, 2, omap_l4_region_base(ta, 2));
2421 77831c20 Juha Riihimäki
    sysbus_mmio_map(busdev, 3, omap_l4_region_base(ta, 4));
2422 77831c20 Juha Riihimäki
    sysbus_mmio_map(busdev, 4, omap_l4_region_base(ta, 5));
2423 827df9f3 balrog
2424 827df9f3 balrog
    s->sdrc = omap_sdrc_init(0x68009000);
2425 0919ac78 Peter Maydell
    s->gpmc = omap_gpmc_init(s, 0x6800a000,
2426 0919ac78 Peter Maydell
                             qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_GPMC_IRQ),
2427 eee0a1c6 Peter Maydell
                             s->drq[OMAP24XX_DMA_GPMC]);
2428 827df9f3 balrog
2429 751c6a17 Gerd Hoffmann
    dinfo = drive_get(IF_SD, 0, 0);
2430 751c6a17 Gerd Hoffmann
    if (!dinfo) {
2431 827df9f3 balrog
        fprintf(stderr, "qemu: missing SecureDigital device\n");
2432 827df9f3 balrog
        exit(1);
2433 827df9f3 balrog
    }
2434 751c6a17 Gerd Hoffmann
    s->mmc = omap2_mmc_init(omap_l4tao(s->l4, 9), dinfo->bdrv,
2435 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_MMC_IRQ),
2436 827df9f3 balrog
                    &s->drq[OMAP24XX_DMA_MMC1_TX],
2437 827df9f3 balrog
                    omap_findclk(s, "mmc_fclk"), omap_findclk(s, "mmc_iclk"));
2438 827df9f3 balrog
2439 827df9f3 balrog
    s->mcspi[0] = omap_mcspi_init(omap_l4ta(s->l4, 35), 4,
2440 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_MCSPI1_IRQ),
2441 827df9f3 balrog
                    &s->drq[OMAP24XX_DMA_SPI1_TX0],
2442 827df9f3 balrog
                    omap_findclk(s, "spi1_fclk"),
2443 827df9f3 balrog
                    omap_findclk(s, "spi1_iclk"));
2444 827df9f3 balrog
    s->mcspi[1] = omap_mcspi_init(omap_l4ta(s->l4, 36), 2,
2445 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_MCSPI2_IRQ),
2446 827df9f3 balrog
                    &s->drq[OMAP24XX_DMA_SPI2_TX0],
2447 827df9f3 balrog
                    omap_findclk(s, "spi2_fclk"),
2448 827df9f3 balrog
                    omap_findclk(s, "spi2_iclk"));
2449 827df9f3 balrog
2450 3023f332 aliguori
    s->dss = omap_dss_init(omap_l4ta(s->l4, 10), 0x68000800,
2451 827df9f3 balrog
                    /* XXX wire M_IRQ_25, D_L2_IRQ_30 and I_IRQ_13 together */
2452 0919ac78 Peter Maydell
                    qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_DSS_IRQ),
2453 0919ac78 Peter Maydell
                           s->drq[OMAP24XX_DMA_DSS],
2454 827df9f3 balrog
                    omap_findclk(s, "dss_clk1"), omap_findclk(s, "dss_clk2"),
2455 827df9f3 balrog
                    omap_findclk(s, "dss_54m_clk"),
2456 827df9f3 balrog
                    omap_findclk(s, "dss_l3_iclk"),
2457 827df9f3 balrog
                    omap_findclk(s, "dss_l4_iclk"));
2458 827df9f3 balrog
2459 54585ffe balrog
    omap_sti_init(omap_l4ta(s->l4, 18), 0x54000000,
2460 0919ac78 Peter Maydell
                  qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_STI),
2461 0919ac78 Peter Maydell
                  omap_findclk(s, "emul_ck"),
2462 54585ffe balrog
                    serial_hds[0] && serial_hds[1] && serial_hds[2] ?
2463 b9d38e95 Blue Swirl
                    serial_hds[3] : NULL);
2464 54585ffe balrog
2465 99570a40 balrog
    s->eac = omap_eac_init(omap_l4ta(s->l4, 32),
2466 0919ac78 Peter Maydell
                           qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_EAC_IRQ),
2467 99570a40 balrog
                    /* Ten consecutive lines */
2468 99570a40 balrog
                    &s->drq[OMAP24XX_DMA_EAC_AC_RD],
2469 99570a40 balrog
                    omap_findclk(s, "func_96m_clk"),
2470 99570a40 balrog
                    omap_findclk(s, "core_l4_iclk"));
2471 99570a40 balrog
2472 827df9f3 balrog
    /* All register mappings (includin those not currenlty implemented):
2473 827df9f3 balrog
     * SystemControlMod        48000000 - 48000fff
2474 827df9f3 balrog
     * SystemControlL4        48001000 - 48001fff
2475 827df9f3 balrog
     * 32kHz Timer Mod        48004000 - 48004fff
2476 827df9f3 balrog
     * 32kHz Timer L4        48005000 - 48005fff
2477 827df9f3 balrog
     * PRCM ModA        48008000 - 480087ff
2478 827df9f3 balrog
     * PRCM ModB        48008800 - 48008fff
2479 827df9f3 balrog
     * PRCM L4                48009000 - 48009fff
2480 827df9f3 balrog
     * TEST-BCM Mod        48012000 - 48012fff
2481 827df9f3 balrog
     * TEST-BCM L4        48013000 - 48013fff
2482 827df9f3 balrog
     * TEST-TAP Mod        48014000 - 48014fff
2483 827df9f3 balrog
     * TEST-TAP L4        48015000 - 48015fff
2484 827df9f3 balrog
     * GPIO1 Mod        48018000 - 48018fff
2485 827df9f3 balrog
     * GPIO Top                48019000 - 48019fff
2486 827df9f3 balrog
     * GPIO2 Mod        4801a000 - 4801afff
2487 827df9f3 balrog
     * GPIO L4                4801b000 - 4801bfff
2488 827df9f3 balrog
     * GPIO3 Mod        4801c000 - 4801cfff
2489 827df9f3 balrog
     * GPIO4 Mod        4801e000 - 4801efff
2490 827df9f3 balrog
     * WDTIMER1 Mod        48020000 - 48010fff
2491 827df9f3 balrog
     * WDTIMER Top        48021000 - 48011fff
2492 827df9f3 balrog
     * WDTIMER2 Mod        48022000 - 48012fff
2493 827df9f3 balrog
     * WDTIMER L4        48023000 - 48013fff
2494 827df9f3 balrog
     * WDTIMER3 Mod        48024000 - 48014fff
2495 827df9f3 balrog
     * WDTIMER3 L4        48025000 - 48015fff
2496 827df9f3 balrog
     * WDTIMER4 Mod        48026000 - 48016fff
2497 827df9f3 balrog
     * WDTIMER4 L4        48027000 - 48017fff
2498 827df9f3 balrog
     * GPTIMER1 Mod        48028000 - 48018fff
2499 827df9f3 balrog
     * GPTIMER1 L4        48029000 - 48019fff
2500 827df9f3 balrog
     * GPTIMER2 Mod        4802a000 - 4801afff
2501 827df9f3 balrog
     * GPTIMER2 L4        4802b000 - 4801bfff
2502 827df9f3 balrog
     * L4-Config AP        48040000 - 480407ff
2503 827df9f3 balrog
     * L4-Config IP        48040800 - 48040fff
2504 827df9f3 balrog
     * L4-Config LA        48041000 - 48041fff
2505 827df9f3 balrog
     * ARM11ETB Mod        48048000 - 48049fff
2506 827df9f3 balrog
     * ARM11ETB L4        4804a000 - 4804afff
2507 827df9f3 balrog
     * DISPLAY Top        48050000 - 480503ff
2508 827df9f3 balrog
     * DISPLAY DISPC        48050400 - 480507ff
2509 827df9f3 balrog
     * DISPLAY RFBI        48050800 - 48050bff
2510 827df9f3 balrog
     * DISPLAY VENC        48050c00 - 48050fff
2511 827df9f3 balrog
     * DISPLAY L4        48051000 - 48051fff
2512 827df9f3 balrog
     * CAMERA Top        48052000 - 480523ff
2513 827df9f3 balrog
     * CAMERA core        48052400 - 480527ff
2514 827df9f3 balrog
     * CAMERA DMA        48052800 - 48052bff
2515 827df9f3 balrog
     * CAMERA MMU        48052c00 - 48052fff
2516 827df9f3 balrog
     * CAMERA L4        48053000 - 48053fff
2517 827df9f3 balrog
     * SDMA Mod                48056000 - 48056fff
2518 827df9f3 balrog
     * SDMA L4                48057000 - 48057fff
2519 827df9f3 balrog
     * SSI Top                48058000 - 48058fff
2520 827df9f3 balrog
     * SSI GDD                48059000 - 48059fff
2521 827df9f3 balrog
     * SSI Port1        4805a000 - 4805afff
2522 827df9f3 balrog
     * SSI Port2        4805b000 - 4805bfff
2523 827df9f3 balrog
     * SSI L4                4805c000 - 4805cfff
2524 827df9f3 balrog
     * USB Mod                4805e000 - 480fefff
2525 827df9f3 balrog
     * USB L4                4805f000 - 480fffff
2526 827df9f3 balrog
     * WIN_TRACER1 Mod        48060000 - 48060fff
2527 827df9f3 balrog
     * WIN_TRACER1 L4        48061000 - 48061fff
2528 827df9f3 balrog
     * WIN_TRACER2 Mod        48062000 - 48062fff
2529 827df9f3 balrog
     * WIN_TRACER2 L4        48063000 - 48063fff
2530 827df9f3 balrog
     * WIN_TRACER3 Mod        48064000 - 48064fff
2531 827df9f3 balrog
     * WIN_TRACER3 L4        48065000 - 48065fff
2532 827df9f3 balrog
     * WIN_TRACER4 Top        48066000 - 480660ff
2533 827df9f3 balrog
     * WIN_TRACER4 ETT        48066100 - 480661ff
2534 827df9f3 balrog
     * WIN_TRACER4 WT        48066200 - 480662ff
2535 827df9f3 balrog
     * WIN_TRACER4 L4        48067000 - 48067fff
2536 827df9f3 balrog
     * XTI Mod                48068000 - 48068fff
2537 827df9f3 balrog
     * XTI L4                48069000 - 48069fff
2538 827df9f3 balrog
     * UART1 Mod        4806a000 - 4806afff
2539 827df9f3 balrog
     * UART1 L4                4806b000 - 4806bfff
2540 827df9f3 balrog
     * UART2 Mod        4806c000 - 4806cfff
2541 827df9f3 balrog
     * UART2 L4                4806d000 - 4806dfff
2542 827df9f3 balrog
     * UART3 Mod        4806e000 - 4806efff
2543 827df9f3 balrog
     * UART3 L4                4806f000 - 4806ffff
2544 827df9f3 balrog
     * I2C1 Mod                48070000 - 48070fff
2545 827df9f3 balrog
     * I2C1 L4                48071000 - 48071fff
2546 827df9f3 balrog
     * I2C2 Mod                48072000 - 48072fff
2547 827df9f3 balrog
     * I2C2 L4                48073000 - 48073fff
2548 827df9f3 balrog
     * McBSP1 Mod        48074000 - 48074fff
2549 827df9f3 balrog
     * McBSP1 L4        48075000 - 48075fff
2550 827df9f3 balrog
     * McBSP2 Mod        48076000 - 48076fff
2551 827df9f3 balrog
     * McBSP2 L4        48077000 - 48077fff
2552 827df9f3 balrog
     * GPTIMER3 Mod        48078000 - 48078fff
2553 827df9f3 balrog
     * GPTIMER3 L4        48079000 - 48079fff
2554 827df9f3 balrog
     * GPTIMER4 Mod        4807a000 - 4807afff
2555 827df9f3 balrog
     * GPTIMER4 L4        4807b000 - 4807bfff
2556 827df9f3 balrog
     * GPTIMER5 Mod        4807c000 - 4807cfff
2557 827df9f3 balrog
     * GPTIMER5 L4        4807d000 - 4807dfff
2558 827df9f3 balrog
     * GPTIMER6 Mod        4807e000 - 4807efff
2559 827df9f3 balrog
     * GPTIMER6 L4        4807f000 - 4807ffff
2560 827df9f3 balrog
     * GPTIMER7 Mod        48080000 - 48080fff
2561 827df9f3 balrog
     * GPTIMER7 L4        48081000 - 48081fff
2562 827df9f3 balrog
     * GPTIMER8 Mod        48082000 - 48082fff
2563 827df9f3 balrog
     * GPTIMER8 L4        48083000 - 48083fff
2564 827df9f3 balrog
     * GPTIMER9 Mod        48084000 - 48084fff
2565 827df9f3 balrog
     * GPTIMER9 L4        48085000 - 48085fff
2566 827df9f3 balrog
     * GPTIMER10 Mod        48086000 - 48086fff
2567 827df9f3 balrog
     * GPTIMER10 L4        48087000 - 48087fff
2568 827df9f3 balrog
     * GPTIMER11 Mod        48088000 - 48088fff
2569 827df9f3 balrog
     * GPTIMER11 L4        48089000 - 48089fff
2570 827df9f3 balrog
     * GPTIMER12 Mod        4808a000 - 4808afff
2571 827df9f3 balrog
     * GPTIMER12 L4        4808b000 - 4808bfff
2572 827df9f3 balrog
     * EAC Mod                48090000 - 48090fff
2573 827df9f3 balrog
     * EAC L4                48091000 - 48091fff
2574 827df9f3 balrog
     * FAC Mod                48092000 - 48092fff
2575 827df9f3 balrog
     * FAC L4                48093000 - 48093fff
2576 827df9f3 balrog
     * MAILBOX Mod        48094000 - 48094fff
2577 827df9f3 balrog
     * MAILBOX L4        48095000 - 48095fff
2578 827df9f3 balrog
     * SPI1 Mod                48098000 - 48098fff
2579 827df9f3 balrog
     * SPI1 L4                48099000 - 48099fff
2580 827df9f3 balrog
     * SPI2 Mod                4809a000 - 4809afff
2581 827df9f3 balrog
     * SPI2 L4                4809b000 - 4809bfff
2582 827df9f3 balrog
     * MMC/SDIO Mod        4809c000 - 4809cfff
2583 827df9f3 balrog
     * MMC/SDIO L4        4809d000 - 4809dfff
2584 827df9f3 balrog
     * MS_PRO Mod        4809e000 - 4809efff
2585 827df9f3 balrog
     * MS_PRO L4        4809f000 - 4809ffff
2586 827df9f3 balrog
     * RNG Mod                480a0000 - 480a0fff
2587 827df9f3 balrog
     * RNG L4                480a1000 - 480a1fff
2588 827df9f3 balrog
     * DES3DES Mod        480a2000 - 480a2fff
2589 827df9f3 balrog
     * DES3DES L4        480a3000 - 480a3fff
2590 827df9f3 balrog
     * SHA1MD5 Mod        480a4000 - 480a4fff
2591 827df9f3 balrog
     * SHA1MD5 L4        480a5000 - 480a5fff
2592 827df9f3 balrog
     * AES Mod                480a6000 - 480a6fff
2593 827df9f3 balrog
     * AES L4                480a7000 - 480a7fff
2594 827df9f3 balrog
     * PKA Mod                480a8000 - 480a9fff
2595 827df9f3 balrog
     * PKA L4                480aa000 - 480aafff
2596 827df9f3 balrog
     * MG Mod                480b0000 - 480b0fff
2597 827df9f3 balrog
     * MG L4                480b1000 - 480b1fff
2598 827df9f3 balrog
     * HDQ/1-wire Mod        480b2000 - 480b2fff
2599 827df9f3 balrog
     * HDQ/1-wire L4        480b3000 - 480b3fff
2600 827df9f3 balrog
     * MPU interrupt        480fe000 - 480fefff
2601 54585ffe balrog
     * STI channel base        54000000 - 5400ffff
2602 827df9f3 balrog
     * IVA RAM                5c000000 - 5c01ffff
2603 827df9f3 balrog
     * IVA ROM                5c020000 - 5c027fff
2604 827df9f3 balrog
     * IMG_BUF_A        5c040000 - 5c040fff
2605 827df9f3 balrog
     * IMG_BUF_B        5c042000 - 5c042fff
2606 827df9f3 balrog
     * VLCDS                5c048000 - 5c0487ff
2607 827df9f3 balrog
     * IMX_COEF                5c049000 - 5c04afff
2608 827df9f3 balrog
     * IMX_CMD                5c051000 - 5c051fff
2609 827df9f3 balrog
     * VLCDQ                5c053000 - 5c0533ff
2610 827df9f3 balrog
     * VLCDH                5c054000 - 5c054fff
2611 827df9f3 balrog
     * SEQ_CMD                5c055000 - 5c055fff
2612 827df9f3 balrog
     * IMX_REG                5c056000 - 5c0560ff
2613 827df9f3 balrog
     * VLCD_REG                5c056100 - 5c0561ff
2614 827df9f3 balrog
     * SEQ_REG                5c056200 - 5c0562ff
2615 827df9f3 balrog
     * IMG_BUF_REG        5c056300 - 5c0563ff
2616 827df9f3 balrog
     * SEQIRQ_REG        5c056400 - 5c0564ff
2617 827df9f3 balrog
     * OCP_REG                5c060000 - 5c060fff
2618 827df9f3 balrog
     * SYSC_REG                5c070000 - 5c070fff
2619 827df9f3 balrog
     * MMU_REG                5d000000 - 5d000fff
2620 827df9f3 balrog
     * sDMA R                68000400 - 680005ff
2621 827df9f3 balrog
     * sDMA W                68000600 - 680007ff
2622 827df9f3 balrog
     * Display Control        68000800 - 680009ff
2623 827df9f3 balrog
     * DSP subsystem        68000a00 - 68000bff
2624 827df9f3 balrog
     * MPU subsystem        68000c00 - 68000dff
2625 827df9f3 balrog
     * IVA subsystem        68001000 - 680011ff
2626 827df9f3 balrog
     * USB                68001200 - 680013ff
2627 827df9f3 balrog
     * Camera                68001400 - 680015ff
2628 827df9f3 balrog
     * VLYNQ (firewall)        68001800 - 68001bff
2629 827df9f3 balrog
     * VLYNQ                68001e00 - 68001fff
2630 827df9f3 balrog
     * SSI                68002000 - 680021ff
2631 827df9f3 balrog
     * L4                68002400 - 680025ff
2632 827df9f3 balrog
     * DSP (firewall)        68002800 - 68002bff
2633 827df9f3 balrog
     * DSP subsystem        68002e00 - 68002fff
2634 827df9f3 balrog
     * IVA (firewall)        68003000 - 680033ff
2635 827df9f3 balrog
     * IVA                68003600 - 680037ff
2636 827df9f3 balrog
     * GFX                68003a00 - 68003bff
2637 827df9f3 balrog
     * CMDWR emulation        68003c00 - 68003dff
2638 827df9f3 balrog
     * SMS                68004000 - 680041ff
2639 827df9f3 balrog
     * OCM                68004200 - 680043ff
2640 827df9f3 balrog
     * GPMC                68004400 - 680045ff
2641 827df9f3 balrog
     * RAM (firewall)        68005000 - 680053ff
2642 827df9f3 balrog
     * RAM (err login)        68005400 - 680057ff
2643 827df9f3 balrog
     * ROM (firewall)        68005800 - 68005bff
2644 827df9f3 balrog
     * ROM (err login)        68005c00 - 68005fff
2645 827df9f3 balrog
     * GPMC (firewall)        68006000 - 680063ff
2646 827df9f3 balrog
     * GPMC (err login)        68006400 - 680067ff
2647 827df9f3 balrog
     * SMS (err login)        68006c00 - 68006fff
2648 827df9f3 balrog
     * SMS registers        68008000 - 68008fff
2649 827df9f3 balrog
     * SDRC registers        68009000 - 68009fff
2650 827df9f3 balrog
     * GPMC registers        6800a000   6800afff
2651 827df9f3 balrog
     */
2652 827df9f3 balrog
2653 a08d4367 Jan Kiszka
    qemu_register_reset(omap2_mpu_reset, s);
2654 827df9f3 balrog
2655 827df9f3 balrog
    return s;
2656 827df9f3 balrog
}