Ignore:
File:
1 edited

Legend:

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

    r5cc9eba r5960b48  
    22 * Copyright (c) 2010 Lenka Trochtova
    33 * Copyright (c) 2011 Jiri Svoboda
    4  * Copyright (c) 2011 Jan Vesely
    54 * All rights reserved.
    65 *
     
    5756#include <ns.h>
    5857#include <sys/stat.h>
    59 #include <ipc/irc.h>
    60 #include <ipc/services.h>
    61 #include <sysinfo.h>
    62 #include <ns.h>
    6358
    6459#include <ddf/driver.h>
     
    7065#include <device/hw_res.h>
    7166
    72 #include "i8237.h"
    73 
    7467#define NAME "isa"
    7568#define CHILD_FUN_CONF_PATH "/drv/isa/isa.dev"
     
    8174#define ISA_FUN(fun) ((isa_fun_t *) ((fun)->driver_data))
    8275
    83 #define ISA_MAX_HW_RES 5
     76#define ISA_MAX_HW_RES 4
    8477
    8578typedef struct {
     
    148141}
    149142
    150 static 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 
    171143static hw_res_ops_t isa_fun_hw_res_ops = {
    172         .get_resource_list = isa_get_fun_resources,
    173         .enable_interrupt = isa_enable_fun_interrupt,
    174         .dma_channel_setup = isa_dma_channel_fun_setup,
     144        &isa_get_fun_resources,
     145        &isa_enable_fun_interrupt
    175146};
    176147
     
    343314}
    344315
    345 static 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 
    378316static void isa_fun_set_io_range(isa_fun_t *fun, size_t addr, size_t len)
    379317{
     
    401339
    402340        val = skip_spaces(val);
    403         irq = (int) strtol(val, &end, 10);
     341        irq = (int)strtol(val, &end, 10);
    404342
    405343        if (val != end)
    406344                isa_fun_set_irq(fun, irq);
    407 }
    408 
    409 static 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);
    419345}
    420346
     
    510436        if (!prop_parse(fun, line, "io_range", &fun_parse_io_range) &&
    511437            !prop_parse(fun, line, "irq", &fun_parse_irq) &&
    512             !prop_parse(fun, line, "dma", &fun_parse_dma) &&
    513438            !prop_parse(fun, line, "match", &fun_parse_match_id)) {
    514439
     
    521446{
    522447        fun->hw_resources.resources =
    523             (hw_resource_t *) malloc(sizeof(hw_resource_t) * ISA_MAX_HW_RES);
     448            (hw_resource_t *)malloc(sizeof(hw_resource_t) * ISA_MAX_HW_RES);
    524449}
    525450
     
    705630
    706631
    707 static void isa_init()
     632static void isa_init() 
    708633{
    709634        ddf_log_init(NAME, LVL_ERROR);
Note: See TracChangeset for help on using the changeset viewer.