Changeset 7de1988c in mainline for uspace/drv/bus/usb/ohci
- Timestamp:
- 2013-09-12T20:53:09Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- ddd0499d
- Parents:
- 8049b79
- Location:
- uspace/drv/bus/usb/ohci
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/ohci/hc.c
r8049b79 r7de1988c 106 106 * @param[out] cmds Commands buffer. 107 107 * @param[in] cmds_size Size of the commands buffer (bytes). 108 * @param[in] regs Physical address of device's registers. 109 * @param[in] reg_size Size of the register area (bytes). 108 * @param[in] regs Device's register range. 110 109 * 111 110 * @return Error code. … … 113 112 int 114 113 hc_get_irq_code(irq_pio_range_t ranges[], size_t ranges_size, irq_cmd_t cmds[], 115 size_t cmds_size, uintptr_t regs, size_t reg_size)114 size_t cmds_size, addr_range_t *regs) 116 115 { 117 116 if ((ranges_size < sizeof(ohci_pio_ranges)) || 118 117 (cmds_size < sizeof(ohci_irq_commands)) || 119 ( reg_size< sizeof(ohci_regs_t)))118 (RNGSZ(*regs) < sizeof(ohci_regs_t))) 120 119 return EOVERFLOW; 121 120 122 121 memcpy(ranges, ohci_pio_ranges, sizeof(ohci_pio_ranges)); 123 ranges[0].base = regs;122 ranges[0].base = RNGABS(*regs); 124 123 125 124 memcpy(cmds, ohci_irq_commands, sizeof(ohci_irq_commands)); 126 ohci_regs_t *registers = (ohci_regs_t *) regs;125 ohci_regs_t *registers = (ohci_regs_t *) RNGABSPTR(*regs); 127 126 cmds[0].addr = (void *) ®isters->interrupt_status; 128 127 cmds[3].addr = (void *) ®isters->interrupt_status; … … 135 134 * 136 135 * @param[in] device Host controller DDF device 137 * @param[in] reg_base Register range base 138 * @param[in] reg_size Register range size 136 * @param[in] regs Register range 139 137 * @param[in] irq Interrupt number 140 138 * @paran[in] handler Interrupt handler … … 142 140 * @return EOK on success or negative error code 143 141 */ 144 int hc_register_irq_handler(ddf_dev_t *device, uintptr_t reg_base, size_t reg_size,145 int irq, interrupt_handler_t handler)142 int hc_register_irq_handler(ddf_dev_t *device, addr_range_t *regs, int irq, 143 interrupt_handler_t handler) 146 144 { 147 145 int rc; … … 158 156 159 157 rc = hc_get_irq_code(irq_ranges, sizeof(irq_ranges), irq_cmds, 160 sizeof(irq_cmds), reg _base, reg_size);158 sizeof(irq_cmds), regs); 161 159 if (rc != EOK) { 162 160 usb_log_error("Failed to generate IRQ code: %s.\n", … … 259 257 * 260 258 * @param[in] instance Memory place for the structure. 261 * @param[in] regs Address of the memory mapped I/O registers. 262 * @param[in] reg_size Size of the memory mapped area. 259 * @param[in] regs Device's I/O registers range. 263 260 * @param[in] interrupts True if w interrupts should be used 264 261 * @return Error code 265 262 */ 266 int hc_init(hc_t *instance, uintptr_t regs, size_t reg_size, bool interrupts) 267 { 268 assert(instance); 269 270 int rc = 271 pio_enable((void*)regs, reg_size, (void**)&instance->registers); 263 int hc_init(hc_t *instance, addr_range_t *regs, bool interrupts) 264 { 265 assert(instance); 266 267 int rc = pio_enable_range(regs, (void **) &instance->registers); 272 268 if (rc != EOK) { 273 269 usb_log_error("Failed to gain access to device registers: %s.\n", -
uspace/drv/bus/usb/ohci/hc.h
r8049b79 r7de1988c 75 75 } hc_t; 76 76 77 int hc_get_irq_code(irq_pio_range_t [], size_t, irq_cmd_t [], size_t, uintptr_t, 78 size_t); 79 int hc_register_irq_handler(ddf_dev_t *, uintptr_t, size_t, int, interrupt_handler_t); 77 int hc_get_irq_code(irq_pio_range_t [], size_t, irq_cmd_t [], size_t, 78 addr_range_t *); 79 int hc_register_irq_handler(ddf_dev_t *, addr_range_t *, int, 80 interrupt_handler_t); 80 81 int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun); 81 int hc_init(hc_t *instance, uintptr_t regs, size_t reg_size, bool interrupts);82 int hc_init(hc_t *instance, addr_range_t *regs, bool interrupts); 82 83 83 84 /** Safely dispose host controller internal structures -
uspace/drv/bus/usb/ohci/ohci.c
r8049b79 r7de1988c 177 177 ddf_fun_set_ops(instance->rh_fun, &rh_ops); 178 178 179 uintptr_t reg_base = 0; 180 size_t reg_size = 0; 179 addr_range_t regs; 181 180 int irq = 0; 182 181 183 rc = get_my_registers(device, ® _base, ®_size, &irq);182 rc = get_my_registers(device, ®s, &irq); 184 183 if (rc != EOK) { 185 184 usb_log_error("Failed to get register memory addresses " … … 190 189 191 190 usb_log_debug("Memory mapped regs at %p (size %zu), IRQ %d.\n", 192 (void *) reg_base, reg_size, irq);193 194 rc = hc_register_irq_handler(device, reg_base, reg_size, irq, irq_handler);191 RNGABSPTR(regs), RNGSZ(regs), irq); 192 193 rc = hc_register_irq_handler(device, ®s, irq, irq_handler); 195 194 if (rc != EOK) { 196 195 usb_log_error("Failed to register interrupt handler: %s.\n", … … 215 214 } 216 215 217 rc = hc_init(&instance->hc, reg_base, reg_size, interrupts);216 rc = hc_init(&instance->hc, ®s, interrupts); 218 217 if (rc != EOK) { 219 218 usb_log_error("Failed to init ohci_hcd: %s.\n", str_error(rc)); -
uspace/drv/bus/usb/ohci/res.c
r8049b79 r7de1988c 48 48 * 49 49 * @param[in] dev Device asking for the addresses. 50 * @param[out] mem_reg_address Base address of the memory range. 51 * @param[out] mem_reg_size Size of the memory range. 50 * @param[out] p_regs Pointer to register range. 52 51 * @param[out] irq_no IRQ assigned to the device. 53 52 * @return Error code. 54 53 */ 55 int get_my_registers(ddf_dev_t *dev, 56 uintptr_t *mem_reg_address, size_t *mem_reg_size, int *irq_no) 54 int get_my_registers(ddf_dev_t *dev, addr_range_t *p_regs, int *irq_no) 57 55 { 58 56 assert(dev); … … 66 64 hw_res_list_parsed_t hw_res; 67 65 hw_res_list_parsed_init(&hw_res); 68 const int ret = hw_res_get_list_parsed(parent_sess, &hw_res, 0);66 const int ret = hw_res_get_list_parsed(parent_sess, &hw_res, 0); 69 67 async_hangup(parent_sess); 70 68 if (ret != EOK) { … … 78 76 } 79 77 80 if (mem_reg_address) 81 *mem_reg_address = hw_res.mem_ranges.ranges[0].address; 82 if (mem_reg_size) 83 *mem_reg_size = hw_res.mem_ranges.ranges[0].size; 78 if (p_regs) 79 *p_regs = hw_res.mem_ranges.ranges[0]; 84 80 if (irq_no) 85 81 *irq_no = hw_res.irqs.irqs[0]; -
uspace/drv/bus/usb/ohci/res.h
r8049b79 r7de1988c 36 36 37 37 #include <ddf/driver.h> 38 #include <device/hw_res_parsed.h> 38 39 39 int get_my_registers(ddf_dev_t *, uintptr_t *, size_t *, int *);40 int get_my_registers(ddf_dev_t *, addr_range_t *, int *); 40 41 int enable_interrupts(ddf_dev_t *); 41 42
Note:
See TracChangeset
for help on using the changeset viewer.
