drm/panel: panel-simple: Allow panel-simple be a DP AUX endpoint device
The panel-simple driver can already have devices instantiated as platform devices or MIPI DSI devices. Let's add a 3rd way to instantiate it: as DP AUX endpoint devices. At the moment there is no benefit to instantiating it in this way, but: - In the next patch we'll give it access to the DDC channel via the DP AUX bus. - Possibly in the future we may use this channel to configure the backlight. Signed-off-by: Douglas Anderson <dianders@chromium.org> Reviewed-by: Lyude Paul <lyude@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20210611101711.v10.5.Iada41f76a7342354bae929d0bb3ceba40f27f0ea@changeid
This commit is contained in:
@@ -82,6 +82,7 @@ config DRM_PANEL_SIMPLE
|
|||||||
depends on BACKLIGHT_CLASS_DEVICE
|
depends on BACKLIGHT_CLASS_DEVICE
|
||||||
depends on PM
|
depends on PM
|
||||||
select VIDEOMODE_HELPERS
|
select VIDEOMODE_HELPERS
|
||||||
|
select DRM_DP_AUX_BUS
|
||||||
help
|
help
|
||||||
DRM panel driver for dumb panels that need at most a regulator and
|
DRM panel driver for dumb panels that need at most a regulator and
|
||||||
a GPIO to be powered up. Optionally a backlight can be attached so
|
a GPIO to be powered up. Optionally a backlight can be attached so
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
#include <drm/drm_crtc.h>
|
#include <drm/drm_crtc.h>
|
||||||
#include <drm/drm_device.h>
|
#include <drm/drm_device.h>
|
||||||
|
#include <drm/drm_dp_aux_bus.h>
|
||||||
#include <drm/drm_mipi_dsi.h>
|
#include <drm/drm_mipi_dsi.h>
|
||||||
#include <drm/drm_panel.h>
|
#include <drm/drm_panel.h>
|
||||||
|
|
||||||
@@ -4957,6 +4958,38 @@ static struct mipi_dsi_driver panel_simple_dsi_driver = {
|
|||||||
.shutdown = panel_simple_dsi_shutdown,
|
.shutdown = panel_simple_dsi_shutdown,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int panel_simple_dp_aux_ep_probe(struct dp_aux_ep_device *aux_ep)
|
||||||
|
{
|
||||||
|
const struct of_device_id *id;
|
||||||
|
|
||||||
|
id = of_match_node(platform_of_match, aux_ep->dev.of_node);
|
||||||
|
if (!id)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
return panel_simple_probe(&aux_ep->dev, id->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void panel_simple_dp_aux_ep_remove(struct dp_aux_ep_device *aux_ep)
|
||||||
|
{
|
||||||
|
panel_simple_remove(&aux_ep->dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void panel_simple_dp_aux_ep_shutdown(struct dp_aux_ep_device *aux_ep)
|
||||||
|
{
|
||||||
|
panel_simple_shutdown(&aux_ep->dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct dp_aux_ep_driver panel_simple_dp_aux_ep_driver = {
|
||||||
|
.driver = {
|
||||||
|
.name = "panel-simple-dp-aux",
|
||||||
|
.of_match_table = platform_of_match, /* Same as platform one! */
|
||||||
|
.pm = &panel_simple_pm_ops,
|
||||||
|
},
|
||||||
|
.probe = panel_simple_dp_aux_ep_probe,
|
||||||
|
.remove = panel_simple_dp_aux_ep_remove,
|
||||||
|
.shutdown = panel_simple_dp_aux_ep_shutdown,
|
||||||
|
};
|
||||||
|
|
||||||
static int __init panel_simple_init(void)
|
static int __init panel_simple_init(void)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
@@ -4965,15 +4998,25 @@ static int __init panel_simple_init(void)
|
|||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
err = dp_aux_dp_driver_register(&panel_simple_dp_aux_ep_driver);
|
||||||
|
if (err < 0)
|
||||||
|
goto err_did_platform_register;
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_DRM_MIPI_DSI)) {
|
if (IS_ENABLED(CONFIG_DRM_MIPI_DSI)) {
|
||||||
err = mipi_dsi_driver_register(&panel_simple_dsi_driver);
|
err = mipi_dsi_driver_register(&panel_simple_dsi_driver);
|
||||||
if (err < 0) {
|
if (err < 0)
|
||||||
platform_driver_unregister(&panel_simple_platform_driver);
|
goto err_did_aux_ep_register;
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_did_aux_ep_register:
|
||||||
|
dp_aux_dp_driver_unregister(&panel_simple_dp_aux_ep_driver);
|
||||||
|
|
||||||
|
err_did_platform_register:
|
||||||
|
platform_driver_unregister(&panel_simple_platform_driver);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
module_init(panel_simple_init);
|
module_init(panel_simple_init);
|
||||||
|
|
||||||
@@ -4982,6 +5025,7 @@ static void __exit panel_simple_exit(void)
|
|||||||
if (IS_ENABLED(CONFIG_DRM_MIPI_DSI))
|
if (IS_ENABLED(CONFIG_DRM_MIPI_DSI))
|
||||||
mipi_dsi_driver_unregister(&panel_simple_dsi_driver);
|
mipi_dsi_driver_unregister(&panel_simple_dsi_driver);
|
||||||
|
|
||||||
|
dp_aux_dp_driver_unregister(&panel_simple_dp_aux_ep_driver);
|
||||||
platform_driver_unregister(&panel_simple_platform_driver);
|
platform_driver_unregister(&panel_simple_platform_driver);
|
||||||
}
|
}
|
||||||
module_exit(panel_simple_exit);
|
module_exit(panel_simple_exit);
|
||||||
|
|||||||
Reference in New Issue
Block a user