Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/platform/icp/icp.c

    r75fe97b ra416d070  
    3939#include <stdio.h>
    4040#include <errno.h>
     41#include <irc.h>
    4142#include <stdbool.h>
    4243#include <stdlib.h>
     
    5354        icp_kbd_irq = 3,
    5455        icp_mouse_base = 0x19000000,
    55         icp_mouse_irq = 4
     56        icp_mouse_irq = 4,
     57        icp_ic_base = 0x14000000
    5658};
    5759
     
    107109};
    108110
     111static hw_resource_t icp_ic_res[] = {
     112        {
     113                .type = MEM_RANGE,
     114                .res.mem_range = {
     115                        .address = icp_ic_base,
     116                        .size = 40,
     117                        .relative = false,
     118                        .endianness = LITTLE_ENDIAN
     119                }
     120        }
     121};
     122
    109123static pio_window_t icp_pio_window = {
    110124        .mem = {
     
    128142};
    129143
     144static icp_fun_t icp_ic_fun_proto = {
     145        .hw_resources = {
     146                sizeof(icp_ic_res) / sizeof(icp_ic_res[0]),
     147                icp_ic_res
     148        },
     149};
     150
    130151/** Obtain function soft-state from DDF function node */
    131152static icp_fun_t *icp_fun(ddf_fun_t *fnode)
     
    142163}
    143164
    144 static bool icp_enable_interrupt(ddf_fun_t *fun)
    145 {
    146         /* TODO */
     165static bool icp_fun_owns_interrupt(icp_fun_t *fun, int irq)
     166{
     167        const hw_resource_list_t *res = &fun->hw_resources;
     168
     169        /* Check that specified irq really belongs to the function */
     170        for (size_t i = 0; i < res->count; ++i) {
     171                if (res->resources[i].type == INTERRUPT &&
     172                    res->resources[i].res.interrupt.irq == irq) {
     173                        return true;
     174                }
     175        }
     176
    147177        return false;
     178}
     179
     180static int icp_fun_enable_interrupt(ddf_fun_t *fnode, int irq)
     181{
     182        icp_fun_t *fun = icp_fun(fnode);
     183
     184        if (!icp_fun_owns_interrupt(fun, irq))
     185                return EINVAL;
     186
     187        return irc_enable_interrupt(irq);
     188}
     189
     190static int icp_fun_disable_interrupt(ddf_fun_t *fnode, int irq)
     191{
     192        icp_fun_t *fun = icp_fun(fnode);
     193
     194        if (!icp_fun_owns_interrupt(fun, irq))
     195                return EINVAL;
     196
     197        return irc_disable_interrupt(irq);
     198}
     199
     200static int icp_fun_clear_interrupt(ddf_fun_t *fnode, int irq)
     201{
     202        icp_fun_t *fun = icp_fun(fnode);
     203
     204        if (!icp_fun_owns_interrupt(fun, irq))
     205                return EINVAL;
     206
     207        return irc_clear_interrupt(irq);
    148208}
    149209
     
    155215static hw_res_ops_t icp_hw_res_ops = {
    156216        .get_resource_list = &icp_get_resources,
    157         .enable_interrupt = &icp_enable_interrupt,
     217        .enable_interrupt = &icp_fun_enable_interrupt,
     218        .disable_interrupt = &icp_fun_disable_interrupt,
     219        .clear_interrupt = &icp_fun_clear_interrupt
    158220};
    159221
     
    225287                return rc;
    226288
     289        rc = icp_add_fun(dev, "intctl", "integratorcp/intctl",
     290            &icp_ic_fun_proto);
     291        if (rc != EOK)
     292                return rc;
     293
    227294        return EOK;
    228295}
Note: See TracChangeset for help on using the changeset viewer.