Loading msm/dsi/dsi_panel.c +12 −0 Original line number Diff line number Diff line Loading @@ -378,6 +378,10 @@ static int dsi_panel_power_off(struct dsi_panel *panel) { int rc = 0; if (panel->is_twm_en) { DSI_DEBUG("TWM Enabled, skip panel power off\n"); return rc; } if (gpio_is_valid(panel->reset_config.disp_en_gpio)) gpio_set_value(panel->reset_config.disp_en_gpio, 0); Loading Loading @@ -4305,6 +4309,10 @@ int dsi_panel_set_nolp(struct dsi_panel *panel) return -EINVAL; } if (panel->is_twm_en) { DSI_DEBUG("TWM Enabled, skip idle off\n"); return rc; } mutex_lock(&panel->panel_lock); if (!panel->panel_initialized) goto exit; Loading Loading @@ -4717,6 +4725,10 @@ int dsi_panel_disable(struct dsi_panel *panel) return -EINVAL; } if (panel->is_twm_en) { DSI_DEBUG("TWM Enabled, skip panel disable\n"); return rc; } mutex_lock(&panel->panel_lock); /* Avoid sending panel off commands when ESD recovery is underway */ Loading msm/dsi/dsi_panel.h +2 −1 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. * Copyright (c) 2016-2020, 2021 The Linux Foundation. All rights reserved. */ #ifndef _DSI_PANEL_H_ Loading Loading @@ -244,6 +244,7 @@ struct dsi_panel { bool reset_gpio_always_on; atomic_t esd_recovery_pending; bool is_twm_en; bool panel_initialized; bool te_using_watchdog_timer; struct dsi_qsync_capabilities qsync_caps; Loading msm/sde/sde_connector.c +102 −0 Original line number Diff line number Diff line Loading @@ -1026,6 +1026,9 @@ void sde_connector_destroy(struct drm_connector *connector) c_conn = to_sde_connector(connector); if (c_conn->sysfs_dev) device_unregister(c_conn->sysfs_dev); /* cancel if any pending esd work */ sde_connector_schedule_status_work(connector, false); Loading Loading @@ -2845,6 +2848,104 @@ static int _sde_connector_install_properties(struct drm_device *dev, return 0; } static ssize_t panel_power_state_show(struct device *device, struct device_attribute *attr, char *buf) { struct drm_connector *conn; struct sde_connector *sde_conn; conn = dev_get_drvdata(device); sde_conn = to_sde_connector(conn); return scnprintf(buf, PAGE_SIZE, "%d\n", sde_conn->last_panel_power_mode); } static ssize_t twm_enable_store(struct device *device, struct device_attribute *attr, const char *buf, size_t count) { struct drm_connector *conn; struct sde_connector *sde_conn; struct dsi_display *dsi_display; int rc; int data; conn = dev_get_drvdata(device); sde_conn = to_sde_connector(conn); dsi_display = (struct dsi_display *) sde_conn->display; rc = kstrtoint(buf, 10, &data); if (rc) { SDE_ERROR("kstrtoint failed, rc = %d\n", rc); return -EINVAL; } sde_conn->twm_en = data ? true : false; dsi_display->panel->is_twm_en = sde_conn->twm_en; sde_conn->allow_bl_update = data ? false : true; SDE_DEBUG("TWM: %s\n", sde_conn->twm_en ? "ENABLED" : "DISABLED"); return count; } static ssize_t twm_enable_show(struct device *device, struct device_attribute *attr, char *buf) { struct drm_connector *conn; struct sde_connector *sde_conn; conn = dev_get_drvdata(device); sde_conn = to_sde_connector(conn); SDE_DEBUG("TWM: %s\n", sde_conn->twm_en ? "ENABLED" : "DISABLED"); return scnprintf(buf, PAGE_SIZE, "%d\n", sde_conn->twm_en); } static DEVICE_ATTR_RO(panel_power_state); static DEVICE_ATTR_RW(twm_enable); static struct attribute *sde_connector_dev_attrs[] = { &dev_attr_panel_power_state.attr, &dev_attr_twm_enable.attr, NULL }; static const struct attribute_group sde_connector_attr_group = { .attrs = sde_connector_dev_attrs, }; static const struct attribute_group *sde_connector_attr_groups[] = { &sde_connector_attr_group, NULL, }; int sde_connector_post_init(struct drm_device *dev, struct drm_connector *conn) { struct sde_connector *c_conn; int rc = 0; if (!dev || !dev->primary || !dev->primary->kdev || !conn) { SDE_ERROR("invalid input param(s)\n"); rc = -EINVAL; return rc; } c_conn = to_sde_connector(conn); if (conn->connector_type != DRM_MODE_CONNECTOR_DSI) return rc; c_conn->sysfs_dev = device_create_with_groups(dev->primary->kdev->class, dev->primary->kdev, 0, conn, sde_connector_attr_groups, "sde-conn-%d-%s", conn->index, conn->name); if (IS_ERR_OR_NULL(c_conn->sysfs_dev)) { SDE_ERROR("connector:%d sysfs create failed rc:%ld\n", &c_conn->base.index, PTR_ERR(c_conn->sysfs_dev)); if (!c_conn->sysfs_dev) rc = -EINVAL; else rc = PTR_ERR(c_conn->sysfs_dev); } return rc; } struct drm_connector *sde_connector_init(struct drm_device *dev, struct drm_encoder *encoder, struct drm_panel *panel, Loading Loading @@ -2896,6 +2997,7 @@ struct drm_connector *sde_connector_init(struct drm_device *dev, c_conn->dpms_mode = DRM_MODE_DPMS_ON; c_conn->lp_mode = 0; c_conn->last_panel_power_mode = SDE_MODE_DPMS_ON; c_conn->twm_en = false; sde_kms = to_sde_kms(priv->kms); if (sde_kms->vbif[VBIF_NRT]) { Loading msm/sde/sde_connector.h +12 −0 Original line number Diff line number Diff line Loading @@ -470,6 +470,7 @@ struct sde_connector_dyn_hdr_metadata { * @esd_status_interval: variable to change ESD check interval in millisec * @panel_dead: Flag to indicate if panel has gone bad * @esd_status_check: Flag to indicate if ESD thread is scheduled or not * @twm_en: Flag to indicate if TWM mode is enabled or not * @bl_scale_dirty: Flag to indicate PP BL scale value(s) is changed * @bl_scale: BL scale value for ABA feature * @bl_scale_sv: BL scale value for sunlight visibility feature Loading Loading @@ -511,6 +512,7 @@ struct sde_connector { int dpms_mode; int lp_mode; int last_panel_power_mode; struct device *sysfs_dev; struct msm_property_info property_info; struct msm_property_data property_data[CONNECTOR_PROP_COUNT]; Loading @@ -532,6 +534,7 @@ struct sde_connector { u32 esd_status_interval; bool panel_dead; bool esd_status_check; bool twm_en; bool bl_scale_dirty; u32 bl_scale; Loading Loading @@ -753,6 +756,15 @@ int sde_connector_set_property_for_commit(struct drm_connector *connector, struct drm_atomic_state *atomic_state, uint32_t property_idx, uint64_t value); /** * sde_connector_post_init - update connector object with post initialization. * It can update the debugfs, sysfs, entries * @dev: Pointer to drm device struct * @conn: Pointer to drm connector * Returns: Zero on success */ int sde_connector_post_init(struct drm_device *dev, struct drm_connector *conn); /** * sde_connector_init - create drm connector object for a given display * @dev: Pointer to drm device struct Loading msm/sde/sde_kms.c +6 −0 Original line number Diff line number Diff line Loading @@ -2176,6 +2176,8 @@ static int sde_kms_postinit(struct msm_kms *kms) struct sde_kms *sde_kms = to_sde_kms(kms); struct drm_device *dev; struct drm_crtc *crtc; struct drm_connector *conn; struct drm_connector_list_iter conn_iter; int rc; if (!sde_kms || !sde_kms->dev || !sde_kms->dev->dev) { Loading @@ -2192,6 +2194,10 @@ static int sde_kms_postinit(struct msm_kms *kms) drm_for_each_crtc(crtc, dev) sde_crtc_post_init(dev, crtc); drm_connector_list_iter_begin(dev, &conn_iter); drm_for_each_connector_iter(conn, &conn_iter) sde_connector_post_init(dev, conn); drm_connector_list_iter_end(&conn_iter); return rc; } Loading Loading
msm/dsi/dsi_panel.c +12 −0 Original line number Diff line number Diff line Loading @@ -378,6 +378,10 @@ static int dsi_panel_power_off(struct dsi_panel *panel) { int rc = 0; if (panel->is_twm_en) { DSI_DEBUG("TWM Enabled, skip panel power off\n"); return rc; } if (gpio_is_valid(panel->reset_config.disp_en_gpio)) gpio_set_value(panel->reset_config.disp_en_gpio, 0); Loading Loading @@ -4305,6 +4309,10 @@ int dsi_panel_set_nolp(struct dsi_panel *panel) return -EINVAL; } if (panel->is_twm_en) { DSI_DEBUG("TWM Enabled, skip idle off\n"); return rc; } mutex_lock(&panel->panel_lock); if (!panel->panel_initialized) goto exit; Loading Loading @@ -4717,6 +4725,10 @@ int dsi_panel_disable(struct dsi_panel *panel) return -EINVAL; } if (panel->is_twm_en) { DSI_DEBUG("TWM Enabled, skip panel disable\n"); return rc; } mutex_lock(&panel->panel_lock); /* Avoid sending panel off commands when ESD recovery is underway */ Loading
msm/dsi/dsi_panel.h +2 −1 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. * Copyright (c) 2016-2020, 2021 The Linux Foundation. All rights reserved. */ #ifndef _DSI_PANEL_H_ Loading Loading @@ -244,6 +244,7 @@ struct dsi_panel { bool reset_gpio_always_on; atomic_t esd_recovery_pending; bool is_twm_en; bool panel_initialized; bool te_using_watchdog_timer; struct dsi_qsync_capabilities qsync_caps; Loading
msm/sde/sde_connector.c +102 −0 Original line number Diff line number Diff line Loading @@ -1026,6 +1026,9 @@ void sde_connector_destroy(struct drm_connector *connector) c_conn = to_sde_connector(connector); if (c_conn->sysfs_dev) device_unregister(c_conn->sysfs_dev); /* cancel if any pending esd work */ sde_connector_schedule_status_work(connector, false); Loading Loading @@ -2845,6 +2848,104 @@ static int _sde_connector_install_properties(struct drm_device *dev, return 0; } static ssize_t panel_power_state_show(struct device *device, struct device_attribute *attr, char *buf) { struct drm_connector *conn; struct sde_connector *sde_conn; conn = dev_get_drvdata(device); sde_conn = to_sde_connector(conn); return scnprintf(buf, PAGE_SIZE, "%d\n", sde_conn->last_panel_power_mode); } static ssize_t twm_enable_store(struct device *device, struct device_attribute *attr, const char *buf, size_t count) { struct drm_connector *conn; struct sde_connector *sde_conn; struct dsi_display *dsi_display; int rc; int data; conn = dev_get_drvdata(device); sde_conn = to_sde_connector(conn); dsi_display = (struct dsi_display *) sde_conn->display; rc = kstrtoint(buf, 10, &data); if (rc) { SDE_ERROR("kstrtoint failed, rc = %d\n", rc); return -EINVAL; } sde_conn->twm_en = data ? true : false; dsi_display->panel->is_twm_en = sde_conn->twm_en; sde_conn->allow_bl_update = data ? false : true; SDE_DEBUG("TWM: %s\n", sde_conn->twm_en ? "ENABLED" : "DISABLED"); return count; } static ssize_t twm_enable_show(struct device *device, struct device_attribute *attr, char *buf) { struct drm_connector *conn; struct sde_connector *sde_conn; conn = dev_get_drvdata(device); sde_conn = to_sde_connector(conn); SDE_DEBUG("TWM: %s\n", sde_conn->twm_en ? "ENABLED" : "DISABLED"); return scnprintf(buf, PAGE_SIZE, "%d\n", sde_conn->twm_en); } static DEVICE_ATTR_RO(panel_power_state); static DEVICE_ATTR_RW(twm_enable); static struct attribute *sde_connector_dev_attrs[] = { &dev_attr_panel_power_state.attr, &dev_attr_twm_enable.attr, NULL }; static const struct attribute_group sde_connector_attr_group = { .attrs = sde_connector_dev_attrs, }; static const struct attribute_group *sde_connector_attr_groups[] = { &sde_connector_attr_group, NULL, }; int sde_connector_post_init(struct drm_device *dev, struct drm_connector *conn) { struct sde_connector *c_conn; int rc = 0; if (!dev || !dev->primary || !dev->primary->kdev || !conn) { SDE_ERROR("invalid input param(s)\n"); rc = -EINVAL; return rc; } c_conn = to_sde_connector(conn); if (conn->connector_type != DRM_MODE_CONNECTOR_DSI) return rc; c_conn->sysfs_dev = device_create_with_groups(dev->primary->kdev->class, dev->primary->kdev, 0, conn, sde_connector_attr_groups, "sde-conn-%d-%s", conn->index, conn->name); if (IS_ERR_OR_NULL(c_conn->sysfs_dev)) { SDE_ERROR("connector:%d sysfs create failed rc:%ld\n", &c_conn->base.index, PTR_ERR(c_conn->sysfs_dev)); if (!c_conn->sysfs_dev) rc = -EINVAL; else rc = PTR_ERR(c_conn->sysfs_dev); } return rc; } struct drm_connector *sde_connector_init(struct drm_device *dev, struct drm_encoder *encoder, struct drm_panel *panel, Loading Loading @@ -2896,6 +2997,7 @@ struct drm_connector *sde_connector_init(struct drm_device *dev, c_conn->dpms_mode = DRM_MODE_DPMS_ON; c_conn->lp_mode = 0; c_conn->last_panel_power_mode = SDE_MODE_DPMS_ON; c_conn->twm_en = false; sde_kms = to_sde_kms(priv->kms); if (sde_kms->vbif[VBIF_NRT]) { Loading
msm/sde/sde_connector.h +12 −0 Original line number Diff line number Diff line Loading @@ -470,6 +470,7 @@ struct sde_connector_dyn_hdr_metadata { * @esd_status_interval: variable to change ESD check interval in millisec * @panel_dead: Flag to indicate if panel has gone bad * @esd_status_check: Flag to indicate if ESD thread is scheduled or not * @twm_en: Flag to indicate if TWM mode is enabled or not * @bl_scale_dirty: Flag to indicate PP BL scale value(s) is changed * @bl_scale: BL scale value for ABA feature * @bl_scale_sv: BL scale value for sunlight visibility feature Loading Loading @@ -511,6 +512,7 @@ struct sde_connector { int dpms_mode; int lp_mode; int last_panel_power_mode; struct device *sysfs_dev; struct msm_property_info property_info; struct msm_property_data property_data[CONNECTOR_PROP_COUNT]; Loading @@ -532,6 +534,7 @@ struct sde_connector { u32 esd_status_interval; bool panel_dead; bool esd_status_check; bool twm_en; bool bl_scale_dirty; u32 bl_scale; Loading Loading @@ -753,6 +756,15 @@ int sde_connector_set_property_for_commit(struct drm_connector *connector, struct drm_atomic_state *atomic_state, uint32_t property_idx, uint64_t value); /** * sde_connector_post_init - update connector object with post initialization. * It can update the debugfs, sysfs, entries * @dev: Pointer to drm device struct * @conn: Pointer to drm connector * Returns: Zero on success */ int sde_connector_post_init(struct drm_device *dev, struct drm_connector *conn); /** * sde_connector_init - create drm connector object for a given display * @dev: Pointer to drm device struct Loading
msm/sde/sde_kms.c +6 −0 Original line number Diff line number Diff line Loading @@ -2176,6 +2176,8 @@ static int sde_kms_postinit(struct msm_kms *kms) struct sde_kms *sde_kms = to_sde_kms(kms); struct drm_device *dev; struct drm_crtc *crtc; struct drm_connector *conn; struct drm_connector_list_iter conn_iter; int rc; if (!sde_kms || !sde_kms->dev || !sde_kms->dev->dev) { Loading @@ -2192,6 +2194,10 @@ static int sde_kms_postinit(struct msm_kms *kms) drm_for_each_crtc(crtc, dev) sde_crtc_post_init(dev, crtc); drm_connector_list_iter_begin(dev, &conn_iter); drm_for_each_connector_iter(conn, &conn_iter) sde_connector_post_init(dev, conn); drm_connector_list_iter_end(&conn_iter); return rc; } Loading