Revision 8da3ff18 hw/musicpal.c
b/hw/musicpal.c | ||
---|---|---|
239 | 239 |
static const char audio_name[] = "mv88w8618"; |
240 | 240 |
|
241 | 241 |
typedef struct musicpal_audio_state { |
242 |
uint32_t base; |
|
243 | 242 |
qemu_irq irq; |
244 | 243 |
uint32_t playback_mode; |
245 | 244 |
uint32_t status; |
... | ... | |
334 | 333 |
{ |
335 | 334 |
musicpal_audio_state *s = opaque; |
336 | 335 |
|
337 |
offset -= s->base; |
|
338 | 336 |
switch (offset) { |
339 | 337 |
case MP_AUDIO_PLAYBACK_MODE: |
340 | 338 |
return s->playback_mode; |
... | ... | |
361 | 359 |
{ |
362 | 360 |
musicpal_audio_state *s = opaque; |
363 | 361 |
|
364 |
offset -= s->base; |
|
365 | 362 |
switch (offset) { |
366 | 363 |
case MP_AUDIO_PLAYBACK_MODE: |
367 | 364 |
if (value & MP_AUDIO_PLAYBACK_EN && |
... | ... | |
448 | 445 |
s = qemu_mallocz(sizeof(musicpal_audio_state)); |
449 | 446 |
if (!s) |
450 | 447 |
return NULL; |
451 |
s->base = base; |
|
452 | 448 |
s->irq = irq; |
453 | 449 |
|
454 | 450 |
i2c = qemu_mallocz(sizeof(i2c_interface)); |
... | ... | |
549 | 545 |
} mv88w8618_rx_desc; |
550 | 546 |
|
551 | 547 |
typedef struct mv88w8618_eth_state { |
552 |
uint32_t base; |
|
553 | 548 |
qemu_irq irq; |
554 | 549 |
uint32_t smir; |
555 | 550 |
uint32_t icr; |
... | ... | |
617 | 612 |
{ |
618 | 613 |
mv88w8618_eth_state *s = opaque; |
619 | 614 |
|
620 |
offset -= s->base; |
|
621 | 615 |
switch (offset) { |
622 | 616 |
case MP_ETH_SMIR: |
623 | 617 |
if (s->smir & MP_ETH_SMIR_OPCODE) { |
... | ... | |
660 | 654 |
{ |
661 | 655 |
mv88w8618_eth_state *s = opaque; |
662 | 656 |
|
663 |
offset -= s->base; |
|
664 | 657 |
switch (offset) { |
665 | 658 |
case MP_ETH_SMIR: |
666 | 659 |
s->smir = value; |
... | ... | |
724 | 717 |
s = qemu_mallocz(sizeof(mv88w8618_eth_state)); |
725 | 718 |
if (!s) |
726 | 719 |
return; |
727 |
s->base = base; |
|
728 | 720 |
s->irq = irq; |
729 | 721 |
s->vc = qemu_new_vlan_client(nd->vlan, eth_receive, eth_can_receive, s); |
730 | 722 |
iomemtype = cpu_register_io_memory(0, mv88w8618_eth_readfn, |
... | ... | |
752 | 744 |
#define MP_LCD_TEXTCOLOR 0xe0e0ff /* RRGGBB */ |
753 | 745 |
|
754 | 746 |
typedef struct musicpal_lcd_state { |
755 |
uint32_t base; |
|
756 | 747 |
uint32_t mode; |
757 | 748 |
uint32_t irqctrl; |
758 | 749 |
int page; |
... | ... | |
852 | 843 |
{ |
853 | 844 |
musicpal_lcd_state *s = opaque; |
854 | 845 |
|
855 |
offset -= s->base; |
|
856 | 846 |
switch (offset) { |
857 | 847 |
case MP_LCD_IRQCTRL: |
858 | 848 |
return s->irqctrl; |
... | ... | |
867 | 857 |
{ |
868 | 858 |
musicpal_lcd_state *s = opaque; |
869 | 859 |
|
870 |
offset -= s->base; |
|
871 | 860 |
switch (offset) { |
872 | 861 |
case MP_LCD_IRQCTRL: |
873 | 862 |
s->irqctrl = value; |
... | ... | |
922 | 911 |
s = qemu_mallocz(sizeof(musicpal_lcd_state)); |
923 | 912 |
if (!s) |
924 | 913 |
return; |
925 |
s->base = base; |
|
926 | 914 |
s->ds = ds; |
927 | 915 |
iomemtype = cpu_register_io_memory(0, musicpal_lcd_readfn, |
928 | 916 |
musicpal_lcd_writefn, s); |
... | ... | |
940 | 928 |
|
941 | 929 |
typedef struct mv88w8618_pic_state |
942 | 930 |
{ |
943 |
uint32_t base; |
|
944 | 931 |
uint32_t level; |
945 | 932 |
uint32_t enabled; |
946 | 933 |
qemu_irq parent_irq; |
... | ... | |
966 | 953 |
{ |
967 | 954 |
mv88w8618_pic_state *s = opaque; |
968 | 955 |
|
969 |
offset -= s->base; |
|
970 | 956 |
switch (offset) { |
971 | 957 |
case MP_PIC_STATUS: |
972 | 958 |
return s->level & s->enabled; |
... | ... | |
981 | 967 |
{ |
982 | 968 |
mv88w8618_pic_state *s = opaque; |
983 | 969 |
|
984 |
offset -= s->base; |
|
985 | 970 |
switch (offset) { |
986 | 971 |
case MP_PIC_ENABLE_SET: |
987 | 972 |
s->enabled |= value; |
... | ... | |
1025 | 1010 |
if (!s) |
1026 | 1011 |
return NULL; |
1027 | 1012 |
qi = qemu_allocate_irqs(mv88w8618_pic_set_irq, s, 32); |
1028 |
s->base = base; |
|
1029 | 1013 |
s->parent_irq = parent_irq; |
1030 | 1014 |
iomemtype = cpu_register_io_memory(0, mv88w8618_pic_readfn, |
1031 | 1015 |
mv88w8618_pic_writefn, s); |
... | ... | |
1059 | 1043 |
typedef struct mv88w8618_pit_state { |
1060 | 1044 |
void *timer[4]; |
1061 | 1045 |
uint32_t control; |
1062 |
uint32_t base; |
|
1063 | 1046 |
} mv88w8618_pit_state; |
1064 | 1047 |
|
1065 | 1048 |
static void mv88w8618_timer_tick(void *opaque) |
... | ... | |
1089 | 1072 |
mv88w8618_pit_state *s = opaque; |
1090 | 1073 |
mv88w8618_timer_state *t; |
1091 | 1074 |
|
1092 |
offset -= s->base; |
|
1093 | 1075 |
switch (offset) { |
1094 | 1076 |
case MP_PIT_TIMER1_VALUE ... MP_PIT_TIMER4_VALUE: |
1095 | 1077 |
t = s->timer[(offset-MP_PIT_TIMER1_VALUE) >> 2]; |
... | ... | |
1107 | 1089 |
mv88w8618_timer_state *t; |
1108 | 1090 |
int i; |
1109 | 1091 |
|
1110 |
offset -= s->base; |
|
1111 | 1092 |
switch (offset) { |
1112 | 1093 |
case MP_PIT_TIMER1_LENGTH ... MP_PIT_TIMER4_LENGTH: |
1113 | 1094 |
t = s->timer[offset >> 2]; |
... | ... | |
1155 | 1136 |
if (!s) |
1156 | 1137 |
return; |
1157 | 1138 |
|
1158 |
s->base = base; |
|
1159 | 1139 |
/* Letting them all run at 1 MHz is likely just a pragmatic |
1160 | 1140 |
* simplification. */ |
1161 | 1141 |
s->timer[0] = mv88w8618_timer_init(1000000, pic[irq]); |
... | ... | |
1172 | 1152 |
#define MP_FLASHCFG_CFGR0 0x04 |
1173 | 1153 |
|
1174 | 1154 |
typedef struct mv88w8618_flashcfg_state { |
1175 |
uint32_t base; |
|
1176 | 1155 |
uint32_t cfgr0; |
1177 | 1156 |
} mv88w8618_flashcfg_state; |
1178 | 1157 |
|
... | ... | |
1181 | 1160 |
{ |
1182 | 1161 |
mv88w8618_flashcfg_state *s = opaque; |
1183 | 1162 |
|
1184 |
offset -= s->base; |
|
1185 | 1163 |
switch (offset) { |
1186 | 1164 |
case MP_FLASHCFG_CFGR0: |
1187 | 1165 |
return s->cfgr0; |
... | ... | |
1196 | 1174 |
{ |
1197 | 1175 |
mv88w8618_flashcfg_state *s = opaque; |
1198 | 1176 |
|
1199 |
offset -= s->base; |
|
1200 | 1177 |
switch (offset) { |
1201 | 1178 |
case MP_FLASHCFG_CFGR0: |
1202 | 1179 |
s->cfgr0 = value; |
... | ... | |
1225 | 1202 |
if (!s) |
1226 | 1203 |
return; |
1227 | 1204 |
|
1228 |
s->base = base; |
|
1229 | 1205 |
s->cfgr0 = 0xfffe4285; /* Default as set by U-Boot for 8 MB flash */ |
1230 | 1206 |
iomemtype = cpu_register_io_memory(0, mv88w8618_flashcfg_readfn, |
1231 | 1207 |
mv88w8618_flashcfg_writefn, s); |
... | ... | |
1266 | 1242 |
|
1267 | 1243 |
static uint32_t musicpal_read(void *opaque, target_phys_addr_t offset) |
1268 | 1244 |
{ |
1269 |
offset -= 0x80000000; |
|
1270 | 1245 |
switch (offset) { |
1271 | 1246 |
case MP_BOARD_REVISION: |
1272 | 1247 |
return 0x0031; |
... | ... | |
1307 | 1282 |
static void musicpal_write(void *opaque, target_phys_addr_t offset, |
1308 | 1283 |
uint32_t value) |
1309 | 1284 |
{ |
1310 |
offset -= 0x80000000; |
|
1311 | 1285 |
switch (offset) { |
1312 | 1286 |
case MP_GPIO_OE_HI: /* used for LCD brightness control */ |
1313 | 1287 |
lcd_brightness = (lcd_brightness & MP_GPIO_LCD_BRIGHTNESS) | |
Also available in: Unified diff