Skip to content

Commit

Permalink
SSP bus framework
Browse files Browse the repository at this point in the history
Signed-off-by: Paul Brook <paul@codesourcery.com>
  • Loading branch information
Paul Brook committed May 14, 2009
1 parent 1de9610 commit 90d3723
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ OBJS+=bt-hci-csr.o
OBJS+=buffered_file.o migration.o migration-tcp.o net.o qemu-sockets.o
OBJS+=qemu-char.o aio.o net-checksum.o savevm.o cache-utils.o
OBJS+=msmouse.o ps2.o
OBJS+=qdev.o
OBJS+=qdev.o ssi.o

ifdef CONFIG_BRLAPI
OBJS+= baum.o
Expand Down
52 changes: 52 additions & 0 deletions hw/ssi.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* QEMU Synchronous Serial Interface support
*
* Copyright (c) 2009 CodeSourcery.
* Written by Paul Brook
*
* This code is licenced under the GNU GPL v2.
*/

#include "ssi.h"

struct SSIBus {
SSISlave *slave;
};

static void ssi_slave_init(DeviceState *dev, void *opaque)
{
SSISlaveInfo *info = opaque;
SSISlave *s = SSI_SLAVE_FROM_QDEV(dev);
SSIBus *bus = qdev_get_bus(dev);

bus->slave = s;
s->info = info;
info->init(s);
}

void ssi_register_slave(const char *name, int size, SSISlaveInfo *info)
{
assert(size >= sizeof(SSISlave));
qdev_register(name, size, ssi_slave_init, info);
}

DeviceState *ssi_create_slave(SSIBus *bus, const char *name)
{
DeviceState *dev;
dev = qdev_create(bus, name);
qdev_init(dev);
return dev;
}

SSIBus *ssi_create_bus(void)
{
return qemu_mallocz(sizeof(SSIBus));
}

uint32_t ssi_transfer(SSIBus *bus, uint32_t val)
{
if (!bus->slave) {
return 0;
}
return bus->slave->info->transfer(bus->slave, val);
}
41 changes: 41 additions & 0 deletions hw/ssi.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/* QEMU Synchronous Serial Interface support. */

/* In principle SSI is a point-point interface. As such the qemu
implementation has a single slave device on a "bus".
However it is fairly common for boards to have multiple slaves
connected to a single master, and select devices with an external
chip select. This is implemented in qemu by having an explicit mux device.
It is assumed that master and slave are both using the same transfer width.
*/

#ifndef QEMU_SSI_H
#define QEMU_SSI_H

#include "qdev.h"

typedef struct SSISlave SSISlave;

/* Slave devices. */
typedef struct {
void (*init)(SSISlave *dev);
uint32_t (*transfer)(SSISlave *dev, uint32_t val);
} SSISlaveInfo;

struct SSISlave {
DeviceState qdev;
SSISlaveInfo *info;
};

#define SSI_SLAVE_FROM_QDEV(dev) DO_UPCAST(SSISlave, qdev, dev)
#define FROM_SSI_SLAVE(type, dev) DO_UPCAST(type, ssidev, dev)

void ssi_register_slave(const char *name, int size, SSISlaveInfo *info);

DeviceState *ssi_create_slave(SSIBus *bus, const char *name);

/* Master interface. */
SSIBus *ssi_create_bus(void);

uint32_t ssi_transfer(SSIBus *bus, uint32_t val);

#endif
1 change: 1 addition & 0 deletions qemu-common.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ typedef struct MouseTransformInfo MouseTransformInfo;
typedef struct uWireSlave uWireSlave;
typedef struct I2SCodec I2SCodec;
typedef struct DeviceState DeviceState;
typedef struct SSIBus SSIBus;

/* CPU save/load. */
void cpu_save(QEMUFile *f, void *opaque);
Expand Down

0 comments on commit 90d3723

Please sign in to comment.