Skip to content

Commit 21e6945

Browse files
kettenisjannau
authored andcommitted
xhci-pci: asmedia: Use read_poll_timeout()
Use read_poll_timeout() instead of open coding timeout loops. Suggested in the upstream submission of the same change to u-boot. Signed-off-by: Mark Kettenis <kettenis@openbsd.org> Signed-off-by: Janne Grunau <j@jannau.net>
1 parent 0ec70c5 commit 21e6945

1 file changed

Lines changed: 39 additions & 42 deletions

File tree

drivers/usb/host/xhci-pci-asmedia.c

Lines changed: 39 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -66,21 +66,20 @@
6666
static int asmedia_mbox_tx(struct pci_dev *pdev, u64 data)
6767
{
6868
u8 op;
69-
int i;
69+
int ret, err;
7070

71-
for (i = 0; i < TIMEOUT_USEC; i++) {
72-
pci_read_config_byte(pdev, ASMT_CFG_CONTROL, &op);
73-
if (!(op & ASMT_CFG_CONTROL_WRITE))
74-
break;
75-
udelay(1);
76-
}
77-
78-
if (op & ASMT_CFG_CONTROL_WRITE) {
71+
ret = read_poll_timeout(pci_read_config_byte, err,
72+
err || !(op & ASMT_CFG_CONTROL_WRITE),
73+
1, TIMEOUT_USEC, false, pdev, ASMT_CFG_CONTROL,
74+
&op);
75+
if (ret) {
7976
dev_err(&pdev->dev,
8077
"Timed out on mailbox tx: 0x%llx\n",
8178
data);
82-
return -ETIMEDOUT;
79+
return ret;
8380
}
81+
if (err)
82+
return err;
8483

8584
pci_write_config_dword(pdev, ASMT_CFG_DATA_WRITE0, data);
8685
pci_write_config_dword(pdev, ASMT_CFG_DATA_WRITE1, data >> 32);
@@ -93,19 +92,18 @@ static int asmedia_mbox_rx(struct pci_dev *pdev, u64 *data)
9392
{
9493
u8 op;
9594
u32 low, high;
96-
int i;
95+
int ret, err;
9796

98-
for (i = 0; i < TIMEOUT_USEC; i++) {
99-
pci_read_config_byte(pdev, ASMT_CFG_CONTROL, &op);
100-
if (op & ASMT_CFG_CONTROL_READ)
101-
break;
102-
udelay(1);
103-
}
104-
105-
if (!(op & ASMT_CFG_CONTROL_READ)) {
97+
ret = read_poll_timeout(pci_read_config_byte, err,
98+
err || (op & ASMT_CFG_CONTROL_READ),
99+
1, TIMEOUT_USEC, false, pdev, ASMT_CFG_CONTROL,
100+
&op);
101+
if (ret) {
106102
dev_err(&pdev->dev, "Timed out on mailbox rx\n");
107-
return -ETIMEDOUT;
103+
return ret;
108104
}
105+
if (err)
106+
return err;
109107

110108
pci_read_config_dword(pdev, ASMT_CFG_DATA_READ0, &low);
111109
pci_read_config_dword(pdev, ASMT_CFG_DATA_READ1, &high);
@@ -223,8 +221,8 @@ static int asmedia_read_reg(struct usb_hcd *hcd, u16 addr, u8 *val) {
223221

224222
static int asmedia_write_reg(struct usb_hcd *hcd, u16 addr, u8 data, bool wait) {
225223
void __iomem *regs = hcd->regs;
226-
u8 status;
227-
int ret, i;
224+
u8 status, val;
225+
int ret, err;
228226

229227
writew_relaxed(addr, regs + ASMT_REG_ADDR);
230228

@@ -255,19 +253,19 @@ static int asmedia_write_reg(struct usb_hcd *hcd, u16 addr, u8 data, bool wait)
255253
if (!wait)
256254
return 0;
257255

258-
for (i = 0; i < TIMEOUT_USEC; i++) {
259-
ret = asmedia_read_reg(hcd, addr, &status);
260-
if (ret)
261-
return ret;
262-
if (status == data)
263-
break;
264-
}
265-
266-
if (i >= TIMEOUT_USEC) {
256+
ret = read_poll_timeout(asmedia_read_reg, err, err || val == data,
257+
0, TIMEOUT_USEC, false, hcd, addr, &val);
258+
if (ret) {
267259
dev_err(hcd->self.controller,
268260
"Verify register timed out ([%04x] = %02x)\n",
269261
addr, data);
270-
return -ETIMEDOUT;
262+
return ret;
263+
}
264+
if (err) {
265+
dev_err(hcd->self.controller,
266+
"Verify register read error ([%04x] = %02x)\n",
267+
addr, data);
268+
return err;
271269
}
272270

273271
return 0;
@@ -282,7 +280,7 @@ static int asmedia_load_fw(struct pci_dev *pdev, const struct firmware *fw)
282280
u32 data;
283281
size_t index = 0, addr = 0;
284282
size_t words = fw->size >> 1;
285-
int ret, i;
283+
int ret, err;
286284

287285
hcd = dev_get_drvdata(&pdev->dev);
288286
regs = hcd->regs;
@@ -328,17 +326,16 @@ static int asmedia_load_fw(struct pci_dev *pdev, const struct firmware *fw)
328326

329327
writel_relaxed(data, regs + ASMT_REG_CODE_WDATA);
330328

331-
for (i = 0; i < TIMEOUT_USEC; i++) {
332-
pci_read_config_word(pdev, ASMT_CFG_SRAM_ADDR, &raddr);
333-
if (raddr != addr)
334-
break;
335-
udelay(1);
336-
}
337-
338-
if (raddr == addr) {
329+
ret = read_poll_timeout(pci_read_config_word, err,
330+
err || (raddr != addr),
331+
1, TIMEOUT_USEC, false, pdev,
332+
ASMT_CFG_SRAM_ADDR, &raddr);
333+
if (ret) {
339334
dev_err(hcd->self.controller, "Word write timed out\n");
340-
return -ETIMEDOUT;
335+
return ret;
341336
}
337+
if (err)
338+
return err;
342339

343340
if (++index & 0x4000)
344341
index += 0x4000;

0 commit comments

Comments
 (0)