Changeset e7bc999 in mainline


Ignore:
Timestamp:
2011-03-20T21:36:17Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1fb1339, 33577f81, fd9f6e4c
Parents:
42dbb26
Message:

Add interrupt support

Fix register structure
Interrupts disabled as there is no way to access mm registers in the handler

Location:
uspace/drv/ohci
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/ohci/main.c

    r42dbb26 re7bc999  
    4848
    4949static int ohci_add_device(ddf_dev_t *device);
     50/*----------------------------------------------------------------------------*/
     51/** IRQ handling callback, identifies device
     52 *
     53 * @param[in] dev DDF instance of the device to use.
     54 * @param[in] iid (Unused).
     55 * @param[in] call Pointer to the call that represents interrupt.
     56 */
     57static void irq_handler(ddf_dev_t *dev, ipc_callid_t iid, ipc_call_t *call)
     58{
     59        assert(dev);
     60        ohci_hc_t *hc = (ohci_hc_t*)dev->driver_data;
     61        assert(hc);
     62        ohci_hc_interrupt(hc, 0);
     63}
    5064/*----------------------------------------------------------------------------*/
    5165static driver_ops_t ohci_driver_ops = {
     
    104118        }
    105119
    106         ret = ohci_hc_init(hcd, hc_fun, mem_reg_base, mem_reg_size);
     120        bool interrupts = false;
     121        ret = pci_enable_interrupts(device);
     122        if (ret != EOK) {
     123                usb_log_warning(
     124                    "Failed(%d) to enable interrupts, fall back to polling.\n",
     125                    ret);
     126        } else {
     127                usb_log_debug("Hw interrupts enabled.\n");
     128                interrupts = true;
     129        }
     130
     131        ret = ohci_hc_init(hcd, hc_fun, mem_reg_base, mem_reg_size, interrupts);
    107132        if (ret != EOK) {
    108133                usb_log_error("Failed to initialize OHCI driver.\n");
     
    110135                return ret;
    111136        }
     137
     138        ret = register_interrupt_handler(device, irq, irq_handler, NULL);
    112139
    113140        hc_fun->ops = &hc_ops;
  • uspace/drv/ohci/ohci_hc.c

    r42dbb26 re7bc999  
    4545
    4646int ohci_hc_init(ohci_hc_t *instance, ddf_fun_t *fun,
    47     uintptr_t regs, size_t reg_size)
     47    uintptr_t regs, size_t reg_size, bool interrupts)
    4848{
    4949        assert(instance);
     
    5353                return ret;
    5454        }
     55        instance->registers->interrupt_disable = 0;
     56        /* enable interrupt on root hub status change */
     57        instance->registers->interupt_enable |= IE_RHSC | IE_MIE;
     58
    5559
    5660        ohci_rh_init(&instance->rh, instance->registers);
     
    7579{
    7680        assert(instance);
     81        /* TODO: Check for interrupt cause */
    7782        ohci_rh_interrupt(&instance->rh);
    7883        /* TODO: implement */
  • uspace/drv/ohci/ohci_hc.h

    r42dbb26 re7bc999  
    5656
    5757int ohci_hc_init(ohci_hc_t *instance, ddf_fun_t *fun,
    58      uintptr_t regs, size_t reg_size);
     58     uintptr_t regs, size_t reg_size, bool interrupts);
    5959
    6060int ohci_hc_schedule(ohci_hc_t *instance, batch_t *batch);
  • uspace/drv/ohci/ohci_regs.h

    r42dbb26 re7bc999  
    4242        volatile uint32_t control;
    4343        volatile uint32_t command_status;
     44        volatile uint32_t interrupt_status;
    4445        volatile uint32_t interupt_enable;
     46#define IE_SO   (1 << 0)
     47#define IE_WDH  (1 << 1)
     48#define IE_SF   (1 << 2)
     49#define IE_RD   (1 << 3)
     50#define IE_UE   (1 << 4)
     51#define IE_FNO  (1 << 5)
     52#define IE_RHSC (1 << 6)
     53#define IE_OC   (1 << 30)
     54#define IE_MIE  (1 << 31)
     55
    4556        volatile uint32_t interrupt_disable;
    4657        volatile uint32_t hcca;
     
    6071        volatile uint32_t rh_status;
    6172        volatile uint32_t rh_port_status[];
    62 } ohci_regs_t;
     73} __attribute__((packed)) ohci_regs_t;
    6374#endif
    6475/**
  • uspace/drv/ohci/ohci_rh.c

    r42dbb26 re7bc999  
    6262void ohci_rh_interrupt(ohci_rh_t *instance)
    6363{
     64        usb_log_info("Interrupt!!.\n");
    6465        /* TODO: implement */
    6566}
  • uspace/drv/ohci/pci.c

    r42dbb26 re7bc999  
    146146int pci_enable_interrupts(ddf_dev_t *device)
    147147{
     148        return ENOTSUP;
    148149        int parent_phone =
    149150            devman_parent_device_connect(device->handle, IPC_FLAG_BLOCKING);
Note: See TracChangeset for help on using the changeset viewer.