Changeset 772a172 in mainline


Ignore:
Timestamp:
2013-09-21T05:22:43Z (11 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f65d9cc
Parents:
19d21728
Message:

ohci,uhci: Switch to library provided irq setup routine.

Location:
uspace/drv/bus/usb
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/ohci/hc.c

    r19d21728 r772a172  
    125125        code->cmds[3].addr = (void *) &registers->interrupt_status;
    126126        OHCI_WR(code->cmds[1].value, OHCI_USED_INTERRUPTS);
    127 
    128         return EOK;
    129 }
    130 
    131 /** Register interrupt handler.
    132  *
    133  * @param[in] device Host controller DDF device
    134  * @param[in] regs Register range
    135  * @param[in] irq Interrupt number
    136  * @paran[in] handler Interrupt handler
    137  *
    138  * @return EOK on success or negative error code
    139  */
    140 int hc_register_irq_handler(ddf_dev_t *device, addr_range_t *regs, int irq,
    141     interrupt_handler_t handler)
    142 {
    143         irq_code_t irq_code = { 0 };
    144 
    145         int ret = hc_gen_irq_code(&irq_code, regs);
    146         if (ret != EOK) {
    147                 usb_log_error("Failed to generate IRQ code: %s.\n",
    148                     str_error(ret));
    149                 return ret;
    150         }
    151 
    152         //TODO we leak memory here
    153 
    154         /* Register handler to avoid interrupt lockup */
    155         ret = register_interrupt_handler(device, irq, handler, &irq_code);
    156         if (ret != EOK) {
    157                 usb_log_error("Failed to register interrupt handler: %s.\n",
    158                     str_error(ret));
    159                 return ret;
    160         }
    161127
    162128        return EOK;
  • uspace/drv/bus/usb/ohci/hc.h

    r19d21728 r772a172  
    7373
    7474int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs);
    75 int hc_register_irq_handler(ddf_dev_t *, addr_range_t *, int,
    76     interrupt_handler_t);
    7775int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun);
    7876int hc_init(hc_t *instance, addr_range_t *regs, bool interrupts);
  • uspace/drv/bus/usb/ohci/ohci.c

    r19d21728 r772a172  
    103103        }
    104104
    105         ret = hc_register_irq_handler(device, &regs, irq, irq_handler);
    106         if (ret != EOK) {
    107                 usb_log_error("Failed to register interrupt handler: %s.\n",
    108                     str_error(ret));
     105        hc_t *hc = malloc(sizeof(hc_t));
     106        if (!hc) {
     107                usb_log_error("Failed to allocate driver structure.\n");
     108                ret = ENOMEM;
    109109                goto ddf_hc_clean;
    110110        }
     
    112112        /* Try to enable interrupts */
    113113        bool interrupts = false;
    114         ret = hcd_ddf_enable_interrupts(device);
     114        ret = hcd_ddf_setup_interrupts(device, &regs, irq, irq_handler,
     115            hc_gen_irq_code);
    115116        if (ret != EOK) {
    116117                usb_log_warning("Failed to enable interrupts: %s."
     
    123124        }
    124125
    125         hc_t *hc = malloc(sizeof(hc_t));
    126         if (!hc) {
    127                 usb_log_error("Failed to allocate driver structure.\n");
    128                 ret = ENOMEM;
    129                 goto unregister_irq;
    130         }
    131 
    132126        /* Initialize OHCI HC */
    133127        ret = hc_init(hc, &regs, interrupts);
    134128        if (ret != EOK) {
    135129                usb_log_error("Failed to init hc: %s.\n", str_error(ret));
    136                 goto hc_free;
     130                goto unregister_irq;
    137131        }
    138132
     
    147141                    str_error(ret));
    148142                hc_fini(hc);
    149 hc_free:
    150                 free(hc);
    151143unregister_irq:
    152144                unregister_interrupt_handler(device, irq);
     145                free(hc);
    153146ddf_hc_clean:
    154147                hcd_ddf_clean_hc(device);
  • uspace/drv/bus/usb/uhci/hc.c

    r19d21728 r772a172  
    127127}
    128128
    129 /** Register interrupt handler.
    130  *
    131  * @param[in] device Host controller DDF device
    132  * @param[in] regs Register range
    133  * @param[in] irq Interrupt number
    134  * @paran[in] handler Interrupt handler
    135  *
    136  * @return EOK on success or negative error code
    137  */
    138 int hc_register_irq_handler(ddf_dev_t *device, addr_range_t *regs, int irq,
    139     interrupt_handler_t handler)
    140 {
    141         assert(device);
    142 
    143         irq_code_t irq_code = { 0 };
    144 
    145         int ret = hc_gen_irq_code(&irq_code, regs);
    146         if (ret != EOK) {
    147                 usb_log_error("Failed to generate IRQ commands: %s.\n",
    148                     str_error(ret));
    149                 return ret;
    150         }
    151         //TODO we leak memory here
    152 
    153         /* Register handler to avoid interrupt lockup */
    154         ret = register_interrupt_handler(device, irq, handler, &irq_code);
    155         if (ret != EOK) {
    156                 usb_log_error("Failed to register interrupt handler: %s.\n",
    157                     str_error(ret));
    158                 return ret;
    159         }
    160 
    161         return EOK;
    162 }
    163 
    164129/** Take action based on the interrupt cause.
    165130 *
  • uspace/drv/bus/usb/uhci/hc.h

    r19d21728 r772a172  
    124124} hc_t;
    125125
    126 int hc_register_irq_handler(ddf_dev_t *, addr_range_t *, int,
    127     interrupt_handler_t);
    128126int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs);
    129127void hc_interrupt(hc_t *instance, uint16_t status);
  • uspace/drv/bus/usb/uhci/uhci.c

    r19d21728 r772a172  
    109109        }
    110110
    111         ret = hc_register_irq_handler(device, &regs, irq, irq_handler);
    112         if (ret != EOK) {
    113                 usb_log_error("Failed to register interrupt handler: %s.\n",
    114                     str_error(ret));
    115                 goto hc_free;
    116         }
    117 
    118111        bool interrupts = false;
    119         ret = hcd_ddf_enable_interrupts(device);
     112        ret = hcd_ddf_setup_interrupts(device, &regs, irq, irq_handler,
     113            hc_gen_irq_code);
    120114        if (ret != EOK) {
    121115                usb_log_warning("Failed to enable interrupts: %s."
     
    154148irq_unregister:
    155149                unregister_interrupt_handler(device, irq);
    156 hc_free:
    157150                free(hc);
    158151ddf_hc_clean:
Note: See TracChangeset for help on using the changeset viewer.