public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
To: lee.jones@linaro.org
Cc: broonie@kernel.org, lgirdwood@gmail.com, sameo@linux.intel.com,
	patches@opensource.wolfsonmicro.com,
	linux-kernel@vger.kernel.org
Subject: [RESEND PATCH v3 03/10] mfd: wm5102: Ensure we always boot the device fully
Date: Mon, 11 May 2015 13:58:03 +0100	[thread overview]
Message-ID: <1431349090-24173-4-git-send-email-ckeepax@opensource.wolfsonmicro.com> (raw)
In-Reply-To: <1431349090-24173-1-git-send-email-ckeepax@opensource.wolfsonmicro.com>

The wm5102 uses a custom boot sequence and the standard boot sequence is
disabled. However, the standard boot sequence must be run at least once
after a cold boot (caused by either a hard reset or removal of AVDD).
Unfortunately the register WRITE_SEQUENCER_CTRL_3 is not affected by the
hardware reset. This means if the device has been previously booted but
the AVDD supply has never been removed, arizona_dev_init will reset the
chip but the boot sequence will not run, which can cause numerous
problems. The solution is to manually clear this register and then boot
the chip again, which is what this patch does.

Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Acked-by: Lee Jones <lee.jones@linaro.org>
---
 drivers/mfd/arizona-core.c |   50 +++++++++++++++++++++++++++++++++++--------
 1 files changed, 40 insertions(+), 10 deletions(-)

diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
index f30d925..0df1299 100644
--- a/drivers/mfd/arizona-core.c
+++ b/drivers/mfd/arizona-core.c
@@ -344,6 +344,33 @@ err_fll:
 		return err;
 }
 
+static int wm5102_clear_write_sequencer(struct arizona *arizona)
+{
+	int ret;
+
+	ret = regmap_write(arizona->regmap, ARIZONA_WRITE_SEQUENCER_CTRL_3,
+			   0x0);
+	if (ret) {
+		dev_err(arizona->dev,
+			"Failed to clear write sequencer state: %d\n", ret);
+		return ret;
+	}
+
+	arizona_enable_reset(arizona);
+	regulator_disable(arizona->dcvdd);
+
+	msleep(20);
+
+	ret = regulator_enable(arizona->dcvdd);
+	if (ret) {
+		dev_err(arizona->dev, "Failed to re-enable DCVDD: %d\n", ret);
+		return ret;
+	}
+	arizona_disable_reset(arizona);
+
+	return 0;
+}
+
 #ifdef CONFIG_PM
 static int arizona_runtime_resume(struct device *dev)
 {
@@ -802,21 +829,24 @@ int arizona_dev_init(struct arizona *arizona)
 	case WM5102:
 		ret = regmap_read(arizona->regmap,
 				  ARIZONA_WRITE_SEQUENCER_CTRL_3, &val);
-		if (ret != 0)
+		if (ret) {
 			dev_err(dev,
 				"Failed to check write sequencer state: %d\n",
 				ret);
-		else if (val & 0x01)
-			break;
-		/* Fall through */
-	default:
-		ret = arizona_wait_for_boot(arizona);
-		if (ret != 0) {
-			dev_err(arizona->dev,
-				"Device failed initial boot: %d\n", ret);
-			goto err_reset;
+		} else if (val & 0x01) {
+			ret = wm5102_clear_write_sequencer(arizona);
+			if (ret)
+				return ret;
 		}
 		break;
+	default:
+		break;
+	}
+
+	ret = arizona_wait_for_boot(arizona);
+	if (ret) {
+		dev_err(arizona->dev, "Device failed initial boot: %d\n", ret);
+		goto err_reset;
 	}
 
 	/* Read the device ID information & do device specific stuff */
-- 
1.7.2.5


  parent reply	other threads:[~2015-05-11 13:10 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-11 12:58 [RESEND PATCH v3 00/10] wm5110 Boot Fixups Charles Keepax
2015-05-11 12:58 ` [RESEND PATCH v3 01/10] mfd: arizona: Use devres to manage reset GPIO Charles Keepax
2015-05-13 12:20   ` Lee Jones
2015-05-11 12:58 ` [RESEND PATCH v3 02/10] mfd: arizona: Factor out hard reset into helper functions Charles Keepax
2015-05-13 12:20   ` Lee Jones
2015-05-11 12:58 ` Charles Keepax [this message]
2015-05-13 12:20   ` [RESEND PATCH v3 03/10] mfd: wm5102: Ensure we always boot the device fully Lee Jones
2015-05-11 12:58 ` [RESEND PATCH v3 04/10] mfd: arizona: Fix formating/style issues in arizona_apply_hardware_patch Charles Keepax
2015-05-13 12:21   ` Lee Jones
2015-05-11 12:58 ` [RESEND PATCH v3 05/10] mfd: arizona: Factor out SYSCLK enable from wm5102 hardware patch Charles Keepax
2015-05-13 12:21   ` Lee Jones
2015-05-11 12:58 ` [RESEND PATCH v3 06/10] mfd: wm5110: Add register patch required for low power sleep Charles Keepax
2015-05-13 12:21   ` Lee Jones
2015-05-11 12:58 ` [RESEND PATCH v3 07/10] regulator: arizona-ldo1: Add additional supported voltage Charles Keepax
2015-05-11 14:20   ` Mark Brown
2015-05-11 14:41     ` Charles Keepax
2015-05-11 16:04       ` Mark Brown
2015-05-11 12:58 ` [RESEND PATCH v3 08/10] mfd: wm5110: Set DCVDD voltage to 1.175V before entering sleep mode Charles Keepax
2015-05-13 12:21   ` Lee Jones
2015-05-11 12:58 ` [RESEND PATCH v3 09/10] mfd: arizona: Add better support for system suspend Charles Keepax
2015-05-13 12:21   ` Lee Jones
2015-05-11 12:58 ` [RESEND PATCH v3 10/10] mfd: wm5110: Add delay before releasing reset line Charles Keepax
2015-05-13 12:22   ` Lee Jones

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1431349090-24173-4-git-send-email-ckeepax@opensource.wolfsonmicro.com \
    --to=ckeepax@opensource.wolfsonmicro.com \
    --cc=broonie@kernel.org \
    --cc=lee.jones@linaro.org \
    --cc=lgirdwood@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=patches@opensource.wolfsonmicro.com \
    --cc=sameo@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox