drm/panel: simple: Add support loader protect and power invert

Signed-off-by: Sandy Huang <hjc@rock-chips.com>
Change-Id: I4abb3739144b5a3c99fd57d76e0ff87ccb664667
This commit is contained in:
Sandy Huang
2021-08-04 16:44:19 +08:00
committed by Guochun Huang
parent 55aa440fb8
commit 697bbdf85b
2 changed files with 77 additions and 2 deletions
+58 -2
View File
@@ -39,6 +39,8 @@
#include <drm/drm_mipi_dsi.h>
#include <drm/drm_panel.h>
#include "panel-simple.h"
struct panel_cmd_header {
u8 data_type;
u8 delay;
@@ -128,6 +130,7 @@ struct panel_simple {
struct mipi_dsi_device *dsi;
bool prepared;
bool enabled;
bool power_invert;
bool no_hpd;
const struct panel_desc *desc;
@@ -365,6 +368,57 @@ static int panel_simple_get_non_edid_modes(struct panel_simple *panel,
return num;
}
static int panel_simple_regulator_enable(struct panel_simple *p)
{
int err;
if (p->power_invert) {
if (regulator_is_enabled(p->supply) > 0)
regulator_disable(p->supply);
} else {
err = regulator_enable(p->supply);
if (err < 0)
return err;
}
return 0;
}
static int panel_simple_regulator_disable(struct panel_simple *p)
{
int err;
if (p->power_invert) {
if (!regulator_is_enabled(p->supply)) {
err = regulator_enable(p->supply);
if (err < 0)
return err;
}
} else {
regulator_disable(p->supply);
}
return 0;
}
int panel_simple_loader_protect(struct drm_panel *panel)
{
struct panel_simple *p = to_panel_simple(panel);
int err;
err = panel_simple_regulator_enable(p);
if (err < 0) {
dev_err(panel->dev, "failed to enable supply: %d\n", err);
return err;
}
p->prepared = true;
p->enabled = true;
return 0;
}
EXPORT_SYMBOL(panel_simple_loader_protect);
static int panel_simple_disable(struct drm_panel *panel)
{
struct panel_simple *p = to_panel_simple(panel);
@@ -394,7 +448,7 @@ static int panel_simple_unprepare(struct drm_panel *panel)
gpiod_set_value_cansleep(p->reset_gpio, 1);
gpiod_set_value_cansleep(p->enable_gpio, 0);
regulator_disable(p->supply);
panel_simple_regulator_disable(p);
if (p->desc->delay.unprepare)
msleep(p->desc->delay.unprepare);
@@ -439,7 +493,7 @@ static int panel_simple_prepare(struct drm_panel *panel)
if (p->prepared)
return 0;
err = regulator_enable(p->supply);
err = panel_simple_regulator_enable(p);
if (err < 0) {
dev_err(panel->dev, "failed to enable supply: %d\n", err);
return err;
@@ -708,6 +762,8 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
return err;
}
panel->power_invert = of_property_read_bool(dev->of_node, "power-invert");
ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0);
if (ddc) {
panel->ddc = of_find_i2c_adapter_by_node(ddc);
+19
View File
@@ -0,0 +1,19 @@
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2021 Rockchip Electronics Co., Ltd.
* Author: Sandy Huang <hjc@rock-chips.com>
*/
#ifndef PANEL_SIMPLE_H
#define PANEL_SIMPLE_H
#include <drm/drm_panel.h>
#if IS_ENABLED(CONFIG_DRM_PANEL_SIMPLE)
int panel_simple_loader_protect(struct drm_panel *panel);
#else
static inline int panel_simple_loader_protect(struct drm_panel *panel)
{
return 0;
}
#endif
#endif