Hi Felipe and Linus,
As you requested, Felipe, I made the translation for the driver's
probing from gpio to gpio_desc. Even if the code is functional, I'm
pretty unhappy about my patch 1, because I lost the "active_low"
notion in the transformation.
I have not found in the gpiolib anything for a driver to set that
active_low value, only for machine code. The legacy behaviour was that
that information was handed over to the driver.
As transforming the different pxa27x_udc users will be not part of
this serie, ie. because the mach info should be kept ISO for this
serie, Linus, do you have an idea so that I still can port to
gpio_desc this driver, and keep the gpio_inverted notion in it ?
Ah, and I sent only 2 out of the 6 patches of the serie, mainly
because Linus doesn't care about the remaining stuff, which remained
constant from last version (at rebase conflicts resolution exception
of course).
Cheers.
--
Robert
Robert Jarzmik (2):
usb: gadget: pxa27x_udc: prepare device-tree support
usb: gadget: pxa27x_udc: add devicetree support
drivers/usb/gadget/udc/pxa27x_udc.c | 61 +++++++++++++++++++++----------------
drivers/usb/gadget/udc/pxa27x_udc.h | 6 ++--
2 files changed, 38 insertions(+), 29 deletions(-)
--
2.0.0.rc2
PS: For Felipe, the diff of the complete serie, for a one quick glance
overview, and not for review is attached to this mail.
drivers/usb/gadget/udc/pxa27x_udc.c | 96 +++++++++----------------------------
drivers/usb/gadget/udc/pxa27x_udc.h | 10 ++--
2 files changed, 26 insertions(+), 80 deletions(-)
diff --git a/drivers/usb/gadget/udc/pxa27x_udc.c
b/drivers/usb/gadget/udc/pxa27x_udc.c
index 9506da8..adbe74a 100644
--- a/drivers/usb/gadget/udc/pxa27x_udc.c
+++ b/drivers/usb/gadget/udc/pxa27x_udc.c
@@ -22,6 +22,7 @@
#include <linux/clk.h>
#include <linux/irq.h>
#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
#include <linux/slab.h>
#include <linux/prefetch.h>
#include <linux/byteorder/generic.h>
@@ -1509,18 +1510,13 @@ static struct usb_ep_ops pxa_ep_ops = {
*/
static void dplus_pullup(struct pxa_udc *udc, int on)
{
- if (on) {
- if (gpio_is_valid(udc->gpio_pullup))
- gpio_set_value(udc->gpio_pullup,
- !udc->gpio_pullup_inverted);
- if (udc->mach && udc->mach->udc_command)
- udc->mach->udc_command(PXA2XX_UDC_CMD_CONNECT);
- } else {
- if (gpio_is_valid(udc->gpio_pullup))
- gpio_set_value(udc->gpio_pullup,
- udc->gpio_pullup_inverted);
- if (udc->mach && udc->mach->udc_command)
- udc->mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT);
+ if (udc->gpiod) {
+ gpiod_set_value(udc->gpiod, on);
+ } else if (udc->udc_command) {
+ if (on)
+ udc->udc_command(PXA2XX_UDC_CMD_CONNECT);
+ else
+ udc->udc_command(PXA2XX_UDC_CMD_DISCONNECT);
}
udc->pullup_on = on;
}
@@ -1611,8 +1607,7 @@ static int pxa_udc_pullup(struct usb_gadget *_gadget, int
is_active)
{
struct pxa_udc *udc = to_gadget_udc(_gadget);
- if (!gpio_is_valid(udc->gpio_pullup)
- && !(udc->mach && udc->mach->udc_command))
+ if (!udc->gpiod && !udc->udc_command)
return -EOPNOTSUPP;
dplus_pullup(udc, is_active);
@@ -2414,50 +2409,6 @@ static struct of_device_id udc_pxa_dt_ids[] = {
MODULE_DEVICE_TABLE(of, udc_pxa_dt_ids);
/**
- * pxa_udc_probe_dt - device tree specific probe
- * @pdev: platform data
- * @udc: pxa_udc structure to fill
- *
- * Fills udc from platform data out of device tree.
- *
- * Returns 0 if DT found, 1 if DT not found, and <0 on error
- */
-static int pxa_udc_probe_dt(struct platform_device *pdev, struct pxa_udc *udc)
-{
- struct device_node *np = pdev->dev.of_node;
- const struct of_device_id *of_id =
- of_match_device(udc_pxa_dt_ids, &pdev->dev);
- u32 gpio_pullup;
- enum of_gpio_flags flags;
-
- if (!np || !of_id)
- return 1;
- pdev->id = -1;
-
- gpio_pullup = of_get_gpio_flags(np, 0, &flags);
- if (gpio_pullup >= 0) {
- udc->gpio_pullup = gpio_pullup;
- udc->gpio_pullup_inverted = (flags & OF_GPIO_ACTIVE_LOW);
- }
- return 0;
-}
-
-/**
- * pxa_udc_probe_pdata - legacy platform data probe
- * @pdev: platform device
- * @udc: pxa_udc structure to fill
- *
- * Simple copy of data from platform_data to udc control structure
- */
-static void pxa_udc_probe_pdata(struct platform_device *pdev,
- struct pxa_udc *udc)
-{
- udc->mach = dev_get_platdata(&pdev->dev);
- udc->gpio_pullup = udc->mach->gpio_pullup;
- udc->gpio_pullup_inverted = udc->mach->gpio_pullup_inverted;
-}
-
-/**
* pxa_udc_probe - probes the udc device
* @_dev: platform device
*
@@ -2468,13 +2419,15 @@ static int pxa_udc_probe(struct platform_device *pdev)
{
struct resource *regs;
struct pxa_udc *udc = &memory;
+ struct pxa2xx_udc_mach_info *mach = dev_get_platdata(&pdev->dev);
int retval = 0;
- retval = pxa_udc_probe_dt(pdev, udc);
- if (retval < 0)
- return retval;
- if (retval > 0)
- pxa_udc_probe_pdata(pdev, udc);
+ if (mach) {
+ udc->gpiod = gpio_to_desc(mach->gpio_pullup);
+ udc->udc_command = mach->udc_command;
+ } else {
+ udc->gpiod = devm_gpiod_get(&pdev->dev, NULL);
+ }
regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
udc->regs = devm_ioremap_resource(&pdev->dev, regs);
@@ -2487,18 +2440,13 @@ static int pxa_udc_probe(struct platform_device *pdev)
udc->dev = &pdev->dev;
udc->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
- if (gpio_is_valid(udc->gpio_pullup)) {
- retval = devm_gpio_request(&pdev->dev,
- udc->gpio_pullup, "USB D+ pullup");
- if (retval == 0)
- gpio_direction_output(udc->gpio_pullup,
- udc->gpio_pullup_inverted);
- }
- if (retval) {
- dev_err(&pdev->dev, "Couldn't request gpio %d : %d\n",
- udc->gpio_pullup, retval);
- return retval;
+ if (IS_ERR(udc->gpiod)) {
+ dev_err(&pdev->dev, "Couldn't find or request D+ gpio : %ld\n",
+ PTR_ERR(udc->gpiod));
+ return PTR_ERR(udc->gpiod);
}
+ if (udc->gpiod)
+ gpiod_direction_output(udc->gpiod, 0);
udc->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(udc->clk))
diff --git a/drivers/usb/gadget/udc/pxa27x_udc.h
b/drivers/usb/gadget/udc/pxa27x_udc.h
index 8995b34..11e1423 100644
--- a/drivers/usb/gadget/udc/pxa27x_udc.h
+++ b/drivers/usb/gadget/udc/pxa27x_udc.h
@@ -420,9 +420,8 @@ struct udc_stats {
* @usb_gadget: udc gadget structure
* @driver: bound gadget (zero, g_ether, g_mass_storage, ...)
* @dev: device
- * @mach: machine info, used to activate specific GPIO
- * @gpio_pullup: if valid, D+ pullup GPIO
- * @gpio_pullup_inverted: 1 if pullup has inverted logic
+ * @udc_command: machine specific function to activate D+ pullup
+ * @gpiod: gpio descriptor of gpio for D+ pullup (or NULL if none)
* @transceiver: external transceiver to handle vbus sense and D+ pullup
* @ep0state: control endpoint state machine state
* @stats: statistics on udc usage
@@ -448,10 +447,9 @@ struct pxa_udc {
struct usb_gadget gadget;
struct usb_gadget_driver *driver;
struct device *dev;
- struct pxa2xx_udc_mach_info *mach;
+ void (*udc_command)(int);
+ struct gpio_desc *gpiod;
struct usb_phy *transceiver;
- int gpio_pullup;
- int gpio_pullup_inverted;
enum ep0_state ep0state;
struct udc_stats stats;
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html