]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
usb: dwc3: qcom: Remove extcon functionality from glue layer
authorKrishna Kurapati <krishna.kurapati@oss.qualcomm.com>
Tue, 29 Jul 2025 09:27:08 +0000 (14:57 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Aug 2025 14:55:42 +0000 (16:55 +0200)
Historically Qualcomm DWC3 glue driver supported both extcon and
usb-role-switch kinds of notifications. When Bjorn contributed [1] the
flattened representation for the DWC3 host controller, he also kept both
extcon and usb-role-switch support in the flattened driver & bindings.

Currently there are no in-kernel users for flattened DWC3 and extcon. As
device's DT needs to be manually converted from legacy to the flat DWC3
representation, we can drop (legacy / deprecated) extcon support from
the new DWC3 glue driver, significantly simplifying the code.

This potentially affects flattening effort for the following platforms:

Platforms currently using linux,extcon-usb-gpio device that need to
switch to gpio-usb-b-connector:
- apq8096-db820c,
- msm8996-sony-xperia-tone-dora

Platforms currently using linux,extcon-usb-gpio device that need to
switch to gpio-usb-c-connector (not supported at this moment) or to
implement typec support
- msm8996-sony-xperia-tone-kagura
- msm8996-sony-xperia-tone-keyaki
- msm8998-fxtec-pro1
- msm8998-sony-xperia-yoshino-lilac
- msm8998-sony-xperia-yoshino-maple
- msm8998-sony-xperia-yoshino-poplar
- sda660-inforce-ifc6560
- sdm630-sony-xperia-nile-discovery
- sdm630-sony-xperia-nile-pioneer
- sdm630-sony-xperia-nile-voyager
- sdm660-xiaomi-lavender
- sm6125-sony-xperia-seine-pdx201
- sm6125-xiaomi-ginkgo
- sm6125-xiaomi-laurel-sprout

Platforms using TI TUSB320L chip need to switch to represent the USB-C
connector properly (and to have a typec-class driver for the TUSB320L
chip):
- msm8996-xiaomi-gemini
- msm8996pro-xiaomi-natrium
- msm8996pro-xiaomi-scoprpio

Commit message suggested by Dmitry Baryshkov.

[1]: https://lore.kernel.org/all/20250414-dwc3-refactor-v7-0-f015b358722d@oss.qualcomm.com/

Signed-off-by: Krishna Kurapati <krishna.kurapati@oss.qualcomm.com>
Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20250729092708.3628187-1-krishna.kurapati@oss.qualcomm.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/dwc3-qcom.c

index 308360a32c93f88371f3eaa9d569e05436b92064..8a9018ca650c58da8e6ab426895f376231fda071 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/of_clk.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/extcon.h>
 #include <linux/interconnect.h>
 #include <linux/platform_device.h>
 #include <linux/phy/phy.h>
@@ -79,11 +78,6 @@ struct dwc3_qcom {
        struct dwc3_qcom_port   ports[DWC3_QCOM_MAX_PORTS];
        u8                      num_ports;
 
-       struct extcon_dev       *edev;
-       struct extcon_dev       *host_edev;
-       struct notifier_block   vbus_nb;
-       struct notifier_block   host_nb;
-
        enum usb_dr_mode        mode;
        bool                    is_suspended;
        bool                    pm_suspended;
@@ -119,8 +113,7 @@ static inline void dwc3_qcom_clrbits(void __iomem *base, u32 offset, u32 val)
 
 /*
  * TODO: Make the in-core role switching code invoke dwc3_qcom_vbus_override_enable(),
- * validate that the in-core extcon support is functional, and drop extcon
- * handling from the glue
+ * validate that the in-core extcon support is functional
  */
 static void dwc3_qcom_vbus_override_enable(struct dwc3_qcom *qcom, bool enable)
 {
@@ -137,80 +130,6 @@ static void dwc3_qcom_vbus_override_enable(struct dwc3_qcom *qcom, bool enable)
        }
 }
 
-static int dwc3_qcom_vbus_notifier(struct notifier_block *nb,
-                                  unsigned long event, void *ptr)
-{
-       struct dwc3_qcom *qcom = container_of(nb, struct dwc3_qcom, vbus_nb);
-
-       /* enable vbus override for device mode */
-       dwc3_qcom_vbus_override_enable(qcom, event);
-       qcom->mode = event ? USB_DR_MODE_PERIPHERAL : USB_DR_MODE_HOST;
-
-       return NOTIFY_DONE;
-}
-
-static int dwc3_qcom_host_notifier(struct notifier_block *nb,
-                                  unsigned long event, void *ptr)
-{
-       struct dwc3_qcom *qcom = container_of(nb, struct dwc3_qcom, host_nb);
-
-       /* disable vbus override in host mode */
-       dwc3_qcom_vbus_override_enable(qcom, !event);
-       qcom->mode = event ? USB_DR_MODE_HOST : USB_DR_MODE_PERIPHERAL;
-
-       return NOTIFY_DONE;
-}
-
-static int dwc3_qcom_register_extcon(struct dwc3_qcom *qcom)
-{
-       struct device           *dev = qcom->dev;
-       struct extcon_dev       *host_edev;
-       int                     ret;
-
-       if (!of_property_present(dev->of_node, "extcon"))
-               return 0;
-
-       qcom->edev = extcon_get_edev_by_phandle(dev, 0);
-       if (IS_ERR(qcom->edev))
-               return dev_err_probe(dev, PTR_ERR(qcom->edev),
-                                    "Failed to get extcon\n");
-
-       qcom->vbus_nb.notifier_call = dwc3_qcom_vbus_notifier;
-
-       qcom->host_edev = extcon_get_edev_by_phandle(dev, 1);
-       if (IS_ERR(qcom->host_edev))
-               qcom->host_edev = NULL;
-
-       ret = devm_extcon_register_notifier(dev, qcom->edev, EXTCON_USB,
-                                           &qcom->vbus_nb);
-       if (ret < 0) {
-               dev_err(dev, "VBUS notifier register failed\n");
-               return ret;
-       }
-
-       if (qcom->host_edev)
-               host_edev = qcom->host_edev;
-       else
-               host_edev = qcom->edev;
-
-       qcom->host_nb.notifier_call = dwc3_qcom_host_notifier;
-       ret = devm_extcon_register_notifier(dev, host_edev, EXTCON_USB_HOST,
-                                           &qcom->host_nb);
-       if (ret < 0) {
-               dev_err(dev, "Host notifier register failed\n");
-               return ret;
-       }
-
-       /* Update initial VBUS override based on extcon state */
-       if (extcon_get_state(qcom->edev, EXTCON_USB) ||
-           !extcon_get_state(host_edev, EXTCON_USB_HOST))
-               dwc3_qcom_vbus_notifier(&qcom->vbus_nb, true, qcom->edev);
-       else
-               dwc3_qcom_vbus_notifier(&qcom->vbus_nb, false, qcom->edev);
-
-       return 0;
-}
-
 static int dwc3_qcom_interconnect_enable(struct dwc3_qcom *qcom)
 {
        int ret;
@@ -737,11 +656,6 @@ static int dwc3_qcom_probe(struct platform_device *pdev)
        if (qcom->mode != USB_DR_MODE_HOST)
                dwc3_qcom_vbus_override_enable(qcom, true);
 
-       /* register extcon to override sw_vbus on Vbus change later */
-       ret = dwc3_qcom_register_extcon(qcom);
-       if (ret)
-               goto interconnect_exit;
-
        wakeup_source = of_property_read_bool(dev->of_node, "wakeup-source");
        device_init_wakeup(&pdev->dev, wakeup_source);
 
@@ -749,8 +663,6 @@ static int dwc3_qcom_probe(struct platform_device *pdev)
 
        return 0;
 
-interconnect_exit:
-       dwc3_qcom_interconnect_exit(qcom);
 remove_core:
        dwc3_core_remove(&qcom->dwc);
 clk_disable: