linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] PM / AVS: rockchip-io: add GRF and PMUGRF types to distinguish
@ 2016-01-30 12:01 David Wu
  2016-01-30 12:39 ` Heiko Stuebner
  0 siblings, 1 reply; 5+ messages in thread
From: David Wu @ 2016-01-30 12:01 UTC (permalink / raw)
  To: linux-arm-kernel

As rk3368 contained two separated iodomain areas, this was
determined to use which regmap base address.

Signed-off-by: David Wu <david.wu@rock-chips.com>
---
 drivers/power/avs/rockchip-io-domain.c | 32 ++++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/drivers/power/avs/rockchip-io-domain.c b/drivers/power/avs/rockchip-io-domain.c
index 8099456..b17aeb7 100644
--- a/drivers/power/avs/rockchip-io-domain.c
+++ b/drivers/power/avs/rockchip-io-domain.c
@@ -47,6 +47,11 @@
 #define RK3368_SOC_CON15_FLASH0		BIT(14)
 #define RK3368_SOC_FLASH_SUPPLY_NUM	2
 
+enum rockchip_iodomain_grf_type {
+	GRF,
+	PMUGRF
+};
+
 struct rockchip_iodomain;
 
 /**
@@ -54,6 +59,7 @@ struct rockchip_iodomain;
  */
 struct rockchip_iodomain_soc_data {
 	int grf_offset;
+	enum rockchip_iodomain_grf_type type;
 	const char *supply_names[MAX_SUPPLIES];
 	void (*init)(struct rockchip_iodomain *iod);
 };
@@ -67,7 +73,7 @@ struct rockchip_iodomain_supply {
 
 struct rockchip_iodomain {
 	struct device *dev;
-	struct regmap *grf;
+	struct regmap *base;
 	struct rockchip_iodomain_soc_data *soc_data;
 	struct rockchip_iodomain_supply supplies[MAX_SUPPLIES];
 };
@@ -86,7 +92,7 @@ static int rockchip_iodomain_write(struct rockchip_iodomain_supply *supply,
 	/* apply hiword-mask */
 	val |= (BIT(supply->idx) << 16);
 
-	ret = regmap_write(iod->grf, iod->soc_data->grf_offset, val);
+	ret = regmap_write(iod->base, iod->soc_data->grf_offset, val);
 	if (ret)
 		dev_err(iod->dev, "Couldn't write to GRF\n");
 
@@ -157,7 +163,7 @@ static void rk3288_iodomain_init(struct rockchip_iodomain *iod)
 	 * instead of a special gpio.
 	 */
 	val = RK3288_SOC_CON2_FLASH0 | (RK3288_SOC_CON2_FLASH0 << 16);
-	ret = regmap_write(iod->grf, RK3288_SOC_CON2, val);
+	ret = regmap_write(iod->base, RK3288_SOC_CON2, val);
 	if (ret < 0)
 		dev_warn(iod->dev, "couldn't update flash0 ctrl\n");
 }
@@ -176,7 +182,7 @@ static void rk3368_iodomain_init(struct rockchip_iodomain *iod)
 	 * instead of a special gpio.
 	 */
 	val = RK3368_SOC_CON15_FLASH0 | (RK3368_SOC_CON15_FLASH0 << 16);
-	ret = regmap_write(iod->grf, RK3368_SOC_CON15, val);
+	ret = regmap_write(iod->base, RK3368_SOC_CON15, val);
 	if (ret < 0)
 		dev_warn(iod->dev, "couldn't update flash0 ctrl\n");
 }
@@ -187,6 +193,7 @@ static void rk3368_iodomain_init(struct rockchip_iodomain *iod)
  */
 static const struct rockchip_iodomain_soc_data soc_data_rk3188 = {
 	.grf_offset = 0x104,
+	.type = GRF,
 	.supply_names = {
 		NULL,
 		NULL,
@@ -209,6 +216,7 @@ static const struct rockchip_iodomain_soc_data soc_data_rk3188 = {
 
 static const struct rockchip_iodomain_soc_data soc_data_rk3288 = {
 	.grf_offset = 0x380,
+	.type = GRF,
 	.supply_names = {
 		"lcdc",		/* LCDC_VDD */
 		"dvp",		/* DVPIO_VDD */
@@ -226,6 +234,7 @@ static const struct rockchip_iodomain_soc_data soc_data_rk3288 = {
 
 static const struct rockchip_iodomain_soc_data soc_data_rk3368 = {
 	.grf_offset = 0x900,
+	.type = GRF,
 	.supply_names = {
 		NULL,		/* reserved */
 		"dvp",		/* DVPIO_VDD */
@@ -242,6 +251,7 @@ static const struct rockchip_iodomain_soc_data soc_data_rk3368 = {
 
 static const struct rockchip_iodomain_soc_data soc_data_rk3368_pmu = {
 	.grf_offset = 0x100,
+	.type = PMUGRF,
 	.supply_names = {
 		NULL,
 		NULL,
@@ -293,10 +303,16 @@ static int rockchip_iodomain_probe(struct platform_device *pdev)
 	match = of_match_node(rockchip_iodomain_match, np);
 	iod->soc_data = (struct rockchip_iodomain_soc_data *)match->data;
 
-	iod->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
-	if (IS_ERR(iod->grf)) {
-		dev_err(&pdev->dev, "couldn't find grf regmap\n");
-		return PTR_ERR(iod->grf);
+	if (iod->soc_data->type == PMUGRF)
+		iod->base = syscon_regmap_lookup_by_phandle(
+				np, "rockchip,pmugrf");
+	else
+		iod->base = syscon_regmap_lookup_by_phandle(
+				np, "rockchip,grf");
+	if (IS_ERR(iod->base)) {
+		dev_err(&pdev->dev, "couldn't find %s regmap\n",
+			(iod->soc_data->type == PMUGRF) ? "pmugrf" : "grf");
+		return PTR_ERR(iod->base);
 	}
 
 	for (i = 0; i < MAX_SUPPLIES; i++) {
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH] PM / AVS: rockchip-io: add GRF and PMUGRF types to distinguish
  2016-01-30 12:01 [PATCH] PM / AVS: rockchip-io: add GRF and PMUGRF types to distinguish David Wu
@ 2016-01-30 12:39 ` Heiko Stuebner
  2016-02-01  8:54   ` David.Wu
  0 siblings, 1 reply; 5+ messages in thread
From: Heiko Stuebner @ 2016-01-30 12:39 UTC (permalink / raw)
  To: linux-arm-kernel

Hi David,

Am Samstag, 30. Januar 2016, 20:01:45 schrieb David Wu:
> As rk3368 contained two separated iodomain areas, this was
> determined to use which regmap base address.
> 
> Signed-off-by: David Wu <david.wu@rock-chips.com>

I don't think we need to specify this on a driver level. Both GRF areas are 
"General register files" only located in two separate power-domains.
So the rockchip,grf property should work for both. Especially as nothing 
keeps designers from introducing yet another GRF-area somewhere else ;-)

>From when I started working on the rk3368, I still have a preliminary 
patches for that sitting here, so I've attached on how I envisoned that to 
work.


Heiko

> ---
>  drivers/power/avs/rockchip-io-domain.c | 32
> ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8
> deletions(-)
> 
> diff --git a/drivers/power/avs/rockchip-io-domain.c
> b/drivers/power/avs/rockchip-io-domain.c index 8099456..b17aeb7 100644
> --- a/drivers/power/avs/rockchip-io-domain.c
> +++ b/drivers/power/avs/rockchip-io-domain.c
> @@ -47,6 +47,11 @@
>  #define RK3368_SOC_CON15_FLASH0		BIT(14)
>  #define RK3368_SOC_FLASH_SUPPLY_NUM	2
> 
> +enum rockchip_iodomain_grf_type {
> +	GRF,
> +	PMUGRF
> +};
> +
>  struct rockchip_iodomain;
> 
>  /**
> @@ -54,6 +59,7 @@ struct rockchip_iodomain;
>   */
>  struct rockchip_iodomain_soc_data {
>  	int grf_offset;
> +	enum rockchip_iodomain_grf_type type;
>  	const char *supply_names[MAX_SUPPLIES];
>  	void (*init)(struct rockchip_iodomain *iod);
>  };
> @@ -67,7 +73,7 @@ struct rockchip_iodomain_supply {
> 
>  struct rockchip_iodomain {
>  	struct device *dev;
> -	struct regmap *grf;
> +	struct regmap *base;
>  	struct rockchip_iodomain_soc_data *soc_data;
>  	struct rockchip_iodomain_supply supplies[MAX_SUPPLIES];
>  };
> @@ -86,7 +92,7 @@ static int rockchip_iodomain_write(struct
> rockchip_iodomain_supply *supply, /* apply hiword-mask */
>  	val |= (BIT(supply->idx) << 16);
> 
> -	ret = regmap_write(iod->grf, iod->soc_data->grf_offset, val);
> +	ret = regmap_write(iod->base, iod->soc_data->grf_offset, val);
>  	if (ret)
>  		dev_err(iod->dev, "Couldn't write to GRF\n");
> 
> @@ -157,7 +163,7 @@ static void rk3288_iodomain_init(struct
> rockchip_iodomain *iod) * instead of a special gpio.
>  	 */
>  	val = RK3288_SOC_CON2_FLASH0 | (RK3288_SOC_CON2_FLASH0 << 16);
> -	ret = regmap_write(iod->grf, RK3288_SOC_CON2, val);
> +	ret = regmap_write(iod->base, RK3288_SOC_CON2, val);
>  	if (ret < 0)
>  		dev_warn(iod->dev, "couldn't update flash0 ctrl\n");
>  }
> @@ -176,7 +182,7 @@ static void rk3368_iodomain_init(struct
> rockchip_iodomain *iod) * instead of a special gpio.
>  	 */
>  	val = RK3368_SOC_CON15_FLASH0 | (RK3368_SOC_CON15_FLASH0 << 16);
> -	ret = regmap_write(iod->grf, RK3368_SOC_CON15, val);
> +	ret = regmap_write(iod->base, RK3368_SOC_CON15, val);
>  	if (ret < 0)
>  		dev_warn(iod->dev, "couldn't update flash0 ctrl\n");
>  }
> @@ -187,6 +193,7 @@ static void rk3368_iodomain_init(struct
> rockchip_iodomain *iod) */
>  static const struct rockchip_iodomain_soc_data soc_data_rk3188 = {
>  	.grf_offset = 0x104,
> +	.type = GRF,
>  	.supply_names = {
>  		NULL,
>  		NULL,
> @@ -209,6 +216,7 @@ static const struct rockchip_iodomain_soc_data
> soc_data_rk3188 = {
> 
>  static const struct rockchip_iodomain_soc_data soc_data_rk3288 = {
>  	.grf_offset = 0x380,
> +	.type = GRF,
>  	.supply_names = {
>  		"lcdc",		/* LCDC_VDD */
>  		"dvp",		/* DVPIO_VDD */
> @@ -226,6 +234,7 @@ static const struct rockchip_iodomain_soc_data
> soc_data_rk3288 = {
> 
>  static const struct rockchip_iodomain_soc_data soc_data_rk3368 = {
>  	.grf_offset = 0x900,
> +	.type = GRF,
>  	.supply_names = {
>  		NULL,		/* reserved */
>  		"dvp",		/* DVPIO_VDD */
> @@ -242,6 +251,7 @@ static const struct rockchip_iodomain_soc_data
> soc_data_rk3368 = {
> 
>  static const struct rockchip_iodomain_soc_data soc_data_rk3368_pmu = {
>  	.grf_offset = 0x100,
> +	.type = PMUGRF,
>  	.supply_names = {
>  		NULL,
>  		NULL,
> @@ -293,10 +303,16 @@ static int rockchip_iodomain_probe(struct
> platform_device *pdev) match = of_match_node(rockchip_iodomain_match,
> np);
>  	iod->soc_data = (struct rockchip_iodomain_soc_data *)match->data;
> 
> -	iod->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
> -	if (IS_ERR(iod->grf)) {
> -		dev_err(&pdev->dev, "couldn't find grf regmap\n");
> -		return PTR_ERR(iod->grf);
> +	if (iod->soc_data->type == PMUGRF)
> +		iod->base = syscon_regmap_lookup_by_phandle(
> +				np, "rockchip,pmugrf");
> +	else
> +		iod->base = syscon_regmap_lookup_by_phandle(
> +				np, "rockchip,grf");
> +	if (IS_ERR(iod->base)) {
> +		dev_err(&pdev->dev, "couldn't find %s regmap\n",
> +			(iod->soc_data->type == PMUGRF) ? "pmugrf" : "grf");
> +		return PTR_ERR(iod->base);
>  	}
> 
>  	for (i = 0; i < MAX_SUPPLIES; i++) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-PM-AVS-rockchip-io-add-io-selectors-and-supplies-for.patch
Type: text/x-patch
Size: 4768 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160130/a4868cb1/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-ARM64-dts-rockchip-add-iodomains-and-stuff.patch
Type: text/x-patch
Size: 1036 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160130/a4868cb1/attachment-0001.bin>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH] PM / AVS: rockchip-io: add GRF and PMUGRF types to distinguish
  2016-01-30 12:39 ` Heiko Stuebner
@ 2016-02-01  8:54   ` David.Wu
  2016-02-01 21:17     ` Heiko Stübner
  0 siblings, 1 reply; 5+ messages in thread
From: David.Wu @ 2016-02-01  8:54 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Heiko,

? 2016/1/30 20:39, Heiko Stuebner ??:
> Hi David,
>
> Am Samstag, 30. Januar 2016, 20:01:45 schrieb David Wu:
>> As rk3368 contained two separated iodomain areas, this was
>> determined to use which regmap base address.
>>
>> Signed-off-by: David Wu <david.wu@rock-chips.com>
> I don't think we need to specify this on a driver level. Both GRF areas are
> "General register files" only located in two separate power-domains.
> So the rockchip,grf property should work for both. Especially as nothing
> keeps designers from introducing yet another GRF-area somewhere else ;-)
>
> >From when I started working on the rk3368, I still have a preliminary
> patches for that sitting here, so I've attached on how I envisoned that to
> work.

Okay, i agree to you, but it make someone a little confused just from 
the drive code,
not DT file,  about  pmugrf regmap base address.:-)

How do you feel about intergating GRF and PMU drivers in one driver?
Thanks!

>
> Heiko
>
>> ---
>>   drivers/power/avs/rockchip-io-domain.c | 32
>> ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8
>> deletions(-)
>>
>> diff --git a/drivers/power/avs/rockchip-io-domain.c
>> b/drivers/power/avs/rockchip-io-domain.c index 8099456..b17aeb7 100644
>> --- a/drivers/power/avs/rockchip-io-domain.c
>> +++ b/drivers/power/avs/rockchip-io-domain.c
>> @@ -47,6 +47,11 @@
>>   #define RK3368_SOC_CON15_FLASH0		BIT(14)
>>   #define RK3368_SOC_FLASH_SUPPLY_NUM	2
>>
>> +enum rockchip_iodomain_grf_type {
>> +	GRF,
>> +	PMUGRF
>> +};
>> +
>>   struct rockchip_iodomain;
>>
>>   /**
>> @@ -54,6 +59,7 @@ struct rockchip_iodomain;
>>    */
>>   struct rockchip_iodomain_soc_data {
>>   	int grf_offset;
>> +	enum rockchip_iodomain_grf_type type;
>>   	const char *supply_names[MAX_SUPPLIES];
>>   	void (*init)(struct rockchip_iodomain *iod);
>>   };
>> @@ -67,7 +73,7 @@ struct rockchip_iodomain_supply {
>>
>>   struct rockchip_iodomain {
>>   	struct device *dev;
>> -	struct regmap *grf;
>> +	struct regmap *base;
>>   	struct rockchip_iodomain_soc_data *soc_data;
>>   	struct rockchip_iodomain_supply supplies[MAX_SUPPLIES];
>>   };
>> @@ -86,7 +92,7 @@ static int rockchip_iodomain_write(struct
>> rockchip_iodomain_supply *supply, /* apply hiword-mask */
>>   	val |= (BIT(supply->idx) << 16);
>>
>> -	ret = regmap_write(iod->grf, iod->soc_data->grf_offset, val);
>> +	ret = regmap_write(iod->base, iod->soc_data->grf_offset, val);
>>   	if (ret)
>>   		dev_err(iod->dev, "Couldn't write to GRF\n");
>>
>> @@ -157,7 +163,7 @@ static void rk3288_iodomain_init(struct
>> rockchip_iodomain *iod) * instead of a special gpio.
>>   	 */
>>   	val = RK3288_SOC_CON2_FLASH0 | (RK3288_SOC_CON2_FLASH0 << 16);
>> -	ret = regmap_write(iod->grf, RK3288_SOC_CON2, val);
>> +	ret = regmap_write(iod->base, RK3288_SOC_CON2, val);
>>   	if (ret < 0)
>>   		dev_warn(iod->dev, "couldn't update flash0 ctrl\n");
>>   }
>> @@ -176,7 +182,7 @@ static void rk3368_iodomain_init(struct
>> rockchip_iodomain *iod) * instead of a special gpio.
>>   	 */
>>   	val = RK3368_SOC_CON15_FLASH0 | (RK3368_SOC_CON15_FLASH0 << 16);
>> -	ret = regmap_write(iod->grf, RK3368_SOC_CON15, val);
>> +	ret = regmap_write(iod->base, RK3368_SOC_CON15, val);
>>   	if (ret < 0)
>>   		dev_warn(iod->dev, "couldn't update flash0 ctrl\n");
>>   }
>> @@ -187,6 +193,7 @@ static void rk3368_iodomain_init(struct
>> rockchip_iodomain *iod) */
>>   static const struct rockchip_iodomain_soc_data soc_data_rk3188 = {
>>   	.grf_offset = 0x104,
>> +	.type = GRF,
>>   	.supply_names = {
>>   		NULL,
>>   		NULL,
>> @@ -209,6 +216,7 @@ static const struct rockchip_iodomain_soc_data
>> soc_data_rk3188 = {
>>
>>   static const struct rockchip_iodomain_soc_data soc_data_rk3288 = {
>>   	.grf_offset = 0x380,
>> +	.type = GRF,
>>   	.supply_names = {
>>   		"lcdc",		/* LCDC_VDD */
>>   		"dvp",		/* DVPIO_VDD */
>> @@ -226,6 +234,7 @@ static const struct rockchip_iodomain_soc_data
>> soc_data_rk3288 = {
>>
>>   static const struct rockchip_iodomain_soc_data soc_data_rk3368 = {
>>   	.grf_offset = 0x900,
>> +	.type = GRF,
>>   	.supply_names = {
>>   		NULL,		/* reserved */
>>   		"dvp",		/* DVPIO_VDD */
>> @@ -242,6 +251,7 @@ static const struct rockchip_iodomain_soc_data
>> soc_data_rk3368 = {
>>
>>   static const struct rockchip_iodomain_soc_data soc_data_rk3368_pmu = {
>>   	.grf_offset = 0x100,
>> +	.type = PMUGRF,
>>   	.supply_names = {
>>   		NULL,
>>   		NULL,
>> @@ -293,10 +303,16 @@ static int rockchip_iodomain_probe(struct
>> platform_device *pdev) match = of_match_node(rockchip_iodomain_match,
>> np);
>>   	iod->soc_data = (struct rockchip_iodomain_soc_data *)match->data;
>>
>> -	iod->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
>> -	if (IS_ERR(iod->grf)) {
>> -		dev_err(&pdev->dev, "couldn't find grf regmap\n");
>> -		return PTR_ERR(iod->grf);
>> +	if (iod->soc_data->type == PMUGRF)
>> +		iod->base = syscon_regmap_lookup_by_phandle(
>> +				np, "rockchip,pmugrf");
>> +	else
>> +		iod->base = syscon_regmap_lookup_by_phandle(
>> +				np, "rockchip,grf");
>> +	if (IS_ERR(iod->base)) {
>> +		dev_err(&pdev->dev, "couldn't find %s regmap\n",
>> +			(iod->soc_data->type == PMUGRF) ? "pmugrf" : "grf");
>> +		return PTR_ERR(iod->base);
>>   	}
>>
>>   	for (i = 0; i < MAX_SUPPLIES; i++) {

-------------- next part --------------
>From 73cc56277c42fd13bed3921b07c84ac4b030321a Mon Sep 17 00:00:00 2001
From: David Wu <wdc@rock-chips.com>
Date: Wed, 24 Dec 2014 16:31:09 +0800
Subject: [PATCH 1/5] rk3368: io-domain: add io domain volt sel
Content-Type: text/plain; charset="utf-8"

Signed-off-by: David Wu <wdc@rock-chips.com>
---
 drivers/power/avs/rockchip-io-domain.c | 184 +++++++++++++++++++++++----------
 1 file changed, 130 insertions(+), 54 deletions(-)

diff --git a/drivers/power/avs/rockchip-io-domain.c b/drivers/power/avs/rockchip-io-domain.c
index b160132..d096457 100755
--- a/drivers/power/avs/rockchip-io-domain.c
+++ b/drivers/power/avs/rockchip-io-domain.c
@@ -43,19 +43,28 @@
 #define RK3288_SOC_CON2_FLASH0		BIT(7)
 #define RK3288_SOC_FLASH_SUPPLY_NUM	2
 
-#define RK3368_GRF_SOC_CON15			0x43c
-#define RK3368_GRF_SOC_CON15_FLASH0		BIT(14)
+#define RK3368_GRF_SOC_CON15		0x43c
+#define RK3368_GRF_SOC_CON15_FLASH0	BIT(14)
 #define RK3368_SOC_FLASH_SUPPLY_NUM	2
 
+#define MAX_ROCKCHIP_GRF_NUM        2
 
 struct rockchip_iodomain;
 
 /**
  * @supplies: voltage settings matching the register bits.
  */
+
+enum rockchip_iodomain_grf_type {
+	GRF,
+	PMU_GRF,
+};
+
 struct rockchip_iodomain_soc_data {
 	int grf_offset;
-	const char *supply_names[MAX_SUPPLIES];
+	int pmugrf_offset;
+	const char *grf_supply_names[MAX_SUPPLIES];
+	const char *pmugrf_supply_names[MAX_SUPPLIES];
 	void (*init)(struct rockchip_iodomain *iod);
 };
 
@@ -64,19 +73,24 @@ struct rockchip_iodomain_supply {
 	struct regulator *reg;
 	struct notifier_block nb;
 	int idx;
+	enum rockchip_iodomain_grf_type type;
 };
 
 struct rockchip_iodomain {
 	struct device *dev;
 	struct regmap *grf;
+	struct regmap *pmu;
 	struct rockchip_iodomain_soc_data *soc_data;
-	struct rockchip_iodomain_supply supplies[MAX_SUPPLIES];
+	struct rockchip_iodomain_supply grf_supplies[MAX_SUPPLIES];
+	struct rockchip_iodomain_supply pmugrf_supplies[MAX_SUPPLIES];
 };
 
 static int rockchip_iodomain_write(struct rockchip_iodomain_supply *supply,
 				   int uV)
 {
 	struct rockchip_iodomain *iod = supply->iod;
+	struct regmap *reg;
+	int offset;
 	u32 val;
 	int ret;
 
@@ -87,7 +101,15 @@ static int rockchip_iodomain_write(struct rockchip_iodomain_supply *supply,
 	/* apply hiword-mask */
 	val |= (BIT(supply->idx) << 16);
 
-	ret = regmap_write(iod->grf, iod->soc_data->grf_offset, val);
+	if (supply->type == GRF) {
+		reg = iod->grf;
+		offset = iod->soc_data->grf_offset;
+	} else if (supply->type == PMU_GRF) {
+		reg = iod->pmu;
+		offset = iod->soc_data->pmugrf_offset;
+	}
+
+	ret = regmap_write(reg, offset, val);
 	if (ret)
 		dev_err(iod->dev, "Couldn't write to GRF\n");
 
@@ -150,7 +172,7 @@ static void rk3288_iodomain_init(struct rockchip_iodomain *iod)
 	u32 val;
 
 	/* if no flash supply we should leave things alone */
-	if (!iod->supplies[RK3288_SOC_FLASH_SUPPLY_NUM].reg)
+	if (!iod->grf_supplies[RK3288_SOC_FLASH_SUPPLY_NUM].reg)
 		return;
 
 	/*
@@ -169,7 +191,7 @@ static void rk3368_iodomain_init(struct rockchip_iodomain *iod)
 	u32 val;
 
 	/* if no flash supply we should leave things alone */
-	if (!iod->supplies[RK3368_SOC_FLASH_SUPPLY_NUM].reg)
+	if (!iod->grf_supplies[RK3368_SOC_FLASH_SUPPLY_NUM].reg)
 		return;
 
 	/*
@@ -189,7 +211,7 @@ static void rk3368_iodomain_init(struct rockchip_iodomain *iod)
  */
 static const struct rockchip_iodomain_soc_data soc_data_rk3188 = {
 	.grf_offset = 0x104,
-	.supply_names = {
+	.grf_supply_names = {
 		NULL,
 		NULL,
 		NULL,
@@ -211,7 +233,7 @@ static const struct rockchip_iodomain_soc_data soc_data_rk3188 = {
 
 static const struct rockchip_iodomain_soc_data soc_data_rk3288 = {
 	.grf_offset = 0x380,
-	.supply_names = {
+	.grf_supply_names = {
 		"lcdc",		/* LCDC_VDD */
 		"dvp",		/* DVPIO_VDD */
 		"flash0",	/* FLASH0_VDD (emmc) */
@@ -228,16 +250,25 @@ static const struct rockchip_iodomain_soc_data soc_data_rk3288 = {
 
 static const struct rockchip_iodomain_soc_data soc_data_rk3368 = {
 	.grf_offset = 0x900,
-	.supply_names = {
+	.pmugrf_offset = 0x100,
+	.grf_supply_names = {
+		NULL,
+		"dvp",		/*DVP IO domain*/
+		"flash0",	/*FLASH0 IO domain*/
+		"wifi",         /*APIO2 IO domain*/
+		NULL,
+		"audio",	/*APIO3 IO domain*/
+		"sdcard",	/*SDCARD IO domain*/
+		"gpio30",	/*APIO1 IO domain*/
+		"gpio1830",	/*ADIO4 IO domain*/
+	},
+	.pmugrf_supply_names = {
+		NULL,
+		NULL,
 		NULL,
-		"dvp_v18sel",		/*DVP IO domain*/
-		"flash0_v18sel",		/*FLASH0 IO domain*/
-		"wifi_v18sel",	/*WIFI IO domain*/
 		NULL,
-		"audio_v18sel",	/*AUDIO IO domain*/
-		"sdcard_v18sel",		/*SDCARD IO domain*/
-		"gpio30_v18sel",		/*GPIO30 IO domain*/
-		"gpio1830_v18sel",	/*GPIO1830 IO domain*/
+		"pmu",	        /*PMU IO domain*/
+		"vop",	        /*LCDC IO domain*/
 	},
 	.init = rk3368_iodomain_init,
 };
@@ -259,47 +290,34 @@ static const struct of_device_id rockchip_iodomain_match[] = {
 	{ /* sentinel */ },
 };
 
-static int rockchip_iodomain_probe(struct platform_device *pdev)
+static int rockchip_iodomain_parse_supply(struct rockchip_iodomain *iod,
+					  struct device_node *np,
+					  enum rockchip_iodomain_grf_type type)
 {
-	struct device_node *np = pdev->dev.of_node;
-	const struct of_device_id *match;
-	struct rockchip_iodomain *iod;
+	struct rockchip_iodomain_supply *group_supply;
+	const char **group_supply_names;
 	int i, ret = 0;
 
-	if (!np)
-		return -ENODEV;
-
-	iod = devm_kzalloc(&pdev->dev, sizeof(*iod), GFP_KERNEL);
-	if (!iod)
-		return -ENOMEM;
-
-	iod->dev = &pdev->dev;
-	platform_set_drvdata(pdev, iod);
-
-	match = of_match_node(rockchip_iodomain_match, np);
-	iod->soc_data = (struct rockchip_iodomain_soc_data *)match->data;
-
-	iod->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
-	if (IS_ERR(iod->grf)) {
-		dev_err(&pdev->dev, "couldn't find grf regmap\n");
-		return PTR_ERR(iod->grf);
+	if (type == GRF) {
+		group_supply_names =
+			(const char **)iod->soc_data->grf_supply_names;
+		group_supply = iod->grf_supplies;
+	} else if (type == PMU_GRF) {
+		group_supply_names =
+			(const char **)iod->soc_data->pmugrf_supply_names;
+		group_supply = iod->pmugrf_supplies;
 	}
 
 	for (i = 0; i < MAX_SUPPLIES; i++) {
-		const char *supply_name = iod->soc_data->supply_names[i];
-		struct rockchip_iodomain_supply *supply = &iod->supplies[i];
+		const char *supply_name = group_supply_names[i];
+		struct rockchip_iodomain_supply *supply = &group_supply[i];
 		struct regulator *reg;
 		int uV;
-		const char *regulator_name = NULL;
 
 		if (!supply_name)
 			continue;
 
-		of_property_read_string(np, supply_name, &regulator_name);
-		if (!regulator_name)
-			continue;
-
-		reg = regulator_get(NULL, regulator_name);
+		reg = devm_regulator_get_optional(iod->dev, supply_name);
 		if (IS_ERR(reg)) {
 			ret = PTR_ERR(reg);
 
@@ -334,6 +352,7 @@ static int rockchip_iodomain_probe(struct platform_device *pdev)
 		supply->idx = i;
 		supply->iod = iod;
 		supply->reg = reg;
+		supply->type = type;
 		supply->nb.notifier_call = rockchip_iodomain_notify;
 
 		ret = rockchip_iodomain_write(supply, uV);
@@ -345,21 +364,16 @@ static int rockchip_iodomain_probe(struct platform_device *pdev)
 		/* register regulator notifier */
 		ret = regulator_register_notifier(reg, &supply->nb);
 		if (ret) {
-			dev_err(&pdev->dev,
+			dev_err(iod->dev,
 				"regulator notifier request failed\n");
 			supply->reg = NULL;
 			goto unreg_notify;
 		}
 	}
 
-	if (iod->soc_data->init)
-		iod->soc_data->init(iod);
-
-	return 0;
-
 unreg_notify:
 	for (i = MAX_SUPPLIES - 1; i >= 0; i--) {
-		struct rockchip_iodomain_supply *io_supply = &iod->supplies[i];
+		struct rockchip_iodomain_supply *io_supply = &group_supply[i];
 
 		if (io_supply->reg)
 			regulator_unregister_notifier(io_supply->reg,
@@ -369,13 +383,75 @@ unreg_notify:
 	return ret;
 }
 
+static int rockchip_iodomain_probe(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node, *node;
+	const struct of_device_id *match;
+	struct rockchip_iodomain *iod;
+	int ret = 0;
+
+	if (!np)
+		return -ENODEV;
+
+	iod = devm_kzalloc(&pdev->dev, sizeof(*iod), GFP_KERNEL);
+	if (!iod)
+		return -ENOMEM;
+
+	iod->dev = &pdev->dev;
+	platform_set_drvdata(pdev, iod);
+
+	match = of_match_node(rockchip_iodomain_match, np);
+	iod->soc_data = (struct rockchip_iodomain_soc_data *)match->data;
+
+	iod->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
+	if (IS_ERR(iod->grf)) {
+		dev_err(&pdev->dev, "couldn't find grf regmap\n");
+		return PTR_ERR(iod->grf);
+	}
+	ret = rockchip_iodomain_parse_supply(iod, np, GRF);
+	if (ret) {
+		dev_err(iod->dev,
+			"rockchip iodomain parse grf supply failed\n");
+		return ret;
+	}
+
+	/* try to find the optional reference to the pmu syscon */
+	node = of_parse_phandle(np, "rockchip,pmu", 0);
+	if (node) {
+		iod->pmu = syscon_node_to_regmap(node);
+		if (IS_ERR(iod->pmu))
+			return PTR_ERR(iod->pmu);
+		ret = rockchip_iodomain_parse_supply(iod, np, PMU_GRF);
+		if (ret) {
+			dev_err(iod->dev,
+				"rockchip iodomain parse pmu_grf supply failed\n");
+			return ret;
+		}
+	}
+
+	if (iod->soc_data->init)
+		iod->soc_data->init(iod);
+
+	return ret;
+}
+
 static int rockchip_iodomain_remove(struct platform_device *pdev)
 {
 	struct rockchip_iodomain *iod = platform_get_drvdata(pdev);
 	int i;
 
 	for (i = MAX_SUPPLIES - 1; i >= 0; i--) {
-		struct rockchip_iodomain_supply *io_supply = &iod->supplies[i];
+		struct rockchip_iodomain_supply *io_supply
+			= &iod->grf_supplies[i];
+
+		if (io_supply->reg)
+			regulator_unregister_notifier(io_supply->reg,
+						      &io_supply->nb);
+	}
+
+	for (i = MAX_SUPPLIES - 1; i >= 0; i--) {
+		struct rockchip_iodomain_supply *io_supply =
+			&iod->pmugrf_supplies[i];
 
 		if (io_supply->reg)
 			regulator_unregister_notifier(io_supply->reg,
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH] PM / AVS: rockchip-io: add GRF and PMUGRF types to distinguish
  2016-02-01  8:54   ` David.Wu
@ 2016-02-01 21:17     ` Heiko Stübner
  2016-02-02  9:38       ` David.Wu
  0 siblings, 1 reply; 5+ messages in thread
From: Heiko Stübner @ 2016-02-01 21:17 UTC (permalink / raw)
  To: linux-arm-kernel

Hi David,

Am Montag, 1. Februar 2016, 16:54:38 schrieb David.Wu:
> ? 2016/1/30 20:39, Heiko Stuebner ??:
> > Am Samstag, 30. Januar 2016, 20:01:45 schrieb David Wu:
> >> As rk3368 contained two separated iodomain areas, this was
> >> determined to use which regmap base address.
> >> 
> >> Signed-off-by: David Wu <david.wu@rock-chips.com>
> > 
> > I don't think we need to specify this on a driver level. Both GRF areas
> > are
> > "General register files" only located in two separate power-domains.
> > So the rockchip,grf property should work for both. Especially as nothing
> > keeps designers from introducing yet another GRF-area somewhere else ;-)
> > 
> > >From when I started working on the rk3368, I still have a preliminary
> > 
> > patches for that sitting here, so I've attached on how I envisoned that to
> > work.
> 
> Okay, i agree to you, but it make someone a little confused just from
> the drive code,
> not DT file,  about  pmugrf regmap base address.:-)
> 
> How do you feel about intergating GRF and PMU drivers in one driver?
> Thanks!

I will very strongly disagree here ;-) .
Similar to the power-domains being part of the pmu, the io-domains are
part of their individual GRFs. So if you want it really clean and tidy the way 
to go foward will be the attached patches. Compile-tested only.

Other things like the usbphy control should move there as well in the long 
run. But that's not immediate necessary.


Heiko
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-PM-AVS-rockchip-io-make-io-domains-a-child-of-the-GR.patch
Type: text/x-patch
Size: 2790 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160201/56da602b/attachment-0003.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0003-arm64-dts-rockchip-add-rk3368-iodomains.patch
Type: text/x-patch
Size: 1174 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160201/56da602b/attachment-0004.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-arm64-dts-rockchip-make-grf-syscons-simple-mfds.patch
Type: text/x-patch
Size: 1316 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160201/56da602b/attachment-0005.bin>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH] PM / AVS: rockchip-io: add GRF and PMUGRF types to distinguish
  2016-02-01 21:17     ` Heiko Stübner
@ 2016-02-02  9:38       ` David.Wu
  0 siblings, 0 replies; 5+ messages in thread
From: David.Wu @ 2016-02-02  9:38 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Heiko,

? 2016/2/2 5:17, Heiko St?bner ??:
> Hi David,
>
> Am Montag, 1. Februar 2016, 16:54:38 schrieb David.Wu:
>> ? 2016/1/30 20:39, Heiko Stuebner ??:
>>> Am Samstag, 30. Januar 2016, 20:01:45 schrieb David Wu:
>>>> As rk3368 contained two separated iodomain areas, this was
>>>> determined to use which regmap base address.
>>>>
>>>> Signed-off-by: David Wu <david.wu@rock-chips.com>
>>> I don't think we need to specify this on a driver level. Both GRF areas
>>> are
>>> "General register files" only located in two separate power-domains.
>>> So the rockchip,grf property should work for both. Especially as nothing
>>> keeps designers from introducing yet another GRF-area somewhere else ;-)
>>>
>>> >From when I started working on the rk3368, I still have a preliminary
>>>
>>> patches for that sitting here, so I've attached on how I envisoned that to
>>> work.
>> Okay, i agree to you, but it make someone a little confused just from
>> the drive code,
>> not DT file,  about  pmugrf regmap base address.:-)
>>
>> How do you feel about intergating GRF and PMU drivers in one driver?
>> Thanks!
> I will very strongly disagree here ;-) .
> Similar to the power-domains being part of the pmu, the io-domains are
> part of their individual GRFs. So if you want it really clean and tidy the way
> to go foward will be the attached patches. Compile-tested only.

Thanks for your reply, the patchs look better than mine.
I have tested them on sdk board and i found something may be wrong.
"parent->of_node" instead of "parent", as the parent is not null if 
parent-node not used.
         if (parent->of_node) {
             iod->grf = syscon_node_to_regmap(parent->of_node);
         } else {
             dev_dbg(&pdev->dev, "falling back to old binding\n");
             iod->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
         }

> Other things like the usbphy control should move there as well in the long
> run. But that's not immediate necessary.
>
>
> Heiko

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-02-02  9:38 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-01-30 12:01 [PATCH] PM / AVS: rockchip-io: add GRF and PMUGRF types to distinguish David Wu
2016-01-30 12:39 ` Heiko Stuebner
2016-02-01  8:54   ` David.Wu
2016-02-01 21:17     ` Heiko Stübner
2016-02-02  9:38       ` David.Wu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).