Hi Eugen, On 02/11/2022 14:14, Eugen Hristev wrote: > The Atmel ISC driver is not compliant with media controller specification. > In order to evolve this driver, it has to move to media controller, to > support enhanced features and future products which embed it. > The move to media controller involves several changes which are > not backwards compatible with the current usability of the driver. > > The best example is the way the format is propagated from the top video > driver /dev/videoX down to the sensor. > > In a simple configuration sensor ==> isc , the isc just calls subdev s_fmt > and controls the sensor directly. This is achieved by having a lot of code > inside the driver that will query the subdev at probe time and make a list > of formats which are usable. > Basically the user has nothing to configure, as the isc will handle > everything at the top level. This is an easy way to capture, but also comes > with the drawback of lack of flexibility. > In a more complicated pipeline > sensor ==> controller 1 ==> controller 2 ==> isc > this will not be achievable, as controller 1 and controller 2 might be > media-controller configurable, and will not propagate the formats down to > the sensor. > > After discussions with the media maintainers, the decision is to move > Atmel ISC to staging as-is, to keep the Kconfig symbols and the users > to the driver in staging. Thus, all the existing users of the non > media-controller paradigm will continue to be happy and use the old config > way. > > The next step is to readd the driver in the media subsystem with a different > symbol, with the conversion to media controller done, and new users > of the driver will be able to use all the new features. > > This patch is merely a file move to staging, not affecting any of the users. > > The exported symbols had to be renamed to atmel_* to avoid duplication when > the future Microchip ISC driver will be added to media subsystem. > > Signed-off-by: Eugen Hristev <eugen.hristev@xxxxxxxxxxxxx> > --- > MAINTAINERS | 4 +- > drivers/media/platform/atmel/Kconfig | 36 ----------------- > drivers/media/platform/atmel/Makefile | 6 --- > drivers/staging/media/Kconfig | 2 + > drivers/staging/media/Makefile | 1 + > drivers/staging/media/atmel/Kconfig | 40 +++++++++++++++++++ > drivers/staging/media/atmel/Makefile | 8 ++++ > .../media}/atmel/atmel-isc-base.c | 20 +++++----- > .../media}/atmel/atmel-isc-clk.c | 8 ++-- > .../media}/atmel/atmel-isc-regs.h | 0 > .../media}/atmel/atmel-isc.h | 16 ++++---- > .../media}/atmel/atmel-sama5d2-isc.c | 18 ++++----- > .../media}/atmel/atmel-sama7g5-isc.c | 18 ++++----- > 13 files changed, 93 insertions(+), 84 deletions(-) > create mode 100644 drivers/staging/media/atmel/Kconfig > create mode 100644 drivers/staging/media/atmel/Makefile > rename drivers/{media/platform => staging/media}/atmel/atmel-isc-base.c (99%) > rename drivers/{media/platform => staging/media}/atmel/atmel-isc-clk.c (97%) > rename drivers/{media/platform => staging/media}/atmel/atmel-isc-regs.h (100%) > rename drivers/{media/platform => staging/media}/atmel/atmel-isc.h (96%) > rename drivers/{media/platform => staging/media}/atmel/atmel-sama5d2-isc.c (97%) > rename drivers/{media/platform => staging/media}/atmel/atmel-sama7g5-isc.c (97%) A new 'deprecated' directory was created for drivers that are marked as deprecated (like this one). Please update this patch for that. Also add a TODO file explaining why it is deprecated, what replaces it, and when it will be removed (I would set that to 2-3 years in the future). The Kconfig should also be updated to prevent building this deprecated driver if the new driver is selected, unless COMPILE_TEST is also set. To be honest, I wonder if it wouldn't be better to do the move to staging as the last patch of the series. It's more logical in the patch sequence. Regards, Hans > > diff --git a/MAINTAINERS b/MAINTAINERS > index 307775bfbf99..8b28d8d4c55e 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -13488,8 +13488,8 @@ L: linux-media@xxxxxxxxxxxxxxx > S: Supported > F: Documentation/devicetree/bindings/media/atmel,isc.yaml > F: Documentation/devicetree/bindings/media/microchip,xisc.yaml > -F: drivers/media/platform/atmel/atmel-isc* > -F: drivers/media/platform/atmel/atmel-sama*-isc* > +F: drivers/staging/media/atmel/atmel-isc* > +F: drivers/staging/media/atmel/atmel-sama*-isc* > F: include/linux/atmel-isc-media.h > > MICROCHIP ISI DRIVER > diff --git a/drivers/media/platform/atmel/Kconfig b/drivers/media/platform/atmel/Kconfig > index f399dba62e17..f438a98542e8 100644 > --- a/drivers/media/platform/atmel/Kconfig > +++ b/drivers/media/platform/atmel/Kconfig > @@ -2,42 +2,6 @@ > > comment "Atmel media platform drivers" > > -config VIDEO_ATMEL_ISC > - tristate "ATMEL Image Sensor Controller (ISC) support" > - depends on V4L_PLATFORM_DRIVERS > - depends on VIDEO_DEV && COMMON_CLK > - depends on ARCH_AT91 || COMPILE_TEST > - select MEDIA_CONTROLLER > - select VIDEO_V4L2_SUBDEV_API > - select VIDEOBUF2_DMA_CONTIG > - select REGMAP_MMIO > - select V4L2_FWNODE > - select VIDEO_ATMEL_ISC_BASE > - help > - This module makes the ATMEL Image Sensor Controller available > - as a v4l2 device. > - > -config VIDEO_ATMEL_XISC > - tristate "ATMEL eXtended Image Sensor Controller (XISC) support" > - depends on V4L_PLATFORM_DRIVERS > - depends on VIDEO_DEV && COMMON_CLK > - depends on ARCH_AT91 || COMPILE_TEST > - select VIDEOBUF2_DMA_CONTIG > - select REGMAP_MMIO > - select V4L2_FWNODE > - select VIDEO_ATMEL_ISC_BASE > - select MEDIA_CONTROLLER > - select VIDEO_V4L2_SUBDEV_API > - help > - This module makes the ATMEL eXtended Image Sensor Controller > - available as a v4l2 device. > - > -config VIDEO_ATMEL_ISC_BASE > - tristate > - default n > - help > - ATMEL ISC and XISC common code base. > - > config VIDEO_ATMEL_ISI > tristate "ATMEL Image Sensor Interface (ISI) support" > depends on V4L_PLATFORM_DRIVERS > diff --git a/drivers/media/platform/atmel/Makefile b/drivers/media/platform/atmel/Makefile > index 794e8f739287..86f77030e6e2 100644 > --- a/drivers/media/platform/atmel/Makefile > +++ b/drivers/media/platform/atmel/Makefile > @@ -1,10 +1,4 @@ > # SPDX-License-Identifier: GPL-2.0-only > -atmel-isc-objs = atmel-sama5d2-isc.o > -atmel-xisc-objs = atmel-sama7g5-isc.o > -atmel-isc-common-objs = atmel-isc-base.o atmel-isc-clk.o > > obj-$(CONFIG_VIDEO_ATMEL_ISI) += atmel-isi.o > -obj-$(CONFIG_VIDEO_ATMEL_ISC_BASE) += atmel-isc-common.o > -obj-$(CONFIG_VIDEO_ATMEL_ISC) += atmel-isc.o > -obj-$(CONFIG_VIDEO_ATMEL_XISC) += atmel-xisc.o > obj-$(CONFIG_VIDEO_MICROCHIP_CSI2DC) += microchip-csi2dc.o > diff --git a/drivers/staging/media/Kconfig b/drivers/staging/media/Kconfig > index d4f03b203ae5..072fab838374 100644 > --- a/drivers/staging/media/Kconfig > +++ b/drivers/staging/media/Kconfig > @@ -20,6 +20,8 @@ menuconfig STAGING_MEDIA > if STAGING_MEDIA && MEDIA_SUPPORT > > # Please keep them in alphabetic order > +source "drivers/staging/media/atmel/Kconfig" > + > source "drivers/staging/media/atomisp/Kconfig" > > source "drivers/staging/media/imx/Kconfig" > diff --git a/drivers/staging/media/Makefile b/drivers/staging/media/Makefile > index a387692b84f2..dbfeb03ea41f 100644 > --- a/drivers/staging/media/Makefile > +++ b/drivers/staging/media/Makefile > @@ -1,4 +1,5 @@ > # SPDX-License-Identifier: GPL-2.0 > +obj-$(CONFIG_VIDEO_ATMEL_ISC_BASE) += atmel/ > obj-$(CONFIG_INTEL_ATOMISP) += atomisp/ > obj-$(CONFIG_VIDEO_CPIA2) += deprecated/cpia2/ > obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx/ > diff --git a/drivers/staging/media/atmel/Kconfig b/drivers/staging/media/atmel/Kconfig > new file mode 100644 > index 000000000000..73cef959f236 > --- /dev/null > +++ b/drivers/staging/media/atmel/Kconfig > @@ -0,0 +1,40 @@ > +# SPDX-License-Identifier: GPL-2.0-only > + > +comment "Atmel media platform drivers" > + > +config VIDEO_ATMEL_ISC > + tristate "ATMEL Image Sensor Controller (ISC) support" > + depends on V4L_PLATFORM_DRIVERS > + depends on VIDEO_DEV && COMMON_CLK > + depends on ARCH_AT91 || COMPILE_TEST > + select MEDIA_CONTROLLER > + select VIDEO_V4L2_SUBDEV_API > + select VIDEOBUF2_DMA_CONTIG > + select REGMAP_MMIO > + select V4L2_FWNODE > + select VIDEO_ATMEL_ISC_BASE > + help > + This module makes the ATMEL Image Sensor Controller available > + as a v4l2 device. > + > +config VIDEO_ATMEL_XISC > + tristate "ATMEL eXtended Image Sensor Controller (XISC) support" > + depends on V4L_PLATFORM_DRIVERS > + depends on VIDEO_DEV && COMMON_CLK > + depends on ARCH_AT91 || COMPILE_TEST > + select VIDEOBUF2_DMA_CONTIG > + select REGMAP_MMIO > + select V4L2_FWNODE > + select VIDEO_ATMEL_ISC_BASE > + select MEDIA_CONTROLLER > + select VIDEO_V4L2_SUBDEV_API > + help > + This module makes the ATMEL eXtended Image Sensor Controller > + available as a v4l2 device. > + > +config VIDEO_ATMEL_ISC_BASE > + tristate > + default n > + help > + ATMEL ISC and XISC common code base. > + > diff --git a/drivers/staging/media/atmel/Makefile b/drivers/staging/media/atmel/Makefile > new file mode 100644 > index 000000000000..34eaeeac5bba > --- /dev/null > +++ b/drivers/staging/media/atmel/Makefile > @@ -0,0 +1,8 @@ > +# SPDX-License-Identifier: GPL-2.0-only > +atmel-isc-objs = atmel-sama5d2-isc.o > +atmel-xisc-objs = atmel-sama7g5-isc.o > +atmel-isc-common-objs = atmel-isc-base.o atmel-isc-clk.o > + > +obj-$(CONFIG_VIDEO_ATMEL_ISC_BASE) += atmel-isc-common.o > +obj-$(CONFIG_VIDEO_ATMEL_ISC) += atmel-isc.o > +obj-$(CONFIG_VIDEO_ATMEL_XISC) += atmel-xisc.o > diff --git a/drivers/media/platform/atmel/atmel-isc-base.c b/drivers/staging/media/atmel/atmel-isc-base.c > similarity index 99% > rename from drivers/media/platform/atmel/atmel-isc-base.c > rename to drivers/staging/media/atmel/atmel-isc-base.c > index 9e5317a7d516..99e61bbfc9bc 100644 > --- a/drivers/media/platform/atmel/atmel-isc-base.c > +++ b/drivers/staging/media/atmel/atmel-isc-base.c > @@ -1221,7 +1221,7 @@ static const struct v4l2_file_operations isc_fops = { > .poll = vb2_fop_poll, > }; > > -irqreturn_t isc_interrupt(int irq, void *dev_id) > +irqreturn_t atmel_isc_interrupt(int irq, void *dev_id) > { > struct isc_device *isc = (struct isc_device *)dev_id; > struct regmap *regmap = isc->regmap; > @@ -1267,7 +1267,7 @@ irqreturn_t isc_interrupt(int irq, void *dev_id) > > return ret; > } > -EXPORT_SYMBOL_GPL(isc_interrupt); > +EXPORT_SYMBOL_GPL(atmel_isc_interrupt); > > static void isc_hist_count(struct isc_device *isc, u32 *min, u32 *max) > { > @@ -1934,14 +1934,14 @@ static int isc_async_complete(struct v4l2_async_notifier *notifier) > return ret; > } > > -const struct v4l2_async_notifier_operations isc_async_ops = { > +const struct v4l2_async_notifier_operations atmel_isc_async_ops = { > .bound = isc_async_bound, > .unbind = isc_async_unbind, > .complete = isc_async_complete, > }; > -EXPORT_SYMBOL_GPL(isc_async_ops); > +EXPORT_SYMBOL_GPL(atmel_isc_async_ops); > > -void isc_subdev_cleanup(struct isc_device *isc) > +void atmel_isc_subdev_cleanup(struct isc_device *isc) > { > struct isc_subdev_entity *subdev_entity; > > @@ -1952,9 +1952,9 @@ void isc_subdev_cleanup(struct isc_device *isc) > > INIT_LIST_HEAD(&isc->subdev_entities); > } > -EXPORT_SYMBOL_GPL(isc_subdev_cleanup); > +EXPORT_SYMBOL_GPL(atmel_isc_subdev_cleanup); > > -int isc_pipeline_init(struct isc_device *isc) > +int atmel_isc_pipeline_init(struct isc_device *isc) > { > struct device *dev = isc->dev; > struct regmap *regmap = isc->regmap; > @@ -1993,17 +1993,17 @@ int isc_pipeline_init(struct isc_device *isc) > > return 0; > } > -EXPORT_SYMBOL_GPL(isc_pipeline_init); > +EXPORT_SYMBOL_GPL(atmel_isc_pipeline_init); > > /* regmap configuration */ > #define ATMEL_ISC_REG_MAX 0xd5c > -const struct regmap_config isc_regmap_config = { > +const struct regmap_config atmel_isc_regmap_config = { > .reg_bits = 32, > .reg_stride = 4, > .val_bits = 32, > .max_register = ATMEL_ISC_REG_MAX, > }; > -EXPORT_SYMBOL_GPL(isc_regmap_config); > +EXPORT_SYMBOL_GPL(atmel_isc_regmap_config); > > MODULE_AUTHOR("Songjun Wu"); > MODULE_AUTHOR("Eugen Hristev"); > diff --git a/drivers/media/platform/atmel/atmel-isc-clk.c b/drivers/staging/media/atmel/atmel-isc-clk.c > similarity index 97% > rename from drivers/media/platform/atmel/atmel-isc-clk.c > rename to drivers/staging/media/atmel/atmel-isc-clk.c > index 2059fe376b00..d442b5f4c931 100644 > --- a/drivers/media/platform/atmel/atmel-isc-clk.c > +++ b/drivers/staging/media/atmel/atmel-isc-clk.c > @@ -277,7 +277,7 @@ static int isc_clk_register(struct isc_device *isc, unsigned int id) > return 0; > } > > -int isc_clk_init(struct isc_device *isc) > +int atmel_isc_clk_init(struct isc_device *isc) > { > unsigned int i; > int ret; > @@ -293,9 +293,9 @@ int isc_clk_init(struct isc_device *isc) > > return 0; > } > -EXPORT_SYMBOL_GPL(isc_clk_init); > +EXPORT_SYMBOL_GPL(atmel_isc_clk_init); > > -void isc_clk_cleanup(struct isc_device *isc) > +void atmel_isc_clk_cleanup(struct isc_device *isc) > { > unsigned int i; > > @@ -308,4 +308,4 @@ void isc_clk_cleanup(struct isc_device *isc) > clk_unregister(isc_clk->clk); > } > } > -EXPORT_SYMBOL_GPL(isc_clk_cleanup); > +EXPORT_SYMBOL_GPL(atmel_isc_clk_cleanup); > diff --git a/drivers/media/platform/atmel/atmel-isc-regs.h b/drivers/staging/media/atmel/atmel-isc-regs.h > similarity index 100% > rename from drivers/media/platform/atmel/atmel-isc-regs.h > rename to drivers/staging/media/atmel/atmel-isc-regs.h > diff --git a/drivers/media/platform/atmel/atmel-isc.h b/drivers/staging/media/atmel/atmel-isc.h > similarity index 96% > rename from drivers/media/platform/atmel/atmel-isc.h > rename to drivers/staging/media/atmel/atmel-isc.h > index ff60ba020cb9..dfc030b5a08f 100644 > --- a/drivers/media/platform/atmel/atmel-isc.h > +++ b/drivers/staging/media/atmel/atmel-isc.h > @@ -350,13 +350,13 @@ struct isc_device { > u32 formats_list_size; > }; > > -extern const struct regmap_config isc_regmap_config; > -extern const struct v4l2_async_notifier_operations isc_async_ops; > - > -irqreturn_t isc_interrupt(int irq, void *dev_id); > -int isc_pipeline_init(struct isc_device *isc); > -int isc_clk_init(struct isc_device *isc); > -void isc_subdev_cleanup(struct isc_device *isc); > -void isc_clk_cleanup(struct isc_device *isc); > +extern const struct regmap_config atmel_isc_regmap_config; > +extern const struct v4l2_async_notifier_operations atmel_isc_async_ops; > + > +irqreturn_t atmel_isc_interrupt(int irq, void *dev_id); > +int atmel_isc_pipeline_init(struct isc_device *isc); > +int atmel_isc_clk_init(struct isc_device *isc); > +void atmel_isc_subdev_cleanup(struct isc_device *isc); > +void atmel_isc_clk_cleanup(struct isc_device *isc); > > #endif > diff --git a/drivers/media/platform/atmel/atmel-sama5d2-isc.c b/drivers/staging/media/atmel/atmel-sama5d2-isc.c > similarity index 97% > rename from drivers/media/platform/atmel/atmel-sama5d2-isc.c > rename to drivers/staging/media/atmel/atmel-sama5d2-isc.c > index 9881d89a645b..ba0614f981a2 100644 > --- a/drivers/media/platform/atmel/atmel-sama5d2-isc.c > +++ b/drivers/staging/media/atmel/atmel-sama5d2-isc.c > @@ -408,7 +408,7 @@ static int atmel_isc_probe(struct platform_device *pdev) > if (IS_ERR(io_base)) > return PTR_ERR(io_base); > > - isc->regmap = devm_regmap_init_mmio(dev, io_base, &isc_regmap_config); > + isc->regmap = devm_regmap_init_mmio(dev, io_base, &atmel_isc_regmap_config); > if (IS_ERR(isc->regmap)) { > ret = PTR_ERR(isc->regmap); > dev_err(dev, "failed to init register map: %d\n", ret); > @@ -419,7 +419,7 @@ static int atmel_isc_probe(struct platform_device *pdev) > if (irq < 0) > return irq; > > - ret = devm_request_irq(dev, irq, isc_interrupt, 0, > + ret = devm_request_irq(dev, irq, atmel_isc_interrupt, 0, > "atmel-sama5d2-isc", isc); > if (ret < 0) { > dev_err(dev, "can't register ISR for IRQ %u (ret=%i)\n", > @@ -464,7 +464,7 @@ static int atmel_isc_probe(struct platform_device *pdev) > /* sama5d2-isc : ISPCK is required and mandatory */ > isc->ispck_required = true; > > - ret = isc_pipeline_init(isc); > + ret = atmel_isc_pipeline_init(isc); > if (ret) > return ret; > > @@ -481,7 +481,7 @@ static int atmel_isc_probe(struct platform_device *pdev) > return ret; > } > > - ret = isc_clk_init(isc); > + ret = atmel_isc_clk_init(isc); > if (ret) { > dev_err(dev, "failed to init isc clock: %d\n", ret); > goto unprepare_hclk; > @@ -523,7 +523,7 @@ static int atmel_isc_probe(struct platform_device *pdev) > goto cleanup_subdev; > } > > - subdev_entity->notifier.ops = &isc_async_ops; > + subdev_entity->notifier.ops = &atmel_isc_async_ops; > > ret = v4l2_async_nf_register(&isc->v4l2_dev, > &subdev_entity->notifier); > @@ -567,7 +567,7 @@ static int atmel_isc_probe(struct platform_device *pdev) > pm_runtime_disable(dev); > > cleanup_subdev: > - isc_subdev_cleanup(isc); > + atmel_isc_subdev_cleanup(isc); > > unregister_v4l2_device: > v4l2_device_unregister(&isc->v4l2_dev); > @@ -575,7 +575,7 @@ static int atmel_isc_probe(struct platform_device *pdev) > unprepare_hclk: > clk_disable_unprepare(isc->hclock); > > - isc_clk_cleanup(isc); > + atmel_isc_clk_cleanup(isc); > > return ret; > } > @@ -586,14 +586,14 @@ static int atmel_isc_remove(struct platform_device *pdev) > > pm_runtime_disable(&pdev->dev); > > - isc_subdev_cleanup(isc); > + atmel_isc_subdev_cleanup(isc); > > v4l2_device_unregister(&isc->v4l2_dev); > > clk_disable_unprepare(isc->ispck); > clk_disable_unprepare(isc->hclock); > > - isc_clk_cleanup(isc); > + atmel_isc_clk_cleanup(isc); > > return 0; > } > diff --git a/drivers/media/platform/atmel/atmel-sama7g5-isc.c b/drivers/staging/media/atmel/atmel-sama7g5-isc.c > similarity index 97% > rename from drivers/media/platform/atmel/atmel-sama7g5-isc.c > rename to drivers/staging/media/atmel/atmel-sama7g5-isc.c > index 8b11aa8340d7..01ababdfcbd9 100644 > --- a/drivers/media/platform/atmel/atmel-sama7g5-isc.c > +++ b/drivers/staging/media/atmel/atmel-sama7g5-isc.c > @@ -397,7 +397,7 @@ static int microchip_xisc_probe(struct platform_device *pdev) > if (IS_ERR(io_base)) > return PTR_ERR(io_base); > > - isc->regmap = devm_regmap_init_mmio(dev, io_base, &isc_regmap_config); > + isc->regmap = devm_regmap_init_mmio(dev, io_base, &atmel_isc_regmap_config); > if (IS_ERR(isc->regmap)) { > ret = PTR_ERR(isc->regmap); > dev_err(dev, "failed to init register map: %d\n", ret); > @@ -408,7 +408,7 @@ static int microchip_xisc_probe(struct platform_device *pdev) > if (irq < 0) > return irq; > > - ret = devm_request_irq(dev, irq, isc_interrupt, 0, > + ret = devm_request_irq(dev, irq, atmel_isc_interrupt, 0, > "microchip-sama7g5-xisc", isc); > if (ret < 0) { > dev_err(dev, "can't register ISR for IRQ %u (ret=%i)\n", > @@ -453,7 +453,7 @@ static int microchip_xisc_probe(struct platform_device *pdev) > /* sama7g5-isc : ISPCK does not exist, ISC is clocked by MCK */ > isc->ispck_required = false; > > - ret = isc_pipeline_init(isc); > + ret = atmel_isc_pipeline_init(isc); > if (ret) > return ret; > > @@ -470,7 +470,7 @@ static int microchip_xisc_probe(struct platform_device *pdev) > return ret; > } > > - ret = isc_clk_init(isc); > + ret = atmel_isc_clk_init(isc); > if (ret) { > dev_err(dev, "failed to init isc clock: %d\n", ret); > goto unprepare_hclk; > @@ -513,7 +513,7 @@ static int microchip_xisc_probe(struct platform_device *pdev) > goto cleanup_subdev; > } > > - subdev_entity->notifier.ops = &isc_async_ops; > + subdev_entity->notifier.ops = &atmel_isc_async_ops; > > ret = v4l2_async_nf_register(&isc->v4l2_dev, > &subdev_entity->notifier); > @@ -536,7 +536,7 @@ static int microchip_xisc_probe(struct platform_device *pdev) > return 0; > > cleanup_subdev: > - isc_subdev_cleanup(isc); > + atmel_isc_subdev_cleanup(isc); > > unregister_v4l2_device: > v4l2_device_unregister(&isc->v4l2_dev); > @@ -544,7 +544,7 @@ static int microchip_xisc_probe(struct platform_device *pdev) > unprepare_hclk: > clk_disable_unprepare(isc->hclock); > > - isc_clk_cleanup(isc); > + atmel_isc_clk_cleanup(isc); > > return ret; > } > @@ -555,13 +555,13 @@ static int microchip_xisc_remove(struct platform_device *pdev) > > pm_runtime_disable(&pdev->dev); > > - isc_subdev_cleanup(isc); > + atmel_isc_subdev_cleanup(isc); > > v4l2_device_unregister(&isc->v4l2_dev); > > clk_disable_unprepare(isc->hclock); > > - isc_clk_cleanup(isc); > + atmel_isc_clk_cleanup(isc); > > return 0; > }