@Shizet
kernel-5.10$ git log -p
commit 15614cd4e0db35c9d5c2a1a1ea09e1483ea220ad (HEAD -> khadas-edge2-android12)
LCD: fix the issue of TS050 screen waking up after half an hour of sleep, resulting in screen LCD polarization
diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
index 558e1d550124..015c102d4cee 100644
--- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -148,6 +148,7 @@ struct panel_simple {
struct drm_dsc_picture_parameter_set *pps;
enum drm_panel_orientation orientation;
};
+extern void lcd_reset_pin_reset(void);
static inline struct panel_simple *to_panel_simple(struct drm_panel *panel)
{
@@ -463,6 +464,7 @@ static int panel_simple_unprepare(struct drm_panel *panel)
panel_simple_xfer_dsi_cmd_seq(p, p->desc->exit_seq);
//gpiod_direction_output(p->reset_gpio, 0);
+ lcd_reset_pin_reset();
gpiod_direction_output(p->enable_gpio, 0);
panel_simple_regulator_disable(p);
diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c
index f55a3a5c5c7c..0962d7ac6950 100644
--- a/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c
@@ -271,6 +271,8 @@ struct dw_mipi_dsi2 {
u32 format;
unsigned long mode_flags;
+ struct gpio_desc *reset_gpio;
+ unsigned int reset_ms;
const struct dw_mipi_dsi2_plat_data *pdata;
struct rockchip_drm_sub_dev sub_dev;
@@ -279,6 +281,8 @@ struct dw_mipi_dsi2 {
struct drm_property *user_split_mode_prop;
};
+struct dw_mipi_dsi2 *mdsi2 = NULL;
+
static inline struct dw_mipi_dsi2 *host_to_dsi2(struct mipi_dsi_host *host)
{
return container_of(host, struct dw_mipi_dsi2, host);
@@ -1321,6 +1325,23 @@ static int dw_mipi_dsi2_bind(struct device *dev, struct device *master,
return ret;
}
+void lcd_reset_pin_reset(void){
+ if(mdsi2 == NULL)
+ return;
+//printk("%s: dsi2->reset_gpio: %d dsi2->reset_ms=%d\n", __func__, mdsi2->reset_gpio,mdsi2->reset_ms);
+ gpiod_set_value_cansleep(mdsi2->reset_gpio, 0);
+ mdelay(mdsi2->reset_ms);
+
+ gpiod_set_value_cansleep(mdsi2->reset_gpio, 1);
+ mdelay(mdsi2->reset_ms);
+
+ gpiod_set_value_cansleep(mdsi2->reset_gpio, 0);
+ mdelay(mdsi2->reset_ms);
+
+ gpiod_set_value_cansleep(mdsi2->reset_gpio, 1);
+ mdelay(mdsi2->reset_ms);
+};
+
static void dw_mipi_dsi2_unbind(struct device *dev, struct device *master,
void *data)
{
@@ -1530,6 +1551,7 @@ static int dw_mipi_dsi2_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct dw_mipi_dsi2 *dsi2;
+ struct device_node *np = NULL;
struct resource *res;
void __iomem *regs;
int id;
@@ -1540,6 +1562,7 @@ static int dw_mipi_dsi2_probe(struct platform_device *pdev)
return -ENOMEM;
id = of_alias_get_id(dev->of_node, "dsi");
+ np = dev->of_node;
if (id < 0)
id = 0;
@@ -1603,6 +1626,14 @@ static int dw_mipi_dsi2_probe(struct platform_device *pdev)
return ret;
}
+ of_property_read_u32(np, "reset-delay-ms", &dsi2->reset_ms);
+
+ dsi2->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_ASIS);
+ if (IS_ERR(dsi2->reset_gpio)){
+ dsi2->reset_gpio = NULL;
+ printk("%s: Cannot get reset GPIO: %d\n", __func__, __LINE__);
+ }
+
dsi2->te_gpio = devm_gpiod_get_optional(dsi2->dev, "te", GPIOD_IN);
if (IS_ERR(dsi2->te_gpio))
dsi2->te_gpio = NULL;
@@ -1632,6 +1663,7 @@ static int dw_mipi_dsi2_probe(struct platform_device *pdev)
DRM_DEV_ERROR(dev, "Failed to register MIPI host: %d\n", ret);
return ret;
}
+ mdsi2 = dsi2;
return component_add(&pdev->dev, &dw_mipi_dsi2_ops);
}