blob: 6a1a796278e8bb1153be58a570727fabc384ce77 [file] [log] [blame]
/*
File: include/asm-arm/hc_sl811-hw.h
*/
/* The base_addr, data_reg_addr, and irq number are board specific.
* The current values are design to run on the Accelent SA1110 IDP
* NOTE: values need to modify for different development boards
*/
#define SIZEOF_IO_REGION 256 /* Size for request/release region */
static int base_addr = 0xd3800000;
static int data_reg_addr = 0xd3810000;
static int irq = 34; /* Also change SL811_SET_GPDR! */
static int gprd = 13; /* also change irq !!! */
MODULE_PARM (base_addr, "i");
MODULE_PARM_DESC (base_addr, "sl811 base address 0xd3800000");
MODULE_PARM (data_reg_addr, "i");
MODULE_PARM_DESC (data_reg_addr, "sl811 data register address 0xd3810000");
MODULE_PARM (irq, "i");
MODULE_PARM_DESC (irq, "IRQ 34 (default)");
MODULE_PARM(gprd,"i");
MODULE_PARM_DESC(gprd,"sl811 GPRD port 13(default)");
/*
* Low level: Read from Data port [arm]
*/
static __u8 inline sl811_read_data (hcipriv_t *hp)
{
__u8 data;
data = readb (hp->hcport2);
rmb ();
return (data);
}
/*
* Low level: Write to index register [arm]
*/
static void inline sl811_write_index (hcipriv_t *hp, __u8 index)
{
writeb (offset, hp->hcport);
wmb ();
}
/*
* Low level: Write to Data port [arm]
*/
static void inline sl811_write_data (hcipriv_t *hp, __u8 data)
{
writeb (data, hp->hcport2);
}
/*
* Low level: Write to index register and data port [arm]
*/
static void inline sl811_write_index_data (hcipriv_t *hp, __u8 index, __u8 data)
{
writeb (offset, hp->hcport);
writeb (data, hp->hcport2);
wmb ();
}
/*****************************************************************
*
* Function Name: init_irq [arm]
*
* This function is board specific. It sets up the interrupt to
* be an edge trigger and trigger on the rising edge
*
* Input: none
*
* Return value : none
*
*****************************************************************/
static void inline init_irq (void)
{
GPDR &= ~(1 << gprd);
set_GPIO_IRQ_edge (1 << gprd, GPIO_RISING_EDGE);
}
/*****************************************************************
*
* Function Name: release_regions [arm]
*
* This function is board specific. It frees all io address.
*
* Input: hcipriv_t *
*
* Return value : none
*
*****************************************************************/
static void inline release_regions (hcipriv_t *hp)
{
if (hp->hcport > 0) {
release_region (hp->hcport, SIZEOF_IO_REGION);
hp->hcport = 0;
}
if (hp->hcport2 > 0) {
release_region (hp->hcport2, SIZEOF_IO_REGION);
hp->hcport2 = 0;
}
}
/*****************************************************************
*
* Function Name: request_regions [arm]
*
* This function is board specific. It request all io address and
* maps into memory (if can).
*
* Input: hcipriv_t *
*
* Return value : 0 = OK
*
*****************************************************************/
static int inline request_regions (hcipriv_t *hp, int addr1, int addr2)
{
if (!request_region (addr1, SIZEOF_IO_REGION, "SL811 USB HOST")) {
DBGERR ("request address %d failed", addr1);
return -EBUSY;
}
hp->hcport = addr1;
if (!hp->hcport) {
DBGERR ("Error mapping SL811 Memory 0x%x", addr1);
}
if (!request_region (addr2, SIZEOF_IO_REGION, "SL811 USB HOST")) {
DBGERR ("request address %d failed", addr2);
return -EBUSY;
}
hp->hcport2 = addr2;
if (!hp->hcport2) {
DBGERR ("Error mapping SL811 Memory 0x%x", addr2);
}
return 0;
}