Changeset e4d7363 in mainline for uspace/drv/bus/usb/ohci


Ignore:
Timestamp:
2017-06-22T21:34:39Z (9 years ago)
Author:
Ondřej Hlavatý <aearsis@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
91ca111
Parents:
cb89430
Message:

usbhost: refactor the initialization

Before that, drivers had to setup MMIO range multiple times, or even parse hw
resources themselves again. The former init method was split in half - init and
start. Init shall allocate and initialize inner structures, start shall start
the HC.

In the XHCI it is demonstrated how to isolate inner HC implementation from the
fact this driver is using libusbhost. It adds some boilerplate code, but
I think it leads to cleaner design.

Location:
uspace/drv/bus/usb/ohci
Files:
3 edited

Legend:

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

    rcb89430 re4d7363  
    8989};
    9090
    91 static void hc_gain_control(hc_t *instance);
    92 static void hc_start(hc_t *instance);
    9391static int hc_init_transfer_lists(hc_t *instance);
    9492static int hc_init_memory(hc_t *instance);
     
    103101 * @return Error code.
    104102 */
    105 int ohci_hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res)
     103int ohci_hc_gen_irq_code(irq_code_t *code, hcd_t *hcd, const hw_res_list_parsed_t *hw_res)
    106104{
    107105        assert(code);
     
    151149 * @return Error code
    152150 */
    153 int hc_init(hc_t *instance, const hw_res_list_parsed_t *hw_res, bool interrupts)
     151int hc_init(hc_t *instance, const hw_res_list_parsed_t *hw_res)
    154152{
    155153        assert(instance);
     
    172170        list_initialize(&instance->pending_batches);
    173171        fibril_mutex_initialize(&instance->guard);
    174         instance->hw_interrupts = interrupts;
    175172
    176173        ret = hc_init_memory(instance);
     
    181178                return ret;
    182179        }
    183 
    184         hc_gain_control(instance);
    185 
    186         ohci_rh_init(&instance->rh, instance->registers, "ohci rh");
    187         hc_start(instance);
    188180
    189181        return EOK;
     
    443435void hc_start(hc_t *instance)
    444436{
     437        ohci_rh_init(&instance->rh, instance->registers, "ohci rh");
     438
    445439        /* OHCI guide page 42 */
    446440        assert(instance);
  • uspace/drv/bus/usb/ohci/hc.h

    rcb89430 re4d7363  
    8080} hc_t;
    8181
    82 extern int hc_init(hc_t *, const hw_res_list_parsed_t *, bool);
     82extern int hc_init(hc_t *, const hw_res_list_parsed_t *);
     83extern void hc_gain_control(hc_t *instance);
     84extern void hc_start(hc_t *instance);
    8385extern void hc_fini(hc_t *);
    8486
     
    8688extern void hc_dequeue_endpoint(hc_t *, const endpoint_t *);
    8789
    88 int ohci_hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res);
     90int ohci_hc_gen_irq_code(irq_code_t *code, hcd_t *hcd, const hw_res_list_parsed_t *hw_res);
    8991
    9092extern void ohci_hc_interrupt(hcd_t *, uint32_t);
  • uspace/drv/bus/usb/ohci/main.c

    rcb89430 re4d7363  
    4747
    4848#define NAME "ohci"
    49 static int ohci_driver_init(hcd_t *, const hw_res_list_parsed_t *, bool);
     49static int ohci_driver_init(hcd_t *, const hw_res_list_parsed_t *);
     50static int ohci_driver_start(hcd_t *, bool);
     51static int ohci_driver_claim(hcd_t *, ddf_dev_t *);
    5052static void ohci_driver_fini(hcd_t *);
    5153
     
    5456        .irq_code_gen = ohci_hc_gen_irq_code,
    5557        .init = ohci_driver_init,
     58        .claim = ohci_driver_claim,
     59        .start = ohci_driver_start,
    5660        .fini = ohci_driver_fini,
    5761        .name = "OHCI",
     
    6670
    6771
    68 static int ohci_driver_init(hcd_t *hcd, const hw_res_list_parsed_t *res, bool irq)
     72static int ohci_driver_init(hcd_t *hcd, const hw_res_list_parsed_t *res)
    6973{
    7074        assert(hcd);
     
    7579                return ENOMEM;
    7680
    77         const int ret = hc_init(instance, res, irq);
     81        const int ret = hc_init(instance, res);
    7882        if (ret == EOK) {
    7983                hcd_set_implementation(hcd, instance, &ohci_hc_driver.ops);
     
    8286        }
    8387        return ret;
     88}
     89
     90static int ohci_driver_claim(hcd_t *hcd, ddf_dev_t *dev)
     91{
     92        hc_t *hc = hcd_get_driver_data(hcd);
     93        assert(hc);
     94
     95        hc_gain_control(hc);
     96
     97        return EOK;
     98}
     99
     100static int ohci_driver_start(hcd_t *hcd, bool interrupts)
     101{
     102        hc_t *hc = hcd_get_driver_data(hcd);
     103        assert(hc);
     104
     105        hc->hw_interrupts = interrupts;
     106        hc_start(hc);
     107        return EOK;
    84108}
    85109
Note: See TracChangeset for help on using the changeset viewer.