Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/isa/isa.c

    r5960b48 r5cc9eba  
    22 * Copyright (c) 2010 Lenka Trochtova
    33 * Copyright (c) 2011 Jiri Svoboda
     4 * Copyright (c) 2011 Jan Vesely
    45 * All rights reserved.
    56 *
     
    5657#include <ns.h>
    5758#include <sys/stat.h>
     59#include <ipc/irc.h>
     60#include <ipc/services.h>
     61#include <sysinfo.h>
     62#include <ns.h>
    5863
    5964#include <ddf/driver.h>
     
    6570#include <device/hw_res.h>
    6671
     72#include "i8237.h"
     73
    6774#define NAME "isa"
    6875#define CHILD_FUN_CONF_PATH "/drv/isa/isa.dev"
     
    7481#define ISA_FUN(fun) ((isa_fun_t *) ((fun)->driver_data))
    7582
    76 #define ISA_MAX_HW_RES 4
     83#define ISA_MAX_HW_RES 5
    7784
    7885typedef struct {
     
    141148}
    142149
     150static int isa_dma_channel_fun_setup(ddf_fun_t *fnode,
     151    unsigned int channel, uint32_t pa, uint16_t size, uint8_t mode)
     152{
     153        assert(fnode);
     154        isa_fun_t *isa_fun = fnode->driver_data;
     155        const hw_resource_list_t *res = &isa_fun->hw_resources;
     156        assert(res);
     157       
     158        const unsigned int ch = channel;
     159        for (size_t i = 0; i < res->count; ++i) {
     160                if (((res->resources[i].type == DMA_CHANNEL_16) &&
     161                    (res->resources[i].res.dma_channel.dma16 == ch)) ||
     162                    ((res->resources[i].type == DMA_CHANNEL_8) &&
     163                    (res->resources[i].res.dma_channel.dma8 == ch))) {
     164                        return dma_setup_channel(channel, pa, size, mode);
     165                }
     166        }
     167       
     168        return EINVAL;
     169}
     170
    143171static hw_res_ops_t isa_fun_hw_res_ops = {
    144         &isa_get_fun_resources,
    145         &isa_enable_fun_interrupt
     172        .get_resource_list = isa_get_fun_resources,
     173        .enable_interrupt = isa_enable_fun_interrupt,
     174        .dma_channel_setup = isa_dma_channel_fun_setup,
    146175};
    147176
     
    314343}
    315344
     345static void isa_fun_set_dma(isa_fun_t *fun, int dma)
     346{
     347        size_t count = fun->hw_resources.count;
     348        hw_resource_t *resources = fun->hw_resources.resources;
     349       
     350        if (count < ISA_MAX_HW_RES) {
     351                if ((dma > 0) && (dma < 4)) {
     352                        resources[count].type = DMA_CHANNEL_8;
     353                        resources[count].res.dma_channel.dma8 = dma;
     354                       
     355                        fun->hw_resources.count++;
     356                        ddf_msg(LVL_NOTE, "Added dma 0x%x to function %s", dma,
     357                            fun->fnode->name);
     358                       
     359                        return;
     360                }
     361
     362                if ((dma > 4) && (dma < 8)) {
     363                        resources[count].type = DMA_CHANNEL_16;
     364                        resources[count].res.dma_channel.dma16 = dma;
     365                       
     366                        fun->hw_resources.count++;
     367                        ddf_msg(LVL_NOTE, "Added dma 0x%x to function %s", dma,
     368                            fun->fnode->name);
     369                       
     370                        return;
     371                }
     372               
     373                ddf_msg(LVL_WARN, "Skipped dma 0x%x for function %s", dma,
     374                    fun->fnode->name);
     375        }
     376}
     377
    316378static void isa_fun_set_io_range(isa_fun_t *fun, size_t addr, size_t len)
    317379{
     
    339401
    340402        val = skip_spaces(val);
    341         irq = (int)strtol(val, &end, 10);
     403        irq = (int) strtol(val, &end, 10);
    342404
    343405        if (val != end)
    344406                isa_fun_set_irq(fun, irq);
     407}
     408
     409static void fun_parse_dma(isa_fun_t *fun, char *val)
     410{
     411        unsigned int dma = 0;
     412        char *end = NULL;
     413       
     414        val = skip_spaces(val);
     415        dma = (unsigned int) strtol(val, &end, 10);
     416       
     417        if (val != end)
     418                isa_fun_set_dma(fun, dma);
    345419}
    346420
     
    436510        if (!prop_parse(fun, line, "io_range", &fun_parse_io_range) &&
    437511            !prop_parse(fun, line, "irq", &fun_parse_irq) &&
     512            !prop_parse(fun, line, "dma", &fun_parse_dma) &&
    438513            !prop_parse(fun, line, "match", &fun_parse_match_id)) {
    439514
     
    446521{
    447522        fun->hw_resources.resources =
    448             (hw_resource_t *)malloc(sizeof(hw_resource_t) * ISA_MAX_HW_RES);
     523            (hw_resource_t *) malloc(sizeof(hw_resource_t) * ISA_MAX_HW_RES);
    449524}
    450525
     
    630705
    631706
    632 static void isa_init() 
     707static void isa_init()
    633708{
    634709        ddf_log_init(NAME, LVL_ERROR);
Note: See TracChangeset for help on using the changeset viewer.