drm/stm: ltdc: add pinctrl for DPI encoder mode
The implementation of functions encoder_enable and encoder_disable make possible to control the pinctrl according to the encoder type. The pinctrl must be activated only if the encoder type is DPI. This helps to move the DPI-related pinctrl configuration from all the panel or bridge to the LTDC dt node. Reviewed-by: Philippe Cornu <philippe.cornu@st.com> Signed-off-by: Yannick Fertré <yannick.fertre@st.com> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org> Link: https://patchwork.freedesktop.org/patch/msgid/1567761708-31777-1-git-send-email-yannick.fertre@st.com
This commit is contained in:
parent
a793f0eeb7
commit
92a57b3fb5
@ -15,6 +15,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_graph.h>
|
||||
#include <linux/pinctrl/consumer.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/reset.h>
|
||||
@ -1040,6 +1041,36 @@ static const struct drm_encoder_funcs ltdc_encoder_funcs = {
|
||||
.destroy = drm_encoder_cleanup,
|
||||
};
|
||||
|
||||
static void ltdc_encoder_disable(struct drm_encoder *encoder)
|
||||
{
|
||||
struct drm_device *ddev = encoder->dev;
|
||||
|
||||
DRM_DEBUG_DRIVER("\n");
|
||||
|
||||
/* Set to sleep state the pinctrl whatever type of encoder */
|
||||
pinctrl_pm_select_sleep_state(ddev->dev);
|
||||
}
|
||||
|
||||
static void ltdc_encoder_enable(struct drm_encoder *encoder)
|
||||
{
|
||||
struct drm_device *ddev = encoder->dev;
|
||||
|
||||
DRM_DEBUG_DRIVER("\n");
|
||||
|
||||
/*
|
||||
* Set to default state the pinctrl only with DPI type.
|
||||
* Others types like DSI, don't need pinctrl due to
|
||||
* internal bridge (the signals do not come out of the chipset).
|
||||
*/
|
||||
if (encoder->encoder_type == DRM_MODE_ENCODER_DPI)
|
||||
pinctrl_pm_select_default_state(ddev->dev);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_helper_funcs ltdc_encoder_helper_funcs = {
|
||||
.disable = ltdc_encoder_disable,
|
||||
.enable = ltdc_encoder_enable,
|
||||
};
|
||||
|
||||
static int ltdc_encoder_init(struct drm_device *ddev, struct drm_bridge *bridge)
|
||||
{
|
||||
struct drm_encoder *encoder;
|
||||
@ -1055,6 +1086,8 @@ static int ltdc_encoder_init(struct drm_device *ddev, struct drm_bridge *bridge)
|
||||
drm_encoder_init(ddev, encoder, <dc_encoder_funcs,
|
||||
DRM_MODE_ENCODER_DPI, NULL);
|
||||
|
||||
drm_encoder_helper_add(encoder, <dc_encoder_helper_funcs);
|
||||
|
||||
ret = drm_bridge_attach(encoder, bridge, NULL);
|
||||
if (ret) {
|
||||
drm_encoder_cleanup(encoder);
|
||||
@ -1280,6 +1313,8 @@ int ltdc_load(struct drm_device *ddev)
|
||||
|
||||
clk_disable_unprepare(ldev->pixel_clk);
|
||||
|
||||
pinctrl_pm_select_sleep_state(ddev->dev);
|
||||
|
||||
pm_runtime_enable(ddev->dev);
|
||||
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user