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

Commit 6b845a99 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ARM: dts: msm: add mdss power domain support to sdm845"

parents 8b6f8de5 78dbffd1
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -366,6 +366,7 @@ Optional properties:
				control register. Number of offsets defined should
				match the number of xin-ids defined in
				property: qcom,sde-inline-rot-xin
- #power-domain-cells:		Number of cells in a power-domain specifier and should contain 0.

Bus Scaling Subnodes:
- qcom,sde-reg-bus:		Property to provide Bus scaling for register access for
@@ -446,6 +447,7 @@ Example:
    interrupt-controller;
    #interrupt-cells = <1>;
    iommus = <&mdp_smmu 0>;
    #power-domain-cells = <0>;

    qcom,sde-off = <0x1000>;
    qcom,sde-ctl-off = <0x00002000 0x00002200 0x00002400
+3 −0
Original line number Diff line number Diff line
@@ -123,6 +123,7 @@ Optional properties
				swizzle configuration value.
- qcom,rot-reg-bus:		Property to provide Bus scaling for register
				access for rotator blocks.
- power-domains:		A phandle to respective power domain node.

Subnode properties:
- compatible:		Compatible name used in smmu v2.
@@ -150,6 +151,8 @@ Example:
		interrupt-parent = <&mdss_mdp>;
		interrupts = <2 0>;

		power-domains = <&mdss_mdp>;

		qcom,mdss-mdp-reg-offset = <0x00001000>;

		rot-vdd-supply = <&gdsc_mdss>;
+4 −0
Original line number Diff line number Diff line
@@ -46,6 +46,8 @@
		#address-cells = <1>;
		#size-cells = <0>;

		#power-domain-cells = <0>;

		/* hw blocks */
		qcom,sde-off = <0x1000>;
		qcom,sde-len = <0x45C>;
@@ -365,6 +367,8 @@
		interrupt-parent = <&mdss_mdp>;
		interrupts = <2 0>;

		power-domains = <&mdss_mdp>;

		/* Offline rotator QoS setting */
		qcom,mdss-rot-vbif-qos-setting = <3 3 3 3 3 3 3 3>;
		qcom,mdss-rot-vbif-memtype = <3 3>;
+84 −0
Original line number Diff line number Diff line
@@ -1423,6 +1423,12 @@ static void _sde_kms_hw_destroy(struct sde_kms *sde_kms,
	if (!priv)
		return;

	if (sde_kms->genpd_init) {
		sde_kms->genpd_init = false;
		pm_genpd_remove(&sde_kms->genpd);
		of_genpd_del_provider(pdev->dev.of_node);
	}

	if (sde_kms->hw_intr)
		sde_hw_intr_destroy(sde_kms->hw_intr);
	sde_kms->hw_intr = NULL;
@@ -2013,6 +2019,56 @@ static void sde_kms_handle_power_event(u32 event_type, void *usr)
	}
}

#define genpd_to_sde_kms(domain) container_of(domain, struct sde_kms, genpd)

static int sde_kms_pd_enable(struct generic_pm_domain *genpd)
{
	struct sde_kms *sde_kms = genpd_to_sde_kms(genpd);
	struct drm_device *dev;
	struct msm_drm_private *priv;
	int rc;

	SDE_DEBUG("\n");

	dev = sde_kms->dev;
	if (!dev)
		return -EINVAL;

	priv = dev->dev_private;
	if (!priv)
		return -EINVAL;

	SDE_EVT32(genpd->device_count);

	rc = sde_power_resource_enable(&priv->phandle, priv->pclient, true);

	return rc;
}

static int sde_kms_pd_disable(struct generic_pm_domain *genpd)
{
	struct sde_kms *sde_kms = genpd_to_sde_kms(genpd);
	struct drm_device *dev;
	struct msm_drm_private *priv;
	int rc;

	SDE_DEBUG("\n");

	dev = sde_kms->dev;
	if (!dev)
		return -EINVAL;

	priv = dev->dev_private;
	if (!priv)
		return -EINVAL;

	SDE_EVT32(genpd->device_count);

	rc = sde_power_resource_enable(&priv->phandle, priv->pclient, false);

	return rc;
}

static int sde_kms_hw_init(struct msm_kms *kms)
{
	struct sde_kms *sde_kms;
@@ -2242,9 +2298,37 @@ static int sde_kms_hw_init(struct msm_kms *kms)
			SDE_POWER_EVENT_PRE_DISABLE,
			sde_kms_handle_power_event, sde_kms, "kms");

	/* initialize power domain if defined */
	if (of_find_property(dev->dev->of_node, "#power-domain-cells", NULL)) {
		sde_kms->genpd.name = dev->unique;
		sde_kms->genpd.power_off = sde_kms_pd_disable;
		sde_kms->genpd.power_on = sde_kms_pd_enable;

		rc = pm_genpd_init(&sde_kms->genpd, NULL, true);
		if (rc < 0) {
			SDE_ERROR("failed to init genpd provider %s: %d\n",
					sde_kms->genpd.name, rc);
			goto genpd_err;
		}

		rc = of_genpd_add_provider_simple(dev->dev->of_node,
				&sde_kms->genpd);
		if (rc < 0) {
			SDE_ERROR("failed to add genpd provider %s: %d\n",
					sde_kms->genpd.name, rc);
			pm_genpd_remove(&sde_kms->genpd);
			goto genpd_err;
		}

		sde_kms->genpd_init = true;
		SDE_DEBUG("added genpd provider %s\n", sde_kms->genpd.name);
	}

	sde_power_resource_enable(&priv->phandle, sde_kms->core_client, false);

	return 0;

genpd_err:
drm_obj_init_err:
	sde_core_perf_destroy(&sde_kms->perf);
hw_intr_init_err:
+4 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#define __SDE_KMS_H__

#include <linux/msm_ion.h>
#include <linux/pm_domain.h>

#include "msm_drv.h"
#include "msm_kms.h"
@@ -176,6 +177,9 @@ struct sde_kms {
	int core_rev;
	struct sde_mdss_cfg *catalog;

	struct generic_pm_domain genpd;
	bool genpd_init;

	struct msm_gem_address_space *aspace[MSM_SMMU_DOMAIN_MAX];
	struct sde_power_client *core_client;