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


Ignore:
Timestamp:
2017-06-22T21:34:39Z (8 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/uhci
Files:
3 edited

Legend:

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

    rcb89430 re4d7363  
    106106 * @return Error code.
    107107 */
    108 int uhci_hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res)
     108int uhci_hc_gen_irq_code(irq_code_t *code, hcd_t *hcd, const hw_res_list_parsed_t *hw_res)
    109109{
    110110        assert(code);
     
    214214 * interrupt fibrils.
    215215 */
    216 int hc_init(hc_t *instance, const hw_res_list_parsed_t *hw_res, bool interrupts)
     216int hc_init(hc_t *instance, const hw_res_list_parsed_t *hw_res)
    217217{
    218218        assert(instance);
     
    222222            return EINVAL;
    223223
    224         instance->hw_interrupts = interrupts;
    225224        instance->hw_failures = 0;
    226225
     
    246245        }
    247246
     247        return EOK;
     248}
     249
     250void hc_start(hc_t *instance)
     251{
    248252        hc_init_hw(instance);
    249253        (void)hc_debug_checker;
    250254
    251255        uhci_rh_init(&instance->rh, instance->registers->ports, "uhci");
    252 
    253         return EOK;
    254256}
    255257
  • uspace/drv/bus/usb/uhci/hc.h

    rcb89430 re4d7363  
    124124} hc_t;
    125125
    126 extern int hc_init(hc_t *, const hw_res_list_parsed_t *, bool);
     126extern int hc_init(hc_t *, const hw_res_list_parsed_t *);
     127extern void hc_start(hc_t *);
    127128extern void hc_fini(hc_t *);
    128129
    129 extern int uhci_hc_gen_irq_code(irq_code_t *, const hw_res_list_parsed_t *);
     130extern int uhci_hc_gen_irq_code(irq_code_t *, hcd_t *,const hw_res_list_parsed_t *);
    130131
    131132extern void uhci_hc_interrupt(hcd_t *, uint32_t);
  • uspace/drv/bus/usb/uhci/main.c

    rcb89430 re4d7363  
    5050#define NAME "uhci"
    5151
    52 static int uhci_driver_init(hcd_t *, const hw_res_list_parsed_t *, bool);
     52static int uhci_driver_init(hcd_t *, const hw_res_list_parsed_t *);
     53static int uhci_driver_start(hcd_t *, bool);
    5354static void uhci_driver_fini(hcd_t *);
    54 static int disable_legacy(ddf_dev_t *);
     55static int disable_legacy(hcd_t *, ddf_dev_t *);
    5556
    5657static const ddf_hc_driver_t uhci_hc_driver = {
     
    5960        .irq_code_gen = uhci_hc_gen_irq_code,
    6061        .init = uhci_driver_init,
     62        .start = uhci_driver_start,
    6163        .fini = uhci_driver_fini,
    6264        .name = "UHCI",
     
    6870};
    6971
    70 static int uhci_driver_init(hcd_t *hcd, const hw_res_list_parsed_t *res, bool irq)
     72static int uhci_driver_init(hcd_t *hcd, const hw_res_list_parsed_t *res)
    7173{
    7274        assert(hcd);
     
    7779                return ENOMEM;
    7880
    79         const int ret = hc_init(instance, res, irq);
     81        const int ret = hc_init(instance, res);
    8082        if (ret == EOK) {
    8183                hcd_set_implementation(hcd, instance, &uhci_hc_driver.ops);
     
    8486        }
    8587        return ret;
     88}
     89
     90static int uhci_driver_start(hcd_t *hcd, bool interrupts)
     91{
     92        assert(hcd);
     93        hc_t *hc = hcd_get_driver_data(hcd);
     94
     95        hc->hw_interrupts = interrupts;
     96        hc_start(hc);
     97        return EOK;
    8698}
    8799
     
    102114 * @return Error code.
    103115 */
    104 static int disable_legacy(ddf_dev_t *device)
     116static int disable_legacy(hcd_t *hcd, ddf_dev_t *device)
    105117{
    106118        assert(device);
Note: See TracChangeset for help on using the changeset viewer.