Re: [PATCH 2/2] usb: typec: intel_pmc_mux: Check the port status before connect

2020-07-17 Thread Greg Kroah-Hartman
On Fri, Jul 17, 2020 at 06:04:51AM +, Mani, Rajmohan wrote:
> Hi Greg,
> 
> > -Original Message-
> > From: Greg Kroah-Hartman 
> > Sent: Thursday, July 16, 2020 12:05 AM
> > To: Mani, Rajmohan 
> > Cc: Darren Hart ; Andy Shevchenko
> > ; Mika Westerberg
> > ; Dmitry Torokhov
> > ; Lee Jones ; Ayman
> > Bagabas ; Masahiro Yamada
> > ; Joseph, Jithu ; Blaž
> > Hrastnik ; Srinivas Pandruvada
> > ; linux-kernel@vger.kernel.org;
> > platform-driver-...@vger.kernel.org; Heikki Krogerus
> > ; linux-...@vger.kernel.org;
> > pmal...@chromium.org; ble...@chromium.org
> > Subject: Re: [PATCH 2/2] usb: typec: intel_pmc_mux: Check the port status
> > before connect
> > 
> > On Wed, Jul 15, 2020 at 05:33:10PM -0700, Rajmohan Mani wrote:
> > > From: Heikki Krogerus 
> > >
> > > The PMC microcontroller that we use for configuration, does not supply
> > > any status information back. For port status we need to talk to
> > > another controller on the board called IOM (I/O manager).
> > >
> > > By checking the port status before configuring the muxes, we can make
> > > sure that we do not reconfigure the port after bootup when the system
> > > firmware (for example BIOS) has already configured it.
> > >
> > > Using the status information also to check if DisplayPort HPD is still
> > > asserted when the cable plug is disconnected, and clearing it if it
> > > is.
> > >
> > > Signed-off-by: Heikki Krogerus 
> > 
> > You can't just forward on patches from others without also adding your
> > signed-off-by to them, right?
> > 
> 
> Sorry I missed this.
> 
> > Please fix up this series and try again.
> > 
> 
> Ack. Will fix this with v2.

Stop and go talk to the proper people in Intel for how to submit patches
to the kernel as you are not following the rules they have documented
for you.

thanks,

greg k-h


RE: [PATCH 2/2] usb: typec: intel_pmc_mux: Check the port status before connect

2020-07-17 Thread Mani, Rajmohan
Hi Greg,

> -Original Message-
> From: Greg Kroah-Hartman 
> Sent: Thursday, July 16, 2020 12:05 AM
> To: Mani, Rajmohan 
> Cc: Darren Hart ; Andy Shevchenko
> ; Mika Westerberg
> ; Dmitry Torokhov
> ; Lee Jones ; Ayman
> Bagabas ; Masahiro Yamada
> ; Joseph, Jithu ; Blaž
> Hrastnik ; Srinivas Pandruvada
> ; linux-kernel@vger.kernel.org;
> platform-driver-...@vger.kernel.org; Heikki Krogerus
> ; linux-...@vger.kernel.org;
> pmal...@chromium.org; ble...@chromium.org
> Subject: Re: [PATCH 2/2] usb: typec: intel_pmc_mux: Check the port status
> before connect
> 
> On Wed, Jul 15, 2020 at 05:33:10PM -0700, Rajmohan Mani wrote:
> > From: Heikki Krogerus 
> >
> > The PMC microcontroller that we use for configuration, does not supply
> > any status information back. For port status we need to talk to
> > another controller on the board called IOM (I/O manager).
> >
> > By checking the port status before configuring the muxes, we can make
> > sure that we do not reconfigure the port after bootup when the system
> > firmware (for example BIOS) has already configured it.
> >
> > Using the status information also to check if DisplayPort HPD is still
> > asserted when the cable plug is disconnected, and clearing it if it
> > is.
> >
> > Signed-off-by: Heikki Krogerus 
> 
> You can't just forward on patches from others without also adding your
> signed-off-by to them, right?
> 

Sorry I missed this.

> Please fix up this series and try again.
> 

Ack. Will fix this with v2.

> thanks,
> 
> greg k-h


Re: [PATCH 2/2] usb: typec: intel_pmc_mux: Check the port status before connect

2020-07-16 Thread Greg Kroah-Hartman
On Wed, Jul 15, 2020 at 05:33:10PM -0700, Rajmohan Mani wrote:
> From: Heikki Krogerus 
> 
> The PMC microcontroller that we use for configuration, does
> not supply any status information back. For port status we
> need to talk to another controller on the board called IOM
> (I/O manager).
> 
> By checking the port status before configuring the muxes, we
> can make sure that we do not reconfigure the port after
> bootup when the system firmware (for example BIOS) has
> already configured it.
> 
> Using the status information also to check if DisplayPort
> HPD is still asserted when the cable plug is disconnected,
> and clearing it if it is.
> 
> Signed-off-by: Heikki Krogerus 

You can't just forward on patches from others without also adding your
signed-off-by to them, right?

Please fix up this series and try again.

thanks,

greg k-h


[PATCH 2/2] usb: typec: intel_pmc_mux: Check the port status before connect

2020-07-15 Thread Rajmohan Mani
From: Heikki Krogerus 

The PMC microcontroller that we use for configuration, does
not supply any status information back. For port status we
need to talk to another controller on the board called IOM
(I/O manager).

By checking the port status before configuring the muxes, we
can make sure that we do not reconfigure the port after
bootup when the system firmware (for example BIOS) has
already configured it.

Using the status information also to check if DisplayPort
HPD is still asserted when the cable plug is disconnected,
and clearing it if it is.

Signed-off-by: Heikki Krogerus 
---
 drivers/usb/typec/mux/Kconfig |  1 +
 drivers/usb/typec/mux/intel_pmc_mux.c | 73 +++
 2 files changed, 64 insertions(+), 10 deletions(-)

diff --git a/drivers/usb/typec/mux/Kconfig b/drivers/usb/typec/mux/Kconfig
index a4dbd11f8ee2..46f5512de63d 100644
--- a/drivers/usb/typec/mux/Kconfig
+++ b/drivers/usb/typec/mux/Kconfig
@@ -12,6 +12,7 @@ config TYPEC_MUX_PI3USB30532
 config TYPEC_MUX_INTEL_PMC
tristate "Intel PMC mux control"
depends on INTEL_SCU_IPC
+   depends on INTEL_IOM
select USB_ROLE_SWITCH
help
  Driver for USB muxes controlled by Intel PMC FW. Intel PMC FW can
diff --git a/drivers/usb/typec/mux/intel_pmc_mux.c 
b/drivers/usb/typec/mux/intel_pmc_mux.c
index 2aba07c7b221..84101fb99934 100644
--- a/drivers/usb/typec/mux/intel_pmc_mux.c
+++ b/drivers/usb/typec/mux/intel_pmc_mux.c
@@ -9,6 +9,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -83,10 +84,17 @@ enum {
 #define PMC_USB_DP_HPD_LVL BIT(4)
 #define PMC_USB_DP_HPD_IRQ BIT(5)
 
+/* IOM Port Status */
+#define IOM_PORT_ACTIVITY_IS(_status_, _type_) \
+   _status_) & IOM_PORT_STATUS_ACTIVITY_TYPE_MASK) >>  \
+ IOM_PORT_STATUS_ACTIVITY_TYPE_SHIFT) ==   \
+(IOM_PORT_STATUS_ACTIVITY_TYPE_##_type_))
+
 struct pmc_usb;
 
 struct pmc_usb_port {
int num;
+   u32 iom_status;
struct pmc_usb *pmc;
struct typec_mux *typec_mux;
struct typec_switch *typec_sw;
@@ -105,6 +113,7 @@ struct pmc_usb_port {
 struct pmc_usb {
u8 num_ports;
struct device *dev;
+   struct intel_iom *iom;
struct intel_scu_ipc_dev *ipc;
struct pmc_usb_port *port;
 };
@@ -145,18 +154,17 @@ static int pmc_usb_command(struct pmc_usb_port *port, u8 
*msg, u32 len)
 }
 
 static int
-pmc_usb_mux_dp_hpd(struct pmc_usb_port *port, struct typec_mux_state *state)
+pmc_usb_mux_dp_hpd(struct pmc_usb_port *port, struct typec_displayport_data 
*dp)
 {
-   struct typec_displayport_data *data = state->data;
u8 msg[2] = { };
 
msg[0] = PMC_USB_DP_HPD;
msg[0] |= port->usb3_port << PMC_USB_MSG_USB3_PORT_SHIFT;
 
-   if (data->status & DP_STATUS_IRQ_HPD)
+   if (dp->status & DP_STATUS_IRQ_HPD)
msg[1] = PMC_USB_DP_HPD_IRQ;
 
-   if (data->status & DP_STATUS_HPD_STATE)
+   if (dp->status & DP_STATUS_HPD_STATE)
msg[1] |= PMC_USB_DP_HPD_LVL;
 
return pmc_usb_command(port, msg, sizeof(msg));
@@ -169,8 +177,12 @@ pmc_usb_mux_dp(struct pmc_usb_port *port, struct 
typec_mux_state *state)
struct altmode_req req = { };
int ret;
 
+   if (IOM_PORT_ACTIVITY_IS(port->iom_status, DP) ||
+   IOM_PORT_ACTIVITY_IS(port->iom_status, DP_MFD))
+   return 0;
+
if (data->status & DP_STATUS_IRQ_HPD)
-   return pmc_usb_mux_dp_hpd(port, state);
+   return pmc_usb_mux_dp_hpd(port, state->data);
 
req.usage = PMC_USB_ALT_MODE;
req.usage |= port->usb3_port << PMC_USB_MSG_USB3_PORT_SHIFT;
@@ -193,7 +205,7 @@ pmc_usb_mux_dp(struct pmc_usb_port *port, struct 
typec_mux_state *state)
return ret;
 
if (data->status & DP_STATUS_HPD_STATE)
-   return pmc_usb_mux_dp_hpd(port, state);
+   return pmc_usb_mux_dp_hpd(port, state->data);
 
return 0;
 }
@@ -205,6 +217,10 @@ pmc_usb_mux_tbt(struct pmc_usb_port *port, struct 
typec_mux_state *state)
u8 cable_speed = TBT_CABLE_SPEED(data->cable_mode);
struct altmode_req req = { };
 
+   if (IOM_PORT_ACTIVITY_IS(port->iom_status, TBT) ||
+   IOM_PORT_ACTIVITY_IS(port->iom_status, ALT_MODE_TBT_USB))
+   return 0;
+
req.usage = PMC_USB_ALT_MODE;
req.usage |= port->usb3_port << PMC_USB_MSG_USB3_PORT_SHIFT;
req.mode_type = PMC_USB_MODE_TYPE_TBT << PMC_USB_MODE_TYPE_SHIFT;
@@ -239,6 +255,10 @@ pmc_usb_mux_usb4(struct pmc_usb_port *port, struct 
typec_mux_state *state)
struct altmode_req req = { };
u8 cable_speed;
 
+   if (IOM_PORT_ACTIVITY_IS(port->iom_status, TBT) ||
+   IOM_PORT_ACTIVITY_IS(port->iom_status, ALT_MODE_TBT_USB))
+   return 0;
+
req.usage = PMC_USB_ALT_MODE;
req.usage |=