Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/char/i8042/main.c

    r8820544 r267f235  
    3636
    3737#include <libarch/inttypes.h>
    38 #include <libarch/config.h>
    3938#include <ddf/driver.h>
    4039#include <device/hw_res_parsed.h>
     
    4342#include <ddf/log.h>
    4443#include <stdio.h>
    45 #include <async.h>
    4644#include "i8042.h"
     45
     46#define CHECK_RET_RETURN(ret, message...) \
     47        do { \
     48                if (ret != EOK) { \
     49                        ddf_msg(LVL_ERROR, message); \
     50                        return ret; \
     51                } \
     52        } while (0)
    4753
    4854/** Get address of I/O registers.
    4955 *
    5056 * @param[in]  dev            Device asking for the addresses.
    51  * @param[out] p_io_reg       Pointer to register range.
     57 * @param[out] io_reg_address Base address of the memory range.
     58 * @param[out] io_reg_size    Size of the memory range.
    5259 * @param[out] kbd_irq        Primary port IRQ.
    5360 * @param[out] mouse_irq      Auxiliary port IRQ.
     
    5663 *
    5764 */
    58 static int get_my_registers(ddf_dev_t *dev, addr_range_t *p_io_reg,
    59     int *kbd_irq, int *mouse_irq)
     65static int get_my_registers(ddf_dev_t *dev, uintptr_t *io_reg_address,
     66    size_t *io_reg_size, int *kbd_irq, int *mouse_irq)
    6067{
    6168        assert(dev);
     
    7885        }
    7986       
    80         if (p_io_reg)
    81                 *p_io_reg = hw_resources.io_ranges.ranges[0];
     87        if (io_reg_address)
     88                *io_reg_address = hw_resources.io_ranges.ranges[0].address;
     89       
     90        if (io_reg_size)
     91                *io_reg_size = hw_resources.io_ranges.ranges[0].size;
    8292       
    8393        if (kbd_irq)
     
    100110static int i8042_dev_add(ddf_dev_t *device)
    101111{
    102         addr_range_t io_regs;
    103         int kbd = 0;
    104         int mouse = 0;
    105         int rc;
    106        
    107112        if (!device)
    108113                return EINVAL;
    109114       
    110         rc = get_my_registers(device, &io_regs, &kbd, &mouse);
    111         if (rc != EOK) {
    112                 ddf_msg(LVL_ERROR, "Failed to get registers: %s.",
    113                     str_error(rc));
    114                 return rc;
    115         }
     115        uintptr_t io_regs = 0;
     116        size_t io_size = 0;
     117        int kbd = 0;
     118        int mouse = 0;
    116119       
    117         ddf_msg(LVL_DEBUG,
    118             "I/O regs at %p (size %zuB), IRQ kbd %d, IRQ mouse %d.",
    119             RNGABSPTR(io_regs), RNGSZ(io_regs), kbd, mouse);
     120        int ret = get_my_registers(device, &io_regs, &io_size, &kbd, &mouse);
     121        CHECK_RET_RETURN(ret, "Failed to get registers: %s.",
     122            str_error(ret));
     123        ddf_msg(LVL_DEBUG, "I/O regs at %p (size %zuB), IRQ kbd %d, IRQ mouse %d.",
     124            (void *) io_regs, io_size, kbd, mouse);
    120125       
    121126        i8042_t *i8042 = ddf_dev_data_alloc(device, sizeof(i8042_t));
    122         if (i8042 == NULL) {
    123                 ddf_msg(LVL_ERROR, "Out of memory.");
    124                 return ENOMEM;
    125         }
     127        ret = (i8042 == NULL) ? ENOMEM : EOK;
     128        CHECK_RET_RETURN(ret, "Failed to allocate i8042 driver instance.");
    126129       
    127         rc = i8042_init(i8042, &io_regs, kbd, mouse, device);
    128         if (rc != EOK) {
    129                 ddf_msg(LVL_ERROR, "Failed to initialize i8042 driver: %s.",
    130                     str_error(rc));
    131                 return rc;
    132         }
     130        ret = i8042_init(i8042, (void *) io_regs, io_size, kbd, mouse, device);
     131        CHECK_RET_RETURN(ret, "Failed to initialize i8042 driver: %s.",
     132            str_error(ret));
    133133       
    134134        ddf_msg(LVL_NOTE, "Controlling '%s' (%" PRIun ").",
     
    152152        printf("%s: HelenOS PS/2 driver.\n", NAME);
    153153        ddf_log_init(NAME);
    154        
    155         /*
    156          * Alleviate the virtual memory / page table pressure caused by
    157          * interrupt storms when the default large stacks are used.
    158          */
    159         async_set_notification_handler_stack_size(PAGE_SIZE);
    160 
    161154        return ddf_driver_main(&i8042_driver);
    162155}
Note: See TracChangeset for help on using the changeset viewer.