LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH 0/4] mfd: WM8350 updates
@ 2008-11-06 13:42 Mark Brown
  2008-11-06 13:43 ` [PATCH 1/4] mfd: Remove i.MX31ism from WM8350 i2c driver Mark Brown
  2008-11-08  0:33 ` [PATCH 0/4] mfd: WM8350 updates Samuel Ortiz
  0 siblings, 2 replies; 6+ messages in thread
From: Mark Brown @ 2008-11-06 13:42 UTC (permalink / raw)
  To: Samuel Ortiz; +Cc: linux-kernel

The following changes since commit c3177623edf3fabf200c60bde9b400d03b6271f7:
  Mark Brown (1):
        mfd: Don't mark WM8350 security register as volatile

are available in the git repository at:

  git://opensource.wolfsonmicro.com/linux-2.6-audioplus for-sameo

Mark Brown (4):
      mfd: Remove i.MX31ism from WM8350 i2c driver
      mfd: Add some documentation for WM8350 register lock
      mfd: Add WM8350 revision H support
      mfd: Add AUXADC support for WM8350

 drivers/mfd/wm8350-core.c             |   74 ++++++++++++++++++++++++++++++++-
 drivers/mfd/wm8350-i2c.c              |    2 -
 include/linux/mfd/wm8350/comparator.h |    8 ++++
 include/linux/mfd/wm8350/core.h       |    3 +
 4 files changed, 83 insertions(+), 4 deletions(-)

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

* [PATCH 1/4] mfd: Remove i.MX31ism from WM8350 i2c driver
  2008-11-06 13:42 [PATCH 0/4] mfd: WM8350 updates Mark Brown
@ 2008-11-06 13:43 ` Mark Brown
  2008-11-06 13:43   ` [PATCH 2/4] mfd: Add some documentation for WM8350 register lock Mark Brown
  2008-11-08  0:33 ` [PATCH 0/4] mfd: WM8350 updates Samuel Ortiz
  1 sibling, 1 reply; 6+ messages in thread
From: Mark Brown @ 2008-11-06 13:43 UTC (permalink / raw)
  To: Samuel Ortiz; +Cc: linux-kernel, Mark Brown

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
 drivers/mfd/wm8350-i2c.c |    2 --
 1 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/drivers/mfd/wm8350-i2c.c b/drivers/mfd/wm8350-i2c.c
index 8dfe21b..f7e9172 100644
--- a/drivers/mfd/wm8350-i2c.c
+++ b/drivers/mfd/wm8350-i2c.c
@@ -1,8 +1,6 @@
 /*
  * wm8350-i2c.c  --  Generic I2C driver for Wolfson WM8350 PMIC
  *
- * This driver defines and configures the WM8350 for the Freescale i.MX32ADS.
- *
  * Copyright 2007, 2008 Wolfson Microelectronics PLC.
  *
  * Author: Liam Girdwood
-- 
1.5.6.5


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

* [PATCH 2/4] mfd: Add some documentation for WM8350 register lock
  2008-11-06 13:43 ` [PATCH 1/4] mfd: Remove i.MX31ism from WM8350 i2c driver Mark Brown
@ 2008-11-06 13:43   ` Mark Brown
  2008-11-06 13:43     ` [PATCH 3/4] mfd: Add WM8350 revision H support Mark Brown
  0 siblings, 1 reply; 6+ messages in thread
From: Mark Brown @ 2008-11-06 13:43 UTC (permalink / raw)
  To: Samuel Ortiz; +Cc: linux-kernel, Mark Brown

Hopefully this will make the purpose of these functions a bit clearer,
it's not immediately obvious that the lock is a hardware feature.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
 drivers/mfd/wm8350-core.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/drivers/mfd/wm8350-core.c b/drivers/mfd/wm8350-core.c
index 0d47fb9..d63a530 100644
--- a/drivers/mfd/wm8350-core.c
+++ b/drivers/mfd/wm8350-core.c
@@ -299,6 +299,13 @@ int wm8350_block_write(struct wm8350 *wm8350, int start_reg, int regs,
 }
 EXPORT_SYMBOL_GPL(wm8350_block_write);
 
+/**
+ * wm8350_reg_lock()
+ *
+ * The WM8350 has a hardware lock which can be used to prevent writes to
+ * some registers (generally those which can cause particularly serious
+ * problems if misused).  This function enables that lock.
+ */
 int wm8350_reg_lock(struct wm8350 *wm8350)
 {
 	u16 key = WM8350_LOCK_KEY;
@@ -314,6 +321,15 @@ int wm8350_reg_lock(struct wm8350 *wm8350)
 }
 EXPORT_SYMBOL_GPL(wm8350_reg_lock);
 
+/**
+ * wm8350_reg_unlock()
+ *
+ * The WM8350 has a hardware lock which can be used to prevent writes to
+ * some registers (generally those which can cause particularly serious
+ * problems if misused).  This function disables that lock so updates
+ * can be performed.  For maximum safety this should be done only when
+ * required.
+ */
 int wm8350_reg_unlock(struct wm8350 *wm8350)
 {
 	u16 key = WM8350_UNLOCK_KEY;
-- 
1.5.6.5


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

* [PATCH 3/4] mfd: Add WM8350 revision H support
  2008-11-06 13:43   ` [PATCH 2/4] mfd: Add some documentation for WM8350 register lock Mark Brown
@ 2008-11-06 13:43     ` Mark Brown
  2008-11-06 13:43       ` [PATCH 4/4] mfd: Add AUXADC support for WM8350 Mark Brown
  0 siblings, 1 reply; 6+ messages in thread
From: Mark Brown @ 2008-11-06 13:43 UTC (permalink / raw)
  To: Samuel Ortiz; +Cc: linux-kernel, Mark Brown

No other software changes are required.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
 drivers/mfd/wm8350-core.c       |    7 ++++++-
 include/linux/mfd/wm8350/core.h |    1 +
 2 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/drivers/mfd/wm8350-core.c b/drivers/mfd/wm8350-core.c
index d63a530..c013afd 100644
--- a/drivers/mfd/wm8350-core.c
+++ b/drivers/mfd/wm8350-core.c
@@ -1202,9 +1202,14 @@ int wm8350_device_init(struct wm8350 *wm8350, int irq,
 			dev_info(wm8350->dev, "Found Rev G device\n");
 			wm8350->rev = WM8350_REV_G;
 			break;
+		case WM8350_REV_H:
+			dev_info(wm8350->dev, "Found Rev H device\n");
+			wm8350->rev = WM8350_REV_H;
+			break;
 		default:
 			/* For safety we refuse to run on unknown hardware */
-			dev_info(wm8350->dev, "Found unknown rev\n");
+			dev_info(wm8350->dev, "Found unknown rev %x\n",
+				 (id2 & WM8350_CHIP_REV_MASK) >> 12);
 			ret = -ENODEV;
 			goto err;
 		}
diff --git a/include/linux/mfd/wm8350/core.h b/include/linux/mfd/wm8350/core.h
index 6ebf97f..9490ec1 100644
--- a/include/linux/mfd/wm8350/core.h
+++ b/include/linux/mfd/wm8350/core.h
@@ -536,6 +536,7 @@
 #define WM8350_REV_E				0x4
 #define WM8350_REV_F				0x5
 #define WM8350_REV_G				0x6
+#define WM8350_REV_H				0x7
 
 #define WM8350_NUM_IRQ				63
 
-- 
1.5.6.5


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

* [PATCH 4/4] mfd: Add AUXADC support for WM8350
  2008-11-06 13:43     ` [PATCH 3/4] mfd: Add WM8350 revision H support Mark Brown
@ 2008-11-06 13:43       ` Mark Brown
  0 siblings, 0 replies; 6+ messages in thread
From: Mark Brown @ 2008-11-06 13:43 UTC (permalink / raw)
  To: Samuel Ortiz; +Cc: linux-kernel, Mark Brown

The auxiliary ADC in the WM8350 is shared between several subdevices
so access to it needs to be arbitrated by the core driver.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
 drivers/mfd/wm8350-core.c             |   51 ++++++++++++++++++++++++++++++++-
 include/linux/mfd/wm8350/comparator.h |    8 +++++
 include/linux/mfd/wm8350/core.h       |    2 +
 3 files changed, 60 insertions(+), 1 deletions(-)

diff --git a/drivers/mfd/wm8350-core.c b/drivers/mfd/wm8350-core.c
index c013afd..60439bd 100644
--- a/drivers/mfd/wm8350-core.c
+++ b/drivers/mfd/wm8350-core.c
@@ -63,7 +63,6 @@
  */
 static DEFINE_MUTEX(io_mutex);
 static DEFINE_MUTEX(reg_lock_mutex);
-static DEFINE_MUTEX(auxadc_mutex);
 
 /* Perform a physical read from the device.
  */
@@ -1082,6 +1081,55 @@ int wm8350_unmask_irq(struct wm8350 *wm8350, int irq)
 }
 EXPORT_SYMBOL_GPL(wm8350_unmask_irq);
 
+int wm8350_read_auxadc(struct wm8350 *wm8350, int channel, int scale, int vref)
+{
+	u16 reg, result = 0;
+	int tries = 5;
+
+	if (channel < WM8350_AUXADC_AUX1 || channel > WM8350_AUXADC_TEMP)
+		return -EINVAL;
+	if (channel >= WM8350_AUXADC_USB && channel <= WM8350_AUXADC_TEMP
+	    && (scale != 0 || vref != 0))
+		return -EINVAL;
+
+	mutex_lock(&wm8350->auxadc_mutex);
+
+	/* Turn on the ADC */
+	reg = wm8350_reg_read(wm8350, WM8350_POWER_MGMT_5);
+	wm8350_reg_write(wm8350, WM8350_POWER_MGMT_5, reg | WM8350_AUXADC_ENA);
+
+	if (scale || vref) {
+		reg = scale << 13;
+		reg |= vref << 12;
+		wm8350_reg_write(wm8350, WM8350_AUX1_READBACK + channel, reg);
+	}
+
+	reg = wm8350_reg_read(wm8350, WM8350_DIGITISER_CONTROL_1);
+	reg |= 1 << channel | WM8350_AUXADC_POLL;
+	wm8350_reg_write(wm8350, WM8350_DIGITISER_CONTROL_1, reg);
+
+	do {
+		schedule_timeout_interruptible(1);
+		reg = wm8350_reg_read(wm8350, WM8350_DIGITISER_CONTROL_1);
+	} while (tries-- && (reg & WM8350_AUXADC_POLL));
+
+	if (!tries)
+		dev_err(wm8350->dev, "adc chn %d read timeout\n", channel);
+	else
+		result = wm8350_reg_read(wm8350,
+					 WM8350_AUX1_READBACK + channel);
+
+	/* Turn off the ADC */
+	reg = wm8350_reg_read(wm8350, WM8350_POWER_MGMT_5);
+	wm8350_reg_write(wm8350, WM8350_POWER_MGMT_5,
+			 reg & ~WM8350_AUXADC_ENA);
+
+	mutex_unlock(&wm8350->auxadc_mutex);
+
+	return result & WM8350_AUXADC_DATA1_MASK;
+}
+EXPORT_SYMBOL_GPL(wm8350_read_auxadc);
+
 /*
  * Cache is always host endian.
  */
@@ -1239,6 +1287,7 @@ int wm8350_device_init(struct wm8350 *wm8350, int irq,
 		}
 	}
 
+	mutex_init(&wm8350->auxadc_mutex);
 	mutex_init(&wm8350->irq_mutex);
 	INIT_WORK(&wm8350->irq_work, wm8350_irq_worker);
 	if (irq) {
diff --git a/include/linux/mfd/wm8350/comparator.h b/include/linux/mfd/wm8350/comparator.h
index 0537886..54bc5d0 100644
--- a/include/linux/mfd/wm8350/comparator.h
+++ b/include/linux/mfd/wm8350/comparator.h
@@ -164,4 +164,12 @@
 #define WM8350_AUXADC_BATT			6
 #define WM8350_AUXADC_TEMP			7
 
+struct wm8350;
+
+/*
+ * AUX ADC Readback
+ */
+int wm8350_read_auxadc(struct wm8350 *wm8350, int channel, int scale,
+		       int vref);
+
 #endif
diff --git a/include/linux/mfd/wm8350/core.h b/include/linux/mfd/wm8350/core.h
index 9490ec1..cc19005 100644
--- a/include/linux/mfd/wm8350/core.h
+++ b/include/linux/mfd/wm8350/core.h
@@ -573,6 +573,8 @@ struct wm8350 {
 			 void *src);
 	u16 *reg_cache;
 
+	struct mutex auxadc_mutex;
+
 	/* Interrupt handling */
 	struct work_struct irq_work;
 	struct mutex irq_mutex; /* IRQ table mutex */
-- 
1.5.6.5


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

* Re: [PATCH 0/4] mfd: WM8350 updates
  2008-11-06 13:42 [PATCH 0/4] mfd: WM8350 updates Mark Brown
  2008-11-06 13:43 ` [PATCH 1/4] mfd: Remove i.MX31ism from WM8350 i2c driver Mark Brown
@ 2008-11-08  0:33 ` Samuel Ortiz
  1 sibling, 0 replies; 6+ messages in thread
From: Samuel Ortiz @ 2008-11-08  0:33 UTC (permalink / raw)
  To: Mark Brown; +Cc: linux-kernel

On Thu, Nov 06, 2008 at 01:42:54PM +0000, Mark Brown wrote:
> The following changes since commit c3177623edf3fabf200c60bde9b400d03b6271f7:
>   Mark Brown (1):
>         mfd: Don't mark WM8350 security register as volatile
Pulled into my for-next branch, thanks Mark.

Cheers,
Samuel.

 
> are available in the git repository at:
> 
>   git://opensource.wolfsonmicro.com/linux-2.6-audioplus for-sameo
> 
> Mark Brown (4):
>       mfd: Remove i.MX31ism from WM8350 i2c driver
>       mfd: Add some documentation for WM8350 register lock
>       mfd: Add WM8350 revision H support
>       mfd: Add AUXADC support for WM8350
> 
>  drivers/mfd/wm8350-core.c             |   74 ++++++++++++++++++++++++++++++++-
>  drivers/mfd/wm8350-i2c.c              |    2 -
>  include/linux/mfd/wm8350/comparator.h |    8 ++++
>  include/linux/mfd/wm8350/core.h       |    3 +
>  4 files changed, 83 insertions(+), 4 deletions(-)

-- 
Intel Open Source Technology Centre
http://oss.intel.com/

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

end of thread, other threads:[~2008-11-08  0:30 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-11-06 13:42 [PATCH 0/4] mfd: WM8350 updates Mark Brown
2008-11-06 13:43 ` [PATCH 1/4] mfd: Remove i.MX31ism from WM8350 i2c driver Mark Brown
2008-11-06 13:43   ` [PATCH 2/4] mfd: Add some documentation for WM8350 register lock Mark Brown
2008-11-06 13:43     ` [PATCH 3/4] mfd: Add WM8350 revision H support Mark Brown
2008-11-06 13:43       ` [PATCH 4/4] mfd: Add AUXADC support for WM8350 Mark Brown
2008-11-08  0:33 ` [PATCH 0/4] mfd: WM8350 updates Samuel Ortiz

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).