[BACK]Return to obio.c CVS log [TXT][DIR] Up to [local] / funnyos / arch / testarm / dev

File: [local] / funnyos / arch / testarm / dev / obio.c (download)

Revision 1.11, Mon Oct 29 21:10:03 2007 UTC (16 years, 6 months ago) by init
Branch: MAIN
CVS Tags: HEAD
Changes since 1.10: +2 -1 lines

use new dr_interrupt pointer in struct driver for future interrupts support

/*
 * $Id: obio.c,v 1.11 2007/10/29 21:10:03 init Exp $
 */
#include <sys/types.h>
#include <sys/device.h>
#include <sys/mem.h>
#include <sys/bus.h>

#include <arch/testarm/dev/obiovar.h>
#include <libkern/printf.h>

/* #define OBIO_DEBUG */

#ifdef OBIO_DEBUG
#define DPRINTF(x...) 	do { printf(x); } while (0)
#else
#define DPRINTF(x...) 	{ }
#endif
 
/*
 * testarm obio (on-board i/o) support.
 * This is a simple memory read/writes.
 */
int obio_attach(struct device *, uint32_t, uint8_t);

uint8_t 	obio_read_1(void *, uint32_t);
uint16_t 	obio_read_2(void *, uint32_t);
uint32_t 	obio_read_4(void *, uint32_t);
int 		obio_write_1(void *, uint32_t, uint8_t);
int 		obio_write_2(void *, uint32_t, uint16_t);
int 		obio_write_4(void *, uint32_t, uint32_t);


struct driver obio_dr = {
	sizeof(struct obio_dd),
	obio_attach,
	NULL,
	NULL
};


int
obio_attach(struct device *self, uint32_t loc, uint8_t flags)
{
	struct obio_dd *ddp = self->dv_devdata;
	struct bus_handle *bhp = &ddp->od_bh;

	ddp->od_locked = 0;
	ddp->od_ndevices = 0;

	bhp->bus_read_1 = obio_read_1;
	bhp->bus_read_2 = obio_read_2;
	bhp->bus_read_4 = obio_read_4;
	bhp->bus_write_1 = obio_write_1;
	bhp->bus_write_2 = obio_write_2;
	bhp->bus_write_4 = obio_write_4;
	bhp->bh_ownerdd = self->dv_devdata;	/* XXX UGLY bus_{read|write} stuff will access bus device from bus_handle using this */ 

	/* expose our bus_handle to the world */
	self->dv_aux = bhp;

	printf("memory-mapped i/o\n");

	return(0);
}


uint8_t
obio_read_1(void *ddp, uint32_t addr)
{
	/*
	 * There is only one on-board i/o bus in testarm.
	 */
	DPRINTF("obio_read_1: read @0x%x\n", addr);
	return( (*(uint8_t *)addr) );
}


uint16_t
obio_read_2(void *ddp, uint32_t addr)
{
	DPRINTF("obio_read_2: read @0x%x\n", addr);
	return( (*(uint16_t *)addr) );
}


uint32_t
obio_read_4(void *ddp, uint32_t addr)
{
	DPRINTF("obio_read_4: read @0x%x\n", addr);
	return( (*(uint32_t *)addr) );
}


int
obio_write_1(void *ddp, uint32_t addr, uint8_t data)
{
	DPRINTF("obio_write_1: write @0x%x data %d\n", addr, data);

	*((uint8_t *)addr) = data;

	/* XXX what about write errors? */
	return(0);
}


int
obio_write_2(void *ddp, uint32_t addr, uint16_t data)
{
	DPRINTF("obio_write_2: write @0x%x data %d\n", addr, data);

	*((uint16_t *)addr) = data;

	return(0);
}


int
obio_write_4(void *ddp, uint32_t addr, uint32_t data)
{
	DPRINTF("obio_write_4: write @0x%x data %d\n", addr, data);

	*((uint32_t *)addr) = data;

	return(0);
}