Changeset e7bc999 in mainline
- Timestamp:
- 2011-03-20T21:36:17Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1fb1339, 33577f81, fd9f6e4c
- Parents:
- 42dbb26
- Location:
- uspace/drv/ohci
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/main.c
r42dbb26 re7bc999 48 48 49 49 static 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 */ 57 static 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 } 50 64 /*----------------------------------------------------------------------------*/ 51 65 static driver_ops_t ohci_driver_ops = { … … 104 118 } 105 119 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); 107 132 if (ret != EOK) { 108 133 usb_log_error("Failed to initialize OHCI driver.\n"); … … 110 135 return ret; 111 136 } 137 138 ret = register_interrupt_handler(device, irq, irq_handler, NULL); 112 139 113 140 hc_fun->ops = &hc_ops; -
uspace/drv/ohci/ohci_hc.c
r42dbb26 re7bc999 45 45 46 46 int 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) 48 48 { 49 49 assert(instance); … … 53 53 return ret; 54 54 } 55 instance->registers->interrupt_disable = 0; 56 /* enable interrupt on root hub status change */ 57 instance->registers->interupt_enable |= IE_RHSC | IE_MIE; 58 55 59 56 60 ohci_rh_init(&instance->rh, instance->registers); … … 75 79 { 76 80 assert(instance); 81 /* TODO: Check for interrupt cause */ 77 82 ohci_rh_interrupt(&instance->rh); 78 83 /* TODO: implement */ -
uspace/drv/ohci/ohci_hc.h
r42dbb26 re7bc999 56 56 57 57 int 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); 59 59 60 60 int ohci_hc_schedule(ohci_hc_t *instance, batch_t *batch); -
uspace/drv/ohci/ohci_regs.h
r42dbb26 re7bc999 42 42 volatile uint32_t control; 43 43 volatile uint32_t command_status; 44 volatile uint32_t interrupt_status; 44 45 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 45 56 volatile uint32_t interrupt_disable; 46 57 volatile uint32_t hcca; … … 60 71 volatile uint32_t rh_status; 61 72 volatile uint32_t rh_port_status[]; 62 } ohci_regs_t;73 } __attribute__((packed)) ohci_regs_t; 63 74 #endif 64 75 /** -
uspace/drv/ohci/ohci_rh.c
r42dbb26 re7bc999 62 62 void ohci_rh_interrupt(ohci_rh_t *instance) 63 63 { 64 usb_log_info("Interrupt!!.\n"); 64 65 /* TODO: implement */ 65 66 } -
uspace/drv/ohci/pci.c
r42dbb26 re7bc999 146 146 int pci_enable_interrupts(ddf_dev_t *device) 147 147 { 148 return ENOTSUP; 148 149 int parent_phone = 149 150 devman_parent_device_connect(device->handle, IPC_FLAG_BLOCKING);
Note:
See TracChangeset
for help on using the changeset viewer.