Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1205985 > unrolled thread

[PATCH V4 0/3] mfd: arizona: Support Cirrus Logic CS47L24 and WM1831

Started byRichard Fitzgerald <rf@opensource.wolfsonmicro.com>
First post2015-08-12 14:00 +0200
Last post2015-08-12 16:50 +0200
Articles 5 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH V4 0/3] mfd: arizona: Support Cirrus Logic CS47L24 and WM1831 Richard Fitzgerald <rf@opensource.wolfsonmicro.com> - 2015-08-12 14:00 +0200
    [PATCH V4 1/3] mfd: arizona: factor out DCVDD isolation control Richard Fitzgerald <rf@opensource.wolfsonmicro.com> - 2015-08-12 14:00 +0200
      Re: [PATCH V4 1/3] mfd: arizona: factor out DCVDD isolation control Lee Jones <lee.jones@linaro.org> - 2015-08-12 16:50 +0200
    [PATCH V4 2/3] mfd: arizona: factor out checking of jack detection state Richard Fitzgerald <rf@opensource.wolfsonmicro.com> - 2015-08-12 14:00 +0200
      Re: [PATCH V4 2/3] mfd: arizona: factor out checking of jack  detection state Lee Jones <lee.jones@linaro.org> - 2015-08-12 16:50 +0200

#1205985 — [PATCH V4 0/3] mfd: arizona: Support Cirrus Logic CS47L24 and WM1831

FromRichard Fitzgerald <rf@opensource.wolfsonmicro.com>
Date2015-08-12 14:00 +0200
Subject[PATCH V4 0/3] mfd: arizona: Support Cirrus Logic CS47L24 and WM1831
Message-ID<pWCRj-3tG-7@gated-at.bofh.it>
This set of patches adds MFD support for the CS47L24 and WM1831 codecs.

Since there are a few features of the existing codecs that are not present
on the CS47L24/WM1831 the first two patches factor out some small parts of
the suspend/resume handling so that the CS47L24/WM1831 can be added in a
clean, readable way.

There are also some small changes due to the change of manufacturer, the
original Arizona codecs were produced by Wolfson Microelectronics but the
CS47L24 and WM1831 are Cirrus Logic parts.

Richard Fitzgerald (3):
  mfd: arizona: factor out DCVDD isolation control
  mfd: arizona: factor out checking of jack detection state
  mfd: arizona: Support Cirrus Logic CS47L24 and WM1831

 Documentation/devicetree/bindings/mfd/arizona.txt |    6 +-
 drivers/mfd/Kconfig                               |   19 +-
 drivers/mfd/Makefile                              |    3 +
 drivers/mfd/arizona-core.c                        |  220 ++-
 drivers/mfd/arizona-irq.c                         |   40 +-
 drivers/mfd/arizona-spi.c                         |    8 +
 drivers/mfd/arizona.h                             |    4 +
 drivers/mfd/cs47l24-tables.c                      | 1635 +++++++++++++++++++++
 include/linux/mfd/arizona/core.h                  |    3 +
 9 files changed, 1858 insertions(+), 80 deletions(-)
 create mode 100644 drivers/mfd/cs47l24-tables.c

-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [next] | [standalone]


#1205987 — [PATCH V4 1/3] mfd: arizona: factor out DCVDD isolation control

FromRichard Fitzgerald <rf@opensource.wolfsonmicro.com>
Date2015-08-12 14:00 +0200
Subject[PATCH V4 1/3] mfd: arizona: factor out DCVDD isolation control
Message-ID<pWCRk-3tG-19@gated-at.bofh.it>
In reply to#1205985
Currently DCVDD isolation is enabled and disabled for
runtime_suspend and runtime_resume. Future codecs will not
have the isolation control so to prepare for these codecs
this patch factors out the isolation control allowing it to
be called as needed in the existing codec-specific switch cases.

Signed-off-by: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
---
 drivers/mfd/arizona-core.c | 108 ++++++++++++++++++++++++++-------------------
 1 file changed, 62 insertions(+), 46 deletions(-)

diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
index bc814b0..33f3db4 100644
--- a/drivers/mfd/arizona-core.c
+++ b/drivers/mfd/arizona-core.c
@@ -462,6 +462,33 @@ static int wm5102_clear_write_sequencer(struct arizona *arizona)
 }
 
 #ifdef CONFIG_PM
+static int arizona_isolate_dcvdd(struct arizona *arizona)
+{
+	int ret;
+
+	ret = regmap_update_bits(arizona->regmap,
+				 ARIZONA_ISOLATION_CONTROL,
+				 ARIZONA_ISOLATE_DCVDD1,
+				 ARIZONA_ISOLATE_DCVDD1);
+	if (ret != 0)
+		dev_err(arizona->dev, "Failed to isolate DCVDD: %d\n", ret);
+
+	return ret;
+}
+
+static int arizona_connect_dcvdd(struct arizona *arizona)
+{
+	int ret;
+
+	ret = regmap_update_bits(arizona->regmap,
+				 ARIZONA_ISOLATION_CONTROL,
+				 ARIZONA_ISOLATE_DCVDD1, 0);
+	if (ret != 0)
+		dev_err(arizona->dev, "Failed to connect DCVDD: %d\n", ret);
+
+	return ret;
+}
+
 static int arizona_runtime_resume(struct device *dev)
 {
 	struct arizona *arizona = dev_get_drvdata(dev);
@@ -501,14 +528,9 @@ static int arizona_runtime_resume(struct device *dev)
 	switch (arizona->type) {
 	case WM5102:
 		if (arizona->external_dcvdd) {
-			ret = regmap_update_bits(arizona->regmap,
-						 ARIZONA_ISOLATION_CONTROL,
-						 ARIZONA_ISOLATE_DCVDD1, 0);
-			if (ret != 0) {
-				dev_err(arizona->dev,
-					"Failed to connect DCVDD: %d\n", ret);
+			ret = arizona_connect_dcvdd(arizona);
+			if (ret != 0)
 				goto err;
-			}
 		}
 
 		ret = wm5102_patch(arizona);
@@ -533,14 +555,9 @@ static int arizona_runtime_resume(struct device *dev)
 			goto err;
 
 		if (arizona->external_dcvdd) {
-			ret = regmap_update_bits(arizona->regmap,
-						 ARIZONA_ISOLATION_CONTROL,
-						 ARIZONA_ISOLATE_DCVDD1, 0);
-			if (ret) {
-				dev_err(arizona->dev,
-					"Failed to connect DCVDD: %d\n", ret);
+			ret = arizona_connect_dcvdd(arizona);
+			if (ret != 0)
 				goto err;
-			}
 		} else {
 			/*
 			 * As this is only called for the internal regulator
@@ -572,14 +589,9 @@ static int arizona_runtime_resume(struct device *dev)
 		}
 
 		if (arizona->external_dcvdd) {
-			ret = regmap_update_bits(arizona->regmap,
-						 ARIZONA_ISOLATION_CONTROL,
-						 ARIZONA_ISOLATE_DCVDD1, 0);
-			if (ret != 0) {
-				dev_err(arizona->dev,
-					"Failed to connect DCVDD: %d\n", ret);
+			ret = arizona_connect_dcvdd(arizona);
+			if (ret != 0)
 				goto err;
-			}
 		}
 		break;
 	}
@@ -612,37 +624,36 @@ static int arizona_runtime_suspend(struct device *dev)
 		return ret;
 	}
 
-	if (arizona->external_dcvdd) {
-		ret = regmap_update_bits(arizona->regmap,
-					 ARIZONA_ISOLATION_CONTROL,
-					 ARIZONA_ISOLATE_DCVDD1,
-					 ARIZONA_ISOLATE_DCVDD1);
-		if (ret != 0) {
-			dev_err(arizona->dev, "Failed to isolate DCVDD: %d\n",
-				ret);
-			return ret;
-		}
-	}
-
 	switch (arizona->type) {
 	case WM5110:
 	case WM8280:
-		if (arizona->external_dcvdd)
-			break;
-
-		/*
-		 * As this is only called for the internal regulator
-		 * (where we know voltage ranges available) it is ok
-		 * to request an exact range.
-		 */
-		ret = regulator_set_voltage(arizona->dcvdd, 1175000, 1175000);
-		if (ret < 0) {
-			dev_err(arizona->dev,
-				"Failed to set suspend voltage: %d\n", ret);
-			return ret;
+		if (arizona->external_dcvdd) {
+			ret = arizona_isolate_dcvdd(arizona);
+			if (ret != 0)
+				return ret;
+		} else {
+			/*
+			 * As this is only called for the internal regulator
+			 * (where we know voltage ranges available) it is ok
+			 * to request an exact range.
+			 */
+			ret = regulator_set_voltage(arizona->dcvdd,
+						    1175000, 1175000);
+			if (ret < 0) {
+				dev_err(arizona->dev,
+					"Failed to set suspend voltage: %d\n",
+					ret);
+				return ret;
+			}
 		}
 		break;
 	case WM5102:
+		if (arizona->external_dcvdd) {
+			ret = arizona_isolate_dcvdd(arizona);
+			if (ret != 0)
+				return ret;
+		}
+
 		if (!(val & ARIZONA_JD1_ENA)) {
 			ret = regmap_write(arizona->regmap,
 					   ARIZONA_WRITE_SEQUENCER_CTRL_3, 0x0);
@@ -655,6 +666,11 @@ static int arizona_runtime_suspend(struct device *dev)
 		}
 		break;
 	default:
+		if (arizona->external_dcvdd) {
+			ret = arizona_isolate_dcvdd(arizona);
+			if (ret != 0)
+				return ret;
+		}
 		break;
 	}
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1206176 — Re: [PATCH V4 1/3] mfd: arizona: factor out DCVDD isolation control

FromLee Jones <lee.jones@linaro.org>
Date2015-08-12 16:50 +0200
SubjectRe: [PATCH V4 1/3] mfd: arizona: factor out DCVDD isolation control
Message-ID<pWFvQ-7mW-13@gated-at.bofh.it>
In reply to#1205987
On Wed, 12 Aug 2015, Richard Fitzgerald wrote:

> Currently DCVDD isolation is enabled and disabled for
> runtime_suspend and runtime_resume. Future codecs will not
> have the isolation control so to prepare for these codecs
> this patch factors out the isolation control allowing it to
> be called as needed in the existing codec-specific switch cases.
> 
> Signed-off-by: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
> ---
>  drivers/mfd/arizona-core.c | 108 ++++++++++++++++++++++++++-------------------
>  1 file changed, 62 insertions(+), 46 deletions(-)

For my own reference:
  Acked-by: Lee Jones <lee.jones@linaro.org>

> diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
> index bc814b0..33f3db4 100644
> --- a/drivers/mfd/arizona-core.c
> +++ b/drivers/mfd/arizona-core.c
> @@ -462,6 +462,33 @@ static int wm5102_clear_write_sequencer(struct arizona *arizona)
>  }
>  
>  #ifdef CONFIG_PM
> +static int arizona_isolate_dcvdd(struct arizona *arizona)
> +{
> +	int ret;
> +
> +	ret = regmap_update_bits(arizona->regmap,
> +				 ARIZONA_ISOLATION_CONTROL,
> +				 ARIZONA_ISOLATE_DCVDD1,
> +				 ARIZONA_ISOLATE_DCVDD1);
> +	if (ret != 0)
> +		dev_err(arizona->dev, "Failed to isolate DCVDD: %d\n", ret);
> +
> +	return ret;
> +}
> +
> +static int arizona_connect_dcvdd(struct arizona *arizona)
> +{
> +	int ret;
> +
> +	ret = regmap_update_bits(arizona->regmap,
> +				 ARIZONA_ISOLATION_CONTROL,
> +				 ARIZONA_ISOLATE_DCVDD1, 0);
> +	if (ret != 0)
> +		dev_err(arizona->dev, "Failed to connect DCVDD: %d\n", ret);
> +
> +	return ret;
> +}
> +
>  static int arizona_runtime_resume(struct device *dev)
>  {
>  	struct arizona *arizona = dev_get_drvdata(dev);
> @@ -501,14 +528,9 @@ static int arizona_runtime_resume(struct device *dev)
>  	switch (arizona->type) {
>  	case WM5102:
>  		if (arizona->external_dcvdd) {
> -			ret = regmap_update_bits(arizona->regmap,
> -						 ARIZONA_ISOLATION_CONTROL,
> -						 ARIZONA_ISOLATE_DCVDD1, 0);
> -			if (ret != 0) {
> -				dev_err(arizona->dev,
> -					"Failed to connect DCVDD: %d\n", ret);
> +			ret = arizona_connect_dcvdd(arizona);
> +			if (ret != 0)
>  				goto err;
> -			}
>  		}
>  
>  		ret = wm5102_patch(arizona);
> @@ -533,14 +555,9 @@ static int arizona_runtime_resume(struct device *dev)
>  			goto err;
>  
>  		if (arizona->external_dcvdd) {
> -			ret = regmap_update_bits(arizona->regmap,
> -						 ARIZONA_ISOLATION_CONTROL,
> -						 ARIZONA_ISOLATE_DCVDD1, 0);
> -			if (ret) {
> -				dev_err(arizona->dev,
> -					"Failed to connect DCVDD: %d\n", ret);
> +			ret = arizona_connect_dcvdd(arizona);
> +			if (ret != 0)
>  				goto err;
> -			}
>  		} else {
>  			/*
>  			 * As this is only called for the internal regulator
> @@ -572,14 +589,9 @@ static int arizona_runtime_resume(struct device *dev)
>  		}
>  
>  		if (arizona->external_dcvdd) {
> -			ret = regmap_update_bits(arizona->regmap,
> -						 ARIZONA_ISOLATION_CONTROL,
> -						 ARIZONA_ISOLATE_DCVDD1, 0);
> -			if (ret != 0) {
> -				dev_err(arizona->dev,
> -					"Failed to connect DCVDD: %d\n", ret);
> +			ret = arizona_connect_dcvdd(arizona);
> +			if (ret != 0)
>  				goto err;
> -			}
>  		}
>  		break;
>  	}
> @@ -612,37 +624,36 @@ static int arizona_runtime_suspend(struct device *dev)
>  		return ret;
>  	}
>  
> -	if (arizona->external_dcvdd) {
> -		ret = regmap_update_bits(arizona->regmap,
> -					 ARIZONA_ISOLATION_CONTROL,
> -					 ARIZONA_ISOLATE_DCVDD1,
> -					 ARIZONA_ISOLATE_DCVDD1);
> -		if (ret != 0) {
> -			dev_err(arizona->dev, "Failed to isolate DCVDD: %d\n",
> -				ret);
> -			return ret;
> -		}
> -	}
> -
>  	switch (arizona->type) {
>  	case WM5110:
>  	case WM8280:
> -		if (arizona->external_dcvdd)
> -			break;
> -
> -		/*
> -		 * As this is only called for the internal regulator
> -		 * (where we know voltage ranges available) it is ok
> -		 * to request an exact range.
> -		 */
> -		ret = regulator_set_voltage(arizona->dcvdd, 1175000, 1175000);
> -		if (ret < 0) {
> -			dev_err(arizona->dev,
> -				"Failed to set suspend voltage: %d\n", ret);
> -			return ret;
> +		if (arizona->external_dcvdd) {
> +			ret = arizona_isolate_dcvdd(arizona);
> +			if (ret != 0)
> +				return ret;
> +		} else {
> +			/*
> +			 * As this is only called for the internal regulator
> +			 * (where we know voltage ranges available) it is ok
> +			 * to request an exact range.
> +			 */
> +			ret = regulator_set_voltage(arizona->dcvdd,
> +						    1175000, 1175000);
> +			if (ret < 0) {
> +				dev_err(arizona->dev,
> +					"Failed to set suspend voltage: %d\n",
> +					ret);
> +				return ret;
> +			}
>  		}
>  		break;
>  	case WM5102:
> +		if (arizona->external_dcvdd) {
> +			ret = arizona_isolate_dcvdd(arizona);
> +			if (ret != 0)
> +				return ret;
> +		}
> +
>  		if (!(val & ARIZONA_JD1_ENA)) {
>  			ret = regmap_write(arizona->regmap,
>  					   ARIZONA_WRITE_SEQUENCER_CTRL_3, 0x0);
> @@ -655,6 +666,11 @@ static int arizona_runtime_suspend(struct device *dev)
>  		}
>  		break;
>  	default:
> +		if (arizona->external_dcvdd) {
> +			ret = arizona_isolate_dcvdd(arizona);
> +			if (ret != 0)
> +				return ret;
> +		}
>  		break;
>  	}
>  

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1205993 — [PATCH V4 2/3] mfd: arizona: factor out checking of jack detection state

FromRichard Fitzgerald <rf@opensource.wolfsonmicro.com>
Date2015-08-12 14:00 +0200
Subject[PATCH V4 2/3] mfd: arizona: factor out checking of jack detection state
Message-ID<pWCRl-3tG-43@gated-at.bofh.it>
In reply to#1205985
Currently runtime_suspend will fully power off the codec if
the jack detection is not enabled. Not all future codecs will
have jack detection so to prepare for these codecs this patch
factors out the check so that it be called as needed in the
existing codec-specific switch cases.

Signed-off-by: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
---
 drivers/mfd/arizona-core.c | 41 ++++++++++++++++++++++++++++++++---------
 1 file changed, 32 insertions(+), 9 deletions(-)

diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
index 33f3db4..43ca30b 100644
--- a/drivers/mfd/arizona-core.c
+++ b/drivers/mfd/arizona-core.c
@@ -489,6 +489,23 @@ static int arizona_connect_dcvdd(struct arizona *arizona)
 	return ret;
 }
 
+static int arizona_is_jack_det_active(struct arizona *arizona)
+{
+	unsigned int val;
+	int ret;
+
+	ret = regmap_read(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE, &val);
+	if (ret) {
+		dev_err(arizona->dev,
+			"Failed to check jack det status: %d\n", ret);
+		return ret;
+	} else if (val & ARIZONA_JD1_ENA) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
 static int arizona_runtime_resume(struct device *dev)
 {
 	struct arizona *arizona = dev_get_drvdata(dev);
@@ -613,20 +630,18 @@ err:
 static int arizona_runtime_suspend(struct device *dev)
 {
 	struct arizona *arizona = dev_get_drvdata(dev);
-	unsigned int val;
+	unsigned int jd_active = 0;
 	int ret;
 
 	dev_dbg(arizona->dev, "Entering AoD mode\n");
 
-	ret = regmap_read(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE, &val);
-	if (ret) {
-		dev_err(dev, "Failed to check jack det status: %d\n", ret);
-		return ret;
-	}
-
 	switch (arizona->type) {
 	case WM5110:
 	case WM8280:
+		jd_active = arizona_is_jack_det_active(arizona);
+		if (jd_active < 0)
+			return jd_active;
+
 		if (arizona->external_dcvdd) {
 			ret = arizona_isolate_dcvdd(arizona);
 			if (ret != 0)
@@ -648,13 +663,17 @@ static int arizona_runtime_suspend(struct device *dev)
 		}
 		break;
 	case WM5102:
+		jd_active = arizona_is_jack_det_active(arizona);
+		if (jd_active < 0)
+			return jd_active;
+
 		if (arizona->external_dcvdd) {
 			ret = arizona_isolate_dcvdd(arizona);
 			if (ret != 0)
 				return ret;
 		}
 
-		if (!(val & ARIZONA_JD1_ENA)) {
+		if (!jd_active) {
 			ret = regmap_write(arizona->regmap,
 					   ARIZONA_WRITE_SEQUENCER_CTRL_3, 0x0);
 			if (ret) {
@@ -666,6 +685,10 @@ static int arizona_runtime_suspend(struct device *dev)
 		}
 		break;
 	default:
+		jd_active = arizona_is_jack_det_active(arizona);
+		if (jd_active < 0)
+			return jd_active;
+
 		if (arizona->external_dcvdd) {
 			ret = arizona_isolate_dcvdd(arizona);
 			if (ret != 0)
@@ -679,7 +702,7 @@ static int arizona_runtime_suspend(struct device *dev)
 	regulator_disable(arizona->dcvdd);
 
 	/* Allow us to completely power down if no jack detection */
-	if (!(val & ARIZONA_JD1_ENA)) {
+	if (!jd_active) {
 		dev_dbg(arizona->dev, "Fully powering off\n");
 
 		arizona->has_fully_powered_off = true;
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1206179 — Re: [PATCH V4 2/3] mfd: arizona: factor out checking of jack detection state

FromLee Jones <lee.jones@linaro.org>
Date2015-08-12 16:50 +0200
SubjectRe: [PATCH V4 2/3] mfd: arizona: factor out checking of jack detection state
Message-ID<pWFvQ-7mW-25@gated-at.bofh.it>
In reply to#1205993
On Wed, 12 Aug 2015, Richard Fitzgerald wrote:

> Currently runtime_suspend will fully power off the codec if
> the jack detection is not enabled. Not all future codecs will
> have jack detection so to prepare for these codecs this patch
> factors out the check so that it be called as needed in the
> existing codec-specific switch cases.
> 
> Signed-off-by: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
> ---
>  drivers/mfd/arizona-core.c | 41 ++++++++++++++++++++++++++++++++---------
>  1 file changed, 32 insertions(+), 9 deletions(-)

For my own reference:
  Acked-by: Lee Jones <lee.jones@linaro.org>

> diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
> index 33f3db4..43ca30b 100644
> --- a/drivers/mfd/arizona-core.c
> +++ b/drivers/mfd/arizona-core.c
> @@ -489,6 +489,23 @@ static int arizona_connect_dcvdd(struct arizona *arizona)
>  	return ret;
>  }
>  
> +static int arizona_is_jack_det_active(struct arizona *arizona)
> +{
> +	unsigned int val;
> +	int ret;
> +
> +	ret = regmap_read(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE, &val);
> +	if (ret) {
> +		dev_err(arizona->dev,
> +			"Failed to check jack det status: %d\n", ret);
> +		return ret;
> +	} else if (val & ARIZONA_JD1_ENA) {
> +		return 1;
> +	} else {
> +		return 0;
> +	}
> +}
> +
>  static int arizona_runtime_resume(struct device *dev)
>  {
>  	struct arizona *arizona = dev_get_drvdata(dev);
> @@ -613,20 +630,18 @@ err:
>  static int arizona_runtime_suspend(struct device *dev)
>  {
>  	struct arizona *arizona = dev_get_drvdata(dev);
> -	unsigned int val;
> +	unsigned int jd_active = 0;
>  	int ret;
>  
>  	dev_dbg(arizona->dev, "Entering AoD mode\n");
>  
> -	ret = regmap_read(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE, &val);
> -	if (ret) {
> -		dev_err(dev, "Failed to check jack det status: %d\n", ret);
> -		return ret;
> -	}
> -
>  	switch (arizona->type) {
>  	case WM5110:
>  	case WM8280:
> +		jd_active = arizona_is_jack_det_active(arizona);
> +		if (jd_active < 0)
> +			return jd_active;
> +
>  		if (arizona->external_dcvdd) {
>  			ret = arizona_isolate_dcvdd(arizona);
>  			if (ret != 0)
> @@ -648,13 +663,17 @@ static int arizona_runtime_suspend(struct device *dev)
>  		}
>  		break;
>  	case WM5102:
> +		jd_active = arizona_is_jack_det_active(arizona);
> +		if (jd_active < 0)
> +			return jd_active;
> +
>  		if (arizona->external_dcvdd) {
>  			ret = arizona_isolate_dcvdd(arizona);
>  			if (ret != 0)
>  				return ret;
>  		}
>  
> -		if (!(val & ARIZONA_JD1_ENA)) {
> +		if (!jd_active) {
>  			ret = regmap_write(arizona->regmap,
>  					   ARIZONA_WRITE_SEQUENCER_CTRL_3, 0x0);
>  			if (ret) {
> @@ -666,6 +685,10 @@ static int arizona_runtime_suspend(struct device *dev)
>  		}
>  		break;
>  	default:
> +		jd_active = arizona_is_jack_det_active(arizona);
> +		if (jd_active < 0)
> +			return jd_active;
> +
>  		if (arizona->external_dcvdd) {
>  			ret = arizona_isolate_dcvdd(arizona);
>  			if (ret != 0)
> @@ -679,7 +702,7 @@ static int arizona_runtime_suspend(struct device *dev)
>  	regulator_disable(arizona->dcvdd);
>  
>  	/* Allow us to completely power down if no jack detection */
> -	if (!(val & ARIZONA_JD1_ENA)) {
> +	if (!jd_active) {
>  		dev_dbg(arizona->dev, "Fully powering off\n");
>  
>  		arizona->has_fully_powered_off = true;

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web