Messages in this thread Patch in this message | | | Date | Mon, 15 Aug 2022 11:43:10 -0700 | From | Isaac Manjarres <> | Subject | Re: [PATCH v6] amba: Remove deferred device addition |
| |
On Fri, Aug 12, 2022 at 08:30:46AM -0700, Guenter Roeck wrote: > After more testing: the changes above result in qemu sx1 boot failures. > There is no crash, boot just hangs. > > qemu command line: > > qemu-system-arm -M sx1 -kernel arch/arm/boot/zImage -no-reboot \ > -initrd rootfs-armv4.cpio \ > --append "rdinit=/sbin/init console=ttyS0,115200 earlycon=uart8250,mmio32,0xfffb0000,115200n8" \ > -nographic -monitor null -serial stdio > > with configuration from > https://github.com/groeck/linux-build-test/blob/master/rootfs/arm/qemu_sx1_defconfig > and root file system from > https://github.com/groeck/linux-build-test/blob/master/rootfs/arm/rootfs-armv4.cpio.gz > > This is with your other patch applied. > > Guenter
Thanks for testing out the patch and sharing the qemu commandline you used for the new issue. I was able to reproduce it on my end :) Can you please try the following patch instead of the second patch I gave you? This worked for me on sx1 and versatileab:
diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index 32b0e0b930c1..110a535648d2 100644 --- a/drivers/amba/bus.c +++ b/drivers/amba/bus.c @@ -209,6 +209,7 @@ static int amba_match(struct device *dev, struct device_driver *drv) struct amba_device *pcdev = to_amba_device(dev); struct amba_driver *pcdrv = to_amba_driver(drv);
+ mutex_lock(&pcdev->periphid_lock); if (!pcdev->periphid) { int ret = amba_read_periphid(pcdev);
@@ -218,11 +219,14 @@ static int amba_match(struct device *dev, struct device_driver *drv) * permanent failure in reading pid and cid, simply map it to * -EPROBE_DEFER. */ - if (ret) + if (ret) { + mutex_unlock(&pcdev->periphid_lock); return -EPROBE_DEFER; + } dev_set_uevent_suppress(dev, false); kobject_uevent(&dev->kobj, KOBJ_ADD); } + mutex_unlock(&pcdev->periphid_lock);
/* When driver_override is set, only bind to the matching driver */ if (pcdev->driver_override) @@ -532,6 +536,7 @@ static void amba_device_release(struct device *dev)
if (d->res.parent) release_resource(&d->res); + mutex_destroy(&d->periphid_lock); kfree(d); }
@@ -584,6 +589,7 @@ static void amba_device_initialize(struct amba_device *dev, const char *name) dev->dev.dma_mask = &dev->dev.coherent_dma_mask; dev->dev.dma_parms = &dev->dma_parms; dev->res.name = dev_name(&dev->dev); + mutex_init(&dev->periphid_lock); }
/** diff --git a/include/linux/amba/bus.h b/include/linux/amba/bus.h index e94cdf235f1d..5001e14c5c06 100644 --- a/include/linux/amba/bus.h +++ b/include/linux/amba/bus.h @@ -67,6 +67,7 @@ struct amba_device { struct clk *pclk; struct device_dma_parameters dma_parms; unsigned int periphid; + struct mutex periphid_lock; unsigned int cid; struct amba_cs_uci_id uci; unsigned int irq[AMBA_NR_IRQS];
Thanks, Isaac
| |