Re: [PATCH v2 1/3] usb: gadget: pxa27x_udc: add devicetree support

2014-06-25 Thread Mark Rutland
On Sun, Jun 22, 2014 at 10:04:57AM +0100, Robert Jarzmik wrote:
 Add support for device-tree device discovery. If devicetree is not
 provided, fallback to legacy platform data discovery.
 
 Signed-off-by: Robert Jarzmik robert.jarz...@free.fr
 Cc: devicet...@vger.kernel.org
 
 ---
 Since V1: change OF id mrvl,pxa27x_udc - marvell,pxa27x-udc
   This is a consequence of other DT reviews on the marvell
   namings.
 ---
  drivers/usb/gadget/pxa27x_udc.c | 105 
 
  drivers/usb/gadget/pxa27x_udc.h |   4 ++
  2 files changed, 90 insertions(+), 19 deletions(-)

[...]

 +/**
 + * 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

That's impossible as this function is marked as returning bool.

Make this an int and return negative error codes.

 + */
 +bool 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);
 + int ret;
 + u32 gpio_pullup;
 +
 + if (!np || !of_id)
 + return 1;
 + ret = of_alias_get_id(np, udc);
 + pdev-id = (ret = 0) ? ret : -1;

The alias name wasn't mentioned in the binding...

 +
 + if (!of_property_read_u32(np, udc-pullup-gpio, gpio_pullup))
 + udc-gpio_pullup = gpio_pullup;

This number is a Linux internal detail. Use the GPIO bindings.

 + udc-gpio_pullup_inverted =
 + of_property_read_bool(np, udc-pullup-gpio-inverted);

The GPIO bindings can describe this.

 @@ -2415,7 +2469,13 @@ static int pxa_udc_probe(struct platform_device *pdev)
  {
   struct resource *regs;
   struct pxa_udc *udc = memory;
 - int retval = 0, gpio;
 + int retval = 0;
 +
 + retval = pxa_udc_probe_dt(pdev, udc);
 + if (retval  0)
 + return retval;

This case can never happen given the prototype of pxa_udc_probe_dt.

 @@ -2446,6 +2504,9 @@ static int pxa_udc_probe(struct platform_device *pdev)
   retval = PTR_ERR(udc-clk);
   goto err_clk;
   }
 + retval = clk_prepare(udc-clk);
 + if (retval)
 + goto err_clk_prepare;
  
   retval = -ENOMEM;
   udc-regs = ioremap(regs-start, resource_size(regs));
 @@ -2483,9 +2544,13 @@ err_add_udc:
  err_irq:
   iounmap(udc-regs);
  err_map:
 + clk_unprepare(udc-clk);
 +err_clk_prepare:
   clk_put(udc-clk);
   udc-clk = NULL;
  err_clk:
 + if (gpio_is_valid(udc-gpio_pullup))
 + gpio_free(udc-gpio_pullup);
   return retval;
  }
  
 @@ -2509,6 +2574,7 @@ static int pxa_udc_remove(struct platform_device *_dev)
  
   udc-transceiver = NULL;
   the_controller = NULL;
 + clk_unprepare(udc-clk);
   clk_put(udc-clk);

I don't see why these clock changes should be in the same patch as the
DT support. They might be a prerequisite, but as far as I can tell they
are required even without DT probing.

Mark.
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 1/3] usb: gadget: pxa27x_udc: add devicetree support

2014-06-25 Thread Robert Jarzmik
Mark Rutland mark.rutl...@arm.com writes:

 On Sun, Jun 22, 2014 at 10:04:57AM +0100, Robert Jarzmik wrote:
 +/**
 + * 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

 That's impossible as this function is marked as returning bool.
 Make this an int and return negative error codes.
Yes, it was designed to be an int. I don't know why this bool appeared
... lack of coffee probably.

 + */
 +bool 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);
 +int ret;
 +u32 gpio_pullup;
 +
 +if (!np || !of_id)
 +return 1;
 +ret = of_alias_get_id(np, udc);
 +pdev-id = (ret = 0) ? ret : -1;

 The alias name wasn't mentioned in the binding...
Ah, now I'm thinking of it, it doesn't serve any purpose ... I will remove this
piece of code and replace by pdev-id = -1.


 +
 +if (!of_property_read_u32(np, udc-pullup-gpio, gpio_pullup))
 +udc-gpio_pullup = gpio_pullup;

 This number is a Linux internal detail. Use the GPIO bindings.
Yes, as in documentation. Agreed.

 +udc-gpio_pullup_inverted =
 +of_property_read_bool(np, udc-pullup-gpio-inverted);

 The GPIO bindings can describe this.
Yes.


 @@ -2415,7 +2469,13 @@ static int pxa_udc_probe(struct platform_device *pdev)
  {
  struct resource *regs;
  struct pxa_udc *udc = memory;
 -int retval = 0, gpio;
 +int retval = 0;
 +
 +retval = pxa_udc_probe_dt(pdev, udc);
 +if (retval  0)
 +return retval;

 This case can never happen given the prototype of pxa_udc_probe_dt.

 @@ -2509,6 +2574,7 @@ static int pxa_udc_remove(struct platform_device *_dev)
  
  udc-transceiver = NULL;
  the_controller = NULL;
 +clk_unprepare(udc-clk);
  clk_put(udc-clk);

 I don't see why these clock changes should be in the same patch as the
 DT support. They might be a prerequisite, but as far as I can tell they
 are required even without DT probing.
Ah they are another posted patch. I think I missed a rebase somewhere, and it
slipped in. It is as you say not this patch purpose, and I thought I had posted
a previous patch with this ... I will split it again.

Thanks for the review.

Cheers.

-- 
Robert
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 1/3] usb: gadget: pxa27x_udc: add devicetree support

2014-06-22 Thread Robert Jarzmik
Add support for device-tree device discovery. If devicetree is not
provided, fallback to legacy platform data discovery.

Signed-off-by: Robert Jarzmik robert.jarz...@free.fr
Cc: devicet...@vger.kernel.org

---
Since V1: change OF id mrvl,pxa27x_udc - marvell,pxa27x-udc
  This is a consequence of other DT reviews on the marvell
  namings.
---
 drivers/usb/gadget/pxa27x_udc.c | 105 
 drivers/usb/gadget/pxa27x_udc.h |   4 ++
 2 files changed, 90 insertions(+), 19 deletions(-)

diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c
index cdf4d67..c7d1976 100644
--- a/drivers/usb/gadget/pxa27x_udc.c
+++ b/drivers/usb/gadget/pxa27x_udc.c
@@ -24,12 +24,15 @@
 #include linux/gpio.h
 #include linux/slab.h
 #include linux/prefetch.h
-#include linux/byteorder/generic.h
-#include linux/platform_data/pxa2xx_udc.h
+#include linux/of_device.h
+
+#include asm/byteorder.h
+#include mach/hardware.h
 
 #include linux/usb.h
 #include linux/usb/ch9.h
 #include linux/usb/gadget.h
+#include mach/udc.h
 
 #include pxa27x_udc.h
 
@@ -1508,16 +1511,16 @@ 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-mach-gpio_pullup))
-   gpio_set_value(udc-mach-gpio_pullup,
-  !udc-mach-gpio_pullup_inverted);
-   if (udc-mach-udc_command)
+   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-mach-gpio_pullup))
-   gpio_set_value(udc-mach-gpio_pullup,
-  udc-mach-gpio_pullup_inverted);
-   if (udc-mach-udc_command)
+   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);
}
udc-pullup_on = on;
@@ -1609,7 +1612,8 @@ 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-mach-gpio_pullup)  !udc-mach-udc_command)
+   if (!gpio_is_valid(udc-gpio_pullup)
+!(udc-mach  udc-mach-udc_command))
return -EOPNOTSUPP;
 
dplus_pullup(udc, is_active);
@@ -2404,6 +2408,56 @@ static struct pxa_udc memory = {
}
 };
 
+static struct of_device_id udc_pxa_dt_ids[] = {
+   { .compatible = marvell,pxa27x-udc },
+   {}
+};
+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
+ */
+bool 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);
+   int ret;
+   u32 gpio_pullup;
+
+   if (!np || !of_id)
+   return 1;
+   ret = of_alias_get_id(np, udc);
+   pdev-id = (ret = 0) ? ret : -1;
+
+   if (!of_property_read_u32(np, udc-pullup-gpio, gpio_pullup))
+   udc-gpio_pullup = gpio_pullup;
+   udc-gpio_pullup_inverted =
+   of_property_read_bool(np, udc-pullup-gpio-inverted);
+   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
@@ -2415,7 +2469,13 @@ static int pxa_udc_probe(struct platform_device *pdev)
 {
struct resource *regs;
struct pxa_udc *udc = memory;
-   int retval = 0, gpio;
+   int retval = 0;
+
+   retval = pxa_udc_probe_dt(pdev, udc);
+   if (retval  0)
+   return retval;
+   if (retval  0)
+   pxa_udc_probe_pdata(pdev, udc);
 
regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!regs)
@@ -2425,19 +2485,17 @@ static int pxa_udc_probe(struct platform_device *pdev)
return