Commit f451387ac0127b076563fa5bce26e1c2763ccbbd
1 parent
c19148bd
Fix OMAP GPMC register offsets and SYSCTL 8bit io (Kyungmin Park).
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4943 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
54 additions
and
3 deletions
hw/omap2.c
| ... | ... | @@ -3528,6 +3528,32 @@ struct omap_sysctl_s { |
| 3528 | 3528 | uint32_t msuspendmux[5]; |
| 3529 | 3529 | }; |
| 3530 | 3530 | |
| 3531 | +static uint32_t omap_sysctl_read8(void *opaque, target_phys_addr_t addr) | |
| 3532 | +{ | |
| 3533 | + | |
| 3534 | + struct omap_sysctl_s *s = (struct omap_sysctl_s *) opaque; | |
| 3535 | + int offset = addr - s->base; | |
| 3536 | + int pad_offset, byte_offset; | |
| 3537 | + int value; | |
| 3538 | + | |
| 3539 | + switch (offset) { | |
| 3540 | + case 0x030 ... 0x140: /* CONTROL_PADCONF - only used in the POP */ | |
| 3541 | + pad_offset = (offset - 0x30) >> 2; | |
| 3542 | + byte_offset = (offset - 0x30) & (4 - 1); | |
| 3543 | + | |
| 3544 | + value = s->padconf[pad_offset]; | |
| 3545 | + value = (value >> (byte_offset * 8)) & 0xff; | |
| 3546 | + | |
| 3547 | + return value; | |
| 3548 | + | |
| 3549 | + default: | |
| 3550 | + break; | |
| 3551 | + } | |
| 3552 | + | |
| 3553 | + OMAP_BAD_REG(addr); | |
| 3554 | + return 0; | |
| 3555 | +} | |
| 3556 | + | |
| 3531 | 3557 | static uint32_t omap_sysctl_read(void *opaque, target_phys_addr_t addr) |
| 3532 | 3558 | { |
| 3533 | 3559 | struct omap_sysctl_s *s = (struct omap_sysctl_s *) opaque; |
| ... | ... | @@ -3629,6 +3655,31 @@ static uint32_t omap_sysctl_read(void *opaque, target_phys_addr_t addr) |
| 3629 | 3655 | return 0; |
| 3630 | 3656 | } |
| 3631 | 3657 | |
| 3658 | +static void omap_sysctl_write8(void *opaque, target_phys_addr_t addr, | |
| 3659 | + uint32_t value) | |
| 3660 | +{ | |
| 3661 | + struct omap_sysctl_s *s = (struct omap_sysctl_s *) opaque; | |
| 3662 | + int offset = addr - s->base; | |
| 3663 | + int pad_offset, byte_offset; | |
| 3664 | + int prev_value; | |
| 3665 | + | |
| 3666 | + switch (offset) { | |
| 3667 | + case 0x030 ... 0x140: /* CONTROL_PADCONF - only used in the POP */ | |
| 3668 | + pad_offset = (offset - 0x30) >> 2; | |
| 3669 | + byte_offset = (offset - 0x30) & (4 - 1); | |
| 3670 | + | |
| 3671 | + prev_value = s->padconf[pad_offset]; | |
| 3672 | + prev_value &= ~(0xff << (byte_offset * 8)); | |
| 3673 | + prev_value |= ((value & 0x1f1f1f1f) << (byte_offset * 8)) & 0x1f1f1f1f; | |
| 3674 | + s->padconf[pad_offset] = prev_value; | |
| 3675 | + break; | |
| 3676 | + | |
| 3677 | + default: | |
| 3678 | + OMAP_BAD_REG(addr); | |
| 3679 | + break; | |
| 3680 | + } | |
| 3681 | +} | |
| 3682 | + | |
| 3632 | 3683 | static void omap_sysctl_write(void *opaque, target_phys_addr_t addr, |
| 3633 | 3684 | uint32_t value) |
| 3634 | 3685 | { |
| ... | ... | @@ -3726,13 +3777,13 @@ static void omap_sysctl_write(void *opaque, target_phys_addr_t addr, |
| 3726 | 3777 | } |
| 3727 | 3778 | |
| 3728 | 3779 | static CPUReadMemoryFunc *omap_sysctl_readfn[] = { |
| 3729 | - omap_badwidth_read32, /* TODO */ | |
| 3780 | + omap_sysctl_read8, | |
| 3730 | 3781 | omap_badwidth_read32, /* TODO */ |
| 3731 | 3782 | omap_sysctl_read, |
| 3732 | 3783 | }; |
| 3733 | 3784 | |
| 3734 | 3785 | static CPUWriteMemoryFunc *omap_sysctl_writefn[] = { |
| 3735 | - omap_badwidth_write32, /* TODO */ | |
| 3786 | + omap_sysctl_write8, | |
| 3736 | 3787 | omap_badwidth_write32, /* TODO */ |
| 3737 | 3788 | omap_sysctl_write, |
| 3738 | 3789 | }; |
| ... | ... | @@ -4139,7 +4190,7 @@ static uint32_t omap_gpmc_read(void *opaque, target_phys_addr_t addr) |
| 4139 | 4190 | cs = (offset - 0x060) / 0x30; |
| 4140 | 4191 | offset -= cs * 0x30; |
| 4141 | 4192 | f = s->cs_file + cs; |
| 4142 | - switch (offset - cs * 0x30) { | |
| 4193 | + switch (offset) { | |
| 4143 | 4194 | case 0x60: /* GPMC_CONFIG1 */ |
| 4144 | 4195 | return f->config[0]; |
| 4145 | 4196 | case 0x64: /* GPMC_CONFIG2 */ | ... | ... |