sunxi: usb-phy: Add support for reading otg id pin value
authorHans de Goede <hdegoede@redhat.com>
Sun, 14 Jun 2015 15:29:53 +0000 (17:29 +0200)
committerHans de Goede <hdegoede@redhat.com>
Sat, 25 Jul 2015 09:22:54 +0000 (11:22 +0200)
Add support for reading the id pin value of the otg connector to the usb
phy code.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Ian Campbell <ijc@hellion.org.uk>
arch/arm/cpu/armv7/sunxi/usb_phy.c
arch/arm/include/asm/arch-sunxi/usb_phy.h
board/sunxi/Kconfig

index b07d67ff3f82f18b1c57a153ff5e3e21f3675fa3..5e82ddc505d9aeff628ff7db3ecee47a55e069a6 100644 (file)
@@ -44,6 +44,7 @@ static struct sunxi_usb_phy {
        int usb_rst_mask;
        int gpio_vbus;
        int gpio_vbus_det;
+       int gpio_id_det;
        int id;
        int init_count;
        int power_on_count;
@@ -82,6 +83,14 @@ static int get_vbus_detect_gpio(int index)
        return -EINVAL;
 }
 
+static int get_id_detect_gpio(int index)
+{
+       switch (index) {
+       case 0: return sunxi_name_to_gpio(CONFIG_USB0_ID_DET);
+       }
+       return -EINVAL;
+}
+
 static void usb_phy_write(struct sunxi_usb_phy *phy, int addr,
                          int data, int len)
 {
@@ -247,6 +256,16 @@ int sunxi_usb_phy_vbus_detect(int index)
        return err;
 }
 
+int sunxi_usb_phy_id_detect(int index)
+{
+       struct sunxi_usb_phy *phy = &sunxi_usb_phy[index];
+
+       if (phy->gpio_id_det < 0)
+               return phy->gpio_id_det;
+
+       return gpio_get_value(phy->gpio_id_det);
+}
+
 int sunxi_usb_phy_probe(void)
 {
        struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
@@ -275,6 +294,18 @@ int sunxi_usb_phy_probe(void)
                        if (ret)
                                return ret;
                }
+
+               phy->gpio_id_det = get_id_detect_gpio(i);
+               if (phy->gpio_id_det >= 0) {
+                       ret = gpio_request(phy->gpio_id_det, "usb_id_det");
+                       if (ret)
+                               return ret;
+                       ret = gpio_direction_input(phy->gpio_id_det);
+                       if (ret)
+                               return ret;
+                       sunxi_gpio_set_pull(phy->gpio_id_det,
+                                           SUNXI_GPIO_PULL_UP);
+               }
        }
 
        setbits_le32(&ccm->usb_clk_cfg, CCM_USB_CTRL_PHYGATE);
@@ -298,6 +329,9 @@ int sunxi_usb_phy_remove(void)
 
                if (phy->gpio_vbus_det >= 0)
                        gpio_free(phy->gpio_vbus_det);
+
+               if (phy->gpio_id_det >= 0)
+                       gpio_free(phy->gpio_id_det);
        }
 
        return 0;
index b7b831e24aaa9c4960ff065a9136522768424d49..5a9cacb6f4a34af3d50975d442d7257ac9efbd0f 100644 (file)
@@ -17,4 +17,5 @@ void sunxi_usb_phy_exit(int index);
 void sunxi_usb_phy_power_on(int index);
 void sunxi_usb_phy_power_off(int index);
 int sunxi_usb_phy_vbus_detect(int index);
+int sunxi_usb_phy_id_detect(int index);
 void sunxi_usb_phy_enable_squelch_detect(int index, int enable);
index 2a1cd3cf3bc16e840262ca5b75d914578f543c34..441c88081389a49607b739c9b884b8bba58bf5ee 100644 (file)
@@ -294,6 +294,13 @@ config USB0_VBUS_DET
        Set the Vbus detect pin for usb0 (otg). This takes a string in the
        format understood by sunxi_name_to_gpio, e.g. PH1 for pin 1 of port H.
 
+config USB0_ID_DET
+       string "ID detect pin for usb0 (otg)"
+       default ""
+       ---help---
+       Set the ID detect pin for usb0 (otg). This takes a string in the
+       format understood by sunxi_name_to_gpio, e.g. PH1 for pin 1 of port H.
+
 config USB1_VBUS_PIN
        string "Vbus enable pin for usb1 (ehci0)"
        default "PH6" if MACH_SUN4I || MACH_SUN7I