hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/bus/sunxi-rsb.c
....@@ -224,6 +224,8 @@
224224
225225 dev_dbg(&rdev->dev, "device %s registered\n", dev_name(&rdev->dev));
226226
227
+ return rdev;
228
+
227229 err_device_add:
228230 put_device(&rdev->dev);
229231
....@@ -266,6 +268,9 @@
266268 /* common code that starts a transfer */
267269 static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb)
268270 {
271
+ u32 int_mask, status;
272
+ bool timeout;
273
+
269274 if (readl(rsb->regs + RSB_CTRL) & RSB_CTRL_START_TRANS) {
270275 dev_dbg(rsb->dev, "RSB transfer still in progress\n");
271276 return -EBUSY;
....@@ -273,13 +278,23 @@
273278
274279 reinit_completion(&rsb->complete);
275280
276
- writel(RSB_INTS_LOAD_BSY | RSB_INTS_TRANS_ERR | RSB_INTS_TRANS_OVER,
277
- rsb->regs + RSB_INTE);
281
+ int_mask = RSB_INTS_LOAD_BSY | RSB_INTS_TRANS_ERR | RSB_INTS_TRANS_OVER;
282
+ writel(int_mask, rsb->regs + RSB_INTE);
278283 writel(RSB_CTRL_START_TRANS | RSB_CTRL_GLOBAL_INT_ENB,
279284 rsb->regs + RSB_CTRL);
280285
281
- if (!wait_for_completion_io_timeout(&rsb->complete,
282
- msecs_to_jiffies(100))) {
286
+ if (irqs_disabled()) {
287
+ timeout = readl_poll_timeout_atomic(rsb->regs + RSB_INTS,
288
+ status, (status & int_mask),
289
+ 10, 100000);
290
+ writel(status, rsb->regs + RSB_INTS);
291
+ } else {
292
+ timeout = !wait_for_completion_io_timeout(&rsb->complete,
293
+ msecs_to_jiffies(100));
294
+ status = rsb->status;
295
+ }
296
+
297
+ if (timeout) {
283298 dev_dbg(rsb->dev, "RSB timeout\n");
284299
285300 /* abort the transfer */
....@@ -291,18 +306,18 @@
291306 return -ETIMEDOUT;
292307 }
293308
294
- if (rsb->status & RSB_INTS_LOAD_BSY) {
309
+ if (status & RSB_INTS_LOAD_BSY) {
295310 dev_dbg(rsb->dev, "RSB busy\n");
296311 return -EBUSY;
297312 }
298313
299
- if (rsb->status & RSB_INTS_TRANS_ERR) {
300
- if (rsb->status & RSB_INTS_TRANS_ERR_ACK) {
314
+ if (status & RSB_INTS_TRANS_ERR) {
315
+ if (status & RSB_INTS_TRANS_ERR_ACK) {
301316 dev_dbg(rsb->dev, "RSB slave nack\n");
302317 return -EINVAL;
303318 }
304319
305
- if (rsb->status & RSB_INTS_TRANS_ERR_DATA) {
320
+ if (status & RSB_INTS_TRANS_ERR_DATA) {
306321 dev_dbg(rsb->dev, "RSB transfer data error\n");
307322 return -EIO;
308323 }
....@@ -651,10 +666,8 @@
651666 return PTR_ERR(rsb->regs);
652667
653668 irq = platform_get_irq(pdev, 0);
654
- if (irq < 0) {
655
- dev_err(dev, "failed to retrieve irq: %d\n", irq);
669
+ if (irq < 0)
656670 return irq;
657
- }
658671
659672 rsb->clk = devm_clk_get(dev, NULL);
660673 if (IS_ERR(rsb->clk)) {
....@@ -768,7 +781,13 @@
768781 return ret;
769782 }
770783
771
- return platform_driver_register(&sunxi_rsb_driver);
784
+ ret = platform_driver_register(&sunxi_rsb_driver);
785
+ if (ret) {
786
+ bus_unregister(&sunxi_rsb_bus);
787
+ return ret;
788
+ }
789
+
790
+ return 0;
772791 }
773792 module_init(sunxi_rsb_init);
774793