sm501: Do not clear read only bits when writing registers
When writing registers that have read only bits we have to avoid changing these bits as they may have non zero values. Make sure we use the correct masks to mask out read only and reserved bits when changing registers. Also remove extra spaces from dram_control and arbitration_control assignments. Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
b6c7e42f74
commit
2100b6b21e
|
@ -836,27 +836,30 @@ static void sm501_system_config_write(void *opaque, hwaddr addr,
|
||||||
|
|
||||||
switch (addr) {
|
switch (addr) {
|
||||||
case SM501_SYSTEM_CONTROL:
|
case SM501_SYSTEM_CONTROL:
|
||||||
s->system_control = value & 0xE300B8F7;
|
s->system_control &= 0x10DB0000;
|
||||||
|
s->system_control |= value & 0xEF00B8F7;
|
||||||
break;
|
break;
|
||||||
case SM501_MISC_CONTROL:
|
case SM501_MISC_CONTROL:
|
||||||
s->misc_control = value & 0xFF7FFF20;
|
s->misc_control &= 0xEF;
|
||||||
|
s->misc_control |= value & 0xFF7FFF10;
|
||||||
break;
|
break;
|
||||||
case SM501_GPIO31_0_CONTROL:
|
case SM501_GPIO31_0_CONTROL:
|
||||||
s->gpio_31_0_control = value;
|
s->gpio_31_0_control = value;
|
||||||
break;
|
break;
|
||||||
case SM501_GPIO63_32_CONTROL:
|
case SM501_GPIO63_32_CONTROL:
|
||||||
s->gpio_63_32_control = value;
|
s->gpio_63_32_control = value & 0xFF80FFFF;
|
||||||
break;
|
break;
|
||||||
case SM501_DRAM_CONTROL:
|
case SM501_DRAM_CONTROL:
|
||||||
s->local_mem_size_index = (value >> 13) & 0x7;
|
s->local_mem_size_index = (value >> 13) & 0x7;
|
||||||
/* TODO : check validity of size change */
|
/* TODO : check validity of size change */
|
||||||
s->dram_control |= value & 0x7FFFFFC3;
|
s->dram_control &= 0x80000000;
|
||||||
|
s->dram_control |= value & 0x7FFFFFC3;
|
||||||
break;
|
break;
|
||||||
case SM501_ARBTRTN_CONTROL:
|
case SM501_ARBTRTN_CONTROL:
|
||||||
s->arbitration_control = value & 0x37777777;
|
s->arbitration_control = value & 0x37777777;
|
||||||
break;
|
break;
|
||||||
case SM501_IRQ_MASK:
|
case SM501_IRQ_MASK:
|
||||||
s->irq_mask = value;
|
s->irq_mask = value & 0xFFDF3F5F;
|
||||||
break;
|
break;
|
||||||
case SM501_MISC_TIMING:
|
case SM501_MISC_TIMING:
|
||||||
s->misc_timing = value & 0xF31F1FFF;
|
s->misc_timing = value & 0xF31F1FFF;
|
||||||
|
|
Loading…
Reference in a new issue