Re: [RFC 1/7] capebus: Core capebus support
From: Russ Dill <hidden>
Date: 2012-11-01 00:55:33
Also in:
linux-arm-kernel, linux-omap, lkml
On Wed, Oct 31, 2012 at 3:07 PM, Pantelis Antoniou [off-list ref] wrote:
On Oct 31, 2012, at 11:55 PM, Russ Dill wrote:quoted
On Wed, Oct 31, 2012 at 9:52 AM, Pantelis Antoniou [off-list ref] wrote:quoted
Introducing capebus; a bus that allows small boards (capes) to connect to a complex SoC using simple expansion connectors.[snip]quoted
quoted
+ if (drv) { + /* call the removed bus method (if added prev.) */ + if (cape_dev->added) { + BUG_ON(cape_dev->bus == NULL); + BUG_ON(cape_dev->bus->ops == NULL); + if (cape_dev->bus->ops->dev_removed) + cape_dev->bus->ops->dev_removed(cape_dev); + cape_dev->added = 0; + }Is there any case where added will not track drv?Yes, there is a corner case here. There is the case where while the device is created there is no matching driver yet. Either that's the case of a not supported cape, or the cape driver hasn't been loaded yet. We do need the device to be created, so that the user can browse in the sysfs it's eeprom attributes. There's some further complications with runtime cape overrides, but that's the gist of it.
I'm trying to figure out how that would come about, here is where
added is set to 1:
+ /* all is fine... */
+ cape_dev->driver = drv;
+ cape_dev->added = 1;
This is after calling drv->probe, so drv is not null.
There is a brief time here where added is 0, but driver is not.
+ if (drv) {
+ /* call the removed bus method (if added prev.) */
+ if (cape_dev->added) {
+ BUG_ON(cape_dev->bus == NULL);
+ BUG_ON(cape_dev->bus->ops == NULL);
+ if (cape_dev->bus->ops->dev_removed)
+ cape_dev->bus->ops->dev_removed(cape_dev);
+ cape_dev->added = 0;
+ }
+ if (drv->remove) {
+ pm_runtime_get_sync(dev);
+ drv->remove(cape_dev);
+ pm_runtime_put_noidle(dev);
+ }
+ cape_dev->driver = NULL;
Is one of the remove or resume functions check added in this case?