Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e4f0612 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "USB: dwc3-msm: Add support for 24MHz utmi clock"

parents e6cad9c4 e9340749
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@ Optional properties :
  passed to secure channel manager(scm) driver. scm driver uses this device
  id to restore USB controller related security configuration after coming
  out of the controller power collapse.
- qcom,ref-clk-rate: Indicates refclk frequency (in Hz) to the core. If not
- qcom,utmi-clk-rate: Indicates refclk frequency (in Hz) to the core. If not
  specified, default of 19.2MHz is assumed.
- qcom,reset_hsphy_sleep_clk_on_init: If present, the HSUSB PHY sleep clock is
  being reset in initialization.
+30 −10
Original line number Diff line number Diff line
@@ -135,7 +135,8 @@ struct dwc3_msm {
	struct clk		*sleep_clk;
	struct clk		*hsphy_sleep_clk;
	struct clk		*utmi_clk;
	unsigned long		ref_clk_rate;
	unsigned int		utmi_clk_rate;
	struct clk		*utmi_clk_src;
	struct regulator	*dwc3_gdsc;

	struct usb_phy		*hs_phy, *ss_phy;
@@ -990,7 +991,7 @@ static void dwc3_msm_update_ref_clk(struct dwc3_msm *mdwc)
	}

	/* Refer to SNPS Databook Table 6-55 for calculations used */
	switch (mdwc->ref_clk_rate) {
	switch (mdwc->utmi_clk_rate) {
	case 19200000:
		guctl |= 52 << __ffs(DWC3_GUCTL_REFCLKPER);
		gfladj |= 12 << __ffs(DWC3_GFLADJ_REFCLK_240MHZ_DECR);
@@ -1005,8 +1006,8 @@ static void dwc3_msm_update_ref_clk(struct dwc3_msm *mdwc)
		gfladj |= 2032 << __ffs(DWC3_GFLADJ_REFCLK_FLADJ);
		break;
	default:
		dev_warn(mdwc->dev, "Unsupported ref_clk_rate: %lu\n",
				mdwc->ref_clk_rate);
		dev_warn(mdwc->dev, "Unsupported utmi_clk_rate: %u\n",
				mdwc->utmi_clk_rate);
		break;
	}

@@ -2435,13 +2436,36 @@ static int dwc3_msm_probe(struct platform_device *pdev)
	}
	clk_prepare_enable(mdwc->hsphy_sleep_clk);

	ret = of_property_read_u32(node, "qcom,utmi-clk-rate",
				   (u32 *)&mdwc->utmi_clk_rate);
	if (ret)
		mdwc->utmi_clk_rate = 19200000;

	mdwc->utmi_clk = devm_clk_get(&pdev->dev, "utmi_clk");
	if (IS_ERR(mdwc->utmi_clk)) {
		dev_err(&pdev->dev, "failed to get utmi_clk\n");
		ret = PTR_ERR(mdwc->utmi_clk);
		goto disable_hsphy_sleep_clk;
	}
	clk_set_rate(mdwc->utmi_clk, 19200000);

	if (mdwc->utmi_clk_rate == 24000000) {
		/*
		 * For setting utmi clock to 24MHz, first set 48MHz on parent
		 * clock "utmi_clk_src" and then set divider 2 on child branch
		 * "utmi_clk".
		 */
		mdwc->utmi_clk_src = devm_clk_get(&pdev->dev, "utmi_clk_src");
		if (IS_ERR(mdwc->utmi_clk_src)) {
			dev_err(&pdev->dev, "failed to get utmi_clk_src\n");
			ret = PTR_ERR(mdwc->utmi_clk_src);
			goto disable_hsphy_sleep_clk;
		}
		clk_set_rate(mdwc->utmi_clk_src, 48000000);
		/* 1 means divide utmi_clk_src by 2 */
		clk_set_rate(mdwc->utmi_clk, 1);
	} else {
		clk_set_rate(mdwc->utmi_clk, mdwc->utmi_clk_rate);
	}
	clk_prepare_enable(mdwc->utmi_clk);

	mdwc->ref_clk = devm_clk_get(&pdev->dev, "ref_clk");
@@ -2450,11 +2474,7 @@ static int dwc3_msm_probe(struct platform_device *pdev)
		ret = PTR_ERR(mdwc->ref_clk);
		goto disable_utmi_clk;
	}
	ret = of_property_read_u32(node, "qcom,ref-clk-rate",
				   (u32 *)&mdwc->ref_clk_rate);
	if (ret)
		mdwc->ref_clk_rate = 19200000;
	clk_set_rate(mdwc->ref_clk, mdwc->ref_clk_rate);
	clk_set_rate(mdwc->ref_clk, 19200000);
	clk_prepare_enable(mdwc->ref_clk);

	mdwc->id_state = mdwc->ext_xceiv.id = DWC3_ID_FLOAT;