linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2 v3] OMAP2+: hwmod: Add hwmod's API's for pad wakeup
@ 2011-05-10 10:30 Govindraj.R
  2011-05-10 10:30 ` [PATCH 1/2 v3] OMAP2+: hwmod: Add API to enable IO ring wakeup Govindraj.R
  2011-05-10 10:30 ` [PATCH 2/2 v3] OMAP2+: hwmod: Add API to check IO PAD wakeup status Govindraj.R
  0 siblings, 2 replies; 5+ messages in thread
From: Govindraj.R @ 2011-05-10 10:30 UTC (permalink / raw)
  To: linux-arm-kernel

Add two API's to set IO Pad wakeup capability based on hwmod
mux pins available and also to check the status of IO Pad wakeup
event.

This two patches are separated from uart_runtime patches posted
earlier and uart_runtime adaptation relies on these two API's.

Based on 2.6.39-rc6

Changes from v2:
---------------
http://www.mail-archive.com/linux-omap at vger.kernel.org/msg49194.html

Changes from v1:
---------------
http://www.mail-archive.com/linux-omap at vger.kernel.org/msg49141.html

Reference to Discussion:
------------------------
http://www.mail-archive.com/linux-omap at vger.kernel.org/msg49000.html
http://www.mail-archive.com/linux-omap at vger.kernel.org/msg49001.html

Govindraj.R (2):
  OMAP2+: hwmod: Add API to enable IO ring wakeup.
  OMAP2+: hwmod: Add API to check IO PAD wakeup status

 arch/arm/mach-omap2/mux.c                     |   28 +++++++++
 arch/arm/mach-omap2/mux.h                     |   13 ++++
 arch/arm/mach-omap2/omap_hwmod.c              |   74 +++++++++++++++++++++++++
 arch/arm/plat-omap/include/plat/omap_device.h |    2 +
 arch/arm/plat-omap/include/plat/omap_hwmod.h  |    4 +
 arch/arm/plat-omap/omap_device.c              |   50 +++++++++++++++++
 6 files changed, 171 insertions(+), 0 deletions(-)

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

* [PATCH 1/2 v3] OMAP2+: hwmod: Add API to enable IO ring wakeup.
  2011-05-10 10:30 [PATCH 0/2 v3] OMAP2+: hwmod: Add hwmod's API's for pad wakeup Govindraj.R
@ 2011-05-10 10:30 ` Govindraj.R
  2011-05-10 16:04   ` Todd Poynor
  2011-05-10 10:30 ` [PATCH 2/2 v3] OMAP2+: hwmod: Add API to check IO PAD wakeup status Govindraj.R
  1 sibling, 1 reply; 5+ messages in thread
From: Govindraj.R @ 2011-05-10 10:30 UTC (permalink / raw)
  To: linux-arm-kernel

Add API to enable IO pad wakeup capability based on mux dynamic pad and
wake_up enable flag available from hwmod_mux initialization.

Use the wakeup_enable flag and enable wakeup capability
for the given pads. Wakeup capability will be enabled/disabled
during hmwod idle transition based on whether wakeup_flag is
set or cleared.

Signed-off-by: Govindraj.R <govindraj.raja@ti.com>
---
 arch/arm/mach-omap2/omap_hwmod.c              |   60 +++++++++++++++++++++++++
 arch/arm/plat-omap/include/plat/omap_device.h |    2 +
 arch/arm/plat-omap/include/plat/omap_hwmod.h  |    3 +
 arch/arm/plat-omap/omap_device.c              |   50 ++++++++++++++++++++
 4 files changed, 115 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index e034294..72176d5 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -1770,6 +1770,36 @@ static int __init omap_hwmod_setup_all(void)
 core_initcall(omap_hwmod_setup_all);
 
 /**
+ * omap_hwmod_set_ioring_wakeup - enable io pad wakeup flag.
+ * @oh: struct omap_hwmod *
+ * @set: bool value indicating to set or clear wakeup status.
+ *
+ * Set or Clear wakeup flag for the io_pad.
+ */
+static int omap_hwmod_set_ioring_wakeup(struct omap_hwmod *oh, bool set_wake)
+{
+	struct omap_device_pad *pad;
+	int ret = -EINVAL, j;
+
+	if (oh->mux->enabled) {
+		for (j = 0; j < oh->mux->nr_pads_dynamic; j++) {
+			pad = oh->mux->pads_dynamic[j];
+			if (pad->flags & OMAP_DEVICE_PAD_WAKEUP) {
+				if (set_wake)
+					pad->idle = pad->enable |
+							OMAP_WAKEUP_EN;
+				else
+					pad->idle = pad->enable &
+							~OMAP_WAKEUP_EN;
+				ret = 0;
+			}
+		}
+	}
+
+	return ret;
+}
+
+/**
  * omap_hwmod_enable - enable an omap_hwmod
  * @oh: struct omap_hwmod *
  *
@@ -2369,3 +2399,33 @@ int omap_hwmod_no_setup_reset(struct omap_hwmod *oh)
 
 	return 0;
 }
+
+/**
+ * omap_hwmod_enable_ioring_wakeup - Set wakeup flag for iopad.
+ * @oh: struct omap_hwmod *
+ *
+ * Traverse through dynamic pads, if pad is enabled then
+ * set wakeup enable bit flag for the mux pin. Wakeup pad bit
+ * will be set during hwmod idle transistion.
+ * Return error if pads are not enabled or not available.
+ */
+int omap_hwmod_enable_ioring_wakeup(struct omap_hwmod *oh)
+{
+	/* Enable pad wake-up capability */
+	return omap_hwmod_set_ioring_wakeup(oh, true);
+}
+
+/**
+ * omap_hwmod_disable_ioring_wakeup - Clear wakeup flag for iopad.
+ * @oh: struct omap_hwmod *
+ *
+ * Traverse through dynamic pads, if pad is enabled then
+ * clear wakeup enable bit flag for the mux pin. Wakeup pad bit
+ * will be set during hwmod idle transistion.
+ * Return error if pads are not enabled or not available.
+ */
+int omap_hwmod_disable_ioring_wakeup(struct omap_hwmod *oh)
+{
+	/* Disable pad wakeup capability */
+	return omap_hwmod_set_ioring_wakeup(oh, false);
+}
diff --git a/arch/arm/plat-omap/include/plat/omap_device.h b/arch/arm/plat-omap/include/plat/omap_device.h
index e4c349f..a377dd0 100644
--- a/arch/arm/plat-omap/include/plat/omap_device.h
+++ b/arch/arm/plat-omap/include/plat/omap_device.h
@@ -117,6 +117,8 @@ int omap_device_enable_hwmods(struct omap_device *od);
 int omap_device_disable_clocks(struct omap_device *od);
 int omap_device_enable_clocks(struct omap_device *od);
 
+int omap_device_enable_ioring_wakeup(struct platform_device *pdev);
+int omap_device_disable_ioring_wakeup(struct platform_device *pdev);
 
 /*
  * Entries should be kept in latency order ascending
diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
index 1adea9c..7ef11a6 100644
--- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
+++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
@@ -602,6 +602,9 @@ u32 omap_hwmod_get_context_loss_count(struct omap_hwmod *oh);
 
 int omap_hwmod_no_setup_reset(struct omap_hwmod *oh);
 
+int omap_hwmod_enable_ioring_wakeup(struct omap_hwmod *oh);
+int omap_hwmod_disable_ioring_wakeup(struct omap_hwmod *oh);
+
 /*
  * Chip variant-specific hwmod init routines - XXX should be converted
  * to use initcalls once the initial boot ordering is straightened out
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c
index 9bbda9a..04a4f15 100644
--- a/arch/arm/plat-omap/omap_device.c
+++ b/arch/arm/plat-omap/omap_device.c
@@ -742,6 +742,56 @@ void __iomem *omap_device_get_rt_va(struct omap_device *od)
 	return omap_hwmod_get_mpu_rt_va(od->hwmods[0]);
 }
 
+/**
+ * omap_device_enable_ioring_wakeup - Set wakeup bit for iopad ring.
+ * @pdev: platform_device for which wakeup needs to be set.
+ *
+ * Caller should ensure this is called if device_may_wakeup(dev) is true
+ * traverse through each hwmod and check each available pads
+ * if pad is enabled then set wakeup enable flag for the mux pin.
+ * Return error if pads are not enabled or not available.
+ * Wakeup enable flag will be we used during hwmod idle transistion.
+ */
+int omap_device_enable_ioring_wakeup(struct platform_device *pdev)
+{
+	int ret = -EINVAL, i;
+	struct omap_device *od;
+	struct omap_hwmod *oh;
+
+	od = _find_by_pdev(pdev);
+	for (i = 0; i < od->hwmods_cnt; i++) {
+		oh = od->hwmods[i];
+		ret = omap_hwmod_enable_ioring_wakeup(oh);
+	}
+
+	return ret;
+}
+
+/**
+ * omap_device_disable_ioring_wakeup - Clear wakeup bit for iopad ring.
+ * @pdev: platform_device for which wakeup needs to be cleared.
+ *
+ * Caller should ensure this is called if device_may_wakeup(dev) is false
+ * traverse through each hwmod and check each available pads
+ * if pad is enabled then clear wakeup enable flag for the mux pin.
+ * Return error if pads are not enabled or not available.
+ * Wakeup enable flag will be we used during hwmod idle transistion.
+ */
+int omap_device_disable_ioring_wakeup(struct platform_device *pdev)
+{
+	int ret = -EINVAL, i;
+	struct omap_device *od;
+	struct omap_hwmod *oh;
+
+	od = _find_by_pdev(pdev);
+	for (i = 0; i < od->hwmods_cnt; i++) {
+		oh = od->hwmods[i];
+		ret = omap_hwmod_disable_ioring_wakeup(oh);
+	}
+
+	return ret;
+}
+
 /*
  * Public functions intended for use in omap_device_pm_latency
  * .activate_func and .deactivate_func function pointers
-- 
1.7.1

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

* [PATCH 2/2 v3] OMAP2+: hwmod: Add API to check IO PAD wakeup status
  2011-05-10 10:30 [PATCH 0/2 v3] OMAP2+: hwmod: Add hwmod's API's for pad wakeup Govindraj.R
  2011-05-10 10:30 ` [PATCH 1/2 v3] OMAP2+: hwmod: Add API to enable IO ring wakeup Govindraj.R
@ 2011-05-10 10:30 ` Govindraj.R
  1 sibling, 0 replies; 5+ messages in thread
From: Govindraj.R @ 2011-05-10 10:30 UTC (permalink / raw)
  To: linux-arm-kernel

Add API to determine IO-PAD wakeup event status for a given
hwmod dynamic_mux pad.

Signed-off-by: Govindraj.R <govindraj.raja@ti.com>
---
 arch/arm/mach-omap2/mux.c                    |   28 ++++++++++++++++++++++++++
 arch/arm/mach-omap2/mux.h                    |   13 ++++++++++++
 arch/arm/mach-omap2/omap_hwmod.c             |   14 +++++++++++++
 arch/arm/plat-omap/include/plat/omap_hwmod.h |    1 +
 4 files changed, 56 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c
index a4ab1e3..b40aebe 100644
--- a/arch/arm/mach-omap2/mux.c
+++ b/arch/arm/mach-omap2/mux.c
@@ -348,6 +348,34 @@ err1:
 	return NULL;
 }
 
+/**
+ * omap_hwmod_mux_get_wake_status - omap hwmod check pad wakeup
+ * @hmux:		Pads for a hwmod
+ *
+ * Gets the wakeup status of given pad from omap-hwmod.
+ * Returns true if wakeup event is set for pad else false
+ * if wakeup is not occured or pads are not avialable.
+ */
+bool omap_hwmod_mux_get_wake_status(struct omap_hwmod_mux_info *hmux)
+{
+	int i;
+	unsigned int val;
+	u8 ret = false;
+
+	for (i = 0; i < hmux->nr_pads; i++) {
+		struct omap_device_pad *pad = &hmux->pads[i];
+
+		val = omap_mux_read(pad->partition,
+					pad->mux->reg_offset);
+		if (val & OMAP_WAKEUP_EVENT) {
+			ret = true;
+			break;
+		}
+	}
+
+	return ret;
+}
+
 /* Assumes the calling function takes care of locking */
 void omap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state)
 {
diff --git a/arch/arm/mach-omap2/mux.h b/arch/arm/mach-omap2/mux.h
index 137f321..86a0051 100644
--- a/arch/arm/mach-omap2/mux.h
+++ b/arch/arm/mach-omap2/mux.h
@@ -225,8 +225,21 @@ omap_hwmod_mux_init(struct omap_device_pad *bpads, int nr_pads);
  */
 void omap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state);
 
+/**
+ * omap_hwmod_mux_get_wake_status - omap hwmod check pad wakeup
+ * @hmux:		Pads for a hwmod
+ *
+ * Called only from omap_hwmod.c, do not use.
+ */
+bool omap_hwmod_mux_get_wake_status(struct omap_hwmod_mux_info *hmux);
 #else
 
+static inline bool
+omap_hwmod_mux_get_wake_status(struct omap_hwmod_mux_info *hmux)
+{
+	return 0;
+}
+
 static inline int omap_mux_init_gpio(int gpio, int val)
 {
 	return 0;
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index 72176d5..83eab67 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -2429,3 +2429,17 @@ int omap_hwmod_disable_ioring_wakeup(struct omap_hwmod *oh)
 	/* Disable pad wakeup capability */
 	return omap_hwmod_set_ioring_wakeup(oh, false);
 }
+
+/**
+ * omap_hwmod_pad_get_wakeup_status - get pad wakeup status if mux is available.
+ * @oh: struct omap_hwmod *
+ *
+ * Returns the wake_up status bit of available pad mux pin.
+ * return error if no mux pads are available.
+ */
+int omap_hmwod_pad_get_wakeup_status(struct omap_hwmod *oh)
+{
+	if (oh->mux)
+		return omap_hwmod_mux_get_wake_status(oh->mux);
+	return -EINVAL;
+}
diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
index 7ef11a6..664975c 100644
--- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
+++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
@@ -605,6 +605,7 @@ int omap_hwmod_no_setup_reset(struct omap_hwmod *oh);
 int omap_hwmod_enable_ioring_wakeup(struct omap_hwmod *oh);
 int omap_hwmod_disable_ioring_wakeup(struct omap_hwmod *oh);
 
+int omap_hmwod_pad_get_wakeup_status(struct omap_hwmod *oh);
 /*
  * Chip variant-specific hwmod init routines - XXX should be converted
  * to use initcalls once the initial boot ordering is straightened out
-- 
1.7.1

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

* [PATCH 1/2 v3] OMAP2+: hwmod: Add API to enable IO ring wakeup.
  2011-05-10 10:30 ` [PATCH 1/2 v3] OMAP2+: hwmod: Add API to enable IO ring wakeup Govindraj.R
@ 2011-05-10 16:04   ` Todd Poynor
  2011-05-11  4:16     ` Raja, Govindraj
  0 siblings, 1 reply; 5+ messages in thread
From: Todd Poynor @ 2011-05-10 16:04 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, May 10, 2011 at 3:30 AM, Govindraj.R <govindraj.raja@ti.com> wrote:
...
>
> +/**
> + * omap_device_enable_ioring_wakeup - Set wakeup bit for iopad ring.
> + * @pdev: platform_device for which wakeup needs to be set.
> + *
> + * Caller should ensure this is called if device_may_wakeup(dev) is true
> + * traverse through each hwmod and check each available pads
> + * if pad is enabled then set wakeup enable flag for the mux pin.
> + * Return error if pads are not enabled or not available.
> + * Wakeup enable flag will be we used during hwmod idle transistion.
> + */
> +int omap_device_enable_ioring_wakeup(struct platform_device *pdev)
> +{
> +       int ret = -EINVAL, i;
> +       struct omap_device *od;
> +       struct omap_hwmod *oh;
> +
> +       od = _find_by_pdev(pdev);
> +       for (i = 0; i < od->hwmods_cnt; i++) {
> +               oh = od->hwmods[i];
> +               ret = omap_hwmod_enable_ioring_wakeup(oh);
> +       }
> +
> +       return ret;
>

Error returns from all but the last hwmod are discarded.  If the error
returns are meaningful and need corrective action (or warning messages) by
callers then these should be preserved.

...

Todd
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110510/2cc3e67a/attachment-0001.html>

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

* [PATCH 1/2 v3] OMAP2+: hwmod: Add API to enable IO ring wakeup.
  2011-05-10 16:04   ` Todd Poynor
@ 2011-05-11  4:16     ` Raja, Govindraj
  0 siblings, 0 replies; 5+ messages in thread
From: Raja, Govindraj @ 2011-05-11  4:16 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, May 10, 2011 at 9:34 PM, Todd Poynor <toddpoynor@google.com> wrote:

> On Tue, May 10, 2011 at 3:30 AM, Govindraj.R <govindraj.raja@ti.com>wrote:
> ...
>
>> +/**
>> + * omap_device_enable_ioring_wakeup - Set wakeup bit for iopad ring.
>> + * @pdev: platform_device for which wakeup needs to be set.
>> + *
>> + * Caller should ensure this is called if device_may_wakeup(dev) is true
>> + * traverse through each hwmod and check each available pads
>> + * if pad is enabled then set wakeup enable flag for the mux pin.
>> + * Return error if pads are not enabled or not available.
>> + * Wakeup enable flag will be we used during hwmod idle transistion.
>> + */
>> +int omap_device_enable_ioring_wakeup(struct platform_device *pdev)
>> +{
>> +       int ret = -EINVAL, i;
>> +       struct omap_device *od;
>> +       struct omap_hwmod *oh;
>> +
>> +       od = _find_by_pdev(pdev);
>> +       for (i = 0; i < od->hwmods_cnt; i++) {
>> +               oh = od->hwmods[i];
>> +               ret = omap_hwmod_enable_ioring_wakeup(oh);
>> +       }
>> +
>> +       return ret;
>>
>
> Error returns from all but the last hwmod are discarded.  If the error
> returns are meaningful and need corrective action (or warning messages) by
> callers then these should be preserved.
>

Actually here we either consider whether dynamic_io_pad was available for
enabling wakeup
or whether its never available for given hwmod. So thats the reason we are
not preserving ret,
also wakeup capability will be dependent on wakeup enable flag and remux
flag which will set
during hwmod_iopad initialisation which takes static structures for all
pads.

--
Govindraj.R



> ...
>
> Todd
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110511/7274274d/attachment-0001.html>

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

end of thread, other threads:[~2011-05-11  4:16 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-05-10 10:30 [PATCH 0/2 v3] OMAP2+: hwmod: Add hwmod's API's for pad wakeup Govindraj.R
2011-05-10 10:30 ` [PATCH 1/2 v3] OMAP2+: hwmod: Add API to enable IO ring wakeup Govindraj.R
2011-05-10 16:04   ` Todd Poynor
2011-05-11  4:16     ` Raja, Govindraj
2011-05-10 10:30 ` [PATCH 2/2 v3] OMAP2+: hwmod: Add API to check IO PAD wakeup status Govindraj.R

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