linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2 v2] OMAP2+: hwmod: Add hwmod's API's for pad wakeup
@ 2011-05-09 12:35 Govindraj.R
  2011-05-09 12:35 ` [PATCH 1/2 v2] OMAP2+: hwmod: Add API to enable IO ring wakeup Govindraj.R
  2011-05-09 12:35 ` [PATCH 2/2 v2] OMAP2+: hwmod: Add API to check IO PAD wakeup status Govindraj.R
  0 siblings, 2 replies; 6+ messages in thread
From: Govindraj.R @ 2011-05-09 12:35 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 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              |   65 +++++++++++++++++++++++++
 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, 162 insertions(+), 0 deletions(-)

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

* [PATCH 1/2 v2] OMAP2+: hwmod: Add API to enable IO ring wakeup.
  2011-05-09 12:35 [PATCH 0/2 v2] OMAP2+: hwmod: Add hwmod's API's for pad wakeup Govindraj.R
@ 2011-05-09 12:35 ` Govindraj.R
  2011-05-09 14:48   ` Paul Walmsley
  2011-05-09 16:56   ` Todd Poynor
  2011-05-09 12:35 ` [PATCH 2/2 v2] OMAP2+: hwmod: Add API to check IO PAD wakeup status Govindraj.R
  1 sibling, 2 replies; 6+ messages in thread
From: Govindraj.R @ 2011-05-09 12:35 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              |   51 +++++++++++++++++++++++++
 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, 106 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index e034294..bbbe1ed 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -2369,3 +2369,54 @@ int omap_hwmod_no_setup_reset(struct omap_hwmod *oh)
 
 	return 0;
 }
+
+static int omap_hwmod_configure_ioring_wakeup(struct omap_hwmod *oh, u16 val)
+{
+	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) {
+				pad->idle = pad->enable | val;
+				ret = 0;
+			}
+		}
+	}
+
+	return ret;
+}
+
+/**
+ * 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_configure_ioring_wakeup(oh, OMAP_WAKEUP_EN);
+}
+
+/**
+ * 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)
+{
+	u16 val = 0;
+
+	/* Disable pad wakeup capability */
+	val &= ~OMAP_WAKEUP_EN;
+	return omap_hwmod_configure_ioring_wakeup(oh, val);
+}
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] 6+ messages in thread

* [PATCH 2/2 v2] OMAP2+: hwmod: Add API to check IO PAD wakeup status
  2011-05-09 12:35 [PATCH 0/2 v2] OMAP2+: hwmod: Add hwmod's API's for pad wakeup Govindraj.R
  2011-05-09 12:35 ` [PATCH 1/2 v2] OMAP2+: hwmod: Add API to enable IO ring wakeup Govindraj.R
@ 2011-05-09 12:35 ` Govindraj.R
  1 sibling, 0 replies; 6+ messages in thread
From: Govindraj.R @ 2011-05-09 12:35 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 bbbe1ed..3311234 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -2420,3 +2420,17 @@ int omap_hwmod_disable_ioring_wakeup(struct omap_hwmod *oh)
 	val &= ~OMAP_WAKEUP_EN;
 	return omap_hwmod_configure_ioring_wakeup(oh, val);
 }
+
+/**
+ * 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] 6+ messages in thread

* [PATCH 1/2 v2] OMAP2+: hwmod: Add API to enable IO ring wakeup.
  2011-05-09 12:35 ` [PATCH 1/2 v2] OMAP2+: hwmod: Add API to enable IO ring wakeup Govindraj.R
@ 2011-05-09 14:48   ` Paul Walmsley
  2011-05-09 16:56   ` Todd Poynor
  1 sibling, 0 replies; 6+ messages in thread
From: Paul Walmsley @ 2011-05-09 14:48 UTC (permalink / raw)
  To: linux-arm-kernel

Hello Govindraj

On Mon, 9 May 2011, Govindraj.R wrote:

> 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              |   51 +++++++++++++++++++++++++
>  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, 106 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
> index e034294..bbbe1ed 100644
> --- a/arch/arm/mach-omap2/omap_hwmod.c
> +++ b/arch/arm/mach-omap2/omap_hwmod.c
> @@ -2369,3 +2369,54 @@ int omap_hwmod_no_setup_reset(struct omap_hwmod *oh)
>  
>  	return 0;
>  }
> +
> +static int omap_hwmod_configure_ioring_wakeup(struct omap_hwmod *oh, u16 val)

What about Todd's comments?

If this function is still valid after considering those comments -- 
perhaps by adding a 'mask' argument -- then lease change this function's 
name to simply _set_ioring_wakeup() and move it up towards the top of the 
file with the rest of the static functions.

> +{
> +	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) {
> +				pad->idle = pad->enable | val;
> +				ret = 0;
> +			}
> +		}
> +	}
> +
> +	return ret;
> +}
> +
> +/**
> + * 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_configure_ioring_wakeup(oh, OMAP_WAKEUP_EN);
> +}
> +
> +/**
> + * 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)
> +{
> +	u16 val = 0;
> +
> +	/* Disable pad wakeup capability */
> +	val &= ~OMAP_WAKEUP_EN;
> +	return omap_hwmod_configure_ioring_wakeup(oh, val);
> +}
> 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
> 


- Paul

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

* [PATCH 1/2 v2] OMAP2+: hwmod: Add API to enable IO ring wakeup.
  2011-05-09 12:35 ` [PATCH 1/2 v2] OMAP2+: hwmod: Add API to enable IO ring wakeup Govindraj.R
  2011-05-09 14:48   ` Paul Walmsley
@ 2011-05-09 16:56   ` Todd Poynor
  2011-05-10  4:20     ` Raja, Govindraj
  1 sibling, 1 reply; 6+ messages in thread
From: Todd Poynor @ 2011-05-09 16:56 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, May 9, 2011 at 5:35 AM, Govindraj.R <govindraj.raja@ti.com> wrote:

> 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              |   51
> +++++++++++++++++++++++++
>  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, 106 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/omap_hwmod.c
> b/arch/arm/mach-omap2/omap_hwmod.c
> index e034294..bbbe1ed 100644
> --- a/arch/arm/mach-omap2/omap_hwmod.c
> +++ b/arch/arm/mach-omap2/omap_hwmod.c
> @@ -2369,3 +2369,54 @@ int omap_hwmod_no_setup_reset(struct omap_hwmod *oh)
>
>        return 0;
>  }
> +
> +static int omap_hwmod_configure_ioring_wakeup(struct omap_hwmod *oh, u16
> val)
> +{
> +       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) {
> +                               pad->idle = pad->enable | val;
> +                               ret = 0;
> +                       }
> +               }
> +       }
> +
> +       return ret;
> +}
> +
> +/**
> + * 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_configure_ioring_wakeup(oh, OMAP_WAKEUP_EN);
> +}
> +
> +/**
> + * 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)
> +{
> +       u16 val = 0;
> +
> +       /* Disable pad wakeup capability */
> +       val &= ~OMAP_WAKEUP_EN;
>

Will still leave val  = 0.

It sounds like omap_hwmod_configure_ioring_wakeup needs to take a new value
for the OMAP_WAKEUP_EN bit (0 or 1), and that code needs to set pad->idle
= pad->enable | OMAP_WAKEUP_EN if being enabled, or pad->idle =
pad->enable & ~OMAP_WAKEUP_EN if being disabled?


> +       return omap_hwmod_configure_ioring_wakeup(oh, val);
> +}
> 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
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110509/1879d187/attachment-0001.html>

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

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

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

> On Mon, May 9, 2011 at 5:35 AM, Govindraj.R <govindraj.raja@ti.com> wrote:
>
>> 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              |   51
>> +++++++++++++++++++++++++
>>  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, 106 insertions(+), 0 deletions(-)
>>
>> diff --git a/arch/arm/mach-omap2/omap_hwmod.c
>> b/arch/arm/mach-omap2/omap_hwmod.c
>> index e034294..bbbe1ed 100644
>> --- a/arch/arm/mach-omap2/omap_hwmod.c
>> +++ b/arch/arm/mach-omap2/omap_hwmod.c
>> @@ -2369,3 +2369,54 @@ int omap_hwmod_no_setup_reset(struct omap_hwmod
>> *oh)
>>
>>        return 0;
>>  }
>> +
>> +static int omap_hwmod_configure_ioring_wakeup(struct omap_hwmod *oh, u16
>> val)
>> +{
>> +       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) {
>> +                               pad->idle = pad->enable | val;
>> +                               ret = 0;
>> +                       }
>> +               }
>> +       }
>> +
>> +       return ret;
>> +}
>> +
>> +/**
>> + * 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_configure_ioring_wakeup(oh, OMAP_WAKEUP_EN);
>> +}
>> +
>> +/**
>> + * 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)
>> +{
>> +       u16 val = 0;
>> +
>> +       /* Disable pad wakeup capability */
>> +       val &= ~OMAP_WAKEUP_EN;
>>
>
> Will still leave val  = 0.
>
> It sounds like omap_hwmod_configure_ioring_wakeup needs to take a new value
> for the OMAP_WAKEUP_EN bit (0 or 1), and that code needs to set pad->idle
> = pad->enable | OMAP_WAKEUP_EN if being enabled, or pad->idle =
> pad->enable & ~OMAP_WAKEUP_EN if being disabled?
>


yes fine.
will change and post out v3.



>
>> +       return omap_hwmod_configure_ioring_wakeup(oh, val);
>>
>> +}
>> 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
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
>> the body of a message to majordomo at vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110510/24755cef/attachment-0001.html>

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

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

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-05-09 12:35 [PATCH 0/2 v2] OMAP2+: hwmod: Add hwmod's API's for pad wakeup Govindraj.R
2011-05-09 12:35 ` [PATCH 1/2 v2] OMAP2+: hwmod: Add API to enable IO ring wakeup Govindraj.R
2011-05-09 14:48   ` Paul Walmsley
2011-05-09 16:56   ` Todd Poynor
2011-05-10  4:20     ` Raja, Govindraj
2011-05-09 12:35 ` [PATCH 2/2 v2] 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).