* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#include "qemu-common.h"
//#define DEBUG
-struct cbus_slave_s;
-struct cbus_priv_s {
- struct cbus_s cbus;
+typedef struct {
+ void *opaque;
+ void (*io)(void *opaque, int rw, int reg, uint16_t *val);
+ int addr;
+} CBusSlave;
+
+typedef struct {
+ CBus cbus;
int sel;
int dat;
cbus_value,
} cycle;
- struct cbus_slave_s *slave[8];
-};
+ CBusSlave *slave[8];
+} CBusPriv;
-struct cbus_slave_s {
- void *opaque;
- void (*io)(void *opaque, int rw, int reg, uint16_t *val);
- int addr;
-};
-
-static void cbus_io(struct cbus_priv_s *s)
+static void cbus_io(CBusPriv *s)
{
if (s->slave[s->addr])
s->slave[s->addr]->io(s->slave[s->addr]->opaque,
s->rw, s->reg, &s->val);
else
- cpu_abort(cpu_single_env, "%s: bad slave address %i\n",
- __FUNCTION__, s->addr);
+ hw_error("%s: bad slave address %i\n", __FUNCTION__, s->addr);
}
-static void cbus_cycle(struct cbus_priv_s *s)
+static void cbus_cycle(CBusPriv *s)
{
switch (s->cycle) {
case cbus_address:
static void cbus_clk(void *opaque, int line, int level)
{
- struct cbus_priv_s *s = (struct cbus_priv_s *) opaque;
+ CBusPriv *s = (CBusPriv *) opaque;
if (!s->sel && level && !s->clk) {
if (s->dir)
static void cbus_dat(void *opaque, int line, int level)
{
- struct cbus_priv_s *s = (struct cbus_priv_s *) opaque;
+ CBusPriv *s = (CBusPriv *) opaque;
s->dat = level;
}
static void cbus_sel(void *opaque, int line, int level)
{
- struct cbus_priv_s *s = (struct cbus_priv_s *) opaque;
+ CBusPriv *s = (CBusPriv *) opaque;
if (!level) {
s->dir = 1;
s->sel = level;
}
-struct cbus_s *cbus_init(qemu_irq dat)
+CBus *cbus_init(qemu_irq dat)
{
- struct cbus_priv_s *s = (struct cbus_priv_s *) qemu_mallocz(sizeof(*s));
+ CBusPriv *s = (CBusPriv *) g_malloc0(sizeof(*s));
s->dat_out = dat;
s->cbus.clk = qemu_allocate_irqs(cbus_clk, s, 1)[0];
return &s->cbus;
}
-void cbus_attach(struct cbus_s *bus, void *slave_opaque)
+void cbus_attach(CBus *bus, void *slave_opaque)
{
- struct cbus_slave_s *slave = (struct cbus_slave_s *) slave_opaque;
- struct cbus_priv_s *s = (struct cbus_priv_s *) bus;
+ CBusSlave *slave = (CBusSlave *) slave_opaque;
+ CBusPriv *s = (CBusPriv *) bus;
s->slave[slave->addr] = slave;
}
/* Retu/Vilma */
-struct cbus_retu_s {
+typedef struct {
uint16_t irqst;
uint16_t irqen;
uint16_t cc[2];
int is_vilma;
qemu_irq irq;
- struct cbus_slave_s cbus;
-};
+ CBusSlave cbus;
+} CBusRetu;
-static void retu_interrupt_update(struct cbus_retu_s *s)
+static void retu_interrupt_update(CBusRetu *s)
{
qemu_set_irq(s->irq, s->irqst & ~s->irqen);
}
retu_adc_self_temp = 13, /* RETU temperature */
};
-static inline uint16_t retu_read(struct cbus_retu_s *s, int reg)
+static inline uint16_t retu_read(CBusRetu *s, int reg)
{
#ifdef DEBUG
printf("RETU read at %02x\n", reg);
return 0x0000;
default:
- cpu_abort(cpu_single_env, "%s: bad register %02x\n",
- __FUNCTION__, reg);
+ hw_error("%s: bad register %02x\n", __FUNCTION__, reg);
}
}
-static inline void retu_write(struct cbus_retu_s *s, int reg, uint16_t val)
+static inline void retu_write(CBusRetu *s, int reg, uint16_t val)
{
#ifdef DEBUG
printf("RETU write of %04x at %02x\n", val, reg);
break;
default:
- cpu_abort(cpu_single_env, "%s: bad register %02x\n",
- __FUNCTION__, reg);
+ hw_error("%s: bad register %02x\n", __FUNCTION__, reg);
}
}
static void retu_io(void *opaque, int rw, int reg, uint16_t *val)
{
- struct cbus_retu_s *s = (struct cbus_retu_s *) opaque;
+ CBusRetu *s = (CBusRetu *) opaque;
if (rw)
*val = retu_read(s, reg);
void *retu_init(qemu_irq irq, int vilma)
{
- struct cbus_retu_s *s = (struct cbus_retu_s *) qemu_mallocz(sizeof(*s));
+ CBusRetu *s = (CBusRetu *) g_malloc0(sizeof(*s));
s->irq = irq;
s->irqen = 0xffff;
void retu_key_event(void *retu, int state)
{
- struct cbus_slave_s *slave = (struct cbus_slave_s *) retu;
- struct cbus_retu_s *s = (struct cbus_retu_s *) slave->opaque;
+ CBusSlave *slave = (CBusSlave *) retu;
+ CBusRetu *s = (CBusRetu *) slave->opaque;
s->irqst |= 1 << retu_int_pwr;
retu_interrupt_update(s);
s->status |= 1 << 5;
}
-void retu_head_event(void *retu, int state)
+#if 0
+static void retu_head_event(void *retu, int state)
{
- struct cbus_slave_s *slave = (struct cbus_slave_s *) retu;
- struct cbus_retu_s *s = (struct cbus_retu_s *) slave->opaque;
+ CBusSlave *slave = (CBusSlave *) retu;
+ CBusRetu *s = (CBusRetu *) slave->opaque;
if ((s->cc[0] & 0x500) == 0x500) { /* TODO: Which bits? */
/* TODO: reissue the interrupt every 100ms or so. */
s->result[retu_adc_head_det] = 123;
}
-void retu_hook_event(void *retu, int state)
+static void retu_hook_event(void *retu, int state)
{
- struct cbus_slave_s *slave = (struct cbus_slave_s *) retu;
- struct cbus_retu_s *s = (struct cbus_retu_s *) slave->opaque;
+ CBusSlave *slave = (CBusSlave *) retu;
+ CBusRetu *s = (CBusRetu *) slave->opaque;
if ((s->cc[0] & 0x500) == 0x500) {
/* TODO: reissue the interrupt every 100ms or so. */
else
s->result[retu_adc_hook_det] = 123;
}
+#endif
/* Tahvo/Betty */
-struct cbus_tahvo_s {
+typedef struct {
uint16_t irqst;
uint16_t irqen;
uint8_t charger;
int is_betty;
qemu_irq irq;
- struct cbus_slave_s cbus;
-};
+ CBusSlave cbus;
+} CBusTahvo;
-static void tahvo_interrupt_update(struct cbus_tahvo_s *s)
+static void tahvo_interrupt_update(CBusTahvo *s)
{
qemu_set_irq(s->irq, s->irqst & ~s->irqen);
}
#define TAHVO_REG_NOPR 0x0c /* (RW) Number of periods */
#define TAHVO_REG_FRR 0x0d /* (RO) FR */
-static inline uint16_t tahvo_read(struct cbus_tahvo_s *s, int reg)
+static inline uint16_t tahvo_read(CBusTahvo *s, int reg)
{
#ifdef DEBUG
printf("TAHVO read at %02x\n", reg);
return 0x0000;
default:
- cpu_abort(cpu_single_env, "%s: bad register %02x\n",
- __FUNCTION__, reg);
+ hw_error("%s: bad register %02x\n", __FUNCTION__, reg);
}
}
-static inline void tahvo_write(struct cbus_tahvo_s *s, int reg, uint16_t val)
+static inline void tahvo_write(CBusTahvo *s, int reg, uint16_t val)
{
#ifdef DEBUG
printf("TAHVO write of %04x at %02x\n", val, reg);
break;
default:
- cpu_abort(cpu_single_env, "%s: bad register %02x\n",
- __FUNCTION__, reg);
+ hw_error("%s: bad register %02x\n", __FUNCTION__, reg);
}
}
static void tahvo_io(void *opaque, int rw, int reg, uint16_t *val)
{
- struct cbus_tahvo_s *s = (struct cbus_tahvo_s *) opaque;
+ CBusTahvo *s = (CBusTahvo *) opaque;
if (rw)
*val = tahvo_read(s, reg);
void *tahvo_init(qemu_irq irq, int betty)
{
- struct cbus_tahvo_s *s = (struct cbus_tahvo_s *) qemu_mallocz(sizeof(*s));
+ CBusTahvo *s = (CBusTahvo *) g_malloc0(sizeof(*s));
s->irq = irq;
s->irqen = 0xffff;