Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 296263
b: refs/heads/master
c: 530c2ea
h: refs/heads/master
i:
  296261: 7fa76b4
  296259: 96898b2
  296255: 18e66e8
v: v3
  • Loading branch information
Russell King committed Mar 24, 2012
1 parent 4d43cec commit f5ba9a2
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 102 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b4ac08492d06e4f2cea24a5b2579b4b0a0f537ce
refs/heads/master: 530c2eaa6ab69fca94911f2aa74fe3e11b1cd19b
103 changes: 2 additions & 101 deletions trunk/arch/arm/mach-rpc/ecard.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,6 @@

#include "ecard.h"

#ifndef CONFIG_ARCH_RPC
#define HAVE_EXPMASK
#endif

struct ecard_request {
void (*fn)(struct ecard_request *);
ecard_t *ec;
Expand All @@ -78,9 +74,6 @@ struct expcard_blacklist {
static ecard_t *cards;
static ecard_t *slot_to_expcard[MAX_ECARDS];
static unsigned int ectcr;
#ifdef HAS_EXPMASK
static unsigned int have_expmask;
#endif

/* List of descriptions of cards which don't have an extended
* identification, or chunk directories containing a description.
Expand Down Expand Up @@ -391,22 +384,10 @@ int ecard_readchunk(struct in_chunk_dir *cd, ecard_t *ec, int id, int num)

static void ecard_def_irq_enable(ecard_t *ec, int irqnr)
{
#ifdef HAS_EXPMASK
if (irqnr < 4 && have_expmask) {
have_expmask |= 1 << irqnr;
__raw_writeb(have_expmask, EXPMASK_ENABLE);
}
#endif
}

static void ecard_def_irq_disable(ecard_t *ec, int irqnr)
{
#ifdef HAS_EXPMASK
if (irqnr < 4 && have_expmask) {
have_expmask &= ~(1 << irqnr);
__raw_writeb(have_expmask, EXPMASK_ENABLE);
}
#endif
}

static int ecard_def_irq_pending(ecard_t *ec)
Expand Down Expand Up @@ -598,83 +579,6 @@ ecard_irq_handler(unsigned int irq, struct irq_desc *desc)
ecard_check_lockup(desc);
}

#ifdef HAS_EXPMASK
static unsigned char priority_masks[] =
{
0xf0, 0xf1, 0xf3, 0xf7, 0xff, 0xff, 0xff, 0xff
};

static unsigned char first_set[] =
{
0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00,
0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00
};

static void
ecard_irqexp_handler(unsigned int irq, struct irq_desc *desc)
{
const unsigned int statusmask = 15;
unsigned int status;

status = __raw_readb(EXPMASK_STATUS) & statusmask;
if (status) {
unsigned int slot = first_set[status];
ecard_t *ec = slot_to_ecard(slot);

if (ec->claimed) {
/*
* this ugly code is so that we can operate a
* prioritorising system:
*
* Card 0 highest priority
* Card 1
* Card 2
* Card 3 lowest priority
*
* Serial cards should go in 0/1, ethernet/scsi in 2/3
* otherwise you will lose serial data at high speeds!
*/
generic_handle_irq(ec->irq);
} else {
printk(KERN_WARNING "card%d: interrupt from unclaimed "
"card???\n", slot);
have_expmask &= ~(1 << slot);
__raw_writeb(have_expmask, EXPMASK_ENABLE);
}
} else
printk(KERN_WARNING "Wild interrupt from backplane (masks)\n");
}

static int __init ecard_probeirqhw(void)
{
ecard_t *ec;
int found;

__raw_writeb(0x00, EXPMASK_ENABLE);
__raw_writeb(0xff, EXPMASK_STATUS);
found = (__raw_readb(EXPMASK_STATUS) & 15) == 0;
__raw_writeb(0xff, EXPMASK_ENABLE);

if (found) {
printk(KERN_DEBUG "Expansion card interrupt "
"management hardware found\n");

/* for each card present, set a bit to '1' */
have_expmask = 0x80000000;

for (ec = cards; ec; ec = ec->next)
have_expmask |= 1 << ec->slot_no;

__raw_writeb(have_expmask, EXPMASK_ENABLE);
}

return found;
}
#else
#define ecard_irqexp_handler NULL
#define ecard_probeirqhw() (0)
#endif

static void __iomem *__ecard_address(ecard_t *ec, card_type_t type, card_speed_t speed)
{
void __iomem *address = NULL;
Expand Down Expand Up @@ -1073,7 +977,7 @@ static int __init ecard_probe(int slot, unsigned irq, card_type_t type)
static int __init ecard_init(void)
{
struct task_struct *task;
int slot, irqhw, irqbase;
int slot, irqbase;

irqbase = irq_alloc_descs(-1, 0, 8, -1);
if (irqbase < 0)
Expand All @@ -1096,10 +1000,7 @@ static int __init ecard_init(void)

ecard_probe(8, 11, ECARD_IOC);

irqhw = ecard_probeirqhw();

irq_set_chained_handler(IRQ_EXPANSIONCARD,
irqhw ? ecard_irqexp_handler : ecard_irq_handler);
irq_set_chained_handler(IRQ_EXPANSIONCARD, ecard_irq_handler);

ecard_proc_init();

Expand Down

0 comments on commit f5ba9a2

Please sign in to comment.