linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: jean.pihet@newoldbits.com (Jean Pihet)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 11/20] ARM: OMAP3+: SmartReflex: introduce notifier_control
Date: Wed,  1 Feb 2012 09:49:50 +0100	[thread overview]
Message-ID: <1328086199-28486-12-git-send-email-j-pihet@ti.com> (raw)
In-Reply-To: <1328086199-28486-1-git-send-email-j-pihet@ti.com>

From: Nishanth Menon <nm@ti.com>

We need some mechanism from class drivers to control when notifiers
should be triggered and when not, currently we have none, which makes
Class driver usage of the interrupt events almost impossible.

We also ensure that disable/enable or irq is always guarenteed to be
paired. The need to do this is because of the mixture of interrupt based
and polling based operations that is implemented as the most optimal
strategy for various SmartReflex AVS class

Introduce an SmartReflex driver API for doing the same. This is useful
for SmartReflex AVS class 1.5 or 2 drivers.

Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Jean Pihet <j-pihet@ti.com>
---
 arch/arm/mach-omap2/smartreflex.c |   65 +++++++++++++++++++++++++++++++++++++
 arch/arm/mach-omap2/smartreflex.h |    8 ++++
 2 files changed, 73 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c
index 8380201..a24a228 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -50,6 +50,7 @@ struct omap_sr {
 	u32				senp_mod;
 	u32				senn_mod;
 	unsigned int			irq;
+	bool				irq_enabled;
 	void __iomem			*base;
 	struct platform_device		*pdev;
 	struct list_head		node;
@@ -765,6 +766,70 @@ void sr_disable(struct voltagedomain *voltdm)
 }
 
 /**
+ * sr_notifier_control() - control the notifier mechanism
+ * @voltdm:	VDD pointer to which the SR module to be configured belongs to.
+ * @enable:	true to enable notifiers and false to disable the same
+ *
+ * SR modules allow an MCU interrupt mechanism that vary based on the IP
+ * revision, we allow the system to generate interrupt if the class driver
+ * has capability to handle the same. it is upto the class driver to ensure
+ * the proper sequencing and handling for a clean implementation. returns
+ * 0 if all goes fine, else returns failure results
+ */
+int sr_notifier_control(struct voltagedomain *voltdm, bool enable)
+{
+	struct omap_sr *sr = _sr_lookup(voltdm);
+	u32 value = 0;
+
+	if (!sr) {
+		pr_warning("%s: sr corresponding to domain not found\n",
+				__func__);
+		return -EINVAL;
+	}
+	if (!sr->autocomp_active)
+		return -EINVAL;
+
+	/* If I could never register an ISR, why bother?? */
+	if (!(sr_class && sr_class->notify && sr_class->notify_flags &&
+			sr->irq)) {
+		dev_warn(&sr->pdev->dev,
+			"%s: unable to setup IRQ without handling mechanism\n",
+			__func__);
+		return -EINVAL;
+	}
+
+	switch (sr->ip_type) {
+	case SR_TYPE_V1:
+		value = notifier_to_irqen_v1(sr_class->notify_flags);
+		sr_modify_reg(sr, ERRCONFIG_V1, value,
+				(enable) ? value : 0);
+		break;
+	case SR_TYPE_V2:
+		value = notifier_to_irqen_v2(sr_class->notify_flags);
+		sr_write_reg(sr, (enable) ? IRQENABLE_SET : IRQENABLE_CLR,
+				value);
+		break;
+	default:
+		 dev_warn(&sr->pdev->dev, "%s: unknown type of sr??\n",
+				 __func__);
+		return -EINVAL;
+	}
+
+	if (!enable)
+		sr_write_reg(sr, IRQSTATUS, value);
+
+	if (enable != sr->irq_enabled) {
+		if (enable)
+			enable_irq(sr->irq);
+		else
+			disable_irq(sr->irq);
+		sr->irq_enabled = enable;
+	}
+
+	return 0;
+}
+
+/**
  * sr_register_class() - API to register a smartreflex class parameters.
  * @class_data:	The structure containing various sr class specific data.
  *
diff --git a/arch/arm/mach-omap2/smartreflex.h b/arch/arm/mach-omap2/smartreflex.h
index da00f8c..8660049 100644
--- a/arch/arm/mach-omap2/smartreflex.h
+++ b/arch/arm/mach-omap2/smartreflex.h
@@ -251,6 +251,7 @@ void omap_sr_register_pmic(struct omap_sr_pmic_data *pmic_data);
 /* Smartreflex driver hooks to be called from Smartreflex class driver */
 int sr_enable(struct voltagedomain *voltdm, unsigned long volt);
 void sr_disable(struct voltagedomain *voltdm);
+int sr_notifier_control(struct voltagedomain *voltdm, bool enable);
 int sr_configure_errgen(struct voltagedomain *voltdm);
 int sr_disable_errgen(struct voltagedomain *voltdm);
 int sr_configure_minmax(struct voltagedomain *voltdm);
@@ -260,6 +261,13 @@ int sr_register_class(struct omap_sr_class_data *class_data);
 #else
 static inline void omap_sr_enable(struct voltagedomain *voltdm) {}
 static inline void omap_sr_disable(struct voltagedomain *voltdm) {}
+
+static inline int sr_notifier_control(struct voltagedomain *voltdm,
+		bool enable)
+{
+	return -EINVAL;
+}
+
 static inline void omap_sr_disable_reset_volt(
 		struct voltagedomain *voltdm) {}
 static inline void omap_sr_register_pmic(
-- 
1.7.5.4

  parent reply	other threads:[~2012-02-01  8:49 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-01  8:49 [PATCH v3 00/20] ARM: OMAP3+: SmartReflex: bugfixes Jean Pihet
2012-02-01  8:49 ` [PATCH 01/20] ARM: OMAP3+: SmartReflex: Layer Cleanup [V4] Jean Pihet
2012-02-01  8:49 ` [PATCH 02/20] ARM: OMAP3+: SmartReflex: add missing error-handling code Jean Pihet
2012-02-01  8:49 ` [PATCH 03/20] ARM: OMAP3+: SmartReflex: fix err interrupt disable sequence Jean Pihet
2012-02-01  8:49 ` [PATCH 04/20] ARM: OMAP3+: SmartReflex Class3: disable errorgen before disable VP Jean Pihet
2012-02-01  8:49 ` [PATCH 05/20] ARM: OMAP3+: SmartReflex: Add a shutdown hook Jean Pihet
2012-02-01  8:49 ` [PATCH 06/20] ARM: OMAP3+: SmartReflex: Fix status masking in ERRCONFIG register Jean Pihet
2012-02-01  8:49 ` [PATCH 07/20] ARM: OMAP3+: SmartReflex: clear ERRCONFIG_VPBOUNDINTST only on a need Jean Pihet
2012-02-02 19:15   ` Kevin Hilman
2012-02-01  8:49 ` [PATCH 08/20] ARM: OMAP3+: hwmod: add SmartReflex IRQs Jean Pihet
2012-02-01  8:49 ` [PATCH 09/20] ARM: OMAP3+: SmartReflex: introduce class init, deinit and priv data Jean Pihet
2012-02-01  8:49 ` [PATCH 10/20] ARM: OMAP3+: SmartReflex: introduce notifiers flags Jean Pihet
2012-02-01  8:49 ` Jean Pihet [this message]
2012-02-01  8:49 ` [PATCH 12/20] ARM: OMAP3+: SmartReflex: disable spamming interrupts Jean Pihet
2012-02-01  8:49 ` [PATCH 13/20] ARM: OMAP3+: SmartReflex: introduce class private data per voltage domain Jean Pihet
2012-02-01  8:49 ` [PATCH 14/20] ARM: OMAP3+: SmartReflex Class3: restrict CPU to run on Jean Pihet
2012-02-01  8:49 ` [PATCH 15/20] ARM: OMAP3+: SmartReflex: add missing platform_set_drvdata() Jean Pihet
2012-02-01  8:49 ` [PATCH 16/20] ARM: OMAP3+: SmartReflex: move late_initcall() closer to its argument Jean Pihet
2012-02-01  8:49 ` [PATCH 17/20] ARM: OMAP3+: SmartReflex: misc cleanups Jean Pihet
2012-02-01  8:49 ` [PATCH 18/20] ARM: OMAP3+: SmartReflex: micro-optimization for sanity check Jean Pihet
2012-02-01  8:49 ` [PATCH 19/20] ARM: OMAP3+: SmartReflex: fix the use of debugfs_create_* API Jean Pihet
2012-02-01  8:49 ` [PATCH 20/20] ARM: OMAP3+: SmartReflex: fix error handling Jean Pihet
2012-02-02 19:23 ` [PATCH v3 00/20] ARM: OMAP3+: SmartReflex: bugfixes Kevin Hilman
2012-02-08 17:52   ` Jean Pihet

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=1328086199-28486-12-git-send-email-j-pihet@ti.com \
    --to=jean.pihet@newoldbits.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /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;
as well as URLs for NNTP newsgroup(s).