Revision 8da3ff18 hw/mcf5208.c

b/hw/mcf5208.c
40 40
        qemu_irq_lower(s->irq);
41 41
}
42 42

  
43
static void m5208_timer_write(m5208_timer_state *s, int offset,
43
static void m5208_timer_write(void *opaque, target_phys_addr_t offset,
44 44
                              uint32_t value)
45 45
{
46
    m5208_timer_state *s = (m5208_timer_state *)opaque;
46 47
    int prescale;
47 48
    int limit;
48 49
    switch (offset) {
......
88 89
    case 4:
89 90
        break;
90 91
    default:
91
        /* Should never happen.  */
92
        abort();
92
        cpu_abort(cpu_single_env, "m5208_timer_write: Bad offset 0x%x\n",
93
                  (int)offset);
94
        break;
93 95
    }
94 96
    m5208_timer_update(s);
95 97
}
......
101 103
    m5208_timer_update(s);
102 104
}
103 105

  
104
typedef struct {
105
    m5208_timer_state timer[2];
106
} m5208_sys_state;
106
static uint32_t m5208_timer_read(void *opaque, target_phys_addr_t addr)
107
{
108
    m5208_timer_state *s = (m5208_timer_state *)opaque;
109
    switch (addr) {
110
    case 0:
111
        return s->pcsr;
112
    case 2:
113
        return s->pmr;
114
    case 4:
115
        return ptimer_get_count(s->timer);
116
    default:
117
        cpu_abort(cpu_single_env, "m5208_timer_read: Bad offset 0x%x\n",
118
                  (int)addr);
119
        return 0;
120
    }
121
}
122

  
123
static CPUReadMemoryFunc *m5208_timer_readfn[] = {
124
   m5208_timer_read,
125
   m5208_timer_read,
126
   m5208_timer_read
127
};
128

  
129
static CPUWriteMemoryFunc *m5208_timer_writefn[] = {
130
   m5208_timer_write,
131
   m5208_timer_write,
132
   m5208_timer_write
133
};
107 134

  
108 135
static uint32_t m5208_sys_read(void *opaque, target_phys_addr_t addr)
109 136
{
110
    m5208_sys_state *s = (m5208_sys_state *)opaque;
111 137
    switch (addr) {
112
    /* PIT0 */
113
    case 0xfc080000:
114
        return s->timer[0].pcsr;
115
    case 0xfc080002:
116
        return s->timer[0].pmr;
117
    case 0xfc080004:
118
        return ptimer_get_count(s->timer[0].timer);
119
    /* PIT1 */
120
    case 0xfc084000:
121
        return s->timer[1].pcsr;
122
    case 0xfc084002:
123
        return s->timer[1].pmr;
124
    case 0xfc084004:
125
        return ptimer_get_count(s->timer[1].timer);
126

  
127
    /* SDRAM Controller.  */
128
    case 0xfc0a8110: /* SDCS0 */
138
    case 0x110: /* SDCS0 */
129 139
        {
130 140
            int n;
131 141
            for (n = 0; n < 32; n++) {
......
134 144
            }
135 145
            return (n - 1)  | 0x40000000;
136 146
        }
137
    case 0xfc0a8114: /* SDCS1 */
147
    case 0x114: /* SDCS1 */
138 148
        return 0;
139 149

  
140 150
    default:
......
147 157
static void m5208_sys_write(void *opaque, target_phys_addr_t addr,
148 158
                            uint32_t value)
149 159
{
150
    m5208_sys_state *s = (m5208_sys_state *)opaque;
151
    switch (addr) {
152
    /* PIT0 */
153
    case 0xfc080000:
154
    case 0xfc080002:
155
    case 0xfc080004:
156
        m5208_timer_write(&s->timer[0], addr & 0xf, value);
157
        return;
158
    /* PIT1 */
159
    case 0xfc084000:
160
    case 0xfc084002:
161
    case 0xfc084004:
162
        m5208_timer_write(&s->timer[1], addr & 0xf, value);
163
        return;
164
    default:
165
        cpu_abort(cpu_single_env, "m5208_sys_write: Bad offset 0x%x\n",
166
                  (int)addr);
167
        break;
168
    }
160
    cpu_abort(cpu_single_env, "m5208_sys_write: Bad offset 0x%x\n",
161
              (int)addr);
169 162
}
170 163

  
171 164
static CPUReadMemoryFunc *m5208_sys_readfn[] = {
......
183 176
static void mcf5208_sys_init(qemu_irq *pic)
184 177
{
185 178
    int iomemtype;
186
    m5208_sys_state *s;
179
    m5208_timer_state *s;
187 180
    QEMUBH *bh;
188 181
    int i;
189 182

  
190
    s = (m5208_sys_state *)qemu_mallocz(sizeof(m5208_sys_state));
191 183
    iomemtype = cpu_register_io_memory(0, m5208_sys_readfn,
192
                                       m5208_sys_writefn, s);
184
                                       m5208_sys_writefn, NULL);
193 185
    /* SDRAMC.  */
194 186
    cpu_register_physical_memory(0xfc0a8000, 0x00004000, iomemtype);
195 187
    /* Timers.  */
196 188
    for (i = 0; i < 2; i++) {
197
        bh = qemu_bh_new(m5208_timer_trigger, &s->timer[i]);
198
        s->timer[i].timer = ptimer_init(bh);
189
        s = (m5208_timer_state *)qemu_mallocz(sizeof(m5208_timer_state));
190
        bh = qemu_bh_new(m5208_timer_trigger, s);
191
        s->timer = ptimer_init(bh);
192
        iomemtype = cpu_register_io_memory(0, m5208_timer_readfn,
193
                                           m5208_timer_writefn, s);
199 194
        cpu_register_physical_memory(0xfc080000 + 0x4000 * i, 0x00004000,
200 195
                                     iomemtype);
201
        s->timer[i].irq = pic[4 + i];
196
        s->irq = pic[4 + i];
202 197
    }
203 198
}
204 199

  

Also available in: Unified diff