Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0dd45aa2 authored by osaisruj's avatar osaisruj
Browse files

disp: msm: sde: add sysfs node to give panel power state



Add sysfs node on connecter to get the panel power state.
This node is used by the HAL to read display power state.

Change-Id: I717e4b87513a845c867871f93876fc7c88ff7b2f
Signed-off-by: default avatarosaisruj <osaisruj@codeaurora.org>
parent b71e9dc1
Loading
Loading
Loading
Loading
+62 −0
Original line number Diff line number Diff line
@@ -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);

@@ -2845,6 +2848,65 @@ 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 DEVICE_ATTR_RO(panel_power_state);

static struct attribute *sde_connector_dev_attrs[] = {
	&dev_attr_panel_power_state.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,
+10 −0
Original line number Diff line number Diff line
@@ -511,6 +511,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];
@@ -753,6 +754,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
+6 −0
Original line number Diff line number Diff line
@@ -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) {
@@ -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;
}