mirror of https://github.com/xemu-project/xemu.git
m25p80: Replace JEDEC ID masking with function.
Instead of always reading and comparing jededc ID, replace it by function. Signed-off-by: Marcin Krzeminski <marcin.krzeminski@nokia.com> Message-id: 1466755631-25201-2-git-send-email-marcin.krzeminski@nokia.com Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
87e79af074
commit
c7cd0a6c24
|
@ -307,6 +307,14 @@ typedef enum {
|
||||||
STATE_READING_DATA,
|
STATE_READING_DATA,
|
||||||
} CMDState;
|
} CMDState;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
MAN_SPANSION,
|
||||||
|
MAN_MACRONIX,
|
||||||
|
MAN_NUMONYX,
|
||||||
|
MAN_WINBOND,
|
||||||
|
MAN_GENERIC,
|
||||||
|
} Manufacturer;
|
||||||
|
|
||||||
typedef struct Flash {
|
typedef struct Flash {
|
||||||
SSISlave parent_obj;
|
SSISlave parent_obj;
|
||||||
|
|
||||||
|
@ -350,6 +358,22 @@ typedef struct M25P80Class {
|
||||||
#define M25P80_GET_CLASS(obj) \
|
#define M25P80_GET_CLASS(obj) \
|
||||||
OBJECT_GET_CLASS(M25P80Class, (obj), TYPE_M25P80)
|
OBJECT_GET_CLASS(M25P80Class, (obj), TYPE_M25P80)
|
||||||
|
|
||||||
|
static inline Manufacturer get_man(Flash *s)
|
||||||
|
{
|
||||||
|
switch (((s->pi->jedec >> 16) & 0xFF)) {
|
||||||
|
case 0x20:
|
||||||
|
return MAN_NUMONYX;
|
||||||
|
case 0xEF:
|
||||||
|
return MAN_WINBOND;
|
||||||
|
case 0x01:
|
||||||
|
return MAN_SPANSION;
|
||||||
|
case 0xC2:
|
||||||
|
return MAN_MACRONIX;
|
||||||
|
default:
|
||||||
|
return MAN_GENERIC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void blk_sync_complete(void *opaque, int ret)
|
static void blk_sync_complete(void *opaque, int ret)
|
||||||
{
|
{
|
||||||
/* do nothing. Masters do not directly interact with the backing store,
|
/* do nothing. Masters do not directly interact with the backing store,
|
||||||
|
@ -562,7 +586,8 @@ static void reset_memory(Flash *s)
|
||||||
s->write_enable = false;
|
s->write_enable = false;
|
||||||
s->reset_enable = false;
|
s->reset_enable = false;
|
||||||
|
|
||||||
if (((s->pi->jedec >> 16) & 0xFF) == JEDEC_NUMONYX) {
|
switch (get_man(s)) {
|
||||||
|
case MAN_NUMONYX:
|
||||||
s->volatile_cfg = 0;
|
s->volatile_cfg = 0;
|
||||||
s->volatile_cfg |= VCFG_DUMMY;
|
s->volatile_cfg |= VCFG_DUMMY;
|
||||||
s->volatile_cfg |= VCFG_WRAP_SEQUENTIAL;
|
s->volatile_cfg |= VCFG_WRAP_SEQUENTIAL;
|
||||||
|
@ -594,6 +619,9 @@ static void reset_memory(Flash *s)
|
||||||
if (!(s->nonvolatile_cfg & NVCFG_LOWER_SEGMENT_MASK)) {
|
if (!(s->nonvolatile_cfg & NVCFG_LOWER_SEGMENT_MASK)) {
|
||||||
s->ear = CFG_UPPER_128MB_SEG_ENABLED;
|
s->ear = CFG_UPPER_128MB_SEG_ENABLED;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
DB_PRINT_L(0, "Reset done.\n");
|
DB_PRINT_L(0, "Reset done.\n");
|
||||||
|
@ -634,9 +662,12 @@ static void decode_new_cmd(Flash *s, uint32_t value)
|
||||||
case QOR:
|
case QOR:
|
||||||
case QOR4:
|
case QOR4:
|
||||||
s->needed_bytes = get_addr_length(s);
|
s->needed_bytes = get_addr_length(s);
|
||||||
if (((s->pi->jedec >> 16) & 0xFF) == JEDEC_NUMONYX) {
|
switch (get_man(s)) {
|
||||||
/* Dummy cycles modeled with bytes writes instead of bits */
|
case MAN_NUMONYX:
|
||||||
s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
|
s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
s->pos = 0;
|
s->pos = 0;
|
||||||
s->len = 0;
|
s->len = 0;
|
||||||
|
@ -645,9 +676,9 @@ static void decode_new_cmd(Flash *s, uint32_t value)
|
||||||
|
|
||||||
case DIOR:
|
case DIOR:
|
||||||
case DIOR4:
|
case DIOR4:
|
||||||
switch ((s->pi->jedec >> 16) & 0xFF) {
|
switch (get_man(s)) {
|
||||||
case JEDEC_WINBOND:
|
case MAN_WINBOND:
|
||||||
case JEDEC_SPANSION:
|
case MAN_SPANSION:
|
||||||
s->needed_bytes = 4;
|
s->needed_bytes = 4;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -662,9 +693,9 @@ static void decode_new_cmd(Flash *s, uint32_t value)
|
||||||
|
|
||||||
case QIOR:
|
case QIOR:
|
||||||
case QIOR4:
|
case QIOR4:
|
||||||
switch ((s->pi->jedec >> 16) & 0xFF) {
|
switch (get_man(s)) {
|
||||||
case JEDEC_WINBOND:
|
case MAN_WINBOND:
|
||||||
case JEDEC_SPANSION:
|
case MAN_SPANSION:
|
||||||
s->needed_bytes = 6;
|
s->needed_bytes = 6;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue