Skip to content

Commit 6ef4993

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 aae6ade commit 6ef4993

1 file changed

Lines changed: 40 additions & 45 deletions

File tree

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

Lines changed: 40 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -66,21 +66,18 @@
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) {
79-
dev_err(&pdev->dev,
80-
"Timed out on mailbox tx: 0x%llx\n",
81-
data);
82-
return -ETIMEDOUT;
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) {
76+
dev_err(&pdev->dev, "Timed out on mailbox tx: 0x%llx\n", data);
77+
return ret;
8378
}
79+
if (err)
80+
return err;
8481

8582
pci_write_config_dword(pdev, ASMT_CFG_DATA_WRITE0, data);
8683
pci_write_config_dword(pdev, ASMT_CFG_DATA_WRITE1, data >> 32);
@@ -93,19 +90,18 @@ static int asmedia_mbox_rx(struct pci_dev *pdev, u64 *data)
9390
{
9491
u8 op;
9592
u32 low, high;
96-
int i;
93+
int ret, err;
9794

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)) {
95+
ret = read_poll_timeout(pci_read_config_byte, err,
96+
err || (op & ASMT_CFG_CONTROL_READ),
97+
1, TIMEOUT_USEC, false, pdev, ASMT_CFG_CONTROL,
98+
&op);
99+
if (ret) {
106100
dev_err(&pdev->dev, "Timed out on mailbox rx\n");
107-
return -ETIMEDOUT;
101+
return ret;
108102
}
103+
if (err)
104+
return err;
109105

110106
pci_read_config_dword(pdev, ASMT_CFG_DATA_READ0, &low);
111107
pci_read_config_dword(pdev, ASMT_CFG_DATA_READ1, &high);
@@ -223,8 +219,8 @@ static int asmedia_read_reg(struct usb_hcd *hcd, u16 addr, u8 *val) {
223219

224220
static int asmedia_write_reg(struct usb_hcd *hcd, u16 addr, u8 data, bool wait) {
225221
void __iomem *regs = hcd->regs;
226-
u8 status;
227-
int ret, i;
222+
u8 status, val;
223+
int ret, err;
228224

229225
writew_relaxed(addr, regs + ASMT_REG_ADDR);
230226

@@ -255,19 +251,19 @@ static int asmedia_write_reg(struct usb_hcd *hcd, u16 addr, u8 data, bool wait)
255251
if (!wait)
256252
return 0;
257253

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) {
254+
ret = read_poll_timeout(asmedia_read_reg, err, err || val == data,
255+
0, TIMEOUT_USEC, false, hcd, addr, &val);
256+
if (ret) {
267257
dev_err(hcd->self.controller,
268258
"Verify register timed out ([%04x] = %02x)\n",
269259
addr, data);
270-
return -ETIMEDOUT;
260+
return ret;
261+
}
262+
if (err) {
263+
dev_err(hcd->self.controller,
264+
"Verify register read error ([%04x] = %02x)\n",
265+
addr, data);
266+
return err;
271267
}
272268

273269
return 0;
@@ -282,7 +278,7 @@ static int asmedia_load_fw(struct pci_dev *pdev, const struct firmware *fw)
282278
u32 data;
283279
size_t index = 0, addr = 0;
284280
size_t words = fw->size >> 1;
285-
int ret, i;
281+
int ret, err;
286282

287283
hcd = dev_get_drvdata(&pdev->dev);
288284
regs = hcd->regs;
@@ -328,17 +324,16 @@ static int asmedia_load_fw(struct pci_dev *pdev, const struct firmware *fw)
328324

329325
writel_relaxed(data, regs + ASMT_REG_CODE_WDATA);
330326

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) {
327+
ret = read_poll_timeout(pci_read_config_word, err,
328+
err || (raddr != addr),
329+
1, TIMEOUT_USEC, false, pdev,
330+
ASMT_CFG_SRAM_ADDR, &raddr);
331+
if (ret) {
339332
dev_err(hcd->self.controller, "Word write timed out\n");
340-
return -ETIMEDOUT;
333+
return ret;
341334
}
335+
if (err)
336+
return err;
342337

343338
if (++index & 0x4000)
344339
index += 0x4000;

0 commit comments

Comments
 (0)