Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/usbmid/usbmid.c

    rbc1c6fb r51f0e410  
    4545
    4646/** Callback for DDF USB interface. */
    47 static int usb_iface_get_address_impl(ddf_fun_t *fun, devman_handle_t handle,
     47static int usb_iface_get_address_impl(device_t *device, devman_handle_t handle,
    4848    usb_address_t *address)
    4949{
    50         return usb_iface_get_address_hub_impl(fun, handle, address);
     50        assert(device);
     51        device_t *parent = device->parent;
     52
     53        /* Default error, device does not support this operation. */
     54        int rc = ENOTSUP;
     55
     56        if (parent && parent->ops && parent->ops->interfaces[USB_DEV_IFACE]) {
     57                usb_iface_t *usb_iface
     58                    = (usb_iface_t *) parent->ops->interfaces[USB_DEV_IFACE];
     59                assert(usb_iface != NULL);
     60
     61                if (usb_iface->get_address) {
     62                        rc = usb_iface->get_address(parent, parent->handle,
     63                            address);
     64                }
     65        }
     66
     67        return rc;
    5168}
    5269
    5370/** Callback for DDF USB interface. */
    54 static int usb_iface_get_interface_impl(ddf_fun_t *fun, devman_handle_t handle,
     71static int usb_iface_get_interface_impl(device_t *device, devman_handle_t handle,
    5572    int *iface_no)
    5673{
    57         assert(fun);
    58 
    59         usbmid_interface_t *iface = fun->driver_data;
     74        assert(device);
     75
     76        usbmid_interface_t *iface = device->driver_data;
    6077        assert(iface);
    6178
     
    6784}
    6885
    69 /** DDF interface of the child - interface function. */
    7086static usb_iface_t child_usb_iface = {
    7187        .get_hc_handle = usb_iface_get_hc_handle_hub_child_impl,
     
    7490};
    7591
    76 /** Operations for children - interface functions. */
    77 static ddf_dev_ops_t child_device_ops = {
     92
     93static device_ops_t child_device_ops = {
    7894        .interfaces[USB_DEV_IFACE] = &child_usb_iface
    7995};
    8096
    81 /** Operations of the device itself. */
    82 static ddf_dev_ops_t mid_device_ops = {
     97static device_ops_t mid_device_ops = {
    8398        .interfaces[USB_DEV_IFACE] = &usb_iface_hub_impl
    8499};
     
    90105 * @retval NULL Error occured.
    91106 */
    92 usbmid_device_t *usbmid_device_create(ddf_dev_t *dev)
     107usbmid_device_t *usbmid_device_create(device_t *dev)
    93108{
    94109        usbmid_device_t *mid = malloc(sizeof(usbmid_device_t));
     
    118133
    119134        mid->dev = dev;
    120         (void) &mid_device_ops;
     135        dev->ops = &mid_device_ops;
    121136
    122137        return mid;
     
    125140/** Create new interface for USB MID device.
    126141 *
    127  * @param fun Backing generic DDF device function (representing interface).
     142 * @param dev Backing generic DDF child device (representing interface).
    128143 * @param iface_no Interface number.
    129144 * @return New interface.
    130145 * @retval NULL Error occured.
    131146 */
    132 usbmid_interface_t *usbmid_interface_create(ddf_fun_t *fun, int iface_no)
     147usbmid_interface_t *usbmid_interface_create(device_t *dev, int iface_no)
    133148{
    134149        usbmid_interface_t *iface = malloc(sizeof(usbmid_interface_t));
     
    139154        }
    140155
    141         iface->fun = fun;
     156        iface->dev = dev;
    142157        iface->interface_no = iface_no;
    143158
     
    157172    const usb_standard_interface_descriptor_t *interface_descriptor)
    158173{
    159         ddf_fun_t *child = NULL;
     174        device_t *child = NULL;
    160175        char *child_name = NULL;
    161176        usbmid_interface_t *child_as_interface = NULL;
    162177        int rc;
     178
     179        /* Create the device. */
     180        child = create_device();
     181        if (child == NULL) {
     182                rc = ENOMEM;
     183                goto error_leave;
     184        }
    163185
    164186        /*
     
    174196        }
    175197
    176         /* Create the device. */
    177         child = ddf_fun_create(parent->dev, fun_inner, child_name);
    178         if (child == NULL) {
    179                 rc = ENOMEM;
    180                 goto error_leave;
    181         }
    182 
    183 
    184 
    185198        child_as_interface = usbmid_interface_create(child,
    186199            (int) interface_descriptor->interface_number);
     
    191204
    192205        child->driver_data = child_as_interface;
     206        child->parent = parent->dev;
     207        child->name = child_name;
    193208        child->ops = &child_device_ops;
    194209
     
    200215        }
    201216
    202         rc = ddf_fun_bind(child);
     217        rc = child_device_register(child, parent->dev);
    203218        if (rc != EOK) {
    204219                goto error_leave;
     
    211226                child->name = NULL;
    212227                /* This takes care of match_id deallocation as well. */
    213                 ddf_fun_destroy(child);
     228                delete_device(child);
    214229        }
    215230        if (child_name != NULL) {
Note: See TracChangeset for help on using the changeset viewer.