@@ -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.
@@ -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
@@ -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@crapouillou.net>");
MODULE_DESCRIPTION("DRM driver for the Ingenic SoCs\n");
@@ -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 */
@@ -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@crapouillou.net>");
+MODULE_DESCRIPTION("DRM driver for the IPU of Ingenic SoCs\n");
+MODULE_LICENSE("GPL");
Instead of building the IPU driver code into the ingenic-drm driver, create a ingenic-ipu driver. Signed-off-by: Paul Cercueil <paul@crapouillou.net> --- 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(-)