~vcs-imports/qemu/maemo

« back to all changes in this revision

Viewing changes to hw/omap3_usb.c

  • Committer: Riku Voipio
  • Date: 2009-05-22 14:25:00 UTC
  • mfrom: (6446.1.1)
  • Revision ID: git-v1:705bf6326a6557323dfcd3c3183c9095f6ed178a
Merge commit 'juri/riku-devel'

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
#include "hw.h"
27
27
 
28
28
#define OMAP3_HSUSB_OTG
29
 
//#define OMAP3_HSUSB_HOST
 
29
#define OMAP3_HSUSB_HOST
30
30
 
31
 
/* #define OMAP3_HSUSB_DEBUG */
 
31
#define OMAP3_HSUSB_DEBUG
32
32
 
33
33
#ifdef OMAP3_HSUSB_DEBUG
34
34
#define TRACE(fmt,...) fprintf(stderr, "%s: " fmt "\n", __FUNCTION__, ##__VA_ARGS__)
214
214
static void omap3_hsusb_musb_core_intr(void *opaque, int source, int level)
215
215
{
216
216
    struct omap3_hsusb_otg_s *s = (struct omap3_hsusb_otg_s *)opaque;
217
 
    TRACE("intr 0x%08x, 0x%08x, 0x%08x", source, level, musb_core_intr_get(s->musb));
218
 
    switch (source) {
219
 
    case musb_set_vbus:
220
 
       TRACE("ignoring VBUS");
221
 
       break;
222
 
    case musb_set_session:
223
 
       TRACE("ignoring SESSION");
224
 
       break;
225
 
    case musb_irq_tx:
226
 
    case musb_irq_rx:
227
 
       TRACE("rxtx");
228
 
       break;
229
 
       /* Fall through */
230
 
    default:
231
 
       TRACE("other");
232
 
    }
 
217
    /*TRACE("intr 0x%08x, 0x%08x, 0x%08x", source, level, musb_core_intr_get(s->musb));*/
233
218
    qemu_set_irq(s->mc_irq, level);
234
219
}
235
220
 
265
250
    uint32_t uhh_sysconfig;
266
251
    uint32_t uhh_hostconfig;
267
252
    uint32_t uhh_debug_csr;
 
253
    uint32_t tll_sysconfig;
 
254
    uint32_t insnreg05_ulpi;
268
255
};
269
256
 
270
257
static void omap3_hsusb_host_save_state(QEMUFile *f, void *opaque)
274
261
    qemu_put_be32(f, s->uhh_sysconfig);
275
262
    qemu_put_be32(f, s->uhh_hostconfig);
276
263
    qemu_put_be32(f, s->uhh_debug_csr);
 
264
    qemu_put_be32(f, s->tll_sysconfig);
 
265
    qemu_put_be32(f, s->insnreg05_ulpi);
277
266
}
278
267
 
279
268
static int omap3_hsusb_host_load_state(QEMUFile *f, void *opaque,
287
276
    s->uhh_sysconfig = qemu_get_be32(f);
288
277
    s->uhh_hostconfig = qemu_get_be32(f);
289
278
    s->uhh_debug_csr = qemu_get_be32(f);
 
279
    s->tll_sysconfig = qemu_get_be32(f);
 
280
    s->insnreg05_ulpi = qemu_get_be32(f);
290
281
    
291
282
    return 0;
292
283
}
297
288
    s->uhh_hostconfig = 0x700;
298
289
    s->uhh_debug_csr = 0x20;
299
290
    /* TODO: perform OHCI & EHCI reset */
 
291
    s->tll_sysconfig = 1;
300
292
}
301
293
 
302
294
static uint32_t omap3_hsusb_host_read(void *opaque, target_phys_addr_t addr)
303
295
{
304
296
    struct omap3_hsusb_host_s *s = (struct omap3_hsusb_host_s *)opaque;
305
 
    
 
297
    TRACE(OMAP_FMT_plx, addr);
 
298
 
306
299
    switch (addr) {
307
300
        case 0x00: /* UHH_REVISION */
308
301
            return 0x10;
325
318
                                   uint32_t value)
326
319
{
327
320
    struct omap3_hsusb_host_s *s = (struct omap3_hsusb_host_s *)opaque;
328
 
    
 
321
    TRACE(OMAP_FMT_plx " = 0x%08x", addr, value);
 
322
 
329
323
    switch (addr) {
330
324
        case 0x00: /* UHH_REVISION */
331
325
        case 0x14: /* UHH_SYSSTATUS */
363
357
 
364
358
static uint32_t omap3_hsusb_ehci_read(void *opaque, target_phys_addr_t addr)
365
359
{
 
360
    struct omap3_hsusb_host_s *s = (struct omap3_hsusb_host_s *)opaque;
366
361
    TRACE(OMAP_FMT_plx, addr);
 
362
    switch (addr) {
 
363
        case 0xa4: /* INSNREG05_ULPI */
 
364
            return s->insnreg05_ulpi;
 
365
        default:
 
366
            break;
 
367
    }
367
368
    return 0;
368
369
}
369
370
 
370
371
static void omap3_hsusb_ehci_write(void *opaque, target_phys_addr_t addr,
371
372
                                   uint32_t value)
372
373
{
 
374
    struct omap3_hsusb_host_s *s = (struct omap3_hsusb_host_s *)opaque;
373
375
    TRACE(OMAP_FMT_plx " = 0x%08x", addr, value);
 
376
 
 
377
    switch (addr) {
 
378
        case 0xa4: /* INSNREG05_ULPI */
 
379
            s->insnreg05_ulpi = value & 0xF0000000;
 
380
        default:
 
381
            break;
 
382
     }
374
383
}
375
384
 
376
385
static CPUReadMemoryFunc *omap3_hsusb_ehci_readfn[] = {
387
396
 
388
397
static uint32_t omap3_hsusb_tll_read(void *opaque, target_phys_addr_t addr)
389
398
{
 
399
    struct omap3_hsusb_host_s *s = (struct omap3_hsusb_host_s *)opaque;
390
400
    TRACE(OMAP_FMT_plx, addr);
 
401
 
 
402
    switch (addr) {
 
403
        case 0x00: /* USBTLL_REVISION */
 
404
            return 0x1;
 
405
        case 0x10: /* USBTLL_SYSCONFIG */
 
406
            return s->tll_sysconfig;
 
407
        case 0x14: /* USBTLL_SYSSTATUS */
 
408
            return 0x1; /* RESETDONE */
 
409
        case 0x18: /* USBTLL_IRQSTATUS */
 
410
            return 0;
 
411
        case 0x1C: /* USBTLL_IRQENABLE */
 
412
            return 0;
 
413
        default:
 
414
            break;
 
415
    }
391
416
    return 0;
392
417
}
393
418
 
394
419
static void omap3_hsusb_tll_write(void *opaque, target_phys_addr_t addr,
395
420
                                  uint32_t value)
396
421
{
 
422
    struct omap3_hsusb_host_s *s = (struct omap3_hsusb_host_s *)opaque;
397
423
    TRACE(OMAP_FMT_plx " = 0x%08x", addr, value);
 
424
 
 
425
    switch (addr) {
 
426
        case 0x00: /* USBTLL_REVISION */
 
427
        case 0x14: /* USBTLL_SYSSTATUS */
 
428
            OMAP_RO_REGV(addr, value);
 
429
        case 0x10: /* USBTLL_SYSCONFIG */
 
430
            s->tll_sysconfig = value & 0xFFFFFEE0;;
 
431
        default:
 
432
            OMAP_BAD_REGV(addr, value);
 
433
            break;
 
434
    }
398
435
}
399
436
 
400
437
static CPUReadMemoryFunc *omap3_hsusb_tll_readfn[] = {
427
464
                                                     omap3_hsusb_host_readfn,
428
465
                                                     omap3_hsusb_host_writefn,
429
466
                                                     s));
430
 
    omap_l4_attach(host_ta, 1, usb_ohci_init_omap(omap_l4_base(host_ta, 1),
 
467
/*    omap_l4_attach(host_ta, 1, usb_ohci_init_omap(omap_l4_base(host_ta, 1),
431
468
                                                  omap_l4_size(host_ta, 1),
432
 
                                                  3, ohci_irq));
 
469
                                                  3, ohci_irq));*/
433
470
    omap_l4_attach(host_ta, 2, l4_register_io_memory(0,
434
471
                                                     omap3_hsusb_ehci_readfn,
435
472
                                                     omap3_hsusb_ehci_writefn,