Commit 55d90a3e authored by Olof Johansson's avatar Olof Johansson
Browse files

Merge tag 'v4.6-rockchip-drivers1' of...

Merge tag 'v4.6-rockchip-drivers1' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip into next/drivers

Support for the power-domains on rk3368 and a fix for
a wrong handling of for_each_available_child_of_node.

* tag 'v4.6-rockchip-drivers1' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip

:
  soc: rockchip: power-domain: fix err handle while probing
  soc: rockchip: power-domain: Modify power domain driver for rk3368
  dt-bindings: modify document of Rockchip power domains
  dt-bindings: add power-domain header for RK3368 SoCs

Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
parents 388f7b1d 1d961f11
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ powered up/down by software based on different application scenes to save power.
Required properties for power domain controller:
- compatible: Should be one of the following.
	"rockchip,rk3288-power-controller" - for RK3288 SoCs.
	"rockchip,rk3368-power-controller" - for RK3368 SoCs.
- #power-domain-cells: Number of cells in a power-domain specifier.
	Should be 1 for multiple PM domains.
- #address-cells: Should be 1.
@@ -14,6 +15,7 @@ Required properties for power domain controller:
Required properties for power domain sub nodes:
- reg: index of the power domain, should use macros in:
	"include/dt-bindings/power/rk3288-power.h" - for RK3288 type power domain.
	"include/dt-bindings/power/rk3368-power.h" - for RK3368 type power domain.
- clocks (optional): phandles to clocks which need to be enabled while power domain
	switches state.

@@ -31,11 +33,24 @@ Example:
		};
	};

	 power: power-controller {
                compatible = "rockchip,rk3368-power-controller";
                #power-domain-cells = <1>;
                #address-cells = <1>;
                #size-cells = <0>;

                pd_gpu_1 {
                        reg = <RK3368_PD_GPU_1>;
                        clocks = <&cru ACLK_GPU_CFG>;
                };
        };

Node of a device using power domains must have a power-domains property,
containing a phandle to the power device node and an index specifying which
power domain to use.
The index should use macros in:
	"include/dt-bindings/power/rk3288-power.h" - for rk3288 type power domain.
	"include/dt-bindings/power/rk3368-power.h" - for rk3368 type power domain.

Example of the node using power domain:

@@ -44,3 +59,9 @@ Example of the node using power domain:
		power-domains = <&power RK3288_PD_GPU>;
		/* ... */
	};

	node {
                /* ... */
                power-domains = <&power RK3368_PD_GPU_1>;
                /* ... */
        };
+34 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include <linux/regmap.h>
#include <linux/mfd/syscon.h>
#include <dt-bindings/power/rk3288-power.h>
#include <dt-bindings/power/rk3368-power.h>

struct rockchip_domain_info {
	int pwr_mask;
@@ -75,6 +76,9 @@ struct rockchip_pmu {
#define DOMAIN_RK3288(pwr, status, req)		\
	DOMAIN(pwr, status, req, req, (req) + 16)

#define DOMAIN_RK3368(pwr, status, req)		\
	DOMAIN(pwr, status, req, (req) + 16, req)

static bool rockchip_pmu_domain_is_idle(struct rockchip_pm_domain *pd)
{
	struct rockchip_pmu *pmu = pd->pmu;
@@ -419,6 +423,7 @@ static int rockchip_pm_domain_probe(struct platform_device *pdev)
		if (error) {
			dev_err(dev, "failed to handle node %s: %d\n",
				node->name, error);
			of_node_put(node);
			goto err_out;
		}
	}
@@ -444,6 +449,14 @@ static const struct rockchip_domain_info rk3288_pm_domains[] = {
	[RK3288_PD_GPU]		= DOMAIN_RK3288(9, 9, 2),
};

static const struct rockchip_domain_info rk3368_pm_domains[] = {
	[RK3368_PD_PERI]	= DOMAIN_RK3368(13, 12, 6),
	[RK3368_PD_VIO]		= DOMAIN_RK3368(15, 14, 8),
	[RK3368_PD_VIDEO]	= DOMAIN_RK3368(14, 13, 7),
	[RK3368_PD_GPU_0]	= DOMAIN_RK3368(16, 15, 2),
	[RK3368_PD_GPU_1]	= DOMAIN_RK3368(17, 16, 2),
};

static const struct rockchip_pmu_info rk3288_pmu = {
	.pwr_offset = 0x08,
	.status_offset = 0x0c,
@@ -461,11 +474,32 @@ static const struct rockchip_pmu_info rk3288_pmu = {
	.domain_info = rk3288_pm_domains,
};

static const struct rockchip_pmu_info rk3368_pmu = {
	.pwr_offset = 0x0c,
	.status_offset = 0x10,
	.req_offset = 0x3c,
	.idle_offset = 0x40,
	.ack_offset = 0x40,

	.core_pwrcnt_offset = 0x48,
	.gpu_pwrcnt_offset = 0x50,

	.core_power_transition_time = 24,
	.gpu_power_transition_time = 24,

	.num_domains = ARRAY_SIZE(rk3368_pm_domains),
	.domain_info = rk3368_pm_domains,
};

static const struct of_device_id rockchip_pm_domain_dt_match[] = {
	{
		.compatible = "rockchip,rk3288-power-controller",
		.data = (void *)&rk3288_pmu,
	},
	{
		.compatible = "rockchip,rk3368-power-controller",
		.data = (void *)&rk3368_pmu,
	},
	{ /* sentinel */ },
};

+28 −0
Original line number Diff line number Diff line
#ifndef __DT_BINDINGS_POWER_RK3368_POWER_H__
#define __DT_BINDINGS_POWER_RK3368_POWER_H__

/* VD_CORE */
#define RK3368_PD_A53_L0	0
#define RK3368_PD_A53_L1	1
#define RK3368_PD_A53_L2	2
#define RK3368_PD_A53_L3	3
#define RK3368_PD_SCU_L		4
#define RK3368_PD_A53_B0	5
#define RK3368_PD_A53_B1	6
#define RK3368_PD_A53_B2	7
#define RK3368_PD_A53_B3	8
#define RK3368_PD_SCU_B		9

/* VD_LOGIC */
#define RK3368_PD_BUS		10
#define RK3368_PD_PERI		11
#define RK3368_PD_VIO		12
#define RK3368_PD_ALIVE		13
#define RK3368_PD_VIDEO		14
#define RK3368_PD_GPU_0		15
#define RK3368_PD_GPU_1		16

/* VD_PMU */
#define RK3368_PD_PMU		17

#endif