SharpSL scoop device - convert to qdev
Convert SharpSL scoop device to qdev, remove lots of supporting code, as lot of init and gpio related things can now be done automagically. Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> Signed-off-by: Andrzej Zaborowski <andrew.zaborowski@intel.com>
This commit is contained in:
parent
0fad6efce5
commit
383d01c663
@ -10,13 +10,6 @@
|
|||||||
fprintf(stderr, "%s: " format, __FUNCTION__, ##__VA_ARGS__)
|
fprintf(stderr, "%s: " format, __FUNCTION__, ##__VA_ARGS__)
|
||||||
|
|
||||||
/* zaurus.c */
|
/* zaurus.c */
|
||||||
typedef struct ScoopInfo ScoopInfo;
|
|
||||||
ScoopInfo *scoop_init(PXA2xxState *cpu,
|
|
||||||
int instance, target_phys_addr_t target_base);
|
|
||||||
void scoop_gpio_set(void *opaque, int line, int level);
|
|
||||||
qemu_irq *scoop_gpio_in_get(ScoopInfo *s);
|
|
||||||
void scoop_gpio_out_set(ScoopInfo *s, int line,
|
|
||||||
qemu_irq handler);
|
|
||||||
|
|
||||||
#define SL_PXA_PARAM_BASE 0xa0000a00
|
#define SL_PXA_PARAM_BASE 0xa0000a00
|
||||||
void sl_bootparam_write(target_phys_addr_t ptr);
|
void sl_bootparam_write(target_phys_addr_t ptr);
|
||||||
|
23
hw/spitz.c
23
hw/spitz.c
@ -23,6 +23,7 @@
|
|||||||
#include "audio/audio.h"
|
#include "audio/audio.h"
|
||||||
#include "boards.h"
|
#include "boards.h"
|
||||||
#include "blockdev.h"
|
#include "blockdev.h"
|
||||||
|
#include "sysbus.h"
|
||||||
|
|
||||||
#undef REG_FMT
|
#undef REG_FMT
|
||||||
#define REG_FMT "0x%02lx"
|
#define REG_FMT "0x%02lx"
|
||||||
@ -851,21 +852,21 @@ static void spitz_out_switch(void *opaque, int line, int level)
|
|||||||
#define SPITZ_SCP2_MIC_BIAS 9
|
#define SPITZ_SCP2_MIC_BIAS 9
|
||||||
|
|
||||||
static void spitz_scoop_gpio_setup(PXA2xxState *cpu,
|
static void spitz_scoop_gpio_setup(PXA2xxState *cpu,
|
||||||
ScoopInfo *scp0, ScoopInfo *scp1)
|
DeviceState *scp0, DeviceState *scp1)
|
||||||
{
|
{
|
||||||
qemu_irq *outsignals = qemu_allocate_irqs(spitz_out_switch, cpu, 8);
|
qemu_irq *outsignals = qemu_allocate_irqs(spitz_out_switch, cpu, 8);
|
||||||
|
|
||||||
scoop_gpio_out_set(scp0, SPITZ_SCP_CHRG_ON, outsignals[0]);
|
qdev_connect_gpio_out(scp0, SPITZ_SCP_CHRG_ON, outsignals[0]);
|
||||||
scoop_gpio_out_set(scp0, SPITZ_SCP_JK_B, outsignals[1]);
|
qdev_connect_gpio_out(scp0, SPITZ_SCP_JK_B, outsignals[1]);
|
||||||
scoop_gpio_out_set(scp0, SPITZ_SCP_LED_GREEN, outsignals[2]);
|
qdev_connect_gpio_out(scp0, SPITZ_SCP_LED_GREEN, outsignals[2]);
|
||||||
scoop_gpio_out_set(scp0, SPITZ_SCP_LED_ORANGE, outsignals[3]);
|
qdev_connect_gpio_out(scp0, SPITZ_SCP_LED_ORANGE, outsignals[3]);
|
||||||
|
|
||||||
if (scp1) {
|
if (scp1) {
|
||||||
scoop_gpio_out_set(scp1, SPITZ_SCP2_BACKLIGHT_CONT, outsignals[4]);
|
qdev_connect_gpio_out(scp1, SPITZ_SCP2_BACKLIGHT_CONT, outsignals[4]);
|
||||||
scoop_gpio_out_set(scp1, SPITZ_SCP2_BACKLIGHT_ON, outsignals[5]);
|
qdev_connect_gpio_out(scp1, SPITZ_SCP2_BACKLIGHT_ON, outsignals[5]);
|
||||||
}
|
}
|
||||||
|
|
||||||
scoop_gpio_out_set(scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
|
qdev_connect_gpio_out(scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SPITZ_GPIO_HSYNC 22
|
#define SPITZ_GPIO_HSYNC 22
|
||||||
@ -952,7 +953,7 @@ static void spitz_common_init(ram_addr_t ram_size,
|
|||||||
const char *cpu_model, enum spitz_model_e model, int arm_id)
|
const char *cpu_model, enum spitz_model_e model, int arm_id)
|
||||||
{
|
{
|
||||||
PXA2xxState *cpu;
|
PXA2xxState *cpu;
|
||||||
ScoopInfo *scp0, *scp1 = NULL;
|
DeviceState *scp0, *scp1 = NULL;
|
||||||
|
|
||||||
if (!cpu_model)
|
if (!cpu_model)
|
||||||
cpu_model = (model == terrier) ? "pxa270-c5" : "pxa270-c0";
|
cpu_model = (model == terrier) ? "pxa270-c5" : "pxa270-c0";
|
||||||
@ -970,9 +971,9 @@ static void spitz_common_init(ram_addr_t ram_size,
|
|||||||
|
|
||||||
spitz_ssp_attach(cpu);
|
spitz_ssp_attach(cpu);
|
||||||
|
|
||||||
scp0 = scoop_init(cpu, 0, 0x10800000);
|
scp0 = sysbus_create_simple("scoop", 0x10800000, NULL);
|
||||||
if (model != akita) {
|
if (model != akita) {
|
||||||
scp1 = scoop_init(cpu, 1, 0x08800040);
|
scp1 = sysbus_create_simple("scoop", 0x08800040, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
spitz_scoop_gpio_setup(cpu, scp0, scp1);
|
spitz_scoop_gpio_setup(cpu, scp0, scp1);
|
||||||
|
23
hw/tosa.c
23
hw/tosa.c
@ -20,6 +20,7 @@
|
|||||||
#include "i2c.h"
|
#include "i2c.h"
|
||||||
#include "ssi.h"
|
#include "ssi.h"
|
||||||
#include "blockdev.h"
|
#include "blockdev.h"
|
||||||
|
#include "sysbus.h"
|
||||||
|
|
||||||
#define TOSA_RAM 0x04000000
|
#define TOSA_RAM 0x04000000
|
||||||
#define TOSA_ROM 0x00800000
|
#define TOSA_ROM 0x00800000
|
||||||
@ -86,14 +87,14 @@ static void tosa_out_switch(void *opaque, int line, int level)
|
|||||||
|
|
||||||
|
|
||||||
static void tosa_gpio_setup(PXA2xxState *cpu,
|
static void tosa_gpio_setup(PXA2xxState *cpu,
|
||||||
ScoopInfo *scp0,
|
DeviceState *scp0,
|
||||||
ScoopInfo *scp1,
|
DeviceState *scp1,
|
||||||
TC6393xbState *tmio)
|
TC6393xbState *tmio)
|
||||||
{
|
{
|
||||||
qemu_irq *outsignals = qemu_allocate_irqs(tosa_out_switch, cpu, 4);
|
qemu_irq *outsignals = qemu_allocate_irqs(tosa_out_switch, cpu, 4);
|
||||||
/* MMC/SD host */
|
/* MMC/SD host */
|
||||||
pxa2xx_mmci_handlers(cpu->mmc,
|
pxa2xx_mmci_handlers(cpu->mmc,
|
||||||
scoop_gpio_in_get(scp0)[TOSA_GPIO_SD_WP],
|
qdev_get_gpio_in(scp0, TOSA_GPIO_SD_WP),
|
||||||
qemu_irq_invert(pxa2xx_gpio_in_get(cpu->gpio)[TOSA_GPIO_nSD_DETECT]));
|
qemu_irq_invert(pxa2xx_gpio_in_get(cpu->gpio)[TOSA_GPIO_nSD_DETECT]));
|
||||||
|
|
||||||
/* Handle reset */
|
/* Handle reset */
|
||||||
@ -108,12 +109,12 @@ static void tosa_gpio_setup(PXA2xxState *cpu,
|
|||||||
pxa2xx_gpio_in_get(cpu->gpio)[TOSA_GPIO_JC_CF_IRQ],
|
pxa2xx_gpio_in_get(cpu->gpio)[TOSA_GPIO_JC_CF_IRQ],
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
scoop_gpio_out_set(scp1, TOSA_GPIO_BT_LED, outsignals[0]);
|
qdev_connect_gpio_out(scp1, TOSA_GPIO_BT_LED, outsignals[0]);
|
||||||
scoop_gpio_out_set(scp1, TOSA_GPIO_NOTE_LED, outsignals[1]);
|
qdev_connect_gpio_out(scp1, TOSA_GPIO_NOTE_LED, outsignals[1]);
|
||||||
scoop_gpio_out_set(scp1, TOSA_GPIO_CHRG_ERR_LED, outsignals[2]);
|
qdev_connect_gpio_out(scp1, TOSA_GPIO_CHRG_ERR_LED, outsignals[2]);
|
||||||
scoop_gpio_out_set(scp1, TOSA_GPIO_WLAN_LED, outsignals[3]);
|
qdev_connect_gpio_out(scp1, TOSA_GPIO_WLAN_LED, outsignals[3]);
|
||||||
|
|
||||||
scoop_gpio_out_set(scp1, TOSA_GPIO_TC6393XB_L3V_ON, tc6393xb_l3v_get(tmio));
|
qdev_connect_gpio_out(scp1, TOSA_GPIO_TC6393XB_L3V_ON, tc6393xb_l3v_get(tmio));
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t tosa_ssp_tansfer(SSISlave *dev, uint32_t value)
|
static uint32_t tosa_ssp_tansfer(SSISlave *dev, uint32_t value)
|
||||||
@ -208,7 +209,7 @@ static void tosa_init(ram_addr_t ram_size,
|
|||||||
{
|
{
|
||||||
PXA2xxState *cpu;
|
PXA2xxState *cpu;
|
||||||
TC6393xbState *tmio;
|
TC6393xbState *tmio;
|
||||||
ScoopInfo *scp0, *scp1;
|
DeviceState *scp0, *scp1;
|
||||||
|
|
||||||
if (!cpu_model)
|
if (!cpu_model)
|
||||||
cpu_model = "pxa255";
|
cpu_model = "pxa255";
|
||||||
@ -221,8 +222,8 @@ static void tosa_init(ram_addr_t ram_size,
|
|||||||
tmio = tc6393xb_init(0x10000000,
|
tmio = tc6393xb_init(0x10000000,
|
||||||
pxa2xx_gpio_in_get(cpu->gpio)[TOSA_GPIO_TC6393XB_INT]);
|
pxa2xx_gpio_in_get(cpu->gpio)[TOSA_GPIO_TC6393XB_INT]);
|
||||||
|
|
||||||
scp0 = scoop_init(cpu, 0, 0x08800000);
|
scp0 = sysbus_create_simple("scoop", 0x08800000, NULL);
|
||||||
scp1 = scoop_init(cpu, 1, 0x14800040);
|
scp1 = sysbus_create_simple("scoop", 0x14800040, NULL);
|
||||||
|
|
||||||
tosa_gpio_setup(cpu, scp0, scp1, tmio);
|
tosa_gpio_setup(cpu, scp0, scp1, tmio);
|
||||||
|
|
||||||
|
121
hw/zaurus.c
121
hw/zaurus.c
@ -18,15 +18,17 @@
|
|||||||
#include "hw.h"
|
#include "hw.h"
|
||||||
#include "pxa.h"
|
#include "pxa.h"
|
||||||
#include "sharpsl.h"
|
#include "sharpsl.h"
|
||||||
|
#include "sysbus.h"
|
||||||
|
|
||||||
#undef REG_FMT
|
#undef REG_FMT
|
||||||
#define REG_FMT "0x%02lx"
|
#define REG_FMT "0x%02lx"
|
||||||
|
|
||||||
/* SCOOP devices */
|
/* SCOOP devices */
|
||||||
|
|
||||||
|
typedef struct ScoopInfo ScoopInfo;
|
||||||
struct ScoopInfo {
|
struct ScoopInfo {
|
||||||
|
SysBusDevice busdev;
|
||||||
qemu_irq handler[16];
|
qemu_irq handler[16];
|
||||||
qemu_irq *in;
|
|
||||||
uint16_t status;
|
uint16_t status;
|
||||||
uint16_t power;
|
uint16_t power;
|
||||||
uint32_t gpio_level;
|
uint32_t gpio_level;
|
||||||
@ -153,7 +155,7 @@ static CPUWriteMemoryFunc * const scoop_writefn[] = {
|
|||||||
scoop_writeb,
|
scoop_writeb,
|
||||||
};
|
};
|
||||||
|
|
||||||
void scoop_gpio_set(void *opaque, int line, int level)
|
static void scoop_gpio_set(void *opaque, int line, int level)
|
||||||
{
|
{
|
||||||
ScoopInfo *s = (ScoopInfo *) opaque;
|
ScoopInfo *s = (ScoopInfo *) opaque;
|
||||||
|
|
||||||
@ -163,78 +165,67 @@ void scoop_gpio_set(void *opaque, int line, int level)
|
|||||||
s->gpio_level &= ~(1 << line);
|
s->gpio_level &= ~(1 << line);
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_irq *scoop_gpio_in_get(ScoopInfo *s)
|
static int scoop_init(SysBusDevice *dev)
|
||||||
{
|
{
|
||||||
return s->in;
|
ScoopInfo *s = FROM_SYSBUS(ScoopInfo, dev);
|
||||||
}
|
int iomemtype;
|
||||||
|
|
||||||
void scoop_gpio_out_set(ScoopInfo *s, int line,
|
s->status = 0x02;
|
||||||
qemu_irq handler) {
|
qdev_init_gpio_out(&s->busdev.qdev, s->handler, 16);
|
||||||
if (line >= 16) {
|
qdev_init_gpio_in(&s->busdev.qdev, scoop_gpio_set, 16);
|
||||||
fprintf(stderr, "No GPIO pin %i\n", line);
|
iomemtype = cpu_register_io_memory(scoop_readfn,
|
||||||
exit(-1);
|
scoop_writefn, s, DEVICE_NATIVE_ENDIAN);
|
||||||
}
|
|
||||||
|
|
||||||
s->handler[line] = handler;
|
sysbus_init_mmio(dev, 0x1000, iomemtype);
|
||||||
}
|
|
||||||
|
|
||||||
static void scoop_save(QEMUFile *f, void *opaque)
|
|
||||||
{
|
|
||||||
ScoopInfo *s = (ScoopInfo *) opaque;
|
|
||||||
qemu_put_be16s(f, &s->status);
|
|
||||||
qemu_put_be16s(f, &s->power);
|
|
||||||
qemu_put_be32s(f, &s->gpio_level);
|
|
||||||
qemu_put_be32s(f, &s->gpio_dir);
|
|
||||||
qemu_put_be32s(f, &s->prev_level);
|
|
||||||
qemu_put_be16s(f, &s->mcr);
|
|
||||||
qemu_put_be16s(f, &s->cdr);
|
|
||||||
qemu_put_be16s(f, &s->ccr);
|
|
||||||
qemu_put_be16s(f, &s->irr);
|
|
||||||
qemu_put_be16s(f, &s->imr);
|
|
||||||
qemu_put_be16s(f, &s->isr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int scoop_load(QEMUFile *f, void *opaque, int version_id)
|
|
||||||
{
|
|
||||||
uint16_t dummy;
|
|
||||||
ScoopInfo *s = (ScoopInfo *) opaque;
|
|
||||||
qemu_get_be16s(f, &s->status);
|
|
||||||
qemu_get_be16s(f, &s->power);
|
|
||||||
qemu_get_be32s(f, &s->gpio_level);
|
|
||||||
qemu_get_be32s(f, &s->gpio_dir);
|
|
||||||
qemu_get_be32s(f, &s->prev_level);
|
|
||||||
qemu_get_be16s(f, &s->mcr);
|
|
||||||
qemu_get_be16s(f, &s->cdr);
|
|
||||||
qemu_get_be16s(f, &s->ccr);
|
|
||||||
qemu_get_be16s(f, &s->irr);
|
|
||||||
qemu_get_be16s(f, &s->imr);
|
|
||||||
qemu_get_be16s(f, &s->isr);
|
|
||||||
if (version_id < 1)
|
|
||||||
qemu_get_be16s(f, &dummy);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScoopInfo *scoop_init(PXA2xxState *cpu,
|
static bool is_version_0 (void *opaque, int version_id)
|
||||||
int instance,
|
{
|
||||||
target_phys_addr_t target_base) {
|
return version_id == 0;
|
||||||
int iomemtype;
|
|
||||||
ScoopInfo *s;
|
|
||||||
|
|
||||||
s = (ScoopInfo *)
|
|
||||||
qemu_mallocz(sizeof(ScoopInfo));
|
|
||||||
memset(s, 0, sizeof(ScoopInfo));
|
|
||||||
|
|
||||||
s->status = 0x02;
|
|
||||||
s->in = qemu_allocate_irqs(scoop_gpio_set, s, 16);
|
|
||||||
iomemtype = cpu_register_io_memory(scoop_readfn,
|
|
||||||
scoop_writefn, s, DEVICE_NATIVE_ENDIAN);
|
|
||||||
cpu_register_physical_memory(target_base, 0x1000, iomemtype);
|
|
||||||
register_savevm(NULL, "scoop", instance, 1, scoop_save, scoop_load, s);
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static const VMStateDescription vmstate_scoop_regs = {
|
||||||
|
.name = "scoop",
|
||||||
|
.version_id = 1,
|
||||||
|
.minimum_version_id = 0,
|
||||||
|
.minimum_version_id_old = 0,
|
||||||
|
.fields = (VMStateField []) {
|
||||||
|
VMSTATE_UINT16(status, ScoopInfo),
|
||||||
|
VMSTATE_UINT16(power, ScoopInfo),
|
||||||
|
VMSTATE_UINT32(gpio_level, ScoopInfo),
|
||||||
|
VMSTATE_UINT32(gpio_dir, ScoopInfo),
|
||||||
|
VMSTATE_UINT32(prev_level, ScoopInfo),
|
||||||
|
VMSTATE_UINT16(mcr, ScoopInfo),
|
||||||
|
VMSTATE_UINT16(cdr, ScoopInfo),
|
||||||
|
VMSTATE_UINT16(ccr, ScoopInfo),
|
||||||
|
VMSTATE_UINT16(irr, ScoopInfo),
|
||||||
|
VMSTATE_UINT16(imr, ScoopInfo),
|
||||||
|
VMSTATE_UINT16(isr, ScoopInfo),
|
||||||
|
VMSTATE_UNUSED_TEST(is_version_0, 2),
|
||||||
|
VMSTATE_END_OF_LIST(),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static SysBusDeviceInfo scoop_sysbus_info = {
|
||||||
|
.init = scoop_init,
|
||||||
|
.qdev.name = "scoop",
|
||||||
|
.qdev.desc = "Scoop2 Sharp custom ASIC",
|
||||||
|
.qdev.size = sizeof(ScoopInfo),
|
||||||
|
.qdev.vmsd = &vmstate_scoop_regs,
|
||||||
|
.qdev.props = (Property[]) {
|
||||||
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static void scoop_register(void)
|
||||||
|
{
|
||||||
|
sysbus_register_withprop(&scoop_sysbus_info);
|
||||||
|
}
|
||||||
|
device_init(scoop_register);
|
||||||
|
|
||||||
/* Write the bootloader parameters memory area. */
|
/* Write the bootloader parameters memory area. */
|
||||||
|
|
||||||
#define MAGIC_CHG(a, b, c, d) ((d << 24) | (c << 16) | (b << 8) | a)
|
#define MAGIC_CHG(a, b, c, d) ((d << 24) | (c << 16) | (b << 8) | a)
|
||||||
|
Loading…
Reference in New Issue
Block a user