Ignore:
Timestamp:
2013-10-15T17:05:26Z (11 years ago)
Author:
Jakub Klama <jakub.klama@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f988a13
Parents:
a73ebf0
Message:

Implementation of IRQMP interrupt controller and UART drivers, part 2.
Modified kernel config files to reflect presence of new drivers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/drivers/grlib_irqmp/grlib_irqmp.c

    ra73ebf0 r4d2dba7  
    3838#include <arch/asm.h>
    3939
    40 void grlib_irqmp_init(grlib_irqmp_t *irqc, grlib_irqmp_regs_t *regs)
     40#include <mm/km.h>
     41
     42void grlib_irqmp_init(grlib_irqmp_t *irqc, bootinfo_t *bootinfo)
    4143{
    42         irqc->regs = regs;
     44        irqc->regs = (void *) km_map(bootinfo->intc_base, PAGE_SIZE,
     45            PAGE_NOT_CACHEABLE);
     46
     47        /* Mask all interrupts */
     48        pio_write_32((void *)&irqc->regs + GRLIB_IRQMP_MASK_OFFSET, 0);
    4349}
    4450
    45 unsigned grlib_irqmp_inum_get(grlib_irqmp_t *irqc)
     51int grlib_irqmp_inum_get(grlib_irqmp_t *irqc)
    4652{
    47         return 0;
     53        int i;
     54        uint32_t pending = pio_read_32(&irqc->regs->pending);
     55
     56        for (i = 1; i < 16; i++) {
     57                if (pending & (1 << i))
     58                        return i;
     59        }
     60
     61        return -1;
    4862}
    4963
    50 void grlib_irqmp_clear(grlib_irqmp_t *irqc, unsigned inum)
     64void grlib_irqmp_clear(grlib_irqmp_t *irqc, int inum)
    5165{
     66        pio_write_32(&irqc->regs->clear, (1 << inum));
    5267}
    5368
    54 void grlib_irqmp_src_enable(grlib_irqmp_t *irqc, unsigned src)
     69void grlib_irqmp_mask(grlib_irqmp_t *irqc, int src)
    5570{
     71        uint32_t mask = pio_read_32((void *)&irqc->regs + GRLIB_IRQMP_MASK_OFFSET);
     72
     73        mask &= ~(1 << src);
     74
     75        pio_write_32((void *)&irqc->regs + GRLIB_IRQMP_MASK_OFFSET, mask);
    5676}
    5777
    58 void grlib_irqmp_src_disable(grlib_irqmp_t *irqc, unsigned src)
     78void grlib_irqmp_unmask(grlib_irqmp_t *irqc, int src)
    5979{
     80        uint32_t mask = pio_read_32((void *)&irqc->regs + GRLIB_IRQMP_MASK_OFFSET);
     81
     82        mask |= (1 << src);
     83
     84        pio_write_32((void *)&irqc->regs + GRLIB_IRQMP_MASK_OFFSET, mask);
    6085}
    6186
Note: See TracChangeset for help on using the changeset viewer.