diff mbox series

[v2,12/32] board: dragonboard410c: upstream DT compat

Message ID 20231219-b4-qcom-common-target-v2-12-b6dd9704219e@linaro.org
State Superseded
Headers show
Series Qualcomm generic board support | expand

Commit Message

Caleb Connolly Dec. 19, 2023, 4:04 p.m. UTC
Use the root compatible strings from upstream Linux, add missing
'#clock-cells' property to the gcc node.

Adjust some of the msm8916/apq8016 drivers to use the correct upstream
compatible properties and DT bindings.

This prepares us to switch to upstream DT in a future patch.

Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
---
 arch/arm/dts/dragonboard410c.dts                 |  25 +++-
 board/qualcomm/dragonboard410c/dragonboard410c.c |  93 +++---------
 doc/device-tree-bindings/usb/ehci-msm.txt        |  10 --
 drivers/clk/qcom/clock-apq8016.c                 |   7 +-
 drivers/phy/qcom/msm8916-usbh-phy.c              |   4 +-
 drivers/pinctrl/qcom/pinctrl-apq8016.c           |   2 +-
 drivers/usb/host/ehci-msm.c                      |  24 ++-
 include/dt-bindings/clock/qcom,gcc-msm8916.h     | 179 +++++++++++++++++++++++
 8 files changed, 248 insertions(+), 96 deletions(-)

Comments

Neil Armstrong Dec. 21, 2023, 4:23 p.m. UTC | #1
On 19/12/2023 17:04, Caleb Connolly wrote:
> Use the root compatible strings from upstream Linux, add missing
> '#clock-cells' property to the gcc node.
> 
> Adjust some of the msm8916/apq8016 drivers to use the correct upstream
> compatible properties and DT bindings.
> 
> This prepares us to switch to upstream DT in a future patch.
> 
> Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
> ---
>   arch/arm/dts/dragonboard410c.dts                 |  25 +++-
>   board/qualcomm/dragonboard410c/dragonboard410c.c |  93 +++---------
>   doc/device-tree-bindings/usb/ehci-msm.txt        |  10 --
>   drivers/clk/qcom/clock-apq8016.c                 |   7 +-
>   drivers/phy/qcom/msm8916-usbh-phy.c              |   4 +-
>   drivers/pinctrl/qcom/pinctrl-apq8016.c           |   2 +-
>   drivers/usb/host/ehci-msm.c                      |  24 ++-
>   include/dt-bindings/clock/qcom,gcc-msm8916.h     | 179 +++++++++++++++++++++++
>   8 files changed, 248 insertions(+), 96 deletions(-)
> 
> diff --git a/arch/arm/dts/dragonboard410c.dts b/arch/arm/dts/dragonboard410c.dts
> index c395e6cc0427..453642b25705 100644
> --- a/arch/arm/dts/dragonboard410c.dts
> +++ b/arch/arm/dts/dragonboard410c.dts
> @@ -12,7 +12,7 @@
>   
>   / {
>   	model = "Qualcomm Technologies, Inc. Dragonboard 410c";
> -	compatible = "qcom,dragonboard", "qcom,apq8016-sbc";
> +	compatible = "qcom,apq8016-sbc", "qcom,apq8016";
>   	qcom,msm-id = <0xce 0x0 0xf8 0x0 0xf9 0x0 0xfa 0x0 0xf7 0x0>;
>   	qcom,board-id = <0x10018 0x0>;
>   	#address-cells = <0x2>;
> @@ -79,6 +79,7 @@
>   			reg = <0x1800000 0x80000>;
>   			#address-cells = <0x1>;
>   			#size-cells = <0x0>;
> +			#clock-cells = <0x1>;
>   		};
>   
>   		serial@78b0000 {
> @@ -91,15 +92,25 @@
>   		};
>   
>   		ehci@78d9000 {
> -			compatible = "qcom,ehci-host";
> +			compatible = "qcom,ci-hdrc";
>   			reg = <0x78d9000 0x400>;
>   			phys = <&ehci_phy>;
> -		};
>   
> -		ehci_phy: ehci_phy@78d9000 {
> -			compatible = "qcom,apq8016-usbphy";
> -			reg = <0x78d9000 0x400>;
> -			#phy-cells = <0>;
> +			ulpi {
> +				usb_hs_phy: phy {
> +					compatible = "qcom,usb-hs-phy-msm8916",
> +						     "qcom,usb-hs-phy";
> +					#phy-cells = <0>;
> +					clocks = <&xo_board>, <&gcc GCC_USB2A_PHY_SLEEP_CLK>;
> +					clock-names = "ref", "sleep";
> +					resets = <&gcc GCC_USB2A_PHY_BCR>, <&usb 0>;
> +					reset-names = "phy", "por";
> +					qcom,init-seq = /bits/ 8 <0x0 0x44>,
> +								 <0x1 0x6b>,
> +								 <0x2 0x24>,
> +								 <0x3 0x13>;
> +				};
> +			};
>   		};
>   
>   		sdhci@07824000 {
> diff --git a/board/qualcomm/dragonboard410c/dragonboard410c.c b/board/qualcomm/dragonboard410c/dragonboard410c.c
> index 350e0e9e20aa..1adac07569ae 100644
> --- a/board/qualcomm/dragonboard410c/dragonboard410c.c
> +++ b/board/qualcomm/dragonboard410c/dragonboard410c.c
> @@ -9,6 +9,7 @@
>   #include <common.h>
>   #include <cpu_func.h>
>   #include <dm.h>
> +#include <dm/pinctrl.h>
>   #include <env.h>
>   #include <init.h>
>   #include <net.h>
> @@ -23,84 +24,32 @@
>   
>   DECLARE_GLOBAL_DATA_PTR;
>   
> -int dram_init(void)
> -{
> -	gd->ram_size = PHYS_SDRAM_1_SIZE;
> -
> -	return 0;
> -}
> -
> -int dram_init_banksize(void)
> -{
> -	gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
> -	gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
> -
> -	return 0;
> -}
> +#define USB_HUB_RESET_GPIO 2
> +#define USB_SW_SELECT_GPIO 3
>   
>   int board_usb_init(int index, enum usb_init_type init)
>   {
> -	static struct udevice *pmic_gpio;
> -	static struct gpio_desc hub_reset, usb_sel;
> -	int ret = 0, node;
> +	struct udevice *usb;
> +	int ret = 0;
>   
> -	if (!pmic_gpio) {
> -		ret = uclass_get_device_by_name(UCLASS_GPIO,
> -						"pm8916_gpios@c000",
> -						&pmic_gpio);
> -		if (ret < 0) {
> -			printf("Failed to find pm8916_gpios@c000 node.\n");
> -			return ret;
> -		}
> +	/* USB device */
> +	ret = device_find_global_by_ofnode(ofnode_path("/soc/usb"), &usb);
> +	if (ret) {
> +		printf("Cannot find USB device\n");
> +		return ret;
>   	}
>   
> -	/* Try to request gpios needed to start usb host on dragonboard */
> -	if (!dm_gpio_is_valid(&hub_reset)) {
> -		node = fdt_subnode_offset(gd->fdt_blob,
> -					  dev_of_offset(pmic_gpio),
> -					  "usb_hub_reset_pm");
> -		if (node < 0) {
> -			printf("Failed to find usb_hub_reset_pm dt node.\n");
> -			return node;
> -		}
> -		ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
> -						 "gpios", 0, &hub_reset, 0);
> -		if (ret < 0) {
> -			printf("Failed to request usb_hub_reset_pm gpio.\n");
> -			return ret;
> -		}
> -	}
> -
> -	if (!dm_gpio_is_valid(&usb_sel)) {
> -		node = fdt_subnode_offset(gd->fdt_blob,
> -					  dev_of_offset(pmic_gpio),
> -					  "usb_sw_sel_pm");
> -		if (node < 0) {
> -			printf("Failed to find usb_sw_sel_pm dt node.\n");
> -			return 0;
> -		}
> -		ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
> -						 "gpios", 0, &usb_sel, 0);
> -		if (ret < 0) {
> -			printf("Failed to request usb_sw_sel_pm gpio.\n");
> -			return ret;
> -		}
> -	}
> -
> -	if (init == USB_INIT_HOST) {
> -		/* Start USB Hub */
> -		dm_gpio_set_dir_flags(&hub_reset,
> -				      GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
> -		mdelay(100);
> -		/* Switch usb to host connectors */
> -		dm_gpio_set_dir_flags(&usb_sel,
> -				      GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
> -		mdelay(100);
> -	} else { /* Device */
> -		/* Disable hub */
> -		dm_gpio_set_dir_flags(&hub_reset, GPIOD_IS_OUT);
> -		/* Switch back to device connector */
> -		dm_gpio_set_dir_flags(&usb_sel, GPIOD_IS_OUT);
> +	/* Select "default" or "device" pinctrl */
> +	switch (init) {
> +	case USB_INIT_HOST:
> +		pinctrl_select_state(usb, "default");
> +		break;
> +	case USB_INIT_DEVICE:
> +		pinctrl_select_state(usb, "device");
> +		break;
> +	default:
> +		debug("Unknown usb_init_type %d\n", init);
> +		break;
>   	}
>   
>   	return 0;
> diff --git a/doc/device-tree-bindings/usb/ehci-msm.txt b/doc/device-tree-bindings/usb/ehci-msm.txt
> deleted file mode 100644
> index 205bb07220fb..000000000000
> --- a/doc/device-tree-bindings/usb/ehci-msm.txt
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -Chipidea EHCI controller (part of OTG controller) used on Qualcomm devices.
> -
> -Required properties:
> -- compatible: must be "qcom,ehci-host"
> -- reg: start address and size of the registers
> -
> -ehci@78d9000 {
> -	compatible = "qcom,ehci-host";
> -	reg = <0x78d9000 0x400>;
> -};
> diff --git a/drivers/clk/qcom/clock-apq8016.c b/drivers/clk/qcom/clock-apq8016.c
> index 0af7191cff52..9de0ad5ed32d 100644
> --- a/drivers/clk/qcom/clock-apq8016.c
> +++ b/drivers/clk/qcom/clock-apq8016.c
> @@ -13,6 +13,7 @@
>   #include <errno.h>
>   #include <asm/io.h>
>   #include <linux/bitops.h>
> +#include <dt-bindings/clock/qcom,gcc-msm8916.h>
>   
>   #include "clock-qcom.h"
>   
> @@ -125,13 +126,13 @@ static ulong apq8016_clk_set_rate(struct clk *clk, ulong rate)
>   	struct msm_clk_priv *priv = dev_get_priv(clk->dev);
>   
>   	switch (clk->id) {
> -	case 0: /* SDC1 */
> +	case GCC_SDCC1_APPS_CLK: /* SDC1 */
>   		return clk_init_sdc(priv, 0, rate);
>   		break;
> -	case 1: /* SDC2 */
> +	case GCC_SDCC2_APPS_CLK: /* SDC2 */
>   		return clk_init_sdc(priv, 1, rate);
>   		break;
> -	case 4: /* UART2 */
> +	case GCC_BLSP1_UART2_APPS_CLK: /* UART2 */
>   		return clk_init_uart(priv);
>   		break;
>   	default:
> diff --git a/drivers/phy/qcom/msm8916-usbh-phy.c b/drivers/phy/qcom/msm8916-usbh-phy.c
> index 7c9d030a4d8a..f52046f7cb02 100644
> --- a/drivers/phy/qcom/msm8916-usbh-phy.c
> +++ b/drivers/phy/qcom/msm8916-usbh-phy.c
> @@ -74,7 +74,7 @@ static int msm_phy_probe(struct udevice *dev)
>   {
>   	struct msm_phy_priv *priv = dev_get_priv(dev);
>   
> -	priv->regs = dev_remap_addr(dev);
> +	priv->regs = dev_remap_addr(dev_get_parent(dev));
>   	if (!priv->regs)
>   		return -EINVAL;
>   
> @@ -96,7 +96,7 @@ static struct phy_ops msm_phy_ops = {
>   };
>   
>   static const struct udevice_id msm_phy_ids[] = {
> -	{ .compatible = "qcom,apq8016-usbphy" },
> +	{ .compatible = "qcom,usb-hs-phy-msm8916" },
>   	{ }
>   };
>   
> diff --git a/drivers/pinctrl/qcom/pinctrl-apq8016.c b/drivers/pinctrl/qcom/pinctrl-apq8016.c
> index 8149ffd83cc4..8e698085d78b 100644
> --- a/drivers/pinctrl/qcom/pinctrl-apq8016.c
> +++ b/drivers/pinctrl/qcom/pinctrl-apq8016.c
> @@ -29,7 +29,7 @@ static const char * const msm_pinctrl_pins[] = {
>   };
>   
>   static const struct pinctrl_function msm_pinctrl_functions[] = {
> -	{"blsp1_uart", 2},
> +	{"blsp_uart2", 2},
>   };
>   
>   static const char *apq8016_get_function_name(struct udevice *dev,
> diff --git a/drivers/usb/host/ehci-msm.c b/drivers/usb/host/ehci-msm.c
> index dd0d153500cb..25960453beae 100644
> --- a/drivers/usb/host/ehci-msm.c
> +++ b/drivers/usb/host/ehci-msm.c
> @@ -9,6 +9,7 @@
>   
>   #include <common.h>
>   #include <dm.h>
> +#include <dm/lists.h>
>   #include <errno.h>
>   #include <usb.h>
>   #include <usb/ehci-ci.h>
> @@ -119,6 +120,26 @@ static int ehci_usb_of_to_plat(struct udevice *dev)
>   	return 0;
>   }
>   
> +static int ehci_usb_of_bind(struct udevice *dev)
> +{
> +	ofnode ulpi_node = ofnode_first_subnode(dev_ofnode(dev));
> +	ofnode phy_node;
> +
> +	if (!ofnode_valid(ulpi_node))
> +		return 0;
> +
> +	phy_node = ofnode_first_subnode(ulpi_node);
> +	if (!ofnode_valid(phy_node)) {
> +		printf("%s: ulpi subnode with no phy\n", __func__);
> +		return -ENOENT;
> +	}
> +
> +	return device_bind_driver_to_node(dev, "msm8916_usbphy", "msm8916_usbphy",
> +					  phy_node, NULL);
> +
> +	return 0;
> +}
> +
>   #if defined(CONFIG_CI_UDC)
>   /* Little quirk that MSM needs with Chipidea controller
>    * Must reinit phy after reset
> @@ -132,7 +153,7 @@ void ci_init_after_reset(struct ehci_ctrl *ctrl)
>   #endif
>   
>   static const struct udevice_id ehci_usb_ids[] = {
> -	{ .compatible = "qcom,ehci-host", },
> +	{ .compatible = "qcom,ci-hdrc", },
>   	{ }
>   };
>   
> @@ -141,6 +162,7 @@ U_BOOT_DRIVER(usb_ehci) = {
>   	.id	= UCLASS_USB,
>   	.of_match = ehci_usb_ids,
>   	.of_to_plat = ehci_usb_of_to_plat,
> +	.bind = ehci_usb_of_bind,
>   	.probe = ehci_usb_probe,
>   	.remove = ehci_usb_remove,
>   	.ops	= &ehci_usb_ops,
> diff --git a/include/dt-bindings/clock/qcom,gcc-msm8916.h b/include/dt-bindings/clock/qcom,gcc-msm8916.h
> new file mode 100644
> index 000000000000..563034406184
> --- /dev/null
> +++ b/include/dt-bindings/clock/qcom,gcc-msm8916.h
> @@ -0,0 +1,179 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * Copyright 2015 Linaro Limited
> + */
> +
> +#ifndef _DT_BINDINGS_CLK_MSM_GCC_8916_H
> +#define _DT_BINDINGS_CLK_MSM_GCC_8916_H
> +
> +#define GPLL0					0
> +#define GPLL0_VOTE				1
> +#define BIMC_PLL				2
> +#define BIMC_PLL_VOTE				3
> +#define GPLL1					4
> +#define GPLL1_VOTE				5
> +#define GPLL2					6
> +#define GPLL2_VOTE				7
> +#define PCNOC_BFDCD_CLK_SRC			8
> +#define SYSTEM_NOC_BFDCD_CLK_SRC		9
> +#define CAMSS_AHB_CLK_SRC			10
> +#define APSS_AHB_CLK_SRC			11
> +#define CSI0_CLK_SRC				12
> +#define CSI1_CLK_SRC				13
> +#define GFX3D_CLK_SRC				14
> +#define VFE0_CLK_SRC				15
> +#define BLSP1_QUP1_I2C_APPS_CLK_SRC		16
> +#define BLSP1_QUP1_SPI_APPS_CLK_SRC		17
> +#define BLSP1_QUP2_I2C_APPS_CLK_SRC		18
> +#define BLSP1_QUP2_SPI_APPS_CLK_SRC		19
> +#define BLSP1_QUP3_I2C_APPS_CLK_SRC		20
> +#define BLSP1_QUP3_SPI_APPS_CLK_SRC		21
> +#define BLSP1_QUP4_I2C_APPS_CLK_SRC		22
> +#define BLSP1_QUP4_SPI_APPS_CLK_SRC		23
> +#define BLSP1_QUP5_I2C_APPS_CLK_SRC		24
> +#define BLSP1_QUP5_SPI_APPS_CLK_SRC		25
> +#define BLSP1_QUP6_I2C_APPS_CLK_SRC		26
> +#define BLSP1_QUP6_SPI_APPS_CLK_SRC		27
> +#define BLSP1_UART1_APPS_CLK_SRC		28
> +#define BLSP1_UART2_APPS_CLK_SRC		29
> +#define CCI_CLK_SRC				30
> +#define CAMSS_GP0_CLK_SRC			31
> +#define CAMSS_GP1_CLK_SRC			32
> +#define JPEG0_CLK_SRC				33
> +#define MCLK0_CLK_SRC				34
> +#define MCLK1_CLK_SRC				35
> +#define CSI0PHYTIMER_CLK_SRC			36
> +#define CSI1PHYTIMER_CLK_SRC			37
> +#define CPP_CLK_SRC				38
> +#define CRYPTO_CLK_SRC				39
> +#define GP1_CLK_SRC				40
> +#define GP2_CLK_SRC				41
> +#define GP3_CLK_SRC				42
> +#define BYTE0_CLK_SRC				43
> +#define ESC0_CLK_SRC				44
> +#define MDP_CLK_SRC				45
> +#define PCLK0_CLK_SRC				46
> +#define VSYNC_CLK_SRC				47
> +#define PDM2_CLK_SRC				48
> +#define SDCC1_APPS_CLK_SRC			49
> +#define SDCC2_APPS_CLK_SRC			50
> +#define APSS_TCU_CLK_SRC			51
> +#define USB_HS_SYSTEM_CLK_SRC			52
> +#define VCODEC0_CLK_SRC				53
> +#define GCC_BLSP1_AHB_CLK			54
> +#define GCC_BLSP1_SLEEP_CLK			55
> +#define GCC_BLSP1_QUP1_I2C_APPS_CLK		56
> +#define GCC_BLSP1_QUP1_SPI_APPS_CLK		57
> +#define GCC_BLSP1_QUP2_I2C_APPS_CLK		58
> +#define GCC_BLSP1_QUP2_SPI_APPS_CLK		59
> +#define GCC_BLSP1_QUP3_I2C_APPS_CLK		60
> +#define GCC_BLSP1_QUP3_SPI_APPS_CLK		61
> +#define GCC_BLSP1_QUP4_I2C_APPS_CLK		62
> +#define GCC_BLSP1_QUP4_SPI_APPS_CLK		63
> +#define GCC_BLSP1_QUP5_I2C_APPS_CLK		64
> +#define GCC_BLSP1_QUP5_SPI_APPS_CLK		65
> +#define GCC_BLSP1_QUP6_I2C_APPS_CLK		66
> +#define GCC_BLSP1_QUP6_SPI_APPS_CLK		67
> +#define GCC_BLSP1_UART1_APPS_CLK		68
> +#define GCC_BLSP1_UART2_APPS_CLK		69
> +#define GCC_BOOT_ROM_AHB_CLK			70
> +#define GCC_CAMSS_CCI_AHB_CLK			71
> +#define GCC_CAMSS_CCI_CLK			72
> +#define GCC_CAMSS_CSI0_AHB_CLK			73
> +#define GCC_CAMSS_CSI0_CLK			74
> +#define GCC_CAMSS_CSI0PHY_CLK			75
> +#define GCC_CAMSS_CSI0PIX_CLK			76
> +#define GCC_CAMSS_CSI0RDI_CLK			77
> +#define GCC_CAMSS_CSI1_AHB_CLK			78
> +#define GCC_CAMSS_CSI1_CLK			79
> +#define GCC_CAMSS_CSI1PHY_CLK			80
> +#define GCC_CAMSS_CSI1PIX_CLK			81
> +#define GCC_CAMSS_CSI1RDI_CLK			82
> +#define GCC_CAMSS_CSI_VFE0_CLK			83
> +#define GCC_CAMSS_GP0_CLK			84
> +#define GCC_CAMSS_GP1_CLK			85
> +#define GCC_CAMSS_ISPIF_AHB_CLK			86
> +#define GCC_CAMSS_JPEG0_CLK			87
> +#define GCC_CAMSS_JPEG_AHB_CLK			88
> +#define GCC_CAMSS_JPEG_AXI_CLK			89
> +#define GCC_CAMSS_MCLK0_CLK			90
> +#define GCC_CAMSS_MCLK1_CLK			91
> +#define GCC_CAMSS_MICRO_AHB_CLK			92
> +#define GCC_CAMSS_CSI0PHYTIMER_CLK		93
> +#define GCC_CAMSS_CSI1PHYTIMER_CLK		94
> +#define GCC_CAMSS_AHB_CLK			95
> +#define GCC_CAMSS_TOP_AHB_CLK			96
> +#define GCC_CAMSS_CPP_AHB_CLK			97
> +#define GCC_CAMSS_CPP_CLK			98
> +#define GCC_CAMSS_VFE0_CLK			99
> +#define GCC_CAMSS_VFE_AHB_CLK			100
> +#define GCC_CAMSS_VFE_AXI_CLK			101
> +#define GCC_CRYPTO_AHB_CLK			102
> +#define GCC_CRYPTO_AXI_CLK			103
> +#define GCC_CRYPTO_CLK				104
> +#define GCC_OXILI_GMEM_CLK			105
> +#define GCC_GP1_CLK				106
> +#define GCC_GP2_CLK				107
> +#define GCC_GP3_CLK				108
> +#define GCC_MDSS_AHB_CLK			109
> +#define GCC_MDSS_AXI_CLK			110
> +#define GCC_MDSS_BYTE0_CLK			111
> +#define GCC_MDSS_ESC0_CLK			112
> +#define GCC_MDSS_MDP_CLK			113
> +#define GCC_MDSS_PCLK0_CLK			114
> +#define GCC_MDSS_VSYNC_CLK			115
> +#define GCC_MSS_CFG_AHB_CLK			116
> +#define GCC_OXILI_AHB_CLK			117
> +#define GCC_OXILI_GFX3D_CLK			118
> +#define GCC_PDM2_CLK				119
> +#define GCC_PDM_AHB_CLK				120
> +#define GCC_PRNG_AHB_CLK			121
> +#define GCC_SDCC1_AHB_CLK			122
> +#define GCC_SDCC1_APPS_CLK			123
> +#define GCC_SDCC2_AHB_CLK			124
> +#define GCC_SDCC2_APPS_CLK			125
> +#define GCC_GTCU_AHB_CLK			126
> +#define GCC_JPEG_TBU_CLK			127
> +#define GCC_MDP_TBU_CLK				128
> +#define GCC_SMMU_CFG_CLK			129
> +#define GCC_VENUS_TBU_CLK			130
> +#define GCC_VFE_TBU_CLK				131
> +#define GCC_USB2A_PHY_SLEEP_CLK			132
> +#define GCC_USB_HS_AHB_CLK			133
> +#define GCC_USB_HS_SYSTEM_CLK			134
> +#define GCC_VENUS0_AHB_CLK			135
> +#define GCC_VENUS0_AXI_CLK			136
> +#define GCC_VENUS0_VCODEC0_CLK			137
> +#define BIMC_DDR_CLK_SRC			138
> +#define GCC_APSS_TCU_CLK			139
> +#define GCC_GFX_TCU_CLK				140
> +#define BIMC_GPU_CLK_SRC			141
> +#define GCC_BIMC_GFX_CLK			142
> +#define GCC_BIMC_GPU_CLK			143
> +#define ULTAUDIO_LPAIF_PRI_I2S_CLK_SRC		144
> +#define ULTAUDIO_LPAIF_SEC_I2S_CLK_SRC		145
> +#define ULTAUDIO_LPAIF_AUX_I2S_CLK_SRC		146
> +#define ULTAUDIO_XO_CLK_SRC			147
> +#define ULTAUDIO_AHBFABRIC_CLK_SRC		148
> +#define CODEC_DIGCODEC_CLK_SRC			149
> +#define GCC_ULTAUDIO_PCNOC_MPORT_CLK		150
> +#define GCC_ULTAUDIO_PCNOC_SWAY_CLK		151
> +#define GCC_ULTAUDIO_AVSYNC_XO_CLK		152
> +#define GCC_ULTAUDIO_STC_XO_CLK			153
> +#define GCC_ULTAUDIO_AHBFABRIC_IXFABRIC_CLK	154
> +#define GCC_ULTAUDIO_AHBFABRIC_IXFABRIC_LPM_CLK	155
> +#define GCC_ULTAUDIO_LPAIF_PRI_I2S_CLK		156
> +#define GCC_ULTAUDIO_LPAIF_SEC_I2S_CLK		157
> +#define GCC_ULTAUDIO_LPAIF_AUX_I2S_CLK		158
> +#define GCC_CODEC_DIGCODEC_CLK			159
> +#define GCC_MSS_Q6_BIMC_AXI_CLK			160
> +
> +/* Indexes for GDSCs */
> +#define BIMC_GDSC				0
> +#define VENUS_GDSC				1
> +#define MDSS_GDSC				2
> +#define JPEG_GDSC				3
> +#define VFE_GDSC				4
> +#define OXILI_GDSC				5
> +
> +#endif
> 
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Sumit Garg Dec. 22, 2023, 7:48 a.m. UTC | #2
On Tue, 19 Dec 2023 at 21:34, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>
> Use the root compatible strings from upstream Linux, add missing
> '#clock-cells' property to the gcc node.
>
> Adjust some of the msm8916/apq8016 drivers to use the correct upstream
> compatible properties and DT bindings.
>
> This prepares us to switch to upstream DT in a future patch.
>
> Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
> ---
>  arch/arm/dts/dragonboard410c.dts                 |  25 +++-
>  board/qualcomm/dragonboard410c/dragonboard410c.c |  93 +++---------
>  doc/device-tree-bindings/usb/ehci-msm.txt        |  10 --
>  drivers/clk/qcom/clock-apq8016.c                 |   7 +-
>  drivers/phy/qcom/msm8916-usbh-phy.c              |   4 +-
>  drivers/pinctrl/qcom/pinctrl-apq8016.c           |   2 +-
>  drivers/usb/host/ehci-msm.c                      |  24 ++-
>  include/dt-bindings/clock/qcom,gcc-msm8916.h     | 179 +++++++++++++++++++++++
>  8 files changed, 248 insertions(+), 96 deletions(-)
>
> diff --git a/arch/arm/dts/dragonboard410c.dts b/arch/arm/dts/dragonboard410c.dts
> index c395e6cc0427..453642b25705 100644
> --- a/arch/arm/dts/dragonboard410c.dts
> +++ b/arch/arm/dts/dragonboard410c.dts
> @@ -12,7 +12,7 @@
>
>  / {
>         model = "Qualcomm Technologies, Inc. Dragonboard 410c";
> -       compatible = "qcom,dragonboard", "qcom,apq8016-sbc";
> +       compatible = "qcom,apq8016-sbc", "qcom,apq8016";
>         qcom,msm-id = <0xce 0x0 0xf8 0x0 0xf9 0x0 0xfa 0x0 0xf7 0x0>;
>         qcom,board-id = <0x10018 0x0>;
>         #address-cells = <0x2>;
> @@ -79,6 +79,7 @@
>                         reg = <0x1800000 0x80000>;
>                         #address-cells = <0x1>;
>                         #size-cells = <0x0>;
> +                       #clock-cells = <0x1>;
>                 };
>
>                 serial@78b0000 {
> @@ -91,15 +92,25 @@
>                 };
>
>                 ehci@78d9000 {
> -                       compatible = "qcom,ehci-host";
> +                       compatible = "qcom,ci-hdrc";
>                         reg = <0x78d9000 0x400>;
>                         phys = <&ehci_phy>;
> -               };
>
> -               ehci_phy: ehci_phy@78d9000 {
> -                       compatible = "qcom,apq8016-usbphy";
> -                       reg = <0x78d9000 0x400>;
> -                       #phy-cells = <0>;
> +                       ulpi {
> +                               usb_hs_phy: phy {
> +                                       compatible = "qcom,usb-hs-phy-msm8916",
> +                                                    "qcom,usb-hs-phy";
> +                                       #phy-cells = <0>;
> +                                       clocks = <&xo_board>, <&gcc GCC_USB2A_PHY_SLEEP_CLK>;
> +                                       clock-names = "ref", "sleep";
> +                                       resets = <&gcc GCC_USB2A_PHY_BCR>, <&usb 0>;
> +                                       reset-names = "phy", "por";
> +                                       qcom,init-seq = /bits/ 8 <0x0 0x44>,
> +                                                                <0x1 0x6b>,
> +                                                                <0x2 0x24>,
> +                                                                <0x3 0x13>;
> +                               };
> +                       };
>                 };
>
>                 sdhci@07824000 {
> diff --git a/board/qualcomm/dragonboard410c/dragonboard410c.c b/board/qualcomm/dragonboard410c/dragonboard410c.c
> index 350e0e9e20aa..1adac07569ae 100644
> --- a/board/qualcomm/dragonboard410c/dragonboard410c.c
> +++ b/board/qualcomm/dragonboard410c/dragonboard410c.c
> @@ -9,6 +9,7 @@
>  #include <common.h>
>  #include <cpu_func.h>
>  #include <dm.h>
> +#include <dm/pinctrl.h>
>  #include <env.h>
>  #include <init.h>
>  #include <net.h>
> @@ -23,84 +24,32 @@
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> -int dram_init(void)
> -{
> -       gd->ram_size = PHYS_SDRAM_1_SIZE;
> -
> -       return 0;
> -}
> -
> -int dram_init_banksize(void)
> -{
> -       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
> -       gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
> -
> -       return 0;
> -}
> +#define USB_HUB_RESET_GPIO 2
> +#define USB_SW_SELECT_GPIO 3
>
>  int board_usb_init(int index, enum usb_init_type init)
>  {
> -       static struct udevice *pmic_gpio;
> -       static struct gpio_desc hub_reset, usb_sel;
> -       int ret = 0, node;
> +       struct udevice *usb;
> +       int ret = 0;
>
> -       if (!pmic_gpio) {
> -               ret = uclass_get_device_by_name(UCLASS_GPIO,
> -                                               "pm8916_gpios@c000",
> -                                               &pmic_gpio);
> -               if (ret < 0) {
> -                       printf("Failed to find pm8916_gpios@c000 node.\n");
> -                       return ret;
> -               }
> +       /* USB device */
> +       ret = device_find_global_by_ofnode(ofnode_path("/soc/usb"), &usb);
> +       if (ret) {
> +               printf("Cannot find USB device\n");
> +               return ret;
>         }
>
> -       /* Try to request gpios needed to start usb host on dragonboard */
> -       if (!dm_gpio_is_valid(&hub_reset)) {
> -               node = fdt_subnode_offset(gd->fdt_blob,
> -                                         dev_of_offset(pmic_gpio),
> -                                         "usb_hub_reset_pm");
> -               if (node < 0) {
> -                       printf("Failed to find usb_hub_reset_pm dt node.\n");
> -                       return node;
> -               }
> -               ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
> -                                                "gpios", 0, &hub_reset, 0);
> -               if (ret < 0) {
> -                       printf("Failed to request usb_hub_reset_pm gpio.\n");
> -                       return ret;
> -               }
> -       }
> -
> -       if (!dm_gpio_is_valid(&usb_sel)) {
> -               node = fdt_subnode_offset(gd->fdt_blob,
> -                                         dev_of_offset(pmic_gpio),
> -                                         "usb_sw_sel_pm");
> -               if (node < 0) {
> -                       printf("Failed to find usb_sw_sel_pm dt node.\n");
> -                       return 0;
> -               }
> -               ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
> -                                                "gpios", 0, &usb_sel, 0);
> -               if (ret < 0) {
> -                       printf("Failed to request usb_sw_sel_pm gpio.\n");
> -                       return ret;
> -               }
> -       }
> -
> -       if (init == USB_INIT_HOST) {
> -               /* Start USB Hub */
> -               dm_gpio_set_dir_flags(&hub_reset,
> -                                     GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
> -               mdelay(100);
> -               /* Switch usb to host connectors */
> -               dm_gpio_set_dir_flags(&usb_sel,
> -                                     GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
> -               mdelay(100);
> -       } else { /* Device */
> -               /* Disable hub */
> -               dm_gpio_set_dir_flags(&hub_reset, GPIOD_IS_OUT);
> -               /* Switch back to device connector */
> -               dm_gpio_set_dir_flags(&usb_sel, GPIOD_IS_OUT);
> +       /* Select "default" or "device" pinctrl */
> +       switch (init) {
> +       case USB_INIT_HOST:
> +               pinctrl_select_state(usb, "default");
> +               break;
> +       case USB_INIT_DEVICE:
> +               pinctrl_select_state(usb, "device");
> +               break;
> +       default:
> +               debug("Unknown usb_init_type %d\n", init);
> +               break;

Can this pinctrl configuration move to the corresponding USB driver instead?

-Sumit

>         }
>
>         return 0;
> diff --git a/doc/device-tree-bindings/usb/ehci-msm.txt b/doc/device-tree-bindings/usb/ehci-msm.txt
> deleted file mode 100644
> index 205bb07220fb..000000000000
> --- a/doc/device-tree-bindings/usb/ehci-msm.txt
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -Chipidea EHCI controller (part of OTG controller) used on Qualcomm devices.
> -
> -Required properties:
> -- compatible: must be "qcom,ehci-host"
> -- reg: start address and size of the registers
> -
> -ehci@78d9000 {
> -       compatible = "qcom,ehci-host";
> -       reg = <0x78d9000 0x400>;
> -};
> diff --git a/drivers/clk/qcom/clock-apq8016.c b/drivers/clk/qcom/clock-apq8016.c
> index 0af7191cff52..9de0ad5ed32d 100644
> --- a/drivers/clk/qcom/clock-apq8016.c
> +++ b/drivers/clk/qcom/clock-apq8016.c
> @@ -13,6 +13,7 @@
>  #include <errno.h>
>  #include <asm/io.h>
>  #include <linux/bitops.h>
> +#include <dt-bindings/clock/qcom,gcc-msm8916.h>
>
>  #include "clock-qcom.h"
>
> @@ -125,13 +126,13 @@ static ulong apq8016_clk_set_rate(struct clk *clk, ulong rate)
>         struct msm_clk_priv *priv = dev_get_priv(clk->dev);
>
>         switch (clk->id) {
> -       case 0: /* SDC1 */
> +       case GCC_SDCC1_APPS_CLK: /* SDC1 */
>                 return clk_init_sdc(priv, 0, rate);
>                 break;
> -       case 1: /* SDC2 */
> +       case GCC_SDCC2_APPS_CLK: /* SDC2 */
>                 return clk_init_sdc(priv, 1, rate);
>                 break;
> -       case 4: /* UART2 */
> +       case GCC_BLSP1_UART2_APPS_CLK: /* UART2 */
>                 return clk_init_uart(priv);
>                 break;
>         default:
> diff --git a/drivers/phy/qcom/msm8916-usbh-phy.c b/drivers/phy/qcom/msm8916-usbh-phy.c
> index 7c9d030a4d8a..f52046f7cb02 100644
> --- a/drivers/phy/qcom/msm8916-usbh-phy.c
> +++ b/drivers/phy/qcom/msm8916-usbh-phy.c
> @@ -74,7 +74,7 @@ static int msm_phy_probe(struct udevice *dev)
>  {
>         struct msm_phy_priv *priv = dev_get_priv(dev);
>
> -       priv->regs = dev_remap_addr(dev);
> +       priv->regs = dev_remap_addr(dev_get_parent(dev));
>         if (!priv->regs)
>                 return -EINVAL;
>
> @@ -96,7 +96,7 @@ static struct phy_ops msm_phy_ops = {
>  };
>
>  static const struct udevice_id msm_phy_ids[] = {
> -       { .compatible = "qcom,apq8016-usbphy" },
> +       { .compatible = "qcom,usb-hs-phy-msm8916" },
>         { }
>  };
>
> diff --git a/drivers/pinctrl/qcom/pinctrl-apq8016.c b/drivers/pinctrl/qcom/pinctrl-apq8016.c
> index 8149ffd83cc4..8e698085d78b 100644
> --- a/drivers/pinctrl/qcom/pinctrl-apq8016.c
> +++ b/drivers/pinctrl/qcom/pinctrl-apq8016.c
> @@ -29,7 +29,7 @@ static const char * const msm_pinctrl_pins[] = {
>  };
>
>  static const struct pinctrl_function msm_pinctrl_functions[] = {
> -       {"blsp1_uart", 2},
> +       {"blsp_uart2", 2},
>  };
>
>  static const char *apq8016_get_function_name(struct udevice *dev,
> diff --git a/drivers/usb/host/ehci-msm.c b/drivers/usb/host/ehci-msm.c
> index dd0d153500cb..25960453beae 100644
> --- a/drivers/usb/host/ehci-msm.c
> +++ b/drivers/usb/host/ehci-msm.c
> @@ -9,6 +9,7 @@
>
>  #include <common.h>
>  #include <dm.h>
> +#include <dm/lists.h>
>  #include <errno.h>
>  #include <usb.h>
>  #include <usb/ehci-ci.h>
> @@ -119,6 +120,26 @@ static int ehci_usb_of_to_plat(struct udevice *dev)
>         return 0;
>  }
>
> +static int ehci_usb_of_bind(struct udevice *dev)
> +{
> +       ofnode ulpi_node = ofnode_first_subnode(dev_ofnode(dev));
> +       ofnode phy_node;
> +
> +       if (!ofnode_valid(ulpi_node))
> +               return 0;
> +
> +       phy_node = ofnode_first_subnode(ulpi_node);
> +       if (!ofnode_valid(phy_node)) {
> +               printf("%s: ulpi subnode with no phy\n", __func__);
> +               return -ENOENT;
> +       }
> +
> +       return device_bind_driver_to_node(dev, "msm8916_usbphy", "msm8916_usbphy",
> +                                         phy_node, NULL);
> +
> +       return 0;
> +}
> +
>  #if defined(CONFIG_CI_UDC)
>  /* Little quirk that MSM needs with Chipidea controller
>   * Must reinit phy after reset
> @@ -132,7 +153,7 @@ void ci_init_after_reset(struct ehci_ctrl *ctrl)
>  #endif
>
>  static const struct udevice_id ehci_usb_ids[] = {
> -       { .compatible = "qcom,ehci-host", },
> +       { .compatible = "qcom,ci-hdrc", },
>         { }
>  };
>
> @@ -141,6 +162,7 @@ U_BOOT_DRIVER(usb_ehci) = {
>         .id     = UCLASS_USB,
>         .of_match = ehci_usb_ids,
>         .of_to_plat = ehci_usb_of_to_plat,
> +       .bind = ehci_usb_of_bind,
>         .probe = ehci_usb_probe,
>         .remove = ehci_usb_remove,
>         .ops    = &ehci_usb_ops,
> diff --git a/include/dt-bindings/clock/qcom,gcc-msm8916.h b/include/dt-bindings/clock/qcom,gcc-msm8916.h
> new file mode 100644
> index 000000000000..563034406184
> --- /dev/null
> +++ b/include/dt-bindings/clock/qcom,gcc-msm8916.h
> @@ -0,0 +1,179 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * Copyright 2015 Linaro Limited
> + */
> +
> +#ifndef _DT_BINDINGS_CLK_MSM_GCC_8916_H
> +#define _DT_BINDINGS_CLK_MSM_GCC_8916_H
> +
> +#define GPLL0                                  0
> +#define GPLL0_VOTE                             1
> +#define BIMC_PLL                               2
> +#define BIMC_PLL_VOTE                          3
> +#define GPLL1                                  4
> +#define GPLL1_VOTE                             5
> +#define GPLL2                                  6
> +#define GPLL2_VOTE                             7
> +#define PCNOC_BFDCD_CLK_SRC                    8
> +#define SYSTEM_NOC_BFDCD_CLK_SRC               9
> +#define CAMSS_AHB_CLK_SRC                      10
> +#define APSS_AHB_CLK_SRC                       11
> +#define CSI0_CLK_SRC                           12
> +#define CSI1_CLK_SRC                           13
> +#define GFX3D_CLK_SRC                          14
> +#define VFE0_CLK_SRC                           15
> +#define BLSP1_QUP1_I2C_APPS_CLK_SRC            16
> +#define BLSP1_QUP1_SPI_APPS_CLK_SRC            17
> +#define BLSP1_QUP2_I2C_APPS_CLK_SRC            18
> +#define BLSP1_QUP2_SPI_APPS_CLK_SRC            19
> +#define BLSP1_QUP3_I2C_APPS_CLK_SRC            20
> +#define BLSP1_QUP3_SPI_APPS_CLK_SRC            21
> +#define BLSP1_QUP4_I2C_APPS_CLK_SRC            22
> +#define BLSP1_QUP4_SPI_APPS_CLK_SRC            23
> +#define BLSP1_QUP5_I2C_APPS_CLK_SRC            24
> +#define BLSP1_QUP5_SPI_APPS_CLK_SRC            25
> +#define BLSP1_QUP6_I2C_APPS_CLK_SRC            26
> +#define BLSP1_QUP6_SPI_APPS_CLK_SRC            27
> +#define BLSP1_UART1_APPS_CLK_SRC               28
> +#define BLSP1_UART2_APPS_CLK_SRC               29
> +#define CCI_CLK_SRC                            30
> +#define CAMSS_GP0_CLK_SRC                      31
> +#define CAMSS_GP1_CLK_SRC                      32
> +#define JPEG0_CLK_SRC                          33
> +#define MCLK0_CLK_SRC                          34
> +#define MCLK1_CLK_SRC                          35
> +#define CSI0PHYTIMER_CLK_SRC                   36
> +#define CSI1PHYTIMER_CLK_SRC                   37
> +#define CPP_CLK_SRC                            38
> +#define CRYPTO_CLK_SRC                         39
> +#define GP1_CLK_SRC                            40
> +#define GP2_CLK_SRC                            41
> +#define GP3_CLK_SRC                            42
> +#define BYTE0_CLK_SRC                          43
> +#define ESC0_CLK_SRC                           44
> +#define MDP_CLK_SRC                            45
> +#define PCLK0_CLK_SRC                          46
> +#define VSYNC_CLK_SRC                          47
> +#define PDM2_CLK_SRC                           48
> +#define SDCC1_APPS_CLK_SRC                     49
> +#define SDCC2_APPS_CLK_SRC                     50
> +#define APSS_TCU_CLK_SRC                       51
> +#define USB_HS_SYSTEM_CLK_SRC                  52
> +#define VCODEC0_CLK_SRC                                53
> +#define GCC_BLSP1_AHB_CLK                      54
> +#define GCC_BLSP1_SLEEP_CLK                    55
> +#define GCC_BLSP1_QUP1_I2C_APPS_CLK            56
> +#define GCC_BLSP1_QUP1_SPI_APPS_CLK            57
> +#define GCC_BLSP1_QUP2_I2C_APPS_CLK            58
> +#define GCC_BLSP1_QUP2_SPI_APPS_CLK            59
> +#define GCC_BLSP1_QUP3_I2C_APPS_CLK            60
> +#define GCC_BLSP1_QUP3_SPI_APPS_CLK            61
> +#define GCC_BLSP1_QUP4_I2C_APPS_CLK            62
> +#define GCC_BLSP1_QUP4_SPI_APPS_CLK            63
> +#define GCC_BLSP1_QUP5_I2C_APPS_CLK            64
> +#define GCC_BLSP1_QUP5_SPI_APPS_CLK            65
> +#define GCC_BLSP1_QUP6_I2C_APPS_CLK            66
> +#define GCC_BLSP1_QUP6_SPI_APPS_CLK            67
> +#define GCC_BLSP1_UART1_APPS_CLK               68
> +#define GCC_BLSP1_UART2_APPS_CLK               69
> +#define GCC_BOOT_ROM_AHB_CLK                   70
> +#define GCC_CAMSS_CCI_AHB_CLK                  71
> +#define GCC_CAMSS_CCI_CLK                      72
> +#define GCC_CAMSS_CSI0_AHB_CLK                 73
> +#define GCC_CAMSS_CSI0_CLK                     74
> +#define GCC_CAMSS_CSI0PHY_CLK                  75
> +#define GCC_CAMSS_CSI0PIX_CLK                  76
> +#define GCC_CAMSS_CSI0RDI_CLK                  77
> +#define GCC_CAMSS_CSI1_AHB_CLK                 78
> +#define GCC_CAMSS_CSI1_CLK                     79
> +#define GCC_CAMSS_CSI1PHY_CLK                  80
> +#define GCC_CAMSS_CSI1PIX_CLK                  81
> +#define GCC_CAMSS_CSI1RDI_CLK                  82
> +#define GCC_CAMSS_CSI_VFE0_CLK                 83
> +#define GCC_CAMSS_GP0_CLK                      84
> +#define GCC_CAMSS_GP1_CLK                      85
> +#define GCC_CAMSS_ISPIF_AHB_CLK                        86
> +#define GCC_CAMSS_JPEG0_CLK                    87
> +#define GCC_CAMSS_JPEG_AHB_CLK                 88
> +#define GCC_CAMSS_JPEG_AXI_CLK                 89
> +#define GCC_CAMSS_MCLK0_CLK                    90
> +#define GCC_CAMSS_MCLK1_CLK                    91
> +#define GCC_CAMSS_MICRO_AHB_CLK                        92
> +#define GCC_CAMSS_CSI0PHYTIMER_CLK             93
> +#define GCC_CAMSS_CSI1PHYTIMER_CLK             94
> +#define GCC_CAMSS_AHB_CLK                      95
> +#define GCC_CAMSS_TOP_AHB_CLK                  96
> +#define GCC_CAMSS_CPP_AHB_CLK                  97
> +#define GCC_CAMSS_CPP_CLK                      98
> +#define GCC_CAMSS_VFE0_CLK                     99
> +#define GCC_CAMSS_VFE_AHB_CLK                  100
> +#define GCC_CAMSS_VFE_AXI_CLK                  101
> +#define GCC_CRYPTO_AHB_CLK                     102
> +#define GCC_CRYPTO_AXI_CLK                     103
> +#define GCC_CRYPTO_CLK                         104
> +#define GCC_OXILI_GMEM_CLK                     105
> +#define GCC_GP1_CLK                            106
> +#define GCC_GP2_CLK                            107
> +#define GCC_GP3_CLK                            108
> +#define GCC_MDSS_AHB_CLK                       109
> +#define GCC_MDSS_AXI_CLK                       110
> +#define GCC_MDSS_BYTE0_CLK                     111
> +#define GCC_MDSS_ESC0_CLK                      112
> +#define GCC_MDSS_MDP_CLK                       113
> +#define GCC_MDSS_PCLK0_CLK                     114
> +#define GCC_MDSS_VSYNC_CLK                     115
> +#define GCC_MSS_CFG_AHB_CLK                    116
> +#define GCC_OXILI_AHB_CLK                      117
> +#define GCC_OXILI_GFX3D_CLK                    118
> +#define GCC_PDM2_CLK                           119
> +#define GCC_PDM_AHB_CLK                                120
> +#define GCC_PRNG_AHB_CLK                       121
> +#define GCC_SDCC1_AHB_CLK                      122
> +#define GCC_SDCC1_APPS_CLK                     123
> +#define GCC_SDCC2_AHB_CLK                      124
> +#define GCC_SDCC2_APPS_CLK                     125
> +#define GCC_GTCU_AHB_CLK                       126
> +#define GCC_JPEG_TBU_CLK                       127
> +#define GCC_MDP_TBU_CLK                                128
> +#define GCC_SMMU_CFG_CLK                       129
> +#define GCC_VENUS_TBU_CLK                      130
> +#define GCC_VFE_TBU_CLK                                131
> +#define GCC_USB2A_PHY_SLEEP_CLK                        132
> +#define GCC_USB_HS_AHB_CLK                     133
> +#define GCC_USB_HS_SYSTEM_CLK                  134
> +#define GCC_VENUS0_AHB_CLK                     135
> +#define GCC_VENUS0_AXI_CLK                     136
> +#define GCC_VENUS0_VCODEC0_CLK                 137
> +#define BIMC_DDR_CLK_SRC                       138
> +#define GCC_APSS_TCU_CLK                       139
> +#define GCC_GFX_TCU_CLK                                140
> +#define BIMC_GPU_CLK_SRC                       141
> +#define GCC_BIMC_GFX_CLK                       142
> +#define GCC_BIMC_GPU_CLK                       143
> +#define ULTAUDIO_LPAIF_PRI_I2S_CLK_SRC         144
> +#define ULTAUDIO_LPAIF_SEC_I2S_CLK_SRC         145
> +#define ULTAUDIO_LPAIF_AUX_I2S_CLK_SRC         146
> +#define ULTAUDIO_XO_CLK_SRC                    147
> +#define ULTAUDIO_AHBFABRIC_CLK_SRC             148
> +#define CODEC_DIGCODEC_CLK_SRC                 149
> +#define GCC_ULTAUDIO_PCNOC_MPORT_CLK           150
> +#define GCC_ULTAUDIO_PCNOC_SWAY_CLK            151
> +#define GCC_ULTAUDIO_AVSYNC_XO_CLK             152
> +#define GCC_ULTAUDIO_STC_XO_CLK                        153
> +#define GCC_ULTAUDIO_AHBFABRIC_IXFABRIC_CLK    154
> +#define GCC_ULTAUDIO_AHBFABRIC_IXFABRIC_LPM_CLK        155
> +#define GCC_ULTAUDIO_LPAIF_PRI_I2S_CLK         156
> +#define GCC_ULTAUDIO_LPAIF_SEC_I2S_CLK         157
> +#define GCC_ULTAUDIO_LPAIF_AUX_I2S_CLK         158
> +#define GCC_CODEC_DIGCODEC_CLK                 159
> +#define GCC_MSS_Q6_BIMC_AXI_CLK                        160
> +
> +/* Indexes for GDSCs */
> +#define BIMC_GDSC                              0
> +#define VENUS_GDSC                             1
> +#define MDSS_GDSC                              2
> +#define JPEG_GDSC                              3
> +#define VFE_GDSC                               4
> +#define OXILI_GDSC                             5
> +
> +#endif
>
> --
> 2.42.1
>
Caleb Connolly Dec. 22, 2023, 4:13 p.m. UTC | #3
Hi Sumit,

[...]
>> -       if (init == USB_INIT_HOST) {
>> -               /* Start USB Hub */
>> -               dm_gpio_set_dir_flags(&hub_reset,
>> -                                     GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
>> -               mdelay(100);
>> -               /* Switch usb to host connectors */
>> -               dm_gpio_set_dir_flags(&usb_sel,
>> -                                     GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
>> -               mdelay(100);
>> -       } else { /* Device */
>> -               /* Disable hub */
>> -               dm_gpio_set_dir_flags(&hub_reset, GPIOD_IS_OUT);
>> -               /* Switch back to device connector */
>> -               dm_gpio_set_dir_flags(&usb_sel, GPIOD_IS_OUT);
>> +       /* Select "default" or "device" pinctrl */
>> +       switch (init) {
>> +       case USB_INIT_HOST:
>> +               pinctrl_select_state(usb, "default");
>> +               break;
>> +       case USB_INIT_DEVICE:
>> +               pinctrl_select_state(usb, "device");
>> +               break;
>> +       default:
>> +               debug("Unknown usb_init_type %d\n", init);
>> +               break;
> 
> Can this pinctrl configuration move to the corresponding USB driver instead?

Possibly, this is definitely something where DT is currently lacking,
similar discussions in Linux resulted in the USB onboard_hub driver, it
would be nice to add support for that U-Boot at some point.

I don't think putting the pinctrl code directly into the USB driver is
the right way to go, as it definitely wouldn't be accepted in upstream
DT bindings.
> 
> -Sumit
>
Sumit Garg Dec. 26, 2023, 9:30 a.m. UTC | #4
On Fri, 22 Dec 2023 at 21:43, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>
> Hi Sumit,
>
> [...]
> >> -       if (init == USB_INIT_HOST) {
> >> -               /* Start USB Hub */
> >> -               dm_gpio_set_dir_flags(&hub_reset,
> >> -                                     GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
> >> -               mdelay(100);
> >> -               /* Switch usb to host connectors */
> >> -               dm_gpio_set_dir_flags(&usb_sel,
> >> -                                     GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
> >> -               mdelay(100);
> >> -       } else { /* Device */
> >> -               /* Disable hub */
> >> -               dm_gpio_set_dir_flags(&hub_reset, GPIOD_IS_OUT);
> >> -               /* Switch back to device connector */
> >> -               dm_gpio_set_dir_flags(&usb_sel, GPIOD_IS_OUT);
> >> +       /* Select "default" or "device" pinctrl */
> >> +       switch (init) {
> >> +       case USB_INIT_HOST:
> >> +               pinctrl_select_state(usb, "default");
> >> +               break;
> >> +       case USB_INIT_DEVICE:
> >> +               pinctrl_select_state(usb, "device");
> >> +               break;
> >> +       default:
> >> +               debug("Unknown usb_init_type %d\n", init);
> >> +               break;
> >
> > Can this pinctrl configuration move to the corresponding USB driver instead?
>
> Possibly, this is definitely something where DT is currently lacking,
> similar discussions in Linux resulted in the USB onboard_hub driver, it
> would be nice to add support for that U-Boot at some point.
>
> I don't think putting the pinctrl code directly into the USB driver is
> the right way to go, as it definitely wouldn't be accepted in upstream
> DT bindings.

As discussed in the other thread,
arch/arm/mach-snapdragon/board_apq8016.c would be a better place for
the time being.

-Sumit

> >
> > -Sumit
> >
> --
> // Caleb (they/them)
Caleb Connolly Jan. 2, 2024, 9:13 a.m. UTC | #5
On 26/12/2023 10:30, Sumit Garg wrote:
> On Fri, 22 Dec 2023 at 21:43, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>>
>> Hi Sumit,
>>
>> [...]
>>>> -       if (init == USB_INIT_HOST) {
>>>> -               /* Start USB Hub */
>>>> -               dm_gpio_set_dir_flags(&hub_reset,
>>>> -                                     GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
>>>> -               mdelay(100);
>>>> -               /* Switch usb to host connectors */
>>>> -               dm_gpio_set_dir_flags(&usb_sel,
>>>> -                                     GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
>>>> -               mdelay(100);
>>>> -       } else { /* Device */
>>>> -               /* Disable hub */
>>>> -               dm_gpio_set_dir_flags(&hub_reset, GPIOD_IS_OUT);
>>>> -               /* Switch back to device connector */
>>>> -               dm_gpio_set_dir_flags(&usb_sel, GPIOD_IS_OUT);
>>>> +       /* Select "default" or "device" pinctrl */
>>>> +       switch (init) {
>>>> +       case USB_INIT_HOST:
>>>> +               pinctrl_select_state(usb, "default");
>>>> +               break;
>>>> +       case USB_INIT_DEVICE:
>>>> +               pinctrl_select_state(usb, "device");
>>>> +               break;
>>>> +       default:
>>>> +               debug("Unknown usb_init_type %d\n", init);
>>>> +               break;
>>>
>>> Can this pinctrl configuration move to the corresponding USB driver instead?
>>
>> Possibly, this is definitely something where DT is currently lacking,
>> similar discussions in Linux resulted in the USB onboard_hub driver, it
>> would be nice to add support for that U-Boot at some point.
>>
>> I don't think putting the pinctrl code directly into the USB driver is
>> the right way to go, as it definitely wouldn't be accepted in upstream
>> DT bindings.
> 
> As discussed in the other thread,
> arch/arm/mach-snapdragon/board_apq8016.c would be a better place for
> the time being.

I would instead prefer this go in mach-snapdragon/board.c and include a 
conditional to check for a named pinctrl on the USB device, using 
"uclass_find_device_by_seq()" to fetch the device would then make this 
properly generic.

This is really not relevant to this patch series, but is a change that 
makes sense when introducing support for new boards, let's limit 
discussion to the other thread [1].

[1]: 
https://lore.kernel.org/u-boot/f805111d-106e-4904-ae9d-e63596f7db4e@linaro.org/
> 
> -Sumit
> 
>>>
>>> -Sumit
>>>
>> --
>> // Caleb (they/them)
Sumit Garg Jan. 2, 2024, 11:54 a.m. UTC | #6
On Tue, 2 Jan 2024 at 14:43, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>
>
>
> On 26/12/2023 10:30, Sumit Garg wrote:
> > On Fri, 22 Dec 2023 at 21:43, Caleb Connolly <caleb.connolly@linaro.org> wrote:
> >>
> >> Hi Sumit,
> >>
> >> [...]
> >>>> -       if (init == USB_INIT_HOST) {
> >>>> -               /* Start USB Hub */
> >>>> -               dm_gpio_set_dir_flags(&hub_reset,
> >>>> -                                     GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
> >>>> -               mdelay(100);
> >>>> -               /* Switch usb to host connectors */
> >>>> -               dm_gpio_set_dir_flags(&usb_sel,
> >>>> -                                     GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
> >>>> -               mdelay(100);
> >>>> -       } else { /* Device */
> >>>> -               /* Disable hub */
> >>>> -               dm_gpio_set_dir_flags(&hub_reset, GPIOD_IS_OUT);
> >>>> -               /* Switch back to device connector */
> >>>> -               dm_gpio_set_dir_flags(&usb_sel, GPIOD_IS_OUT);
> >>>> +       /* Select "default" or "device" pinctrl */
> >>>> +       switch (init) {
> >>>> +       case USB_INIT_HOST:
> >>>> +               pinctrl_select_state(usb, "default");
> >>>> +               break;
> >>>> +       case USB_INIT_DEVICE:
> >>>> +               pinctrl_select_state(usb, "device");
> >>>> +               break;
> >>>> +       default:
> >>>> +               debug("Unknown usb_init_type %d\n", init);
> >>>> +               break;
> >>>
> >>> Can this pinctrl configuration move to the corresponding USB driver instead?
> >>
> >> Possibly, this is definitely something where DT is currently lacking,
> >> similar discussions in Linux resulted in the USB onboard_hub driver, it
> >> would be nice to add support for that U-Boot at some point.
> >>
> >> I don't think putting the pinctrl code directly into the USB driver is
> >> the right way to go, as it definitely wouldn't be accepted in upstream
> >> DT bindings.
> >
> > As discussed in the other thread,
> > arch/arm/mach-snapdragon/board_apq8016.c would be a better place for
> > the time being.
>
> I would instead prefer this go in mach-snapdragon/board.c and include a
> conditional to check for a named pinctrl on the USB device, using
> "uclass_find_device_by_seq()" to fetch the device would then make this
> properly generic.

Yes, that can be a further step and I don't expect that to be part of
this series. But since this patch is moving stuff, we should move SoC
specific bits to mach-snapdragon/board_apq8016.c rather than its
opposite to the db410c specific file.

>
> This is really not relevant to this patch series, but is a change that
> makes sense when introducing support for new boards, let's limit
> discussion to the other thread [1].

But why? The USB stuff we are discussing here is relevant to existing
board support, right?

-Sumit

>
> [1]:
> https://lore.kernel.org/u-boot/f805111d-106e-4904-ae9d-e63596f7db4e@linaro.org/
> >
> > -Sumit
> >
> >>>
> >>> -Sumit
> >>>
> >> --
> >> // Caleb (they/them)
>
> --
> // Caleb (they/them)
Caleb Connolly Jan. 2, 2024, 12:21 p.m. UTC | #7
On 02/01/2024 12:54, Sumit Garg wrote:
> On Tue, 2 Jan 2024 at 14:43, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>>
>>
>>
>> On 26/12/2023 10:30, Sumit Garg wrote:
>>> On Fri, 22 Dec 2023 at 21:43, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>>>>
>>>> Hi Sumit,
>>>>
>>>> [...]
>>>>>> -       if (init == USB_INIT_HOST) {
>>>>>> -               /* Start USB Hub */
>>>>>> -               dm_gpio_set_dir_flags(&hub_reset,
>>>>>> -                                     GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
>>>>>> -               mdelay(100);
>>>>>> -               /* Switch usb to host connectors */
>>>>>> -               dm_gpio_set_dir_flags(&usb_sel,
>>>>>> -                                     GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
>>>>>> -               mdelay(100);
>>>>>> -       } else { /* Device */
>>>>>> -               /* Disable hub */
>>>>>> -               dm_gpio_set_dir_flags(&hub_reset, GPIOD_IS_OUT);
>>>>>> -               /* Switch back to device connector */
>>>>>> -               dm_gpio_set_dir_flags(&usb_sel, GPIOD_IS_OUT);
>>>>>> +       /* Select "default" or "device" pinctrl */
>>>>>> +       switch (init) {
>>>>>> +       case USB_INIT_HOST:
>>>>>> +               pinctrl_select_state(usb, "default");
>>>>>> +               break;
>>>>>> +       case USB_INIT_DEVICE:
>>>>>> +               pinctrl_select_state(usb, "device");
>>>>>> +               break;
>>>>>> +       default:
>>>>>> +               debug("Unknown usb_init_type %d\n", init);
>>>>>> +               break;
>>>>>
>>>>> Can this pinctrl configuration move to the corresponding USB driver instead?
>>>>
>>>> Possibly, this is definitely something where DT is currently lacking,
>>>> similar discussions in Linux resulted in the USB onboard_hub driver, it
>>>> would be nice to add support for that U-Boot at some point.
>>>>
>>>> I don't think putting the pinctrl code directly into the USB driver is
>>>> the right way to go, as it definitely wouldn't be accepted in upstream
>>>> DT bindings.
>>>
>>> As discussed in the other thread,
>>> arch/arm/mach-snapdragon/board_apq8016.c would be a better place for
>>> the time being.
>>
>> I would instead prefer this go in mach-snapdragon/board.c and include a
>> conditional to check for a named pinctrl on the USB device, using
>> "uclass_find_device_by_seq()" to fetch the device would then make this
>> properly generic.
> 
> Yes, that can be a further step and I don't expect that to be part of
> this series. But since this patch is moving stuff, we should move SoC
> specific bits to mach-snapdragon/board_apq8016.c rather than its
> opposite to the db410c specific file.

The reason I moved this board code to the board directory is because 
with this series I'm enforcing that all mach-snapdragon code be generic 
and built for all Qualcomm platforms. I also did it because while I 
don't want to break support for db410c, I don't plan to fix it, so this 
works as a temporary solution until someone who does care about the 
board (like you) wants to fix it up.
> 
>>
>> This is really not relevant to this patch series, but is a change that
>> makes sense when introducing support for new boards, let's limit
>> discussion to the other thread [1].
> 
> But why? The USB stuff we are discussing here is relevant to existing
> board support, right?

Right, and the existing board is supported with this series. You're 
suggesting that I spend significantly more time on this series to make 
supporting your board (which is NOT yet upstream) easier.

My cover letter is very explicit that this series lays the groundwork 
such that all future Qualcomm boards can be supported in a fully generic 
way, with no additional board code. I have support for 3 new Qualcomm 
SoCs and ~6 devices based on this series, and none of that requires 
adding new board code because I took the time to come up with proper 
solutions by fixing drivers or DT.

I carved out exceptions for the db410c and db820c because I cannot test 
all the usecases they support, and finding proper solutions to allow for 
dropping their board code is a whole lot of work for boards that - 
unfortunately - I'm not able to prioritize.

The fact that you are working on a board based on db410c is great, it 
means that you can put the effort in to find a proper generic solution, 
and ideally we can drop board/qualcomm/dragonboard410c entirely!

I'm *more than* happy to discuss ideas and figure out the right 
solutions to the remaining board code with you. There are absolutely 
areas where U-Boot is missing flexibility, and I see this as a good 
opportunity for us to fix some of that.

It's clear from other threads that restricting the amount of mach/board 
code in U-Boot is a good way forward, and I would very much like for 
Qualcomm to lead the way here. There is no good reason why we shouldn't 
be able to have a single U-Boot binary for all of our supported boards, 
and it makes testing *so* much easier.

> 
> -Sumit
> 
>>
>> [1]:
>> https://lore.kernel.org/u-boot/f805111d-106e-4904-ae9d-e63596f7db4e@linaro.org/
>>>
>>> -Sumit
>>>
>>>>>
>>>>> -Sumit
>>>>>
>>>> --
>>>> // Caleb (they/them)
>>
>> --
>> // Caleb (they/them)
diff mbox series

Patch

diff --git a/arch/arm/dts/dragonboard410c.dts b/arch/arm/dts/dragonboard410c.dts
index c395e6cc0427..453642b25705 100644
--- a/arch/arm/dts/dragonboard410c.dts
+++ b/arch/arm/dts/dragonboard410c.dts
@@ -12,7 +12,7 @@ 
 
 / {
 	model = "Qualcomm Technologies, Inc. Dragonboard 410c";
-	compatible = "qcom,dragonboard", "qcom,apq8016-sbc";
+	compatible = "qcom,apq8016-sbc", "qcom,apq8016";
 	qcom,msm-id = <0xce 0x0 0xf8 0x0 0xf9 0x0 0xfa 0x0 0xf7 0x0>;
 	qcom,board-id = <0x10018 0x0>;
 	#address-cells = <0x2>;
@@ -79,6 +79,7 @@ 
 			reg = <0x1800000 0x80000>;
 			#address-cells = <0x1>;
 			#size-cells = <0x0>;
+			#clock-cells = <0x1>;
 		};
 
 		serial@78b0000 {
@@ -91,15 +92,25 @@ 
 		};
 
 		ehci@78d9000 {
-			compatible = "qcom,ehci-host";
+			compatible = "qcom,ci-hdrc";
 			reg = <0x78d9000 0x400>;
 			phys = <&ehci_phy>;
-		};
 
-		ehci_phy: ehci_phy@78d9000 {
-			compatible = "qcom,apq8016-usbphy";
-			reg = <0x78d9000 0x400>;
-			#phy-cells = <0>;
+			ulpi {
+				usb_hs_phy: phy {
+					compatible = "qcom,usb-hs-phy-msm8916",
+						     "qcom,usb-hs-phy";
+					#phy-cells = <0>;
+					clocks = <&xo_board>, <&gcc GCC_USB2A_PHY_SLEEP_CLK>;
+					clock-names = "ref", "sleep";
+					resets = <&gcc GCC_USB2A_PHY_BCR>, <&usb 0>;
+					reset-names = "phy", "por";
+					qcom,init-seq = /bits/ 8 <0x0 0x44>,
+								 <0x1 0x6b>,
+								 <0x2 0x24>,
+								 <0x3 0x13>;
+				};
+			};
 		};
 
 		sdhci@07824000 {
diff --git a/board/qualcomm/dragonboard410c/dragonboard410c.c b/board/qualcomm/dragonboard410c/dragonboard410c.c
index 350e0e9e20aa..1adac07569ae 100644
--- a/board/qualcomm/dragonboard410c/dragonboard410c.c
+++ b/board/qualcomm/dragonboard410c/dragonboard410c.c
@@ -9,6 +9,7 @@ 
 #include <common.h>
 #include <cpu_func.h>
 #include <dm.h>
+#include <dm/pinctrl.h>
 #include <env.h>
 #include <init.h>
 #include <net.h>
@@ -23,84 +24,32 @@ 
 
 DECLARE_GLOBAL_DATA_PTR;
 
-int dram_init(void)
-{
-	gd->ram_size = PHYS_SDRAM_1_SIZE;
-
-	return 0;
-}
-
-int dram_init_banksize(void)
-{
-	gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
-	gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
-
-	return 0;
-}
+#define USB_HUB_RESET_GPIO 2
+#define USB_SW_SELECT_GPIO 3
 
 int board_usb_init(int index, enum usb_init_type init)
 {
-	static struct udevice *pmic_gpio;
-	static struct gpio_desc hub_reset, usb_sel;
-	int ret = 0, node;
+	struct udevice *usb;
+	int ret = 0;
 
-	if (!pmic_gpio) {
-		ret = uclass_get_device_by_name(UCLASS_GPIO,
-						"pm8916_gpios@c000",
-						&pmic_gpio);
-		if (ret < 0) {
-			printf("Failed to find pm8916_gpios@c000 node.\n");
-			return ret;
-		}
+	/* USB device */
+	ret = device_find_global_by_ofnode(ofnode_path("/soc/usb"), &usb);
+	if (ret) {
+		printf("Cannot find USB device\n");
+		return ret;
 	}
 
-	/* Try to request gpios needed to start usb host on dragonboard */
-	if (!dm_gpio_is_valid(&hub_reset)) {
-		node = fdt_subnode_offset(gd->fdt_blob,
-					  dev_of_offset(pmic_gpio),
-					  "usb_hub_reset_pm");
-		if (node < 0) {
-			printf("Failed to find usb_hub_reset_pm dt node.\n");
-			return node;
-		}
-		ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
-						 "gpios", 0, &hub_reset, 0);
-		if (ret < 0) {
-			printf("Failed to request usb_hub_reset_pm gpio.\n");
-			return ret;
-		}
-	}
-
-	if (!dm_gpio_is_valid(&usb_sel)) {
-		node = fdt_subnode_offset(gd->fdt_blob,
-					  dev_of_offset(pmic_gpio),
-					  "usb_sw_sel_pm");
-		if (node < 0) {
-			printf("Failed to find usb_sw_sel_pm dt node.\n");
-			return 0;
-		}
-		ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
-						 "gpios", 0, &usb_sel, 0);
-		if (ret < 0) {
-			printf("Failed to request usb_sw_sel_pm gpio.\n");
-			return ret;
-		}
-	}
-
-	if (init == USB_INIT_HOST) {
-		/* Start USB Hub */
-		dm_gpio_set_dir_flags(&hub_reset,
-				      GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
-		mdelay(100);
-		/* Switch usb to host connectors */
-		dm_gpio_set_dir_flags(&usb_sel,
-				      GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
-		mdelay(100);
-	} else { /* Device */
-		/* Disable hub */
-		dm_gpio_set_dir_flags(&hub_reset, GPIOD_IS_OUT);
-		/* Switch back to device connector */
-		dm_gpio_set_dir_flags(&usb_sel, GPIOD_IS_OUT);
+	/* Select "default" or "device" pinctrl */
+	switch (init) {
+	case USB_INIT_HOST:
+		pinctrl_select_state(usb, "default");
+		break;
+	case USB_INIT_DEVICE:
+		pinctrl_select_state(usb, "device");
+		break;
+	default:
+		debug("Unknown usb_init_type %d\n", init);
+		break;
 	}
 
 	return 0;
diff --git a/doc/device-tree-bindings/usb/ehci-msm.txt b/doc/device-tree-bindings/usb/ehci-msm.txt
deleted file mode 100644
index 205bb07220fb..000000000000
--- a/doc/device-tree-bindings/usb/ehci-msm.txt
+++ /dev/null
@@ -1,10 +0,0 @@ 
-Chipidea EHCI controller (part of OTG controller) used on Qualcomm devices.
-
-Required properties:
-- compatible: must be "qcom,ehci-host"
-- reg: start address and size of the registers
-
-ehci@78d9000 {
-	compatible = "qcom,ehci-host";
-	reg = <0x78d9000 0x400>;
-};
diff --git a/drivers/clk/qcom/clock-apq8016.c b/drivers/clk/qcom/clock-apq8016.c
index 0af7191cff52..9de0ad5ed32d 100644
--- a/drivers/clk/qcom/clock-apq8016.c
+++ b/drivers/clk/qcom/clock-apq8016.c
@@ -13,6 +13,7 @@ 
 #include <errno.h>
 #include <asm/io.h>
 #include <linux/bitops.h>
+#include <dt-bindings/clock/qcom,gcc-msm8916.h>
 
 #include "clock-qcom.h"
 
@@ -125,13 +126,13 @@  static ulong apq8016_clk_set_rate(struct clk *clk, ulong rate)
 	struct msm_clk_priv *priv = dev_get_priv(clk->dev);
 
 	switch (clk->id) {
-	case 0: /* SDC1 */
+	case GCC_SDCC1_APPS_CLK: /* SDC1 */
 		return clk_init_sdc(priv, 0, rate);
 		break;
-	case 1: /* SDC2 */
+	case GCC_SDCC2_APPS_CLK: /* SDC2 */
 		return clk_init_sdc(priv, 1, rate);
 		break;
-	case 4: /* UART2 */
+	case GCC_BLSP1_UART2_APPS_CLK: /* UART2 */
 		return clk_init_uart(priv);
 		break;
 	default:
diff --git a/drivers/phy/qcom/msm8916-usbh-phy.c b/drivers/phy/qcom/msm8916-usbh-phy.c
index 7c9d030a4d8a..f52046f7cb02 100644
--- a/drivers/phy/qcom/msm8916-usbh-phy.c
+++ b/drivers/phy/qcom/msm8916-usbh-phy.c
@@ -74,7 +74,7 @@  static int msm_phy_probe(struct udevice *dev)
 {
 	struct msm_phy_priv *priv = dev_get_priv(dev);
 
-	priv->regs = dev_remap_addr(dev);
+	priv->regs = dev_remap_addr(dev_get_parent(dev));
 	if (!priv->regs)
 		return -EINVAL;
 
@@ -96,7 +96,7 @@  static struct phy_ops msm_phy_ops = {
 };
 
 static const struct udevice_id msm_phy_ids[] = {
-	{ .compatible = "qcom,apq8016-usbphy" },
+	{ .compatible = "qcom,usb-hs-phy-msm8916" },
 	{ }
 };
 
diff --git a/drivers/pinctrl/qcom/pinctrl-apq8016.c b/drivers/pinctrl/qcom/pinctrl-apq8016.c
index 8149ffd83cc4..8e698085d78b 100644
--- a/drivers/pinctrl/qcom/pinctrl-apq8016.c
+++ b/drivers/pinctrl/qcom/pinctrl-apq8016.c
@@ -29,7 +29,7 @@  static const char * const msm_pinctrl_pins[] = {
 };
 
 static const struct pinctrl_function msm_pinctrl_functions[] = {
-	{"blsp1_uart", 2},
+	{"blsp_uart2", 2},
 };
 
 static const char *apq8016_get_function_name(struct udevice *dev,
diff --git a/drivers/usb/host/ehci-msm.c b/drivers/usb/host/ehci-msm.c
index dd0d153500cb..25960453beae 100644
--- a/drivers/usb/host/ehci-msm.c
+++ b/drivers/usb/host/ehci-msm.c
@@ -9,6 +9,7 @@ 
 
 #include <common.h>
 #include <dm.h>
+#include <dm/lists.h>
 #include <errno.h>
 #include <usb.h>
 #include <usb/ehci-ci.h>
@@ -119,6 +120,26 @@  static int ehci_usb_of_to_plat(struct udevice *dev)
 	return 0;
 }
 
+static int ehci_usb_of_bind(struct udevice *dev)
+{
+	ofnode ulpi_node = ofnode_first_subnode(dev_ofnode(dev));
+	ofnode phy_node;
+
+	if (!ofnode_valid(ulpi_node))
+		return 0;
+
+	phy_node = ofnode_first_subnode(ulpi_node);
+	if (!ofnode_valid(phy_node)) {
+		printf("%s: ulpi subnode with no phy\n", __func__);
+		return -ENOENT;
+	}
+
+	return device_bind_driver_to_node(dev, "msm8916_usbphy", "msm8916_usbphy",
+					  phy_node, NULL);
+
+	return 0;
+}
+
 #if defined(CONFIG_CI_UDC)
 /* Little quirk that MSM needs with Chipidea controller
  * Must reinit phy after reset
@@ -132,7 +153,7 @@  void ci_init_after_reset(struct ehci_ctrl *ctrl)
 #endif
 
 static const struct udevice_id ehci_usb_ids[] = {
-	{ .compatible = "qcom,ehci-host", },
+	{ .compatible = "qcom,ci-hdrc", },
 	{ }
 };
 
@@ -141,6 +162,7 @@  U_BOOT_DRIVER(usb_ehci) = {
 	.id	= UCLASS_USB,
 	.of_match = ehci_usb_ids,
 	.of_to_plat = ehci_usb_of_to_plat,
+	.bind = ehci_usb_of_bind,
 	.probe = ehci_usb_probe,
 	.remove = ehci_usb_remove,
 	.ops	= &ehci_usb_ops,
diff --git a/include/dt-bindings/clock/qcom,gcc-msm8916.h b/include/dt-bindings/clock/qcom,gcc-msm8916.h
new file mode 100644
index 000000000000..563034406184
--- /dev/null
+++ b/include/dt-bindings/clock/qcom,gcc-msm8916.h
@@ -0,0 +1,179 @@ 
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright 2015 Linaro Limited
+ */
+
+#ifndef _DT_BINDINGS_CLK_MSM_GCC_8916_H
+#define _DT_BINDINGS_CLK_MSM_GCC_8916_H
+
+#define GPLL0					0
+#define GPLL0_VOTE				1
+#define BIMC_PLL				2
+#define BIMC_PLL_VOTE				3
+#define GPLL1					4
+#define GPLL1_VOTE				5
+#define GPLL2					6
+#define GPLL2_VOTE				7
+#define PCNOC_BFDCD_CLK_SRC			8
+#define SYSTEM_NOC_BFDCD_CLK_SRC		9
+#define CAMSS_AHB_CLK_SRC			10
+#define APSS_AHB_CLK_SRC			11
+#define CSI0_CLK_SRC				12
+#define CSI1_CLK_SRC				13
+#define GFX3D_CLK_SRC				14
+#define VFE0_CLK_SRC				15
+#define BLSP1_QUP1_I2C_APPS_CLK_SRC		16
+#define BLSP1_QUP1_SPI_APPS_CLK_SRC		17
+#define BLSP1_QUP2_I2C_APPS_CLK_SRC		18
+#define BLSP1_QUP2_SPI_APPS_CLK_SRC		19
+#define BLSP1_QUP3_I2C_APPS_CLK_SRC		20
+#define BLSP1_QUP3_SPI_APPS_CLK_SRC		21
+#define BLSP1_QUP4_I2C_APPS_CLK_SRC		22
+#define BLSP1_QUP4_SPI_APPS_CLK_SRC		23
+#define BLSP1_QUP5_I2C_APPS_CLK_SRC		24
+#define BLSP1_QUP5_SPI_APPS_CLK_SRC		25
+#define BLSP1_QUP6_I2C_APPS_CLK_SRC		26
+#define BLSP1_QUP6_SPI_APPS_CLK_SRC		27
+#define BLSP1_UART1_APPS_CLK_SRC		28
+#define BLSP1_UART2_APPS_CLK_SRC		29
+#define CCI_CLK_SRC				30
+#define CAMSS_GP0_CLK_SRC			31
+#define CAMSS_GP1_CLK_SRC			32
+#define JPEG0_CLK_SRC				33
+#define MCLK0_CLK_SRC				34
+#define MCLK1_CLK_SRC				35
+#define CSI0PHYTIMER_CLK_SRC			36
+#define CSI1PHYTIMER_CLK_SRC			37
+#define CPP_CLK_SRC				38
+#define CRYPTO_CLK_SRC				39
+#define GP1_CLK_SRC				40
+#define GP2_CLK_SRC				41
+#define GP3_CLK_SRC				42
+#define BYTE0_CLK_SRC				43
+#define ESC0_CLK_SRC				44
+#define MDP_CLK_SRC				45
+#define PCLK0_CLK_SRC				46
+#define VSYNC_CLK_SRC				47
+#define PDM2_CLK_SRC				48
+#define SDCC1_APPS_CLK_SRC			49
+#define SDCC2_APPS_CLK_SRC			50
+#define APSS_TCU_CLK_SRC			51
+#define USB_HS_SYSTEM_CLK_SRC			52
+#define VCODEC0_CLK_SRC				53
+#define GCC_BLSP1_AHB_CLK			54
+#define GCC_BLSP1_SLEEP_CLK			55
+#define GCC_BLSP1_QUP1_I2C_APPS_CLK		56
+#define GCC_BLSP1_QUP1_SPI_APPS_CLK		57
+#define GCC_BLSP1_QUP2_I2C_APPS_CLK		58
+#define GCC_BLSP1_QUP2_SPI_APPS_CLK		59
+#define GCC_BLSP1_QUP3_I2C_APPS_CLK		60
+#define GCC_BLSP1_QUP3_SPI_APPS_CLK		61
+#define GCC_BLSP1_QUP4_I2C_APPS_CLK		62
+#define GCC_BLSP1_QUP4_SPI_APPS_CLK		63
+#define GCC_BLSP1_QUP5_I2C_APPS_CLK		64
+#define GCC_BLSP1_QUP5_SPI_APPS_CLK		65
+#define GCC_BLSP1_QUP6_I2C_APPS_CLK		66
+#define GCC_BLSP1_QUP6_SPI_APPS_CLK		67
+#define GCC_BLSP1_UART1_APPS_CLK		68
+#define GCC_BLSP1_UART2_APPS_CLK		69
+#define GCC_BOOT_ROM_AHB_CLK			70
+#define GCC_CAMSS_CCI_AHB_CLK			71
+#define GCC_CAMSS_CCI_CLK			72
+#define GCC_CAMSS_CSI0_AHB_CLK			73
+#define GCC_CAMSS_CSI0_CLK			74
+#define GCC_CAMSS_CSI0PHY_CLK			75
+#define GCC_CAMSS_CSI0PIX_CLK			76
+#define GCC_CAMSS_CSI0RDI_CLK			77
+#define GCC_CAMSS_CSI1_AHB_CLK			78
+#define GCC_CAMSS_CSI1_CLK			79
+#define GCC_CAMSS_CSI1PHY_CLK			80
+#define GCC_CAMSS_CSI1PIX_CLK			81
+#define GCC_CAMSS_CSI1RDI_CLK			82
+#define GCC_CAMSS_CSI_VFE0_CLK			83
+#define GCC_CAMSS_GP0_CLK			84
+#define GCC_CAMSS_GP1_CLK			85
+#define GCC_CAMSS_ISPIF_AHB_CLK			86
+#define GCC_CAMSS_JPEG0_CLK			87
+#define GCC_CAMSS_JPEG_AHB_CLK			88
+#define GCC_CAMSS_JPEG_AXI_CLK			89
+#define GCC_CAMSS_MCLK0_CLK			90
+#define GCC_CAMSS_MCLK1_CLK			91
+#define GCC_CAMSS_MICRO_AHB_CLK			92
+#define GCC_CAMSS_CSI0PHYTIMER_CLK		93
+#define GCC_CAMSS_CSI1PHYTIMER_CLK		94
+#define GCC_CAMSS_AHB_CLK			95
+#define GCC_CAMSS_TOP_AHB_CLK			96
+#define GCC_CAMSS_CPP_AHB_CLK			97
+#define GCC_CAMSS_CPP_CLK			98
+#define GCC_CAMSS_VFE0_CLK			99
+#define GCC_CAMSS_VFE_AHB_CLK			100
+#define GCC_CAMSS_VFE_AXI_CLK			101
+#define GCC_CRYPTO_AHB_CLK			102
+#define GCC_CRYPTO_AXI_CLK			103
+#define GCC_CRYPTO_CLK				104
+#define GCC_OXILI_GMEM_CLK			105
+#define GCC_GP1_CLK				106
+#define GCC_GP2_CLK				107
+#define GCC_GP3_CLK				108
+#define GCC_MDSS_AHB_CLK			109
+#define GCC_MDSS_AXI_CLK			110
+#define GCC_MDSS_BYTE0_CLK			111
+#define GCC_MDSS_ESC0_CLK			112
+#define GCC_MDSS_MDP_CLK			113
+#define GCC_MDSS_PCLK0_CLK			114
+#define GCC_MDSS_VSYNC_CLK			115
+#define GCC_MSS_CFG_AHB_CLK			116
+#define GCC_OXILI_AHB_CLK			117
+#define GCC_OXILI_GFX3D_CLK			118
+#define GCC_PDM2_CLK				119
+#define GCC_PDM_AHB_CLK				120
+#define GCC_PRNG_AHB_CLK			121
+#define GCC_SDCC1_AHB_CLK			122
+#define GCC_SDCC1_APPS_CLK			123
+#define GCC_SDCC2_AHB_CLK			124
+#define GCC_SDCC2_APPS_CLK			125
+#define GCC_GTCU_AHB_CLK			126
+#define GCC_JPEG_TBU_CLK			127
+#define GCC_MDP_TBU_CLK				128
+#define GCC_SMMU_CFG_CLK			129
+#define GCC_VENUS_TBU_CLK			130
+#define GCC_VFE_TBU_CLK				131
+#define GCC_USB2A_PHY_SLEEP_CLK			132
+#define GCC_USB_HS_AHB_CLK			133
+#define GCC_USB_HS_SYSTEM_CLK			134
+#define GCC_VENUS0_AHB_CLK			135
+#define GCC_VENUS0_AXI_CLK			136
+#define GCC_VENUS0_VCODEC0_CLK			137
+#define BIMC_DDR_CLK_SRC			138
+#define GCC_APSS_TCU_CLK			139
+#define GCC_GFX_TCU_CLK				140
+#define BIMC_GPU_CLK_SRC			141
+#define GCC_BIMC_GFX_CLK			142
+#define GCC_BIMC_GPU_CLK			143
+#define ULTAUDIO_LPAIF_PRI_I2S_CLK_SRC		144
+#define ULTAUDIO_LPAIF_SEC_I2S_CLK_SRC		145
+#define ULTAUDIO_LPAIF_AUX_I2S_CLK_SRC		146
+#define ULTAUDIO_XO_CLK_SRC			147
+#define ULTAUDIO_AHBFABRIC_CLK_SRC		148
+#define CODEC_DIGCODEC_CLK_SRC			149
+#define GCC_ULTAUDIO_PCNOC_MPORT_CLK		150
+#define GCC_ULTAUDIO_PCNOC_SWAY_CLK		151
+#define GCC_ULTAUDIO_AVSYNC_XO_CLK		152
+#define GCC_ULTAUDIO_STC_XO_CLK			153
+#define GCC_ULTAUDIO_AHBFABRIC_IXFABRIC_CLK	154
+#define GCC_ULTAUDIO_AHBFABRIC_IXFABRIC_LPM_CLK	155
+#define GCC_ULTAUDIO_LPAIF_PRI_I2S_CLK		156
+#define GCC_ULTAUDIO_LPAIF_SEC_I2S_CLK		157
+#define GCC_ULTAUDIO_LPAIF_AUX_I2S_CLK		158
+#define GCC_CODEC_DIGCODEC_CLK			159
+#define GCC_MSS_Q6_BIMC_AXI_CLK			160
+
+/* Indexes for GDSCs */
+#define BIMC_GDSC				0
+#define VENUS_GDSC				1
+#define MDSS_GDSC				2
+#define JPEG_GDSC				3
+#define VFE_GDSC				4
+#define OXILI_GDSC				5
+
+#endif