From: Peter Maydell <peter.maydell@linaro.org>
To: Anthony Liguori <aliguori@us.ibm.com>
Cc: qemu-devel@nongnu.org, Paul Brook <paul@codesourcery.com>
Subject: [Qemu-devel] [PULL 01/24] xilinx_spips: seperate SPI and QSPI as two classes
Date: Mon, 3 Jun 2013 17:29:58 +0100 [thread overview]
Message-ID: <1370277021-26129-2-git-send-email-peter.maydell@linaro.org> (raw)
In-Reply-To: <1370277021-26129-1-git-send-email-peter.maydell@linaro.org>
From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Make SPI and QSPI different classes. QSPIPS is setup as a child of SPIPS.
Only QSPI has the LQSPI functionality, so move all that to the child class.
Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
Message-id: 2cdd0cadb5ba77ca02fde5cae627852dc9a64c71.1369117359.git.peter.crosthwaite@xilinx.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
hw/arm/xilinx_zynq.c | 2 +-
hw/ssi/xilinx_spips.c | 69 +++++++++++++++++++++++++++++++++++++++----------
2 files changed, 56 insertions(+), 15 deletions(-)
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 41505c3..4602a6f 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -66,7 +66,7 @@ static inline void zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq,
int num_busses = is_qspi ? NUM_QSPI_BUSSES : 1;
int num_ss = is_qspi ? NUM_QSPI_FLASHES : NUM_SPI_FLASHES;
- dev = qdev_create(NULL, "xilinx,spips");
+ dev = qdev_create(NULL, is_qspi ? "xlnx.ps7-qspi" : "xlnx.ps7-spi");
qdev_prop_set_uint8(dev, "num-txrx-bytes", is_qspi ? 4 : 1);
qdev_prop_set_uint8(dev, "num-ss-bits", num_ss);
qdev_prop_set_uint8(dev, "num-busses", num_busses);
diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c
index b2397f4..734adf0 100644
--- a/hw/ssi/xilinx_spips.c
+++ b/hw/ssi/xilinx_spips.c
@@ -129,7 +129,8 @@ typedef enum {
} FlashCMD;
typedef struct {
- SysBusDevice busdev;
+ SysBusDevice parent_obj;
+
MemoryRegion iomem;
MemoryRegion mmlqspi;
@@ -149,15 +150,23 @@ typedef struct {
uint8_t num_txrx_bytes;
uint32_t regs[R_MAX];
+} XilinxSPIPS;
+
+typedef struct {
+ XilinxSPIPS parent_obj;
uint32_t lqspi_buf[LQSPI_CACHE_SIZE];
hwaddr lqspi_cached_addr;
-} XilinxSPIPS;
+} XilinxQSPIPS;
+
-#define TYPE_XILINX_SPIPS "xilinx,spips"
+#define TYPE_XILINX_SPIPS "xlnx.ps7-spi"
+#define TYPE_XILINX_QSPIPS "xlnx.ps7-qspi"
#define XILINX_SPIPS(obj) \
OBJECT_CHECK(XilinxSPIPS, (obj), TYPE_XILINX_SPIPS)
+#define XILINX_QSPIPS(obj) \
+ OBJECT_CHECK(XilinxQSPIPS, (obj), TYPE_XILINX_QSPIPS)
static inline int num_effective_busses(XilinxSPIPS *s)
{
@@ -436,11 +445,12 @@ static uint64_t
lqspi_read(void *opaque, hwaddr addr, unsigned int size)
{
int i;
+ XilinxQSPIPS *q = opaque;
XilinxSPIPS *s = opaque;
- if (addr >= s->lqspi_cached_addr &&
- addr <= s->lqspi_cached_addr + LQSPI_CACHE_SIZE - 4) {
- return s->lqspi_buf[(addr - s->lqspi_cached_addr) >> 2];
+ if (addr >= q->lqspi_cached_addr &&
+ addr <= q->lqspi_cached_addr + LQSPI_CACHE_SIZE - 4) {
+ return q->lqspi_buf[(addr - q->lqspi_cached_addr) >> 2];
} else {
int flash_addr = (addr / num_effective_busses(s));
int slave = flash_addr >> LQSPI_ADDRESS_BITS;
@@ -484,14 +494,14 @@ lqspi_read(void *opaque, hwaddr addr, unsigned int size)
for (i = 0; i < LQSPI_CACHE_SIZE / 4; ++i) {
tx_data_bytes(s, 0, 4);
xilinx_spips_flush_txfifo(s);
- rx_data_bytes(s, &s->lqspi_buf[cache_entry], 4);
+ rx_data_bytes(s, &q->lqspi_buf[cache_entry], 4);
cache_entry++;
}
s->regs[R_CONFIG] |= CS;
xilinx_spips_update_cs_lines(s);
- s->lqspi_cached_addr = addr;
+ q->lqspi_cached_addr = addr;
return lqspi_read(opaque, addr, size);
}
}
@@ -511,7 +521,7 @@ static void xilinx_spips_realize(DeviceState *dev, Error **errp)
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
int i;
- DB_PRINT("inited device model\n");
+ DB_PRINT("realized spips\n");
s->spi = g_new(SSIBus *, s->num_busses);
for (i = 0; i < s->num_busses; ++i) {
@@ -531,17 +541,32 @@ static void xilinx_spips_realize(DeviceState *dev, Error **errp)
memory_region_init_io(&s->iomem, &spips_ops, s, "spi", R_MAX*4);
sysbus_init_mmio(sbd, &s->iomem);
- memory_region_init_io(&s->mmlqspi, &lqspi_ops, s, "lqspi",
- (1 << LQSPI_ADDRESS_BITS) * 2);
- sysbus_init_mmio(sbd, &s->mmlqspi);
-
s->irqline = -1;
- s->lqspi_cached_addr = ~0ULL;
fifo8_create(&s->rx_fifo, RXFF_A);
fifo8_create(&s->tx_fifo, TXFF_A);
}
+static void xilinx_qspips_realize(DeviceState *dev, Error **errp)
+{
+ XilinxSPIPS *s = XILINX_SPIPS(dev);
+ XilinxQSPIPS *q = XILINX_QSPIPS(dev);
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+
+ DB_PRINT("realized qspips\n");
+
+ s->num_busses = 2;
+ s->num_cs = 2;
+ s->num_txrx_bytes = 4;
+
+ xilinx_spips_realize(dev, errp);
+ memory_region_init_io(&s->mmlqspi, &lqspi_ops, s, "lqspi",
+ (1 << LQSPI_ADDRESS_BITS) * 2);
+ sysbus_init_mmio(sbd, &s->mmlqspi);
+
+ q->lqspi_cached_addr = ~0ULL;
+}
+
static int xilinx_spips_post_load(void *opaque, int version_id)
{
xilinx_spips_update_ixr((XilinxSPIPS *)opaque);
@@ -570,6 +595,14 @@ static Property xilinx_spips_properties[] = {
DEFINE_PROP_UINT8("num-txrx-bytes", XilinxSPIPS, num_txrx_bytes, 1),
DEFINE_PROP_END_OF_LIST(),
};
+
+static void xilinx_qspips_class_init(ObjectClass *klass, void * data)
+{
+ DeviceClass *dc = DEVICE_CLASS(klass);
+
+ dc->realize = xilinx_qspips_realize;
+}
+
static void xilinx_spips_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
@@ -587,9 +620,17 @@ static const TypeInfo xilinx_spips_info = {
.class_init = xilinx_spips_class_init,
};
+static const TypeInfo xilinx_qspips_info = {
+ .name = TYPE_XILINX_QSPIPS,
+ .parent = TYPE_XILINX_SPIPS,
+ .instance_size = sizeof(XilinxQSPIPS),
+ .class_init = xilinx_qspips_class_init,
+};
+
static void xilinx_spips_register_types(void)
{
type_register_static(&xilinx_spips_info);
+ type_register_static(&xilinx_qspips_info);
}
type_init(xilinx_spips_register_types)
--
1.7.9.5
next prev parent reply other threads:[~2013-06-03 19:01 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-03 16:29 [Qemu-devel] [PULL 00/24] arm-devs queue Peter Maydell
2013-06-03 16:29 ` Peter Maydell [this message]
2013-06-03 16:29 ` [Qemu-devel] [PULL 02/24] xilinx_spips: Make interrupts clear on read Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 03/24] xilinx_spips: Inhibit interrupts in LQSPI mode Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 04/24] xilinx_spips: Add verbose LQSPI debug output Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 05/24] xilinx_spips: Fix QSPI FIFO size Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 06/24] xilinx_spips: Trash LQ page cache on mode change Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 07/24] xilinx_spips: Add automatic start support Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 08/24] xilinx_spips: Implement automatic CS Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 09/24] xilinx_spips: lqspi: Dont touch config register Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 10/24] xilinx_spips: Fix CTRL register RW bits Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 11/24] xilinx_spips: Fix striping behaviour Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 12/24] xilinx_spips: Debug msgs for Snoop state Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 13/24] xilinx_spips: Multiple debug verbosity levels Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 14/24] xilinx_spips: lqspi: Push more data to tx-fifo Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 15/24] xilinx_spips: lqspi: Fix byte/misaligned access Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 16/24] sd/sdhci.c: Only reset data_count on new commands Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 17/24] sd/sdhci: Fix Buffer Write Ready interrupt Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 18/24] sd/sdhci.c: Fix bdata_read DPRINT message Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 19/24] sd/sdhci:ADMA: fix interrupt Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 20/24] sd/sd.c: Fix "inquiry" ACMD41 Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 21/24] i.MX: split GPT and EPIT timer implementation Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 22/24] hw/arm/exynos4210.c: convert chipid_and_omr to an mmio region Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 23/24] exynos4210.c: register rom_mem for memory migration Peter Maydell
2013-06-03 16:30 ` [Qemu-devel] [PULL 24/24] i.MX: Improve EPIT timer code Peter Maydell
2013-06-17 21:17 ` [Qemu-devel] [PULL 00/24] arm-devs queue Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1370277021-26129-2-git-send-email-peter.maydell@linaro.org \
--to=peter.maydell@linaro.org \
--cc=aliguori@us.ibm.com \
--cc=paul@codesourcery.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).