* [PATCH v3 0/5] add usb support for hi6220 @ 2015-02-10 7:50 Zhangfei Gao 2015-02-10 7:50 ` [PATCH v3 1/5] Documentation: dt-bindings: add dt binding info for hi6220 dwc2 Zhangfei Gao ` (4 more replies) 0 siblings, 5 replies; 11+ messages in thread From: Zhangfei Gao @ 2015-02-10 7:50 UTC (permalink / raw) To: linux-arm-kernel v3: fix typo and add -EPROBE_DEFER of regulator, pointed by Peter v2: address comments from Sergei and Peter add hi6220_phy_setup(false) code v1: hi6220 usb controller is inherited from dwc2 add phy accordingly support otg gadget/host Zhangfei Gao (5): Documentation: dt-bindings: add dt binding info for hi6220 dwc2 Documentation: dt-bindings: add dt binding info for hi6220 usb: dwc2: platform: add hi6220 support usb: phy: load usb phy earlier usb: phy: add phy-hi6220-usb Documentation/devicetree/bindings/usb/dwc2.txt | 1 + .../devicetree/bindings/usb/hi6220-usb.txt | 49 ++++ drivers/usb/Makefile | 2 +- drivers/usb/dwc2/platform.c | 30 ++ drivers/usb/phy/Kconfig | 9 + drivers/usb/phy/Makefile | 1 + drivers/usb/phy/phy-hi6220-usb.c | 308 +++++++++++++++++++++ 7 files changed, 399 insertions(+), 1 deletion(-) create mode 100644 Documentation/devicetree/bindings/usb/hi6220-usb.txt create mode 100644 drivers/usb/phy/phy-hi6220-usb.c -- 1.9.1 ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 1/5] Documentation: dt-bindings: add dt binding info for hi6220 dwc2 2015-02-10 7:50 [PATCH v3 0/5] add usb support for hi6220 Zhangfei Gao @ 2015-02-10 7:50 ` Zhangfei Gao 2015-02-10 7:50 ` [PATCH v3 2/5] Documentation: dt-bindings: add dt binding info for hi6220 Zhangfei Gao ` (3 subsequent siblings) 4 siblings, 0 replies; 11+ messages in thread From: Zhangfei Gao @ 2015-02-10 7:50 UTC (permalink / raw) To: linux-arm-kernel Add necessary dwc2 binding documentation for Hisilicon soc: hi6220 Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org> --- Documentation/devicetree/bindings/usb/dwc2.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/usb/dwc2.txt b/Documentation/devicetree/bindings/usb/dwc2.txt index fd132cb..2213682 100644 --- a/Documentation/devicetree/bindings/usb/dwc2.txt +++ b/Documentation/devicetree/bindings/usb/dwc2.txt @@ -4,6 +4,7 @@ Platform DesignWare HS OTG USB 2.0 controller Required properties: - compatible : One of: - brcm,bcm2835-usb: The DWC2 USB controller instance in the BCM2835 SoC. + - hisilicon,hi6220-usb: The DWC2 USB controller instance in the hi6220 SoC. - rockchip,rk3066-usb: The DWC2 USB controller instance in the rk3066 Soc; - "rockchip,rk3188-usb", "rockchip,rk3066-usb", "snps,dwc2": for rk3188 Soc; - "rockchip,rk3288-usb", "rockchip,rk3066-usb", "snps,dwc2": for rk3288 Soc; -- 1.9.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 2/5] Documentation: dt-bindings: add dt binding info for hi6220 2015-02-10 7:50 [PATCH v3 0/5] add usb support for hi6220 Zhangfei Gao 2015-02-10 7:50 ` [PATCH v3 1/5] Documentation: dt-bindings: add dt binding info for hi6220 dwc2 Zhangfei Gao @ 2015-02-10 7:50 ` Zhangfei Gao 2015-02-10 13:28 ` Mark Rutland 2015-02-10 7:50 ` [PATCH v3 3/5] usb: dwc2: platform: add hi6220 support Zhangfei Gao ` (2 subsequent siblings) 4 siblings, 1 reply; 11+ messages in thread From: Zhangfei Gao @ 2015-02-10 7:50 UTC (permalink / raw) To: linux-arm-kernel Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org> --- .../devicetree/bindings/usb/hi6220-usb.txt | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 Documentation/devicetree/bindings/usb/hi6220-usb.txt diff --git a/Documentation/devicetree/bindings/usb/hi6220-usb.txt b/Documentation/devicetree/bindings/usb/hi6220-usb.txt new file mode 100644 index 0000000..b8278de --- /dev/null +++ b/Documentation/devicetree/bindings/usb/hi6220-usb.txt @@ -0,0 +1,49 @@ +Hisilicon hi6220 SoC USB controller +----------------------------- + +usb controller is inherited from dwc2, refer dwc2.txt +----- + +Required properties: +- compatible: "hisilicon,hi6220-usb" +Refer to dwc2.txt for dwc2 usb properties + + +PHY: +----- + +Required properties: +- compatible: "hisilicon,hi6220-usb-phy" +- vcc-supply: phandle to the regulator that provides power to the PHY. +- clocks: phandle and clock specifier of the PHY clock. +- hisilicon,peripheral-syscon: phandle of syscon used to control peripheral. +- hisilicon,gpio-vbus: gpio of detecting vbus. +- hisilicon,gpio-id: gpio of detecting id. + +Example: + + peripheral_ctrl: syscon at f7030000 { + compatible = "syscon"; + reg = <0x0 0xf7030000 0x0 0x1000>; + }; + + usb2_phy: usbphy { + compatible = "hisilicon,hi6220-usb-phy"; + vcc-supply = <&fixed_5v_hub>; + hisilicon,gpio-vbus = <&gpio2 6 0>; + hisilicon,gpio-id = <&gpio2 5 0>; + hisilicon,peripheral-syscon = <&peripheral_ctrl>; + clocks = <&clock_sys HI6220_USBOTG_HCLK>; + }; + + usb: usb at f72c0000 { + compatible = "hisilicon,hi6220-usb"; + reg = <0x0 0xf72c0000 0x0 0x40000>; + phys = <&usb2_phy>; + dr_mode = "otg"; + g-use-dma; + g-rx-fifo-size = <512>; + g-np-tx-fifo-size = <128>; + g-tx-fifo-size = <128>; + interrupts = <0 77 0x4>; + }; -- 1.9.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 2/5] Documentation: dt-bindings: add dt binding info for hi6220 2015-02-10 7:50 ` [PATCH v3 2/5] Documentation: dt-bindings: add dt binding info for hi6220 Zhangfei Gao @ 2015-02-10 13:28 ` Mark Rutland 0 siblings, 0 replies; 11+ messages in thread From: Mark Rutland @ 2015-02-10 13:28 UTC (permalink / raw) To: linux-arm-kernel On Tue, Feb 10, 2015 at 07:50:24AM +0000, Zhangfei Gao wrote: > Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org> > --- > .../devicetree/bindings/usb/hi6220-usb.txt | 49 ++++++++++++++++++++++ > 1 file changed, 49 insertions(+) > create mode 100644 Documentation/devicetree/bindings/usb/hi6220-usb.txt > > diff --git a/Documentation/devicetree/bindings/usb/hi6220-usb.txt b/Documentation/devicetree/bindings/usb/hi6220-usb.txt > new file mode 100644 > index 0000000..b8278de > --- /dev/null > +++ b/Documentation/devicetree/bindings/usb/hi6220-usb.txt > @@ -0,0 +1,49 @@ > +Hisilicon hi6220 SoC USB controller > +----------------------------- > + > +usb controller is inherited from dwc2, refer dwc2.txt > +----- > + > +Required properties: > +- compatible: "hisilicon,hi6220-usb" > +Refer to dwc2.txt for dwc2 usb properties > + > + > +PHY: > +----- > + > +Required properties: > +- compatible: "hisilicon,hi6220-usb-phy" > +- vcc-supply: phandle to the regulator that provides power to the PHY. > +- clocks: phandle and clock specifier of the PHY clock. > +- hisilicon,peripheral-syscon: phandle of syscon used to control peripheral. > +- hisilicon,gpio-vbus: gpio of detecting vbus. > +- hisilicon,gpio-id: gpio of detecting id. These should be vbus-gpios and id-gpios respectively. > + > +Example: > + > + peripheral_ctrl: syscon at f7030000 { > + compatible = "syscon"; > + reg = <0x0 0xf7030000 0x0 0x1000>; > + }; We should have a real string for this in addition to "syscon". Thanks, Mark. ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 3/5] usb: dwc2: platform: add hi6220 support 2015-02-10 7:50 [PATCH v3 0/5] add usb support for hi6220 Zhangfei Gao 2015-02-10 7:50 ` [PATCH v3 1/5] Documentation: dt-bindings: add dt binding info for hi6220 dwc2 Zhangfei Gao 2015-02-10 7:50 ` [PATCH v3 2/5] Documentation: dt-bindings: add dt binding info for hi6220 Zhangfei Gao @ 2015-02-10 7:50 ` Zhangfei Gao 2015-02-10 7:50 ` [PATCH v3 4/5] usb: phy: load usb phy earlier Zhangfei Gao 2015-02-10 7:50 ` [PATCH v3 5/5] usb: phy: add phy-hi6220-usb Zhangfei Gao 4 siblings, 0 replies; 11+ messages in thread From: Zhangfei Gao @ 2015-02-10 7:50 UTC (permalink / raw) To: linux-arm-kernel Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org> --- drivers/usb/dwc2/platform.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c index ae095f0..f7c67db 100644 --- a/drivers/usb/dwc2/platform.c +++ b/drivers/usb/dwc2/platform.c @@ -50,6 +50,35 @@ static const char dwc2_driver_name[] = "dwc2"; +static const struct dwc2_core_params params_hi6220 = { + .otg_cap = 2, /* No HNP/SRP capable */ + .otg_ver = 0, /* 1.3 */ + .dma_enable = 1, + .dma_desc_enable = 0, + .speed = 0, /* High Speed */ + .enable_dynamic_fifo = 1, + .en_multiple_tx_fifo = 1, + .host_rx_fifo_size = 512, + .host_nperio_tx_fifo_size = 512, + .host_perio_tx_fifo_size = 512, + .max_transfer_size = 65535, + .max_packet_count = 511, + .host_channels = 16, + .phy_type = 1, /* UTMI */ + .phy_utmi_width = 8, + .phy_ulpi_ddr = 0, /* Single */ + .phy_ulpi_ext_vbus = 0, + .i2c_enable = 0, + .ulpi_fs_ls = 0, + .host_support_fs_ls_low_power = 0, + .host_ls_low_power_phy_clk = 0, /* 48 MHz */ + .ts_dline = 0, + .reload_ctl = 0, + .ahbcfg = GAHBCFG_HBSTLEN_INCR16 << + GAHBCFG_HBSTLEN_SHIFT, + .uframe_sched = 0, +}; + static const struct dwc2_core_params params_bcm2835 = { .otg_cap = 0, /* HNP/SRP capable */ .otg_ver = 0, /* 1.3 */ @@ -129,6 +158,7 @@ static int dwc2_driver_remove(struct platform_device *dev) static const struct of_device_id dwc2_of_match_table[] = { { .compatible = "brcm,bcm2835-usb", .data = ¶ms_bcm2835 }, + { .compatible = "hisilicon,hi6220-usb", .data = ¶ms_hi6220 }, { .compatible = "rockchip,rk3066-usb", .data = ¶ms_rk3066 }, { .compatible = "snps,dwc2", .data = NULL }, { .compatible = "samsung,s3c6400-hsotg", .data = NULL}, -- 1.9.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 4/5] usb: phy: load usb phy earlier 2015-02-10 7:50 [PATCH v3 0/5] add usb support for hi6220 Zhangfei Gao ` (2 preceding siblings ...) 2015-02-10 7:50 ` [PATCH v3 3/5] usb: dwc2: platform: add hi6220 support Zhangfei Gao @ 2015-02-10 7:50 ` Zhangfei Gao 2015-02-10 7:50 ` [PATCH v3 5/5] usb: phy: add phy-hi6220-usb Zhangfei Gao 4 siblings, 0 replies; 11+ messages in thread From: Zhangfei Gao @ 2015-02-10 7:50 UTC (permalink / raw) To: linux-arm-kernel Since phy is definitely used in usb controller, load the phy earlier to make boot time shorter. Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org> Acked-by: Peter Chen <peter.chen@freescale.com> --- drivers/usb/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index 2f1e2aa..d8926c6 100644 --- a/drivers/usb/Makefile +++ b/drivers/usb/Makefile @@ -5,6 +5,7 @@ # Object files in subdirectories obj-$(CONFIG_USB) += core/ +obj-$(CONFIG_USB_SUPPORT) += phy/ obj-$(CONFIG_USB_DWC3) += dwc3/ obj-$(CONFIG_USB_DWC2) += dwc2/ @@ -48,7 +49,6 @@ obj-$(CONFIG_USB_MICROTEK) += image/ obj-$(CONFIG_USB_SERIAL) += serial/ obj-$(CONFIG_USB) += misc/ -obj-$(CONFIG_USB_SUPPORT) += phy/ obj-$(CONFIG_EARLY_PRINTK_DBGP) += early/ obj-$(CONFIG_USB_ATM) += atm/ -- 1.9.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 5/5] usb: phy: add phy-hi6220-usb 2015-02-10 7:50 [PATCH v3 0/5] add usb support for hi6220 Zhangfei Gao ` (3 preceding siblings ...) 2015-02-10 7:50 ` [PATCH v3 4/5] usb: phy: load usb phy earlier Zhangfei Gao @ 2015-02-10 7:50 ` Zhangfei Gao 4 siblings, 0 replies; 11+ messages in thread From: Zhangfei Gao @ 2015-02-10 7:50 UTC (permalink / raw) To: linux-arm-kernel Add usb phy controller for hi6220 platform Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org> --- drivers/usb/phy/Kconfig | 9 ++ drivers/usb/phy/Makefile | 1 + drivers/usb/phy/phy-hi6220-usb.c | 308 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 318 insertions(+) create mode 100644 drivers/usb/phy/phy-hi6220-usb.c diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig index c6d0c8e..405a3d0 100644 --- a/drivers/usb/phy/Kconfig +++ b/drivers/usb/phy/Kconfig @@ -173,6 +173,15 @@ config USB_MXS_PHY MXS Phy is used by some of the i.MX SoCs, for example imx23/28/6x. +config USB_HI6220_PHY + tristate "hi6220 USB PHY support" + select USB_PHY + select MFD_SYSCON + help + Enable this to support the HISILICON HI6220 USB PHY. + + To compile this driver as a module, choose M here. + config USB_RCAR_PHY tristate "Renesas R-Car USB PHY support" depends on USB || USB_GADGET diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile index 75f2bba..00172d3 100644 --- a/drivers/usb/phy/Makefile +++ b/drivers/usb/phy/Makefile @@ -18,6 +18,7 @@ obj-$(CONFIG_SAMSUNG_USBPHY) += phy-samsung-usb.o obj-$(CONFIG_TWL6030_USB) += phy-twl6030-usb.o obj-$(CONFIG_USB_EHCI_TEGRA) += phy-tegra-usb.o obj-$(CONFIG_USB_GPIO_VBUS) += phy-gpio-vbus-usb.o +obj-$(CONFIG_USB_HI6220_PHY) += phy-hi6220-usb.o obj-$(CONFIG_USB_ISP1301) += phy-isp1301.o obj-$(CONFIG_USB_MSM_OTG) += phy-msm-usb.o obj-$(CONFIG_USB_MV_OTG) += phy-mv-usb.o diff --git a/drivers/usb/phy/phy-hi6220-usb.c b/drivers/usb/phy/phy-hi6220-usb.c new file mode 100644 index 0000000..b251e85 --- /dev/null +++ b/drivers/usb/phy/phy-hi6220-usb.c @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2015 Linaro Ltd. + * Copyright (c) 2015 Hisilicon Limited. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include <linux/clk.h> +#include <linux/mfd/syscon.h> +#include <linux/of_gpio.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> +#include <linux/regulator/consumer.h> +#include <linux/usb/gadget.h> +#include <linux/usb/otg.h> + +#define SC_PERIPH_CTRL4 0x00c + +#define CTRL4_PICO_SIDDQ BIT(6) +#define CTRL4_PICO_OGDISABLE BIT(8) +#define CTRL4_PICO_VBUSVLDEXT BIT(10) +#define CTRL4_PICO_VBUSVLDEXTSEL BIT(11) +#define CTRL4_OTG_PHY_SEL BIT(21) + +#define SC_PERIPH_CTRL5 0x010 + +#define CTRL5_USBOTG_RES_SEL BIT(3) +#define CTRL5_PICOPHY_ACAENB BIT(4) +#define CTRL5_PICOPHY_BC_MODE BIT(5) +#define CTRL5_PICOPHY_CHRGSEL BIT(6) +#define CTRL5_PICOPHY_VDATSRCEND BIT(7) +#define CTRL5_PICOPHY_VDATDETENB BIT(8) +#define CTRL5_PICOPHY_DCDENB BIT(9) +#define CTRL5_PICOPHY_IDDIG BIT(10) + +#define SC_PERIPH_CTRL8 0x018 +#define SC_PERIPH_RSTEN0 0x300 +#define SC_PERIPH_RSTDIS0 0x304 + +#define RST0_USBOTG_BUS BIT(4) +#define RST0_POR_PICOPHY BIT(5) +#define RST0_USBOTG BIT(6) +#define RST0_USBOTG_32K BIT(7) + +#define EYE_PATTERN_PARA 0x7053348c + +struct hi6220_priv { + struct usb_phy phy; + struct delayed_work work; + struct regmap *reg; + struct clk *clk; + struct regulator *vcc; + struct device *dev; + int gpio_vbus; + int gpio_id; + enum usb_otg_state state; +}; + +static void hi6220_start_periphrals(struct hi6220_priv *priv, bool on) +{ + struct usb_otg *otg = priv->phy.otg; + + if (!otg->gadget) + return; + + if (on) + usb_gadget_connect(otg->gadget); + else + usb_gadget_disconnect(otg->gadget); +} + +static void hi6220_detect_work(struct work_struct *work) +{ + struct hi6220_priv *priv = + container_of(work, struct hi6220_priv, work.work); + int gpio_id, gpio_vbus; + enum usb_otg_state state; + + if (!gpio_is_valid(priv->gpio_id) || !gpio_is_valid(priv->gpio_vbus)) + return; + + gpio_id = gpio_get_value_cansleep(priv->gpio_id); + gpio_vbus = gpio_get_value_cansleep(priv->gpio_vbus); + + if (gpio_vbus == 0) { + if (gpio_id == 1) + state = OTG_STATE_B_PERIPHERAL; + else + state = OTG_STATE_A_HOST; + } else { + state = OTG_STATE_A_HOST; + } + + if (priv->state != state) { + hi6220_start_periphrals(priv, state == OTG_STATE_B_PERIPHERAL); + priv->state = state; + } +} + +static irqreturn_t hiusb_gpio_intr(int irq, void *data) +{ + struct hi6220_priv *priv = (struct hi6220_priv *)data; + + /* add debounce time */ + schedule_delayed_work(&priv->work, msecs_to_jiffies(100)); + return IRQ_HANDLED; +} + +static int hi6220_set_peripheral(struct usb_otg *otg, struct usb_gadget *gadget) +{ + otg->gadget = gadget; + return 0; +} + +static int hi6220_phy_setup(struct hi6220_priv *priv, bool on) +{ + struct regmap *reg = priv->reg; + u32 val, mask; + int ret; + + if (priv->reg == NULL) + return 0; + + if (on) { + val = RST0_USBOTG_BUS | RST0_POR_PICOPHY | + RST0_USBOTG | RST0_USBOTG_32K; + mask = val; + ret = regmap_update_bits(reg, SC_PERIPH_RSTDIS0, mask, val); + if (ret) + goto out; + + ret = regmap_read(reg, SC_PERIPH_CTRL5, &val); + val = CTRL5_USBOTG_RES_SEL | CTRL5_PICOPHY_ACAENB; + mask = val | CTRL5_PICOPHY_BC_MODE; + ret = regmap_update_bits(reg, SC_PERIPH_CTRL5, mask, val); + if (ret) + goto out; + + val = CTRL4_PICO_VBUSVLDEXT | CTRL4_PICO_VBUSVLDEXTSEL | + CTRL4_OTG_PHY_SEL; + mask = val | CTRL4_PICO_SIDDQ | CTRL4_PICO_OGDISABLE; + ret = regmap_update_bits(reg, SC_PERIPH_CTRL4, mask, val); + if (ret) + goto out; + + ret = regmap_write(reg, SC_PERIPH_CTRL8, EYE_PATTERN_PARA); + if (ret) + goto out; + } else { + val = CTRL4_PICO_SIDDQ; + mask = val; + ret = regmap_update_bits(reg, SC_PERIPH_CTRL4, mask, val); + if (ret) + goto out; + + ret = regmap_read(reg, SC_PERIPH_CTRL4, &val); + val = RST0_USBOTG_BUS | RST0_POR_PICOPHY | + RST0_USBOTG | RST0_USBOTG_32K; + mask = val; + ret = regmap_update_bits(reg, SC_PERIPH_RSTEN0, mask, val); + if (ret) + goto out; + } + + return 0; +out: + dev_err(priv->dev, "failed to setup phy ret: %d\n", ret); + return ret; +} + +static int hi6220_phy_probe(struct platform_device *pdev) +{ + struct hi6220_priv *priv; + struct usb_otg *otg; + struct device_node *np = pdev->dev.of_node; + struct device *dev = &pdev->dev; + int ret, irq; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + otg = devm_kzalloc(dev, sizeof(*otg), GFP_KERNEL); + if (!otg) + return -ENOMEM; + + priv->dev = dev; + priv->phy.dev = &pdev->dev; + priv->phy.otg = otg; + priv->phy.label = "hi6220"; + priv->phy.type = USB_PHY_TYPE_USB2; + otg->set_peripheral = hi6220_set_peripheral; + platform_set_drvdata(pdev, priv); + + priv->gpio_vbus = of_get_named_gpio(np, "hisilicon,gpio-vbus", 0); + if (priv->gpio_vbus == -EPROBE_DEFER) + return -EPROBE_DEFER; + if (!gpio_is_valid(priv->gpio_vbus)) { + dev_err(dev, "invalid gpio %d\n", priv->gpio_vbus); + return -ENODEV; + } + + priv->gpio_id = of_get_named_gpio(np, "hisilicon,gpio-id", 0); + if (priv->gpio_id == -EPROBE_DEFER) + return -EPROBE_DEFER; + if (!gpio_is_valid(priv->gpio_id)) { + dev_err(dev, "invalid gpio %d\n", priv->gpio_id); + return -ENODEV; + } + + priv->reg = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, + "hisilicon,peripheral-syscon"); + if (IS_ERR(priv->reg)) + priv->reg = NULL; + + ret = devm_gpio_request_one(dev, priv->gpio_vbus, + GPIOF_IN, "gpio_vbus"); + if (ret < 0) { + dev_err(dev, "gpio request failed for gpio_vbus\n"); + return ret; + } + + ret = devm_gpio_request_one(dev, priv->gpio_id, GPIOF_IN, "gpio_id"); + if (ret < 0) { + dev_err(dev, "gpio request failed for gpio_id\n"); + return ret; + } + + priv->vcc = devm_regulator_get(dev, "vcc"); + if (IS_ERR(priv->vcc)) { + if (PTR_ERR(priv->vcc) == -EPROBE_DEFER) + return -EPROBE_DEFER; + dev_info(dev, "No regulator found\n"); + } else { + ret = regulator_enable(priv->vcc); + if (ret) { + dev_err(dev, "Failed to enable regulator\n"); + return -ENODEV; + } + } + + priv->clk = devm_clk_get(dev, NULL); + if (IS_ERR(priv->clk)) { + regulator_disable(priv->vcc); + return PTR_ERR(priv->clk); + } + clk_prepare_enable(priv->clk); + INIT_DELAYED_WORK(&priv->work, hi6220_detect_work); + + irq = gpio_to_irq(priv->gpio_vbus); + ret = devm_request_irq(dev, gpio_to_irq(priv->gpio_vbus), + hiusb_gpio_intr, IRQF_NO_SUSPEND | + IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, + "vbus_gpio_intr", priv); + if (ret) { + dev_err(dev, "request gpio irq failed.\n"); + goto err_irq; + } + + hi6220_phy_setup(priv, true); + ret = usb_add_phy_dev(&priv->phy); + if (ret) { + dev_err(dev, "Can't register transceiver\n"); + goto err_irq; + } + schedule_delayed_work(&priv->work, 0); + + return 0; +err_irq: + cancel_delayed_work_sync(&priv->work); + clk_disable_unprepare(priv->clk); + regulator_disable(priv->vcc); + return ret; +} + +static int hi6220_phy_remove(struct platform_device *pdev) +{ + struct hi6220_priv *priv = platform_get_drvdata(pdev); + + cancel_delayed_work_sync(&priv->work); + hi6220_phy_setup(priv, false); + clk_disable_unprepare(priv->clk); + regulator_disable(priv->vcc); + return 0; +} + +static const struct of_device_id hi6220_phy_of_match[] = { + {.compatible = "hisilicon,hi6220-usb-phy",}, + { }, +}; +MODULE_DEVICE_TABLE(of, hi6220_phy_of_match); + +static struct platform_driver hi6220_phy_driver = { + .probe = hi6220_phy_probe, + .remove = hi6220_phy_remove, + .driver = { + .name = "hi6220-usb-phy", + .of_match_table = hi6220_phy_of_match, + } +}; +module_platform_driver(hi6220_phy_driver); + +MODULE_DESCRIPTION("HISILICON HI6220 USB PHY driver"); +MODULE_ALIAS("platform:hi6220-usb-phy"); +MODULE_LICENSE("GPL"); -- 1.9.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
[parent not found: <20150210070424.GC32709@shlinux2>]
* [PATCH v3 4/5] usb: phy: load usb phy earlier [not found] <20150210070424.GC32709@shlinux2> @ 2015-02-10 8:36 ` zhangfei 2015-02-10 14:49 ` Felipe Balbi 1 sibling, 0 replies; 11+ messages in thread From: zhangfei @ 2015-02-10 8:36 UTC (permalink / raw) To: linux-arm-kernel On 02/10/2015 03:04 PM, Peter Chen wrote: > This patch does not belong to phy, so, doesn't need to > add phy in subject, meanwhile, please add GregKH as TO list, > he is the right one to queue this patch. > > Reply-To: > In-Reply-To: <1423554627-694-5-git-send-email-zhangfei.gao@linaro.org> OK, thanks Peter. Will resend this patchset and drop this one. ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 4/5] usb: phy: load usb phy earlier [not found] <20150210070424.GC32709@shlinux2> 2015-02-10 8:36 ` [PATCH v3 4/5] usb: phy: load usb phy earlier zhangfei @ 2015-02-10 14:49 ` Felipe Balbi 2015-02-10 15:20 ` zhangfei 2015-02-11 1:36 ` Peter Chen 1 sibling, 2 replies; 11+ messages in thread From: Felipe Balbi @ 2015-02-10 14:49 UTC (permalink / raw) To: linux-arm-kernel On Tue, Feb 10, 2015 at 03:04:28PM +0800, Peter Chen wrote: > This patch does not belong to phy, so, doesn't need to > add phy in subject, meanwhile, please add GregKH as TO list, > he is the right one to queue this patch. > > Reply-To: > In-Reply-To: <1423554627-694-5-git-send-email-zhangfei.gao@linaro.org> > > On Tue, Feb 10, 2015 at 03:50:26PM +0800, Zhangfei Gao wrote: > > Since phy is definitely used in usb controller, load the phy > > earlier to make boot time shorter. > > > > Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org> > > Acked-by: Peter Chen <peter.chen@freescale.com> NAK, make sure there are no such dependencies with your controller driver. They should know how to defer probing if their resources aren't available yet. -- balbi -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150210/6c13a06b/attachment.sig> ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 4/5] usb: phy: load usb phy earlier 2015-02-10 14:49 ` Felipe Balbi @ 2015-02-10 15:20 ` zhangfei 2015-02-11 1:36 ` Peter Chen 1 sibling, 0 replies; 11+ messages in thread From: zhangfei @ 2015-02-10 15:20 UTC (permalink / raw) To: linux-arm-kernel On 02/10/2015 10:49 PM, Felipe Balbi wrote: > On Tue, Feb 10, 2015 at 03:04:28PM +0800, Peter Chen wrote: >> This patch does not belong to phy, so, doesn't need to >> add phy in subject, meanwhile, please add GregKH as TO list, >> he is the right one to queue this patch. >> >> Reply-To: >> In-Reply-To: <1423554627-694-5-git-send-email-zhangfei.gao@linaro.org> >> >> On Tue, Feb 10, 2015 at 03:50:26PM +0800, Zhangfei Gao wrote: >>> Since phy is definitely used in usb controller, load the phy >>> earlier to make boot time shorter. >>> >>> Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org> >>> Acked-by: Peter Chen <peter.chen@freescale.com> > > NAK, make sure there are no such dependencies with your controller > driver. They should know how to defer probing if their resources aren't > available yet. Sorry for the confusion, There is no dependencies at all, just for optimization. Peter already told me this patch should not be put here, causing confusion. And I resend in another thread. The controller is dwc2, which use defer probe. And dwc2 controller defer probe every time even the phy driver in the same folder. Since we know the calling sequence, we can simply change the sequence to load the phy earlier. However, as you said the new driver will be put in drivers/phy, there should be no such issue in the future. It is OK not using this patch. Thanks ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 4/5] usb: phy: load usb phy earlier 2015-02-10 14:49 ` Felipe Balbi 2015-02-10 15:20 ` zhangfei @ 2015-02-11 1:36 ` Peter Chen 1 sibling, 0 replies; 11+ messages in thread From: Peter Chen @ 2015-02-11 1:36 UTC (permalink / raw) To: linux-arm-kernel > On Tue, Feb 10, 2015 at 03:04:28PM +0800, Peter Chen wrote: > > This patch does not belong to phy, so, doesn't need to add phy in > > subject, meanwhile, please add GregKH as TO list, he is the right one > > to queue this patch. > > > > Reply-To: > > In-Reply-To: <1423554627-694-5-git-send-email-zhangfei.gao@linaro.org> > > > > On Tue, Feb 10, 2015 at 03:50:26PM +0800, Zhangfei Gao wrote: > > > Since phy is definitely used in usb controller, load the phy earlier > > > to make boot time shorter. > > > > > > Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org> > > > Acked-by: Peter Chen <peter.chen@freescale.com> > > NAK, make sure there are no such dependencies with your controller driver. > They should know how to defer probing if their resources aren't available yet. > I NAKed it first. But after thinking more, I think it is a good patch, USB PHY works proper is the base for coming USB controller operation, with this patch, it can avoid the controller drivers which are linked earlier than USB PHY always being probed deferral, look at drivers/Makefile, it links drivers follow the similar method. Zhangfei, you may need to add more description in your commit log to prove it is a good improvement. Peter ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2015-02-11 1:36 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-02-10 7:50 [PATCH v3 0/5] add usb support for hi6220 Zhangfei Gao 2015-02-10 7:50 ` [PATCH v3 1/5] Documentation: dt-bindings: add dt binding info for hi6220 dwc2 Zhangfei Gao 2015-02-10 7:50 ` [PATCH v3 2/5] Documentation: dt-bindings: add dt binding info for hi6220 Zhangfei Gao 2015-02-10 13:28 ` Mark Rutland 2015-02-10 7:50 ` [PATCH v3 3/5] usb: dwc2: platform: add hi6220 support Zhangfei Gao 2015-02-10 7:50 ` [PATCH v3 4/5] usb: phy: load usb phy earlier Zhangfei Gao 2015-02-10 7:50 ` [PATCH v3 5/5] usb: phy: add phy-hi6220-usb Zhangfei Gao [not found] <20150210070424.GC32709@shlinux2> 2015-02-10 8:36 ` [PATCH v3 4/5] usb: phy: load usb phy earlier zhangfei 2015-02-10 14:49 ` Felipe Balbi 2015-02-10 15:20 ` zhangfei 2015-02-11 1:36 ` Peter Chen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).