Takashi Iwai 859c02
From 11228eee79ae78317644b59246cb4de195e00b2c Mon Sep 17 00:00:00 2001
Takashi Iwai 859c02
From: Rui Miguel Silva <rui.silva@linaro.org>
Takashi Iwai 859c02
Date: Fri, 27 Aug 2021 14:11:52 +0100
Takashi Iwai 859c02
Subject: [PATCH] usb: isp1760: write to status and address register
Takashi Iwai 859c02
Git-commit: 36815a4a0763bb405ebd776c45553005c1ef7a15
Takashi Iwai 859c02
Patch-mainline: v5.15-rc1
Takashi Iwai 859c02
References: stable-5.14.6
Takashi Iwai 859c02
Takashi Iwai 859c02
[ Upstream commit 36815a4a0763bb405ebd776c45553005c1ef7a15 ]
Takashi Iwai 859c02
Takashi Iwai 859c02
We were already writing directly the port status register to
Takashi Iwai 859c02
trigger changes in isp1763. The same is needed in other IP
Takashi Iwai 859c02
from the family, including also to setup the read address
Takashi Iwai 859c02
before reading from device.
Takashi Iwai 859c02
Takashi Iwai 859c02
Reported-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Takashi Iwai 859c02
Tested-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Takashi Iwai 859c02
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
Takashi Iwai 859c02
Link: https://lore.kernel.org/r/20210827131154.4151862-4-rui.silva@linaro.org
Takashi Iwai 859c02
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Takashi Iwai 859c02
Signed-off-by: Sasha Levin <sashal@kernel.org>
Takashi Iwai 859c02
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 859c02
Takashi Iwai 859c02
---
Takashi Iwai 859c02
 drivers/usb/isp1760/isp1760-hcd.c | 23 +++++++++++------------
Takashi Iwai 859c02
 1 file changed, 11 insertions(+), 12 deletions(-)
Takashi Iwai 859c02
Takashi Iwai 859c02
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
Takashi Iwai 859c02
index d2d19548241e..e517376c3291 100644
Takashi Iwai 859c02
--- a/drivers/usb/isp1760/isp1760-hcd.c
Takashi Iwai 859c02
+++ b/drivers/usb/isp1760/isp1760-hcd.c
Takashi Iwai 859c02
@@ -182,7 +182,7 @@ struct urb_listitem {
Takashi Iwai 859c02
 	struct urb *urb;
Takashi Iwai 859c02
 };
Takashi Iwai 859c02
 
Takashi Iwai 859c02
-static const u32 isp1763_hc_portsc1_fields[] = {
Takashi Iwai 859c02
+static const u32 isp176x_hc_portsc1_fields[] = {
Takashi Iwai 859c02
 	[PORT_OWNER]		= BIT(13),
Takashi Iwai 859c02
 	[PORT_POWER]		= BIT(12),
Takashi Iwai 859c02
 	[PORT_LSTATUS]		= BIT(10),
Takashi Iwai 859c02
@@ -205,27 +205,28 @@ static u32 isp1760_hcd_read(struct usb_hcd *hcd, u32 field)
Takashi Iwai 859c02
 }
Takashi Iwai 859c02
 
Takashi Iwai 859c02
 /*
Takashi Iwai 859c02
- * We need, in isp1763, to write directly the values to the portsc1
Takashi Iwai 859c02
+ * We need, in isp176x, to write directly the values to the portsc1
Takashi Iwai 859c02
  * register so it will make the other values to trigger.
Takashi Iwai 859c02
  */
Takashi Iwai 859c02
 static void isp1760_hcd_portsc1_set_clear(struct isp1760_hcd *priv, u32 field,
Takashi Iwai 859c02
 					  u32 val)
Takashi Iwai 859c02
 {
Takashi Iwai 859c02
-	u32 bit = isp1763_hc_portsc1_fields[field];
Takashi Iwai 859c02
-	u32 port_status = readl(priv->base + ISP1763_HC_PORTSC1);
Takashi Iwai 859c02
+	u32 bit = isp176x_hc_portsc1_fields[field];
Takashi Iwai 859c02
+	u16 portsc1_reg = priv->is_isp1763 ? ISP1763_HC_PORTSC1 :
Takashi Iwai 859c02
+		ISP176x_HC_PORTSC1;
Takashi Iwai 859c02
+	u32 port_status = readl(priv->base + portsc1_reg);
Takashi Iwai 859c02
 
Takashi Iwai 859c02
 	if (val)
Takashi Iwai 859c02
-		writel(port_status | bit, priv->base + ISP1763_HC_PORTSC1);
Takashi Iwai 859c02
+		writel(port_status | bit, priv->base + portsc1_reg);
Takashi Iwai 859c02
 	else
Takashi Iwai 859c02
-		writel(port_status & ~bit, priv->base + ISP1763_HC_PORTSC1);
Takashi Iwai 859c02
+		writel(port_status & ~bit, priv->base + portsc1_reg);
Takashi Iwai 859c02
 }
Takashi Iwai 859c02
 
Takashi Iwai 859c02
 static void isp1760_hcd_write(struct usb_hcd *hcd, u32 field, u32 val)
Takashi Iwai 859c02
 {
Takashi Iwai 859c02
 	struct isp1760_hcd *priv = hcd_to_priv(hcd);
Takashi Iwai 859c02
 
Takashi Iwai 859c02
-	if (unlikely(priv->is_isp1763 &&
Takashi Iwai 859c02
-		     (field >= PORT_OWNER && field <= PORT_CONNECT)))
Takashi Iwai 859c02
+	if (unlikely((field >= PORT_OWNER && field <= PORT_CONNECT)))
Takashi Iwai 859c02
 		return isp1760_hcd_portsc1_set_clear(priv, field, val);
Takashi Iwai 859c02
 
Takashi Iwai 859c02
 	isp1760_field_write(priv->fields, field, val);
Takashi Iwai 859c02
@@ -367,8 +368,7 @@ static void isp1760_mem_read(struct usb_hcd *hcd, u32 src_offset, void *dst,
Takashi Iwai 859c02
 {
Takashi Iwai 859c02
 	struct isp1760_hcd *priv = hcd_to_priv(hcd);
Takashi Iwai 859c02
 
Takashi Iwai 859c02
-	isp1760_hcd_write(hcd, MEM_BANK_SEL, ISP_BANK_0);
Takashi Iwai 859c02
-	isp1760_hcd_write(hcd, MEM_START_ADDR, src_offset);
Takashi Iwai 859c02
+	isp1760_reg_write(priv->regs, ISP176x_HC_MEMORY, src_offset);
Takashi Iwai 859c02
 	ndelay(100);
Takashi Iwai 859c02
 
Takashi Iwai 859c02
 	bank_reads8(priv->base, src_offset, ISP_BANK_0, dst, bytes);
Takashi Iwai 859c02
@@ -496,8 +496,7 @@ static void isp1760_ptd_read(struct usb_hcd *hcd, u32 ptd_offset, u32 slot,
Takashi Iwai 859c02
 	u16 src_offset = ptd_offset + slot * sizeof(*ptd);
Takashi Iwai 859c02
 	struct isp1760_hcd *priv = hcd_to_priv(hcd);
Takashi Iwai 859c02
 
Takashi Iwai 859c02
-	isp1760_hcd_write(hcd, MEM_BANK_SEL, ISP_BANK_0);
Takashi Iwai 859c02
-	isp1760_hcd_write(hcd, MEM_START_ADDR, src_offset);
Takashi Iwai 859c02
+	isp1760_reg_write(priv->regs, ISP176x_HC_MEMORY, src_offset);
Takashi Iwai 859c02
 	ndelay(90);
Takashi Iwai 859c02
 
Takashi Iwai 859c02
 	bank_reads8(priv->base, src_offset, ISP_BANK_0, (void *)ptd,
Takashi Iwai 859c02
-- 
Takashi Iwai 859c02
2.26.2
Takashi Iwai 859c02