On Mon, 30 May 2011 19:28:34 +0200, Sebastian Andrzej Siewior wrote:
From: Felipe Balbi <balbi@xxxxxx> this class will be used to abstract away several of the duplicated operations scatered
scattered
among the USB gadget controller drivers. Later, we can add an atomic notifer to tell
notifier
interested drivers about what's happening with the controller. Notifications such as suspend, resume, enumerated, etc will be
etc. (ie. with dot)
useful, at a minimum, for implementing usb charger detection. The core is currently set explicit to 'n'. It will be changed to 'y' once all users are converted since it provides functions which clash with other drivers. Signed-off-by: Felipe Balbi <balbi@xxxxxx> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx>
Acked-by: Michal Nazarewicz <mina86@xxxxxxxxxx> Still with the comment that we should aim to got usb_udc and usb_gadget_driver stashed together.
+static void usb_gadget_remove_driver(struct usb_udc *udc)
I'd call it __usb_gadget_remove_driver() (ie. with "__"), but that's just me.
+int usb_gadget_register_driver(struct usb_gadget_driver *driver) +{ + struct usb_udc *udc = NULL; + int ret; + + if (!driver || !driver->bind || !driver->setup) + return -EINVAL; + + mutex_lock(&udc_lock); + list_for_each_entry(udc, &udc_list, list) + /* For now we take the first one */ + if (!udc->driver) { + pr_debug("using UDC '%s'\n", udc->gadget->name);
pr_debug() not needed.
+ goto found; + } + + pr_debug("couldn't find an available UDC\n"); + mutex_unlock(&udc_lock); + return -ENODEV; + +found: + dev_dbg(&udc->dev, "registering UDC driver [%s]\n", + driver->function); + + udc->driver = driver; + udc->dev.driver = &driver->driver; + + ret = usb_gadget_start(udc->gadget, driver); + if (ret) { + dev_err(&udc->dev, "failed to start %s --> %d\n", + udc->driver->function, ret);
I'd put the dev_err() after err1 label instead of here, but that's just me.
+ goto err1; + } + + kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); + mutex_unlock(&udc_lock); + return 0; + +err1: + udc->driver = NULL; + udc->dev.driver = NULL; + mutex_unlock(&udc_lock); + return ret; +} +EXPORT_SYMBOL_GPL(usb_gadget_register_driver);
+static ssize_t usb_udc_srp_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t n) +{ + struct usb_udc *udc = dev_get_drvdata(dev); + + if (sysfs_streq(buf, "1")) + usb_gadget_wakeup(udc->gadget);
I'd use kzstrtoul() or something but that looks good to.
+ + return n; +} +static DEVICE_ATTR(srp, S_IWUSR, NULL, usb_udc_srp_store);
+static ssize_t usb_udc_speed_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct usb_udc *udc = dev_get_drvdata(dev); + struct usb_gadget *gadget = udc->gadget; + + switch (gadget->speed) { + case USB_SPEED_LOW: + return snprintf(buf, PAGE_SIZE, "low-speed\n"); + case USB_SPEED_FULL: + return snprintf(buf, PAGE_SIZE, "full-speed\n"); + case USB_SPEED_HIGH: + return snprintf(buf, PAGE_SIZE, "high-speed\n"); + case USB_SPEED_WIRELESS: + return snprintf(buf, PAGE_SIZE, "wireless\n"); + case USB_SPEED_SUPER: + return snprintf(buf, PAGE_SIZE, "super-speed\n"); + case USB_SPEED_UNKNOWN: /* FALLTHROUGH */ + default: + return snprintf(buf, PAGE_SIZE, "UNKNOWN\n"); + } +}
Isn't there some function for returning speed of the gadget as a string? I remember seeing a patch that added such a function. I might be wrong though.
+static int usb_udc_uevent(struct device *dev, struct kobj_uevent_env *env)
Would it make sense to export it? Just asking.
+static void __exit usb_udc_exit(void) +{ + class_destroy(udc_class); + udc_class = NULL;
That's not needed.
+}
-- Best regards, _ _ .o. | Liege of Serenely Enlightened Majesty of o' \,=./ `o ..o | Computer Science, Michal "mina86" Nazarewicz (o o) ooo +-----<email/xmpp: mnazarewicz@xxxxxxxxxx>-----ooO--(_)--Ooo-- -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html