On Mon, Nov 21, 2016 at 11:31 AM, Russell King - ARM Linux <linux@xxxxxxxxxxxxxxx> wrote: > Passing data between drivers using *_set_drvdata() is a layering > violation: > > 1. Driver data is supposed to be driver private data associated with > the currently bound driver. > 2. The driver data pointer is NULL'd when the driver unbinds from the > device. See __device_release_driver() and the > dev_set_drvdata(dev, NULL). > 3. It will break with CONFIG_DEBUG_TEST_DRIVER_REMOVE enabled for a > similar reason to (2). > > So, do not pass data between drivers using *_set_drvdata() - any > examples in the kernel already are founded on bad practice, are > fragile, and are already broken for some kernel configurations. After inspecting mfd_add_device, it seems that it creates a platform_device which has the parent set to the driver calling the function. Isn't module unloading forbidden if there is a parent->child relationship in place and you're removing the parent? What should be the best practice to share data between drivers? Reference counted data? In the case of TWL, the twl-core is just a simple container for regmaps - all other "sub devices" are using those regmaps to access the I2C device's registers, it makes no sense to remove the parent driver since it does *nothing*. -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html