mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
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:
committed by
Guochun Huang
parent
55aa440fb8
commit
697bbdf85b
@@ -39,6 +39,8 @@
|
|||||||
#include <drm/drm_mipi_dsi.h>
|
#include <drm/drm_mipi_dsi.h>
|
||||||
#include <drm/drm_panel.h>
|
#include <drm/drm_panel.h>
|
||||||
|
|
||||||
|
#include "panel-simple.h"
|
||||||
|
|
||||||
struct panel_cmd_header {
|
struct panel_cmd_header {
|
||||||
u8 data_type;
|
u8 data_type;
|
||||||
u8 delay;
|
u8 delay;
|
||||||
@@ -128,6 +130,7 @@ struct panel_simple {
|
|||||||
struct mipi_dsi_device *dsi;
|
struct mipi_dsi_device *dsi;
|
||||||
bool prepared;
|
bool prepared;
|
||||||
bool enabled;
|
bool enabled;
|
||||||
|
bool power_invert;
|
||||||
bool no_hpd;
|
bool no_hpd;
|
||||||
|
|
||||||
const struct panel_desc *desc;
|
const struct panel_desc *desc;
|
||||||
@@ -365,6 +368,57 @@ static int panel_simple_get_non_edid_modes(struct panel_simple *panel,
|
|||||||
return num;
|
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)
|
static int panel_simple_disable(struct drm_panel *panel)
|
||||||
{
|
{
|
||||||
struct panel_simple *p = to_panel_simple(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->reset_gpio, 1);
|
||||||
gpiod_set_value_cansleep(p->enable_gpio, 0);
|
gpiod_set_value_cansleep(p->enable_gpio, 0);
|
||||||
|
|
||||||
regulator_disable(p->supply);
|
panel_simple_regulator_disable(p);
|
||||||
|
|
||||||
if (p->desc->delay.unprepare)
|
if (p->desc->delay.unprepare)
|
||||||
msleep(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)
|
if (p->prepared)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err = regulator_enable(p->supply);
|
err = panel_simple_regulator_enable(p);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
dev_err(panel->dev, "failed to enable supply: %d\n", err);
|
dev_err(panel->dev, "failed to enable supply: %d\n", err);
|
||||||
return err;
|
return err;
|
||||||
@@ -708,6 +762,8 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
|
|||||||
return err;
|
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);
|
ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0);
|
||||||
if (ddc) {
|
if (ddc) {
|
||||||
panel->ddc = of_find_i2c_adapter_by_node(ddc);
|
panel->ddc = of_find_i2c_adapter_by_node(ddc);
|
||||||
|
|||||||
19
drivers/gpu/drm/panel/panel-simple.h
Normal file
19
drivers/gpu/drm/panel/panel-simple.h
Normal 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
|
||||||
Reference in New Issue
Block a user