Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/uhci-rhd/main.c

    r357a302 r1a93bb0  
    3232 * @brief UHCI driver
    3333 */
    34 #include <driver.h>
     34#include <ddf/driver.h>
     35#include <devman.h>
     36#include <device/hw_res.h>
    3537#include <usb_iface.h>
    3638#include <usb/ddfiface.h>
     
    4345
    4446#define NAME "uhci-rhd"
     47static int hc_get_my_registers(ddf_dev_t *dev,
     48    uintptr_t *io_reg_address, size_t *io_reg_size);
    4549
    46 static int usb_iface_get_hc_handle(device_t *dev, devman_handle_t *handle)
     50static int usb_iface_get_hc_handle(ddf_fun_t *fun, devman_handle_t *handle)
    4751{
    48         assert(dev);
    49         assert(dev->driver_data);
     52        assert(fun);
     53        assert(fun->driver_data);
    5054        assert(handle);
    5155
    52         *handle = ((uhci_root_hub_t*)dev->driver_data)->hc_handle;
    53         usb_log_debug("Answering HC handle: %d.\n", *handle);
     56        *handle = ((uhci_root_hub_t*)fun->driver_data)->hc_handle;
    5457
    5558        return EOK;
     
    6164};
    6265
    63 static device_ops_t uhci_rh_ops = {
     66static ddf_dev_ops_t uhci_rh_ops = {
    6467        .interfaces[USB_DEV_IFACE] = &uhci_rh_usb_iface,
    6568};
    6669
    67 static int uhci_rh_add_device(device_t *device)
     70static int uhci_rh_add_device(ddf_dev_t *device)
    6871{
    6972        if (!device)
     
    7174
    7275        usb_log_debug2("%s called device %d\n", __FUNCTION__, device->handle);
    73         device->ops = &uhci_rh_ops;
     76
     77        //device->ops = &uhci_rh_ops;
     78        (void) uhci_rh_ops;
    7479
    7580        uhci_root_hub_t *rh = malloc(sizeof(uhci_root_hub_t));
     
    7984        }
    8085
    81         /* TODO: get register values from hc */
    82         int ret = uhci_root_hub_init(rh, (void*)0xc030, 4, device);
     86        uintptr_t io_regs = 0;
     87        size_t io_size = 0;
     88
     89        int ret = hc_get_my_registers(device, &io_regs, &io_size);
     90        assert(ret == EOK);
     91
     92        /* TODO: verify values from hc */
     93        usb_log_info("I/O regs at 0x%X (size %zu).\n", io_regs, io_size);
     94        ret = uhci_root_hub_init(rh, (void*)io_regs, io_size, device);
    8395        if (ret != EOK) {
    8496                usb_log_error("Failed(%d) to initialize driver instance.\n", ret);
     
    101113        .driver_ops = &uhci_rh_driver_ops
    102114};
    103 
     115/*----------------------------------------------------------------------------*/
    104116int main(int argc, char *argv[])
    105117{
    106         usb_log_enable(USB_LOG_LEVEL_ERROR, NAME);
    107         return driver_main(&uhci_rh_driver);
     118        usb_log_enable(USB_LOG_LEVEL_INFO, NAME);
     119        return ddf_driver_main(&uhci_rh_driver);
     120}
     121/*----------------------------------------------------------------------------*/
     122int hc_get_my_registers(ddf_dev_t *dev,
     123    uintptr_t *io_reg_address, size_t *io_reg_size)
     124{
     125        assert(dev != NULL);
     126
     127        int parent_phone = devman_parent_device_connect(dev->handle,
     128            IPC_FLAG_BLOCKING);
     129        if (parent_phone < 0) {
     130                return parent_phone;
     131        }
     132
     133        int rc;
     134
     135        hw_resource_list_t hw_resources;
     136        rc = hw_res_get_resource_list(parent_phone, &hw_resources);
     137        if (rc != EOK) {
     138                goto leave;
     139        }
     140
     141        uintptr_t io_address = 0;
     142        size_t io_size = 0;
     143        bool io_found = false;
     144
     145        size_t i;
     146        for (i = 0; i < hw_resources.count; i++) {
     147                hw_resource_t *res = &hw_resources.resources[i];
     148                switch (res->type) {
     149                        case IO_RANGE:
     150                                io_address = (uintptr_t)
     151                                    res->res.io_range.address;
     152                                io_size = res->res.io_range.size;
     153                                io_found = true;
     154                                break;
     155                        default:
     156                                break;
     157                }
     158        }
     159
     160        if (!io_found) {
     161                rc = ENOENT;
     162                goto leave;
     163        }
     164
     165        if (io_reg_address != NULL) {
     166                *io_reg_address = io_address;
     167        }
     168        if (io_reg_size != NULL) {
     169                *io_reg_size = io_size;
     170        }
     171        rc = EOK;
     172leave:
     173        async_hangup(parent_phone);
     174
     175        return rc;
    108176}
    109177/**
Note: See TracChangeset for help on using the changeset viewer.