All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
To: linux@roeck-us.net, heikki.krogerus@linux.intel.com,
	gregkh@linuxfoundation.org, andersson@kernel.org,
	robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org,
	linux-usb@vger.kernel.org, linux-arm-msm@vger.kernel.org,
	devicetree@vger.kernel.org
Cc: wcheng@codeaurora.org, caleb.connolly@linaro.org,
	bryan.odonoghue@linaro.org, konrad.dybcio@linaro.org,
	subbaram@quicinc.com, jackp@quicinc.com,
	robertom@qti.qualcomm.com,
	Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Subject: [PATCH v4 13/18] phy: qcom-qmp: Register as a typec switch for orientation detection
Date: Sat, 18 Mar 2023 12:18:23 +0000	[thread overview]
Message-ID: <20230318121828.739424-14-bryan.odonoghue@linaro.org> (raw)
In-Reply-To: <20230318121828.739424-1-bryan.odonoghue@linaro.org>

From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

The lane select switch for USB typec orientation is within the USB QMP PHY.
the current device.  It could be connected through an endpoint, to an
independent device handling the typec detection, ie the QCOM SPMI typec
driver.

bod: Fixed the logic qcom_qmp_phy_typec_switch_set() to disable phy
 on disconnect if and only if we have initialized the PHY.
 Retained CC orientation logic in qcom_qmp_phy_com_init() to simplify
 patch.

bod: Ported from earlier version of driver to phy-qcom-qmp-combo.c

Co-developed-by: Wesley Cheng <wcheng@codeaurora.org>
Signed-off-by: Wesley Cheng <wcheng@codeaurora.org>
Co-developed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/phy/qualcomm/Kconfig              |  8 +++
 drivers/phy/qualcomm/phy-qcom-qmp-combo.c | 80 +++++++++++++++++++++--
 2 files changed, 84 insertions(+), 4 deletions(-)

diff --git a/drivers/phy/qualcomm/Kconfig b/drivers/phy/qualcomm/Kconfig
index 4850d48f31fa1..8240fffdbed4e 100644
--- a/drivers/phy/qualcomm/Kconfig
+++ b/drivers/phy/qualcomm/Kconfig
@@ -101,6 +101,14 @@ config PHY_QCOM_QMP_USB
 
 endif # PHY_QCOM_QMP
 
+config PHY_QCOM_QMP_TYPEC
+	def_bool PHY_QCOM_QMP=y && TYPEC=y || PHY_QCOM_QMP=m && TYPEC
+	help
+	  Register a type C switch from the QMP PHY driver for type C
+	  orientation support.  This has dependencies with if the type C kernel
+	  configuration is enabled or not.  This support will not be present if
+	  USB type C is disabled.
+
 config PHY_QCOM_QUSB2
 	tristate "Qualcomm QUSB2 PHY Driver"
 	depends on OF && (ARCH_QCOM || COMPILE_TEST)
diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-combo.c b/drivers/phy/qualcomm/phy-qcom-qmp-combo.c
index c1483e157af4a..afe708c63557d 100644
--- a/drivers/phy/qualcomm/phy-qcom-qmp-combo.c
+++ b/drivers/phy/qualcomm/phy-qcom-qmp-combo.c
@@ -19,6 +19,7 @@
 #include <linux/regulator/consumer.h>
 #include <linux/reset.h>
 #include <linux/slab.h>
+#include <linux/usb/typec_mux.h>
 
 #include <dt-bindings/phy/phy-qcom-qmp.h>
 
@@ -63,6 +64,10 @@
 /* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */
 #define CLAMP_EN				BIT(0) /* enables i/o clamp_n */
 
+/* QPHY_V3_DP_COM_TYPEC_CTRL register bits */
+#define SW_PORTSELECT_VAL			BIT(0)
+#define SW_PORTSELECT_MUX			BIT(1)
+
 #define PHY_INIT_COMPLETE_TIMEOUT		10000
 
 struct qmp_phy_init_tbl {
@@ -1323,6 +1328,9 @@ struct qmp_combo {
 	struct clk_fixed_rate pipe_clk_fixed;
 	struct clk_hw dp_link_hw;
 	struct clk_hw dp_pixel_hw;
+
+	struct typec_switch_dev *sw;
+	enum typec_orientation orientation;
 };
 
 static void qmp_v3_dp_aux_init(struct qmp_combo *qmp);
@@ -1970,7 +1978,8 @@ static void qmp_v3_configure_dp_tx(struct qmp_combo *qmp)
 static bool qmp_combo_configure_dp_mode(struct qmp_combo *qmp)
 {
 	u32 val;
-	bool reverse = false;
+	bool reverse = qmp->orientation == TYPEC_ORIENTATION_REVERSE;
+	const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
 
 	val = DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
 	      DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN;
@@ -1989,10 +1998,18 @@ static bool qmp_combo_configure_dp_mode(struct qmp_combo *qmp)
 	 * if (orientation == ORIENTATION_CC2)
 	 *	writel(0x4c, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_MODE);
 	 */
+	if (dp_opts->lanes == 4 || reverse)
+		val |= DP_PHY_PD_CTL_LANE_0_1_PWRDN;
+	if (dp_opts->lanes == 4 || !reverse)
+		val |= DP_PHY_PD_CTL_LANE_2_3_PWRDN;
+
 	val |= DP_PHY_PD_CTL_LANE_2_3_PWRDN;
 	writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
 
-	writel(0x5c, qmp->dp_dp_phy + QSERDES_DP_PHY_MODE);
+	if (reverse)
+		writel(0x4c, qmp->pcs + QSERDES_DP_PHY_MODE);
+	else
+		writel(0x5c, qmp->pcs + QSERDES_DP_PHY_MODE);
 
 	return reverse;
 }
@@ -2476,6 +2493,7 @@ static int qmp_combo_com_init(struct qmp_combo *qmp)
 {
 	const struct qmp_phy_cfg *cfg = qmp->cfg;
 	void __iomem *com = qmp->com;
+	u32 val;
 	int ret;
 
 	mutex_lock(&qmp->phy_mutex);
@@ -2513,8 +2531,11 @@ static int qmp_combo_com_init(struct qmp_combo *qmp)
 			SW_DPPHY_RESET_MUX | SW_DPPHY_RESET |
 			SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET);
 
-	/* Default type-c orientation, i.e CC1 */
-	qphy_setbits(com, QPHY_V3_DP_COM_TYPEC_CTRL, 0x02);
+	/* Latch CC orientation based on reported state by TCPM */
+	val = SW_PORTSELECT_MUX;
+	if (qmp->orientation == TYPEC_ORIENTATION_REVERSE)
+		val |= SW_PORTSELECT_VAL;
+	qphy_setbits(com, QPHY_V3_DP_COM_TYPEC_CTRL, val);
 
 	qphy_setbits(com, QPHY_V3_DP_COM_PHY_MODE_CTRL, USB3_MODE | DP_MODE);
 
@@ -3353,6 +3374,53 @@ static struct phy *qmp_combo_phy_xlate(struct device *dev, struct of_phandle_arg
 	return ERR_PTR(-EINVAL);
 }
 
+#if IS_ENABLED(CONFIG_PHY_QCOM_QMP_TYPEC)
+static int qmp_combo_typec_switch_set(struct typec_switch_dev *sw,
+				      enum typec_orientation orientation)
+{
+	struct qmp_combo *qmp = typec_switch_get_drvdata(sw);
+	struct phy *dp_phy = qmp->dp_phy;
+	int ret = 0;
+
+	dev_dbg(qmp->dev, "Toggling orientation current %d requested %d\n",
+		qmp->orientation, orientation);
+
+	qmp->orientation = orientation;
+
+	if (orientation == TYPEC_ORIENTATION_NONE) {
+		if (qmp->init_count)
+			ret = qmp_combo_dp_power_off(dp_phy);
+	} else {
+		if (!qmp->init_count)
+			ret = qmp_combo_dp_power_on(dp_phy);
+	}
+
+	return 0;
+}
+
+static int qmp_combo_typec_switch_register(struct qmp_combo *qmp)
+{
+	struct typec_switch_desc sw_desc;
+	struct device *dev = qmp->dev;
+
+	sw_desc.drvdata = qmp;
+	sw_desc.fwnode = dev->fwnode;
+	sw_desc.set = qmp_combo_typec_switch_set;
+	qmp->sw = typec_switch_register(dev, &sw_desc);
+	if (IS_ERR(qmp->sw)) {
+		dev_err(dev, "Error registering typec switch: %ld\n",
+			PTR_ERR(qmp->sw));
+	}
+
+	return 0;
+}
+#else
+static int qmp_combo_typec_switch_register(struct qmp_combo *qmp)
+{
+	return 0;
+}
+#endif
+
 static int qmp_combo_probe(struct platform_device *pdev)
 {
 	struct qmp_combo *qmp;
@@ -3443,6 +3511,10 @@ static int qmp_combo_probe(struct platform_device *pdev)
 	else
 		phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
 
+	ret = qmp_combo_typec_switch_register(qmp);
+	if (ret)
+		goto err_node_put;
+
 	of_node_put(usb_np);
 	of_node_put(dp_np);
 
-- 
2.39.2


  parent reply	other threads:[~2023-03-18 12:18 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-18 12:18 [PATCH v4 00/18] Add Qualcomm PMIC TPCM support Bryan O'Donoghue
2023-03-18 12:18 ` [PATCH v4 01/18] dt-bindings: regulator: qcom,usb-vbus-regulator: Mark reg as required Bryan O'Donoghue
2023-03-19 11:41   ` Krzysztof Kozlowski
2023-03-18 12:18 ` [PATCH v4 02/18] dt-bindings: regulator: qcom,usb-vbus-regulator: Mark regulator-*-microamp required Bryan O'Donoghue
2023-03-19 11:42   ` Krzysztof Kozlowski
2023-03-19 11:53   ` Krzysztof Kozlowski
2023-03-18 12:18 ` [PATCH v4 03/18] dt-bindings: phy: qcom,sc7180-qmp-usb3-dp-phy: Add orientation-switch as optional Bryan O'Donoghue
2023-03-19 11:42   ` Krzysztof Kozlowski
2023-03-18 12:18 ` [PATCH v4 04/18] dt-bindings: phy: qcom,sc7180-qmp-usb3-dp-phy: Add port as an optional Bryan O'Donoghue
2023-03-19 11:45   ` Krzysztof Kozlowski
2023-03-21 20:49     ` Rob Herring
2023-03-22 14:01       ` Bryan O'Donoghue
2023-03-23 13:39       ` Bryan O'Donoghue
2023-03-18 12:18 ` [PATCH v4 05/18] dt-bindings: usb: Add qcom,pmic-typec dt-binding header Bryan O'Donoghue
2023-03-19 11:50   ` Krzysztof Kozlowski
2023-03-19 14:50     ` Bryan O'Donoghue
2023-03-18 12:18 ` [PATCH v4 06/18] dt-bindings: usb: Add Qualcomm PMIC Type-C controller YAML schema Bryan O'Donoghue
2023-03-19 11:53   ` Krzysztof Kozlowski
2023-03-18 12:18 ` [PATCH v4 07/18] dt-bindings: usb: Add qcom,pmic-pdphy dt-binding header Bryan O'Donoghue
2023-03-19 11:50   ` Krzysztof Kozlowski
2023-03-18 12:18 ` [PATCH v4 08/18] dt-bindings: usb: Add Qualcomm PMIC PDPHY controller YAML schema Bryan O'Donoghue
2023-03-19 11:55   ` Krzysztof Kozlowski
2023-03-18 12:18 ` [PATCH v4 09/18] dt-bindings: usb: Add Qualcomm PMIC TCPM " Bryan O'Donoghue
2023-03-19 11:58   ` Krzysztof Kozlowski
2023-03-19 14:59     ` Bryan O'Donoghue
2023-03-19 15:10       ` Krzysztof Kozlowski
2023-03-19 15:44         ` Bryan O'Donoghue
2023-03-19 17:50           ` Krzysztof Kozlowski
2023-03-19 21:31             ` Caleb Connolly
2023-03-19 22:34               ` Bryan O'Donoghue
2023-03-19 22:32             ` Bryan O'Donoghue
2023-03-19 15:50         ` Bryan O'Donoghue
2023-03-18 12:18 ` [PATCH v4 10/18] dt-bindings: mfd: qcom,spmi-pmic: Add pdphy to SPMI device types Bryan O'Donoghue
2023-03-19 11:58   ` Krzysztof Kozlowski
2023-03-21 20:58     ` Rob Herring
2023-03-21 23:52       ` Bryan O'Donoghue
2023-03-18 12:18 ` [PATCH v4 11/18] dt-bindings: mfd: qcom,spmi-pmic: Add typec " Bryan O'Donoghue
2023-03-19 11:59   ` Krzysztof Kozlowski
2023-03-18 12:18 ` [PATCH v4 12/18] usb: typec: qcom: Add Qualcomm PMIC TCPM support Bryan O'Donoghue
2023-03-23 14:36   ` Jianhua Lu
2023-03-23 17:31     ` Bryan O'Donoghue
2023-03-24  0:43       ` Jianhua Lu
2023-03-24  0:53         ` Bryan O'Donoghue
2023-03-24  1:13           ` Jianhua Lu
2023-03-24  2:37             ` Bryan O'Donoghue
2023-03-24 10:16               ` Jianhua Lu
2023-03-24 13:25                 ` Bryan O'Donoghue
2023-03-24 15:09                   ` Jianhua Lu
2023-03-24 16:03                     ` Bryan O'Donoghue
2023-03-24 14:00   ` Heikki Krogerus
2023-03-24 14:22     ` Bryan O'Donoghue
2023-03-18 12:18 ` Bryan O'Donoghue [this message]
2023-03-18 16:42   ` [PATCH v4 13/18] phy: qcom-qmp: Register as a typec switch for orientation detection kernel test robot
2023-03-20 11:15   ` Neil Armstrong
2023-03-20 11:19     ` Bryan O'Donoghue
2023-03-18 12:18 ` [PATCH v4 14/18] arm64: dts: qcom: pm8150b: Add a TCPM description Bryan O'Donoghue
2023-03-18 13:13   ` Konrad Dybcio
2023-03-18 21:09   ` kernel test robot
2023-03-18 12:18 ` [PATCH v4 15/18] arm64: dts: qcom: qrb5165-rb5: Switch on Type-C VBUS boost Bryan O'Donoghue
2023-03-18 12:18 ` [PATCH v4 16/18] arm64: dts: qcom: qrb5165-rb5: Switch on basic TCPM Bryan O'Donoghue
2023-03-18 13:09   ` Konrad Dybcio
2023-03-18 12:18 ` [PATCH v4 17/18] arm64: dts: qcom: qrb5165-rb5: Switch on TCPM usb-role-switching for usb_1 Bryan O'Donoghue
2023-03-18 13:10   ` Konrad Dybcio
2023-03-18 17:46     ` Bryan O'Donoghue
2023-03-18 12:18 ` [PATCH v4 18/18] arm64: dts: qcom: qrb5165-rb5: Switch on TCPM orientation-switch for usb_1_qmpphy Bryan O'Donoghue
2023-03-18 13:11   ` Konrad Dybcio
2023-03-18 17:47     ` Bryan O'Donoghue
2023-03-24 15:10 ` [PATCH v4 00/18] Add Qualcomm PMIC TPCM support Luca Weiss
2023-03-24 15:28   ` Bryan O'Donoghue
2023-03-31  8:48     ` Luca Weiss
2023-03-31 13:52       ` Bryan O'Donoghue
2023-03-31 14:58         ` Luca Weiss

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230318121828.739424-14-bryan.odonoghue@linaro.org \
    --to=bryan.odonoghue@linaro.org \
    --cc=andersson@kernel.org \
    --cc=caleb.connolly@linaro.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dmitry.baryshkov@linaro.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=jackp@quicinc.com \
    --cc=konrad.dybcio@linaro.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=robertom@qti.qualcomm.com \
    --cc=robh+dt@kernel.org \
    --cc=subbaram@quicinc.com \
    --cc=wcheng@codeaurora.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.