This is my idea to hook the ulpi for my board.
This patch includes to support gpio-chipselect for the ISP1504 (pin29)

diff --git a/drivers/usb/phy/phy-generic.c b/drivers/usb/phy/phy-generic.c
index fce3a9e..2b7bdf3 100644
--- a/drivers/usb/phy/phy-generic.c
+++ b/drivers/usb/phy/phy-generic.c
@@ -26,10 +26,12 @@
  *     autonomous such as isp1504, isp1707, etc.
  */
 +#define DEBUG
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/dma-mapping.h>
 #include <linux/usb/otg.h>
+#include <linux/usb/ulpi.h>
 #include <linux/usb/usb_phy_gen_xceiv.h>
 #include <linux/slab.h>
 #include <linux/clk.h>
@@ -150,7 +152,8 @@ static int nop_set_host(struct usb_otg *otg, struct usb_bus *host)
 }
  int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_gen_xceiv *nop,
-               enum usb_phy_type type, u32 clk_rate, bool needs_vcc)
+               enum usb_phy_type type, u32 clk_rate, bool needs_vcc,
+               bool needs_ulpi)
 {
        int err;
@@ -159,6 +162,15 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_gen_xceiv *nop,
        if (!nop->phy.otg)
                return -ENOMEM;
 +      if (needs_ulpi) {
+               nop->ulpi = otg_ulpi_create(&ulpi_viewport_access_ops, 0);
+               if (!nop->ulpi) {
+                       dev_err(dev, "otg_ulpi_create failed\n");
+                       return -ENOMEM;
+               }
+       }
+
+
        nop->clk = devm_clk_get(dev, "main_clk");
        if (IS_ERR(nop->clk)) {
                dev_dbg(dev, "Can't get phy clock: %ld\n",
@@ -181,6 +193,23 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_gen_xceiv *nop,
                        return -EPROBE_DEFER;
        }
 +      if (nop->gpio_chipselect != -EPROBE_DEFER) {
+               dev_dbg(dev, "Requesting Chipselect GPIO %d\n",
+                               nop->gpio_chipselect);
+               if( gpio_is_valid(nop->gpio_chipselect)) {
+                       unsigned long gpio_flags;
+
+                       gpio_flags = GPIOF_OUT_INIT_LOW;
+                       err = devm_gpio_request_one(dev, nop->gpio_chipselect,
+                                       gpio_flags, dev_name(dev));
+                       if (err) {
+                               dev_err(dev, "Error requesting Chipselect GPIO 
%d\n",
+                                               nop->gpio_chipselect);
+                               return err;
+                       }
+               }
+       }
+
        if (gpio_is_valid(nop->gpio_reset)) {
                unsigned long gpio_flags;
@@ -225,6 +254,7 @@ static int usb_phy_gen_xceiv_probe(struct platform_device *pdev)
        int err;
        u32 clk_rate = 0;
        bool needs_vcc = false;
+       bool needs_ulpi = false;
        nop = devm_kzalloc(dev, sizeof(*nop), GFP_KERNEL);
        if (!nop)
@@ -235,13 +265,19 @@ static int usb_phy_gen_xceiv_probe(struct platform_device *pdev)
        if (dev->of_node) {
                struct device_node *node = dev->of_node;
                enum of_gpio_flags flags;
+               enum of_gpio_flags csflags;
                if (of_property_read_u32(node, "clock-frequency", &clk_rate))
                        clk_rate = 0;
                needs_vcc = of_property_read_bool(node, "vcc-supply");
+               needs_ulpi = of_property_read_bool(node, "ulpi_vbus_init");
+
                nop->gpio_reset = of_get_named_gpio_flags(node, "reset-gpios",
                                                                0, &flags);
+
+               nop->gpio_chipselect = of_get_named_gpio_flags(node, "cs-gpios",
+                                                               0, &csflags);
                if (nop->gpio_reset == -EPROBE_DEFER)
                        return -EPROBE_DEFER;
@@ -254,7 +290,8 @@ static int usb_phy_gen_xceiv_probe(struct platform_device *pdev)
                nop->gpio_reset = pdata->gpio_reset;
        }
 -      err = usb_phy_gen_create_phy(dev, nop, type, clk_rate, needs_vcc);
+       err = usb_phy_gen_create_phy(dev, nop, type, clk_rate,
+                       needs_vcc, needs_ulpi);
        if (err)
                return err;
 diff --git a/drivers/usb/phy/phy-generic.h b/drivers/usb/phy/phy-generic.h
index d2a220d..722fdac 100644
--- a/drivers/usb/phy/phy-generic.h
+++ b/drivers/usb/phy/phy-generic.h
@@ -3,10 +3,12 @@
  struct usb_phy_gen_xceiv {
        struct usb_phy phy;
+       struct usb_phy *ulpi;
        struct device *dev;
        struct clk *clk;
        struct regulator *vcc;
        int gpio_reset;
+       int gpio_chipselect;
        bool reset_active_low;
 };
 @@ -14,6 +16,7 @@ int usb_gen_phy_init(struct usb_phy *phy);
 void usb_gen_phy_shutdown(struct usb_phy *phy);
  int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_gen_xceiv *nop,
-               enum usb_phy_type type, u32 clk_rate, bool needs_vcc);
+               enum usb_phy_type type, u32 clk_rate,
+               bool needs_vcc, bool needs_ulpi);
  #endif



Regards
Chris
--
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

Reply via email to