aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/mediatek/patches-4.14/0108-usb-mtu3-use-FORCE-RG_IDDIG-to-implement-manual-DRD-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/mediatek/patches-4.14/0108-usb-mtu3-use-FORCE-RG_IDDIG-to-implement-manual-DRD-.patch')
-rw-r--r--target/linux/mediatek/patches-4.14/0108-usb-mtu3-use-FORCE-RG_IDDIG-to-implement-manual-DRD-.patch274
1 files changed, 0 insertions, 274 deletions
diff --git a/target/linux/mediatek/patches-4.14/0108-usb-mtu3-use-FORCE-RG_IDDIG-to-implement-manual-DRD-.patch b/target/linux/mediatek/patches-4.14/0108-usb-mtu3-use-FORCE-RG_IDDIG-to-implement-manual-DRD-.patch
deleted file mode 100644
index 6ff80e446f..0000000000
--- a/target/linux/mediatek/patches-4.14/0108-usb-mtu3-use-FORCE-RG_IDDIG-to-implement-manual-DRD-.patch
+++ /dev/null
@@ -1,274 +0,0 @@
-From 6c4995c9a8ba8841ba640201636954c84f494587 Mon Sep 17 00:00:00 2001
-From: Chunfeng Yun <chunfeng.yun@mediatek.com>
-Date: Fri, 13 Oct 2017 17:10:42 +0800
-Subject: [PATCH 108/224] usb: mtu3: use FORCE/RG_IDDIG to implement manual DRD
- switch
-
-In order to keep manual DRD switch independent on IDDIG interrupt,
-make use of FORCE/RG_IDDIG instead of IDDIG EINT interrupt to
-implement manual DRD switch function.
-
-Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
-Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
----
- drivers/usb/mtu3/mtu3.h | 18 ++++++++----
- drivers/usb/mtu3/mtu3_dr.c | 61 ++++++++++++++++++++++++++++++-----------
- drivers/usb/mtu3/mtu3_dr.h | 6 ++++
- drivers/usb/mtu3/mtu3_host.c | 5 ++++
- drivers/usb/mtu3/mtu3_hw_regs.h | 2 ++
- drivers/usb/mtu3/mtu3_plat.c | 38 ++-----------------------
- 6 files changed, 74 insertions(+), 56 deletions(-)
-
---- a/drivers/usb/mtu3/mtu3.h
-+++ b/drivers/usb/mtu3/mtu3.h
-@@ -115,6 +115,19 @@ enum mtu3_g_ep0_state {
- };
-
- /**
-+ * MTU3_DR_FORCE_NONE: automatically switch host and periperal mode
-+ * by IDPIN signal.
-+ * MTU3_DR_FORCE_HOST: force to enter host mode and override OTG
-+ * IDPIN signal.
-+ * MTU3_DR_FORCE_DEVICE: force to enter peripheral mode.
-+ */
-+enum mtu3_dr_force_mode {
-+ MTU3_DR_FORCE_NONE = 0,
-+ MTU3_DR_FORCE_HOST,
-+ MTU3_DR_FORCE_DEVICE,
-+};
-+
-+/**
- * @base: the base address of fifo
- * @limit: the bitmap size in bits
- * @bitmap: fifo bitmap in unit of @MTU3_EP_FIFO_UNIT
-@@ -196,7 +209,6 @@ struct mtu3_gpd_ring {
- * xHCI driver initialization, it's necessary for system bootup
- * as device.
- * @is_u3_drd: whether port0 supports usb3.0 dual-role device or not
--* @id_*: used to maually switch between host and device modes by idpin
- * @manual_drd_enabled: it's true when supports dual-role device by debugfs
- * to switch host/device modes depending on user input.
- */
-@@ -207,10 +219,6 @@ struct otg_switch_mtk {
- struct notifier_block id_nb;
- struct delayed_work extcon_reg_dwork;
- bool is_u3_drd;
-- /* dual-role switch by debugfs */
-- struct pinctrl *id_pinctrl;
-- struct pinctrl_state *id_float;
-- struct pinctrl_state *id_ground;
- bool manual_drd_enabled;
- };
-
---- a/drivers/usb/mtu3/mtu3_dr.c
-+++ b/drivers/usb/mtu3/mtu3_dr.c
-@@ -261,21 +261,22 @@ static void extcon_register_dwork(struct
- * depending on user input.
- * This is useful in special cases, such as uses TYPE-A receptacle but also
- * wants to support dual-role mode.
-- * It generates cable state changes by pulling up/down IDPIN and
-- * notifies driver to switch mode by "extcon-usb-gpio".
-- * NOTE: when use MICRO receptacle, should not enable this interface.
- */
- static void ssusb_mode_manual_switch(struct ssusb_mtk *ssusb, int to_host)
- {
- struct otg_switch_mtk *otg_sx = &ssusb->otg_switch;
-
-- if (to_host)
-- pinctrl_select_state(otg_sx->id_pinctrl, otg_sx->id_ground);
-- else
-- pinctrl_select_state(otg_sx->id_pinctrl, otg_sx->id_float);
-+ if (to_host) {
-+ ssusb_set_force_mode(ssusb, MTU3_DR_FORCE_HOST);
-+ ssusb_set_mailbox(otg_sx, MTU3_VBUS_OFF);
-+ ssusb_set_mailbox(otg_sx, MTU3_ID_GROUND);
-+ } else {
-+ ssusb_set_force_mode(ssusb, MTU3_DR_FORCE_DEVICE);
-+ ssusb_set_mailbox(otg_sx, MTU3_ID_FLOAT);
-+ ssusb_set_mailbox(otg_sx, MTU3_VBUS_VALID);
-+ }
- }
-
--
- static int ssusb_mode_show(struct seq_file *sf, void *unused)
- {
- struct ssusb_mtk *ssusb = sf->private;
-@@ -388,17 +389,45 @@ static void ssusb_debugfs_exit(struct ss
- debugfs_remove_recursive(ssusb->dbgfs_root);
- }
-
-+void ssusb_set_force_mode(struct ssusb_mtk *ssusb,
-+ enum mtu3_dr_force_mode mode)
-+{
-+ u32 value;
-+
-+ value = mtu3_readl(ssusb->ippc_base, SSUSB_U2_CTRL(0));
-+ switch (mode) {
-+ case MTU3_DR_FORCE_DEVICE:
-+ value |= SSUSB_U2_PORT_FORCE_IDDIG | SSUSB_U2_PORT_RG_IDDIG;
-+ break;
-+ case MTU3_DR_FORCE_HOST:
-+ value |= SSUSB_U2_PORT_FORCE_IDDIG;
-+ value &= ~SSUSB_U2_PORT_RG_IDDIG;
-+ break;
-+ case MTU3_DR_FORCE_NONE:
-+ value &= ~(SSUSB_U2_PORT_FORCE_IDDIG | SSUSB_U2_PORT_RG_IDDIG);
-+ break;
-+ default:
-+ return;
-+ }
-+ mtu3_writel(ssusb->ippc_base, SSUSB_U2_CTRL(0), value);
-+}
-+
- int ssusb_otg_switch_init(struct ssusb_mtk *ssusb)
- {
- struct otg_switch_mtk *otg_sx = &ssusb->otg_switch;
-
-- INIT_DELAYED_WORK(&otg_sx->extcon_reg_dwork, extcon_register_dwork);
--
-- if (otg_sx->manual_drd_enabled)
-+ if (otg_sx->manual_drd_enabled) {
- ssusb_debugfs_init(ssusb);
-+ } else {
-+ INIT_DELAYED_WORK(&otg_sx->extcon_reg_dwork,
-+ extcon_register_dwork);
-
-- /* It is enough to delay 1s for waiting for host initialization */
-- schedule_delayed_work(&otg_sx->extcon_reg_dwork, HZ);
-+ /*
-+ * It is enough to delay 1s for waiting for
-+ * host initialization
-+ */
-+ schedule_delayed_work(&otg_sx->extcon_reg_dwork, HZ);
-+ }
-
- return 0;
- }
-@@ -407,8 +436,8 @@ void ssusb_otg_switch_exit(struct ssusb_
- {
- struct otg_switch_mtk *otg_sx = &ssusb->otg_switch;
-
-- cancel_delayed_work(&otg_sx->extcon_reg_dwork);
--
- if (otg_sx->manual_drd_enabled)
- ssusb_debugfs_exit(ssusb);
-+ else
-+ cancel_delayed_work(&otg_sx->extcon_reg_dwork);
- }
---- a/drivers/usb/mtu3/mtu3_dr.h
-+++ b/drivers/usb/mtu3/mtu3_dr.h
-@@ -87,6 +87,8 @@ static inline void ssusb_gadget_exit(str
- int ssusb_otg_switch_init(struct ssusb_mtk *ssusb);
- void ssusb_otg_switch_exit(struct ssusb_mtk *ssusb);
- int ssusb_set_vbus(struct otg_switch_mtk *otg_sx, int is_on);
-+void ssusb_set_force_mode(struct ssusb_mtk *ssusb,
-+ enum mtu3_dr_force_mode mode);
-
- #else
-
-@@ -103,6 +105,10 @@ static inline int ssusb_set_vbus(struct
- return 0;
- }
-
-+static inline void
-+ssusb_set_force_mode(struct ssusb_mtk *ssusb, enum mtu3_dr_force_mode mode)
-+{}
-+
- #endif
-
- #endif /* _MTU3_DR_H_ */
---- a/drivers/usb/mtu3/mtu3_host.c
-+++ b/drivers/usb/mtu3/mtu3_host.c
-@@ -189,6 +189,8 @@ int ssusb_host_disable(struct ssusb_mtk
-
- static void ssusb_host_setup(struct ssusb_mtk *ssusb)
- {
-+ struct otg_switch_mtk *otg_sx = &ssusb->otg_switch;
-+
- host_ports_num_get(ssusb);
-
- /*
-@@ -197,6 +199,9 @@ static void ssusb_host_setup(struct ssus
- */
- ssusb_host_enable(ssusb);
-
-+ if (otg_sx->manual_drd_enabled)
-+ ssusb_set_force_mode(ssusb, MTU3_DR_FORCE_HOST);
-+
- /* if port0 supports dual-role, works as host mode by default */
- ssusb_set_vbus(&ssusb->otg_switch, 1);
- }
---- a/drivers/usb/mtu3/mtu3_hw_regs.h
-+++ b/drivers/usb/mtu3/mtu3_hw_regs.h
-@@ -472,6 +472,8 @@
- #define SSUSB_U3_PORT_DIS BIT(0)
-
- /* U3D_SSUSB_U2_CTRL_0P */
-+#define SSUSB_U2_PORT_RG_IDDIG BIT(12)
-+#define SSUSB_U2_PORT_FORCE_IDDIG BIT(11)
- #define SSUSB_U2_PORT_VBUSVALID BIT(9)
- #define SSUSB_U2_PORT_OTG_SEL BIT(7)
- #define SSUSB_U2_PORT_HOST BIT(2)
---- a/drivers/usb/mtu3/mtu3_plat.c
-+++ b/drivers/usb/mtu3/mtu3_plat.c
-@@ -21,7 +21,6 @@
- #include <linux/module.h>
- #include <linux/of_address.h>
- #include <linux/of_irq.h>
--#include <linux/pinctrl/consumer.h>
- #include <linux/platform_device.h>
-
- #include "mtu3.h"
-@@ -212,33 +211,6 @@ static void ssusb_ip_sw_reset(struct ssu
- mtu3_clrbits(ssusb->ippc_base, U3D_SSUSB_IP_PW_CTRL0, SSUSB_IP_SW_RST);
- }
-
--static int get_iddig_pinctrl(struct ssusb_mtk *ssusb)
--{
-- struct otg_switch_mtk *otg_sx = &ssusb->otg_switch;
--
-- otg_sx->id_pinctrl = devm_pinctrl_get(ssusb->dev);
-- if (IS_ERR(otg_sx->id_pinctrl)) {
-- dev_err(ssusb->dev, "Cannot find id pinctrl!\n");
-- return PTR_ERR(otg_sx->id_pinctrl);
-- }
--
-- otg_sx->id_float =
-- pinctrl_lookup_state(otg_sx->id_pinctrl, "id_float");
-- if (IS_ERR(otg_sx->id_float)) {
-- dev_err(ssusb->dev, "Cannot find pinctrl id_float!\n");
-- return PTR_ERR(otg_sx->id_float);
-- }
--
-- otg_sx->id_ground =
-- pinctrl_lookup_state(otg_sx->id_pinctrl, "id_ground");
-- if (IS_ERR(otg_sx->id_ground)) {
-- dev_err(ssusb->dev, "Cannot find pinctrl id_ground!\n");
-- return PTR_ERR(otg_sx->id_ground);
-- }
--
-- return 0;
--}
--
- /* ignore the error if the clock does not exist */
- static struct clk *get_optional_clk(struct device *dev, const char *id)
- {
-@@ -349,15 +321,11 @@ static int get_ssusb_rscs(struct platfor
- dev_err(ssusb->dev, "couldn't get extcon device\n");
- return -EPROBE_DEFER;
- }
-- if (otg_sx->manual_drd_enabled) {
-- ret = get_iddig_pinctrl(ssusb);
-- if (ret)
-- return ret;
-- }
- }
-
-- dev_info(dev, "dr_mode: %d, is_u3_dr: %d, u3p_dis_msk:%x\n",
-- ssusb->dr_mode, otg_sx->is_u3_drd, ssusb->u3p_dis_msk);
-+ dev_info(dev, "dr_mode: %d, is_u3_dr: %d, u3p_dis_msk: %x, drd: %s\n",
-+ ssusb->dr_mode, otg_sx->is_u3_drd, ssusb->u3p_dis_msk,
-+ otg_sx->manual_drd_enabled ? "manual" : "auto");
-
- return 0;
- }