Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1220136
| From | Tomeu Vizoso <tomeu.vizoso@collabora.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH v4 02/22] ARM: amba: Move reading of periphid to pre_probe() |
| Date | 2015-09-07 14:40 +0200 |
| Message-ID | <q63Si-5E0-29@gated-at.bofh.it> (permalink) |
| References | <q63IB-5sL-5@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
Reading the periphid when the Primecell device is registered means that
the apb pclk must be available by then or the device won't be registered
at all.
By moving this code to pre_probe (to be called by the device-driver core
before the device is matched to a driver) we remove any order
requirements.
Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
---
Changes in v4:
- Added bus.pre_probe callback so the probes of Primecell devices can be
deferred if their device IDs cannot be yet read because of the clock
driver not having probed when they are registered. Maybe this goes
overboard and the matching information should be in the DT if there is
one.
Changes in v3: None
Changes in v2: None
drivers/amba/bus.c | 78 ++++++++++++++++++++++++++----------------------------
1 file changed, 38 insertions(+), 40 deletions(-)
diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c
index f0099360039e..1cbe43b4acd3 100644
--- a/drivers/amba/bus.c
+++ b/drivers/amba/bus.c
@@ -24,6 +24,8 @@
#define to_amba_driver(d) container_of(d, struct amba_driver, drv)
+static int amba_pre_probe(struct device *dev);
+
static const struct amba_id *
amba_lookup(const struct amba_id *table, struct amba_device *dev)
{
@@ -193,6 +195,7 @@ struct bus_type amba_bustype = {
.name = "amba",
.dev_attrs = amba_dev_attrs,
.match = amba_match,
+ .pre_probe = amba_pre_probe,
.uevent = amba_uevent,
.pm = &amba_pm,
};
@@ -336,44 +339,26 @@ static void amba_device_release(struct device *dev)
kfree(d);
}
-/**
- * amba_device_add - add a previously allocated AMBA device structure
- * @dev: AMBA device allocated by amba_device_alloc
- * @parent: resource parent for this devices resources
- *
- * Claim the resource, and read the device cell ID if not already
- * initialized. Register the AMBA device with the Linux device
- * manager.
- */
-int amba_device_add(struct amba_device *dev, struct resource *parent)
+static int amba_pre_probe(struct device *dev)
{
+ struct amba_device *d = to_amba_device(dev);
u32 size;
void __iomem *tmp;
int i, ret;
- WARN_ON(dev->irq[0] == (unsigned int)-1);
- WARN_ON(dev->irq[1] == (unsigned int)-1);
-
- ret = request_resource(parent, &dev->res);
- if (ret)
- goto err_out;
-
- /* Hard-coded primecell ID instead of plug-n-play */
- if (dev->periphid != 0)
- goto skip_probe;
+ if (d->periphid != 0)
+ return 0;
/*
* Dynamically calculate the size of the resource
* and use this for iomap
*/
- size = resource_size(&dev->res);
- tmp = ioremap(dev->res.start, size);
- if (!tmp) {
- ret = -ENOMEM;
- goto err_release;
- }
+ size = resource_size(&d->res);
+ tmp = ioremap(d->res.start, size);
+ if (!tmp)
+ return -ENOMEM;
- ret = amba_get_enable_pclk(dev);
+ ret = amba_get_enable_pclk(d);
if (ret == 0) {
u32 pid, cid;
@@ -388,37 +373,50 @@ int amba_device_add(struct amba_device *dev, struct resource *parent)
cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) <<
(i * 8);
- amba_put_disable_pclk(dev);
+ amba_put_disable_pclk(d);
if (cid == AMBA_CID || cid == CORESIGHT_CID)
- dev->periphid = pid;
+ d->periphid = pid;
- if (!dev->periphid)
+ if (!d->periphid)
ret = -ENODEV;
}
iounmap(tmp);
+ return ret;
+}
+
+/**
+ * amba_device_add - add a previously allocated AMBA device structure
+ * @dev: AMBA device allocated by amba_device_alloc
+ * @parent: resource parent for this devices resources
+ *
+ * Claim the resource, and register the AMBA device with the Linux device
+ * manager.
+ */
+int amba_device_add(struct amba_device *dev, struct resource *parent)
+{
+ int ret;
+
+ WARN_ON(dev->irq[0] == (unsigned int)-1);
+ WARN_ON(dev->irq[1] == (unsigned int)-1);
+
+ ret = request_resource(parent, &dev->res);
if (ret)
- goto err_release;
+ return ret;
- skip_probe:
ret = device_add(&dev->dev);
if (ret)
- goto err_release;
+ return ret;
if (dev->irq[0])
ret = device_create_file(&dev->dev, &dev_attr_irq0);
if (ret == 0 && dev->irq[1])
ret = device_create_file(&dev->dev, &dev_attr_irq1);
- if (ret == 0)
- return ret;
-
- device_unregister(&dev->dev);
+ if (ret)
+ device_unregister(&dev->dev);
- err_release:
- release_resource(&dev->res);
- err_out:
return ret;
}
EXPORT_SYMBOL_GPL(amba_device_add);
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH v4 0/22] On-demand device probing Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:30 +0200
[PATCH v4 13/22] backlight: Probe backlight devices on demand Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:30 +0200
[PATCH v4 05/22] gpio: Probe GPIO drivers on demand Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:30 +0200
[PATCH v4 03/22] of/platform: Point to struct device from device node Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:30 +0200
[PATCH v4 09/22] drm: Probe panels on demand Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:30 +0200
[PATCH v4 20/22] driver core: Allow deferring probes until late init Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:30 +0200
Re: [PATCH v4 20/22] driver core: Allow deferring probes until late init Mark Brown <broonie@kernel.org> - 2015-09-11 14:20 +0200
Re: [PATCH v4 20/22] driver core: Allow deferring probes until late init Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-14 11:10 +0200
[PATCH v4 14/22] usb: phy: Probe phy devices on demand Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:30 +0200
[PATCH v4 15/22] clk: Probe clk providers on demand Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:30 +0200
[PATCH v4 22/22] of/platform: Defer probes of registered devices Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:30 +0200
[PATCH v4 16/22] pinctrl: Probe pinctrl devices on demand Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:30 +0200
[PATCH v4 21/22] driver core: Start processing deferred probes earlier Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:30 +0200
Re: [PATCH v4 21/22] driver core: Start processing deferred probes earlier Mark Brown <broonie@kernel.org> - 2015-09-11 14:30 +0200
Re: [PATCH v4 21/22] driver core: Start processing deferred probes earlier Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-15 15:20 +0200
[PATCH v4 07/22] regulator: core: Reduce critical area in _regulator_get Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:40 +0200
Re: [PATCH v4 07/22] regulator: core: Reduce critical area in _regulator_get Mark Brown <broonie@kernel.org> - 2015-09-11 14:20 +0200
[PATCH v4 11/22] i2c: core: Probe i2c adapters and devices on demand Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:40 +0200
[PATCH v4 12/22] pwm: Probe PWM chip devices on demand Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:40 +0200
[PATCH v4 02/22] ARM: amba: Move reading of periphid to pre_probe() Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:40 +0200
[PATCH v4 01/22] driver core: Add pre_probe callback to bus_type Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:40 +0200
Re: [PATCH v4 01/22] driver core: Add pre_probe callback to bus_type Mark Brown <broonie@kernel.org> - 2015-09-11 14:10 +0200
[PATCH v4 10/22] drm/tegra: Probe dpaux devices on demand Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-07 14:40 +0200
Re: [PATCH v4 0/22] On-demand device probing Rob Herring <robherring2@gmail.com> - 2015-09-07 23:00 +0200
Re: [PATCH v4 0/22] On-demand device probing Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-08 09:40 +0200
Re: [PATCH v4 0/22] On-demand device probing Rob Herring <robh@kernel.org> - 2015-09-09 07:50 +0200
Re: [PATCH v4 0/22] On-demand device probing Tomeu Vizoso <tomeu.vizoso@collabora.com> - 2015-09-09 11:50 +0200
csiph-web