Changeset 8d2760f in mainline for kernel/genarch/src/kbd/z8530.c


Ignore:
Timestamp:
2008-11-29T20:24:47Z (16 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
57e76cb
Parents:
dfd77382
Message:

Add additional members to the irq_t structure so that an interrupt-driven driver
does not need to know how to clear the level interrupt. The z8530 was modified
in this way and is much more generic. The ns16550 driver has also been modified,
but awaits testing. The sparc64 interrupt mapping and dispatch code is now using
the new info and calls the clear-interrupt-routine itself.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/kbd/z8530.c

    rdfd77382 r8d2760f  
    4444#include <arch/interrupt.h>
    4545#include <arch/drivers/kbd.h>
    46 #include <arch/drivers/fhc.h>
    4746#include <cpu.h>
    4847#include <arch/asm.h>
     
    8483        z8530_write_a(&z8530, WR0, WR0_TX_IP_RST);
    8584
    86         z8530_write_a(&z8530, WR1, WR1_IARCSC);         /* interrupt on all characters */
     85        /* interrupt on all characters */
     86        z8530_write_a(&z8530, WR1, WR1_IARCSC);
    8787
    8888        /* 8 bits per character and enable receiver */
    8989        z8530_write_a(&z8530, WR3, WR3_RX8BITSCH | WR3_RX_ENABLE);
    9090       
    91         z8530_write_a(&z8530, WR9, WR9_MIE);            /* Master Interrupt Enable. */
     91        /* Master Interrupt Enable. */
     92        z8530_write_a(&z8530, WR9, WR9_MIE);
    9293       
    9394        spinlock_lock(&z8530_irq.lock);
     
    109110
    110111/** Initialize z8530. */
    111 void z8530_init(devno_t devno, inr_t inr, uintptr_t vaddr)
     112void
     113z8530_init(devno_t devno, uintptr_t vaddr, inr_t inr, cir_t cir, void *cir_arg)
    112114{
    113115        chardev_initialize("z8530_kbd", &kbrd, &ops);
     
    122124        z8530_irq.claim = z8530_claim;
    123125        z8530_irq.handler = z8530_irq_handler;
     126        z8530_irq.cir = cir;
     127        z8530_irq.cir_arg = cir_arg;
    124128        irq_register(&z8530_irq);
    125129
     
    198202void z8530_irq_handler(irq_t *irq, void *arg, ...)
    199203{
    200         /*
    201          * So far, we know we got this interrupt through the FHC.
    202          * Since we don't have enough documentation about the FHC
    203          * and because the interrupt looks like level sensitive,
    204          * we cannot handle it by scheduling one of the level
    205          * interrupt traps. Process the interrupt directly.
    206          */
    207204        if (irq->notif_cfg.notify && irq->notif_cfg.answerbox)
    208205                ipc_irq_send_notif(irq);
    209206        else
    210207                z8530_interrupt();
    211         fhc_clear_interrupt(central_fhc, irq->inr);
    212208}
    213209
Note: See TracChangeset for help on using the changeset viewer.