Ignore:
File:
1 edited

Legend:

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

    r920d0fc r58563585  
    2727 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2828 */
     29
    2930/** @addtogroup drvusbohci
    3031 * @{
     
    3334 * Main routines of OHCI driver.
    3435 */
     36
     37#include <assert.h>
    3538#include <ddf/driver.h>
    3639#include <errno.h>
     40#include <io/log.h>
    3741#include <str_error.h>
    3842
    3943#include <usb/debug.h>
     44#include <usb/host/ddf_helpers.h>
    4045
    41 #include "ohci.h"
     46#include "hc.h"
    4247
    4348#define NAME "ohci"
     49static int ohci_driver_init(hcd_t *, const hw_res_list_parsed_t *, bool);
     50static void ohci_driver_fini(hcd_t *);
     51
     52static const ddf_hc_driver_t ohci_hc_driver = {
     53        .hc_speed = USB_SPEED_FULL,
     54        .irq_code_gen = ohci_hc_gen_irq_code,
     55        .init = ohci_driver_init,
     56        .fini = ohci_driver_fini,
     57        .name = "OHCI",
     58        .ops = {
     59                .schedule       = ohci_hc_schedule,
     60                .ep_add_hook    = ohci_endpoint_init,
     61                .ep_remove_hook = ohci_endpoint_fini,
     62                .irq_hook       = ohci_hc_interrupt,
     63                .status_hook    = ohci_hc_status,
     64        },
     65};
     66
     67
     68static int ohci_driver_init(hcd_t *hcd, const hw_res_list_parsed_t *res, bool irq)
     69{
     70        assert(hcd);
     71        assert(hcd_get_driver_data(hcd) == NULL);
     72
     73        hc_t *instance = malloc(sizeof(hc_t));
     74        if (!instance)
     75                return ENOMEM;
     76
     77        const int ret = hc_init(instance, res, irq);
     78        if (ret == EOK) {
     79                hcd_set_implementation(hcd, instance, &ohci_hc_driver.ops);
     80        } else {
     81                free(instance);
     82        }
     83        return ret;
     84}
     85
     86static void ohci_driver_fini(hcd_t *hcd)
     87{
     88        assert(hcd);
     89        hc_t *hc = hcd_get_driver_data(hcd);
     90        if (hc)
     91                hc_fini(hc);
     92
     93        hcd_set_implementation(hcd, NULL, NULL);
     94        free(hc);
     95}
    4496
    4597/** Initializes a new ddf driver instance of OHCI hcd.
     
    52104        usb_log_debug("ohci_dev_add() called\n");
    53105        assert(device);
    54 
    55         int ret = device_setup_ohci(device);
    56         if (ret != EOK) {
    57                 usb_log_error("Failed to initialize OHCI driver: %s.\n",
    58                     str_error(ret));
    59                 return ret;
    60         }
    61         usb_log_info("Controlling new OHCI device '%s'.\n", ddf_dev_get_name(device));
    62 
    63         return EOK;
     106        return hcd_ddf_add_hc(device, &ohci_hc_driver);
    64107}
    65108
    66 static driver_ops_t ohci_driver_ops = {
     109static const driver_ops_t ohci_driver_ops = {
    67110        .dev_add = ohci_dev_add,
    68111};
    69112
    70 static driver_t ohci_driver = {
     113static const driver_t ohci_driver = {
    71114        .name = NAME,
    72115        .driver_ops = &ohci_driver_ops
     
    86129        return ddf_driver_main(&ohci_driver);
    87130}
     131
    88132/**
    89133 * @}
Note: See TracChangeset for help on using the changeset viewer.