[PATCH 5/6] drm/ingenic: Make IPU driver its own module

From: Paul Cercueil
Date: Fri Jul 08 2022 - 16:55:08 EST


Instead of building the IPU driver code into the ingenic-drm driver,
create a ingenic-ipu driver.

Signed-off-by: Paul Cercueil <paul@xxxxxxxxxxxxxxx>
---
drivers/gpu/drm/ingenic/Kconfig | 2 +-
drivers/gpu/drm/ingenic/Makefile | 2 +-
drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 33 +++++------------------
drivers/gpu/drm/ingenic/ingenic-drm.h | 3 ---
drivers/gpu/drm/ingenic/ingenic-ipu.c | 6 ++++-
5 files changed, 14 insertions(+), 32 deletions(-)

diff --git a/drivers/gpu/drm/ingenic/Kconfig b/drivers/gpu/drm/ingenic/Kconfig
index 090830bcbde7..daa1aa81b46b 100644
--- a/drivers/gpu/drm/ingenic/Kconfig
+++ b/drivers/gpu/drm/ingenic/Kconfig
@@ -18,7 +18,7 @@ config DRM_INGENIC
if DRM_INGENIC

config DRM_INGENIC_IPU
- bool "IPU support for Ingenic SoCs"
+ tristate "IPU support for Ingenic SoCs"
help
Choose this option to enable support for the IPU found in Ingenic SoCs.

diff --git a/drivers/gpu/drm/ingenic/Makefile b/drivers/gpu/drm/ingenic/Makefile
index f10cc1c5a5f2..e650d4ec895b 100644
--- a/drivers/gpu/drm/ingenic/Makefile
+++ b/drivers/gpu/drm/ingenic/Makefile
@@ -1,4 +1,4 @@
obj-$(CONFIG_DRM_INGENIC) += ingenic-drm.o
ingenic-drm-y = ingenic-drm-drv.o
-ingenic-drm-$(CONFIG_DRM_INGENIC_IPU) += ingenic-ipu.o
+obj-$(CONFIG_DRM_INGENIC_IPU) += ingenic-ipu.o
obj-$(CONFIG_DRM_INGENIC_DW_HDMI) += ingenic-dw-hdmi.o
diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
index 78d0b035e2d7..98ff038d95d6 100644
--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
@@ -550,6 +550,7 @@ void ingenic_drm_plane_disable(struct device *dev, struct drm_plane *plane)
regmap_clear_bits(priv->map, JZ_REG_LCD_OSDC, en_bit);
}
}
+EXPORT_SYMBOL_GPL(ingenic_drm_plane_disable);

static void ingenic_drm_plane_atomic_disable(struct drm_plane *plane,
struct drm_atomic_state *state)
@@ -633,6 +634,7 @@ void ingenic_drm_plane_config(struct device *dev,
state->crtc_h << JZ_LCD_SIZE01_HEIGHT_LSB);
}
}
+EXPORT_SYMBOL_GPL(ingenic_drm_plane_config);

bool ingenic_drm_map_noncoherent(const struct device *dev)
{
@@ -640,6 +642,7 @@ bool ingenic_drm_map_noncoherent(const struct device *dev)

return priv->soc_info->map_noncoherent;
}
+EXPORT_SYMBOL_GPL(ingenic_drm_map_noncoherent);

static void ingenic_drm_update_palette(struct ingenic_drm *priv,
const struct drm_color_lut *lut)
@@ -1438,6 +1441,9 @@ static int ingenic_drm_probe(struct platform_device *pdev)
struct component_match *match = NULL;
struct device_node *np;

+ if (drm_firmware_drivers_only())
+ return -ENODEV;
+
if (!IS_ENABLED(CONFIG_DRM_INGENIC_IPU))
return ingenic_drm_bind(dev, false);

@@ -1615,32 +1621,7 @@ static struct platform_driver ingenic_drm_driver = {
.probe = ingenic_drm_probe,
.remove = ingenic_drm_remove,
};
-
-static int ingenic_drm_init(void)
-{
- int err;
-
- if (drm_firmware_drivers_only())
- return -ENODEV;
-
- if (IS_ENABLED(CONFIG_DRM_INGENIC_IPU)) {
- err = platform_driver_register(ingenic_ipu_driver_ptr);
- if (err)
- return err;
- }
-
- return platform_driver_register(&ingenic_drm_driver);
-}
-module_init(ingenic_drm_init);
-
-static void ingenic_drm_exit(void)
-{
- platform_driver_unregister(&ingenic_drm_driver);
-
- if (IS_ENABLED(CONFIG_DRM_INGENIC_IPU))
- platform_driver_unregister(ingenic_ipu_driver_ptr);
-}
-module_exit(ingenic_drm_exit);
+module_platform_driver(ingenic_drm_driver);

MODULE_AUTHOR("Paul Cercueil <paul@xxxxxxxxxxxxxxx>");
MODULE_DESCRIPTION("DRM driver for the Ingenic SoCs\n");
diff --git a/drivers/gpu/drm/ingenic/ingenic-drm.h b/drivers/gpu/drm/ingenic/ingenic-drm.h
index e5bd007ea93d..9b89929b81bc 100644
--- a/drivers/gpu/drm/ingenic/ingenic-drm.h
+++ b/drivers/gpu/drm/ingenic/ingenic-drm.h
@@ -220,13 +220,10 @@
struct device;
struct drm_plane;
struct drm_plane_state;
-struct platform_driver;

void ingenic_drm_plane_config(struct device *dev,
struct drm_plane *plane, u32 fourcc);
void ingenic_drm_plane_disable(struct device *dev, struct drm_plane *plane);
bool ingenic_drm_map_noncoherent(const struct device *dev);

-extern struct platform_driver *ingenic_ipu_driver_ptr;
-
#endif /* DRIVERS_GPU_DRM_INGENIC_INGENIC_DRM_H */
diff --git a/drivers/gpu/drm/ingenic/ingenic-ipu.c b/drivers/gpu/drm/ingenic/ingenic-ipu.c
index d13f58ad4769..fb62c27819ea 100644
--- a/drivers/gpu/drm/ingenic/ingenic-ipu.c
+++ b/drivers/gpu/drm/ingenic/ingenic-ipu.c
@@ -15,6 +15,7 @@
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_device.h>
+#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/time.h>

@@ -995,5 +996,8 @@ static struct platform_driver ingenic_ipu_driver = {
.probe = ingenic_ipu_probe,
.remove = ingenic_ipu_remove,
};
+module_platform_driver(ingenic_ipu_driver);

-struct platform_driver *ingenic_ipu_driver_ptr = &ingenic_ipu_driver;
+MODULE_AUTHOR("Paul Cercueil <paul@xxxxxxxxxxxxxxx>");
+MODULE_DESCRIPTION("DRM driver for the IPU of Ingenic SoCs\n");
+MODULE_LICENSE("GPL");
--
2.35.1