/*
|
/*
|
* linux/arch/arm/drivers/block/ide-ics.c
|
* linux/arch/arm/drivers/block/ide-ics.c
|
*
|
*
|
* Copyright (c) 1996 Russell King.
|
* Copyright (c) 1996 Russell King.
|
*
|
*
|
* Changelog:
|
* Changelog:
|
* 08-06-1996 RMK Created
|
* 08-06-1996 RMK Created
|
*/
|
*/
|
|
|
#include <linux/module.h>
|
#include <linux/module.h>
|
#include <linux/malloc.h>
|
#include <linux/malloc.h>
|
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
#include <linux/errno.h>
|
#include <linux/errno.h>
|
#include <asm/ecard.h>
|
#include <asm/ecard.h>
|
|
|
#include "ide.h"
|
#include "ide.h"
|
|
|
static const card_ids rapide_cids[] = {
|
static const card_ids rapide_cids[] = {
|
{ 0xffff, 0xffff }
|
{ 0xffff, 0xffff }
|
};
|
};
|
|
|
static struct expansion_card *ec[MAX_ECARDS];
|
static struct expansion_card *ec[MAX_ECARDS];
|
static int result[MAX_ECARDS];
|
static int result[MAX_ECARDS];
|
|
|
static inline int rapide_register (struct expansion_card *ec)
|
static inline int rapide_register (struct expansion_card *ec)
|
{
|
{
|
unsigned long port = ecard_address (ec, ECARD_MEMC, 0);
|
unsigned long port = ecard_address (ec, ECARD_MEMC, 0);
|
|
|
return ide_register_port (port, port + 0x206, 4, ec->irq);
|
return ide_register_port (port, port + 0x206, 4, ec->irq);
|
}
|
}
|
|
|
int rapide_init (void)
|
int rapide_init (void)
|
{
|
{
|
int i;
|
int i;
|
|
|
for (i = 0; i < MAX_ECARDS; i++)
|
for (i = 0; i < MAX_ECARDS; i++)
|
ec[i] = NULL;
|
ec[i] = NULL;
|
|
|
ecard_startfind ();
|
ecard_startfind ();
|
|
|
for (i = 0; ; i++) {
|
for (i = 0; ; i++) {
|
if ((ec[i] = ecard_find (0, rapide_cids)) == NULL)
|
if ((ec[i] = ecard_find (0, rapide_cids)) == NULL)
|
break;
|
break;
|
|
|
ecard_claim (ec[i]);
|
ecard_claim (ec[i]);
|
result[i] = rapide_register (ec[i]);
|
result[i] = rapide_register (ec[i]);
|
}
|
}
|
for (i = 0; i < MAX_ECARDS; i++)
|
for (i = 0; i < MAX_ECARDS; i++)
|
if (ec[i] && result[i] < 0) {
|
if (ec[i] && result[i] < 0) {
|
ecard_release (ec[i]);
|
ecard_release (ec[i]);
|
ec[i] = NULL;
|
ec[i] = NULL;
|
}
|
}
|
return 0;
|
return 0;
|
}
|
}
|
|
|
#ifdef MODULE
|
#ifdef MODULE
|
|
|
int init_module (void)
|
int init_module (void)
|
{
|
{
|
return rapide_init();
|
return rapide_init();
|
}
|
}
|
|
|
void cleanup_module (void)
|
void cleanup_module (void)
|
{
|
{
|
int i;
|
int i;
|
|
|
for (i = 0; i < MAX_ECARDS; i++)
|
for (i = 0; i < MAX_ECARDS; i++)
|
if (ec[i]) {
|
if (ec[i]) {
|
unsigned long port;
|
unsigned long port;
|
port = ecard_address (ec[i], ECARD_MEMC, 0);
|
port = ecard_address (ec[i], ECARD_MEMC, 0);
|
|
|
ide_unregister_port (port, ec[i]->irq, 16);
|
ide_unregister_port (port, ec[i]->irq, 16);
|
ecard_release (ec[i]);
|
ecard_release (ec[i]);
|
ec[i] = NULL;
|
ec[i] = NULL;
|
}
|
}
|
}
|
}
|
#endif
|
#endif
|
|
|
|
|