media_device is embedded in struct vimc_device and when vimc is removed vimc_device and the embedded media_device goes with it, while the active stream and vimc_capture continue to access it. Fix the media_device lifetime problem by changing vimc to create shared media_device using Media Device Allocator API and vimc_capture getting a reference to vimc module. With this change, vimc module can be removed only when the references are gone. vimc can be removed after vimc_capture is removed. Media Device Allocator API supports just USB devices. Enhance it adding a genetic device allocate interface to support other media drivers. The new interface takes pointer to struct device instead and creates media device. This interface allows a group of drivers that have a common root device to share media device resource and ensure media device doesn't get deleted as long as one of the drivers holds its reference. The new interface has been tested with vimc component driver to fix panics when vimc module is removed while streaming is in progress. Shuah Khan (2): media: add generic device allocate interface to media-dev-allocator vimc: fix BUG: unable to handle kernel NULL pointer dereference drivers/media/Makefile | 4 +- drivers/media/media-dev-allocator.c | 39 ++++++++++++++ drivers/media/platform/vimc/vimc-capture.c | 17 +++++- drivers/media/platform/vimc/vimc-core.c | 60 ++++++++++++---------- include/media/media-dev-allocator.h | 46 ++++++++++++++--- 5 files changed, 130 insertions(+), 36 deletions(-) -- 2.17.1