Statistics
| Branch: | Revision:

root / hw / omap2.c @ a1bc20df

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