lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1318817327-4589-2-git-send-email-nobuhiro.iwamatsu.yj@renesas.com>
Date:	Mon, 17 Oct 2011 11:08:47 +0900
From:	Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@...esas.com>
To:	tglx@...utronix.de
Cc:	linux-kernel@...r.kernel.org, mingo@...nel.org,
	Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@...esas.com>
Subject: [PATCH 2/2] irq: Add function pointer table for generic-chip

This adds the function table to access it with function pointer
by some functions providedd in generic-chip.
The driver who uses the function offered in generic-chip can use
this via this function table.

Signed-off-by: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@...esas.com>
---
 include/linux/irq.h       |   27 ++++++++++++++++-----------
 kernel/irq/generic-chip.c |   31 +++++++++++++++++++++----------
 2 files changed, 37 insertions(+), 21 deletions(-)

diff --git a/include/linux/irq.h b/include/linux/irq.h
index bff29c5..06ed817 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -638,6 +638,20 @@ struct irq_chip_type {
 	u32			type;
 };
 
+/* Generic chip callback functions table */
+struct irq_gc_functions {
+	void (* gc_noop)(struct irq_data *d);
+	void (* gc_mask_disable_reg)(struct irq_data *d);
+	void (* gc_mask_set_bit)(struct irq_data *d);
+	void (* gc_mask_clr_bit)(struct irq_data *d);
+	void (* gc_unmask_enable_reg)(struct irq_data *d);
+	void (* gc_ack_set_bit)(struct irq_data *d);
+	void (* gc_ack_clr_bit)(struct irq_data *d);
+	void (* gc_mask_disable_reg_and_ack)(struct irq_data *d);
+	void (* gc_eoi)(struct irq_data *d);
+	int (* gc_set_wake)(struct irq_data *d, unsigned int on);
+};
+
 /**
  * struct irq_chip_generic - Generic irq chip data structure
  * @lock:		Lock to protect register and cache data access
@@ -653,6 +667,7 @@ struct irq_chip_type {
  * @private:		Private data for non generic chip callbacks
  * @list:		List head for keeping track of instances
  * @chip_types:		Array of interrupt irq_chip_types
+ * @functions:		Generic chip callback functions
  *
  * Note, that irq_chip_generic can have multiple irq_chip_type
  * implementations which can be associated to a particular irq line of
@@ -674,6 +689,7 @@ struct irq_chip_generic {
 	void			*private;
 	struct list_head	list;
 	struct irq_chip_type	chip_types[0];
+	struct irq_gc_functions	functions;
 };
 
 /**
@@ -688,17 +704,6 @@ enum irq_gc_flags {
 	IRQ_GC_INIT_NESTED_LOCK		= 1 << 1,
 };
 
-/* Generic chip callback functions */
-void irq_gc_noop(struct irq_data *d);
-void irq_gc_mask_disable_reg(struct irq_data *d);
-void irq_gc_mask_set_bit(struct irq_data *d);
-void irq_gc_mask_clr_bit(struct irq_data *d);
-void irq_gc_unmask_enable_reg(struct irq_data *d);
-void irq_gc_ack_set_bit(struct irq_data *d);
-void irq_gc_ack_clr_bit(struct irq_data *d);
-void irq_gc_mask_disable_reg_and_ack(struct irq_data *d);
-void irq_gc_eoi(struct irq_data *d);
-int irq_gc_set_wake(struct irq_data *d, unsigned int on);
 
 /* Setup functions for irq_chip_generic */
 struct irq_chip_generic *
diff --git a/kernel/irq/generic-chip.c b/kernel/irq/generic-chip.c
index 6cb7613..8aec156 100644
--- a/kernel/irq/generic-chip.c
+++ b/kernel/irq/generic-chip.c
@@ -24,7 +24,7 @@ static inline struct irq_chip_regs *cur_regs(struct irq_data *d)
  * irq_gc_noop - NOOP function
  * @d: irq_data
  */
-void irq_gc_noop(struct irq_data *d)
+static void irq_gc_noop(struct irq_data *d)
 {
 }
 
@@ -35,7 +35,7 @@ void irq_gc_noop(struct irq_data *d)
  * Chip has separate enable/disable registers instead of a single mask
  * register.
  */
-void irq_gc_mask_disable_reg(struct irq_data *d)
+static void irq_gc_mask_disable_reg(struct irq_data *d)
 {
 	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 	u32 mask = 1 << (d->irq - gc->irq_base);
@@ -53,7 +53,7 @@ void irq_gc_mask_disable_reg(struct irq_data *d)
  * Chip has a single mask register. Values of this register are cached
  * and protected by gc->lock
  */
-void irq_gc_mask_set_bit(struct irq_data *d)
+static void irq_gc_mask_set_bit(struct irq_data *d)
 {
 	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 	u32 mask = 1 << (d->irq - gc->irq_base);
@@ -71,7 +71,7 @@ void irq_gc_mask_set_bit(struct irq_data *d)
  * Chip has a single mask register. Values of this register are cached
  * and protected by gc->lock
  */
-void irq_gc_mask_clr_bit(struct irq_data *d)
+static void irq_gc_mask_clr_bit(struct irq_data *d)
 {
 	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 	u32 mask = 1 << (d->irq - gc->irq_base);
@@ -89,7 +89,7 @@ void irq_gc_mask_clr_bit(struct irq_data *d)
  * Chip has separate enable/disable registers instead of a single mask
  * register.
  */
-void irq_gc_unmask_enable_reg(struct irq_data *d)
+static void irq_gc_unmask_enable_reg(struct irq_data *d)
 {
 	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 	u32 mask = 1 << (d->irq - gc->irq_base);
@@ -104,7 +104,7 @@ void irq_gc_unmask_enable_reg(struct irq_data *d)
  * irq_gc_ack_set_bit - Ack pending interrupt via setting bit
  * @d: irq_data
  */
-void irq_gc_ack_set_bit(struct irq_data *d)
+static void irq_gc_ack_set_bit(struct irq_data *d)
 {
 	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 	u32 mask = 1 << (d->irq - gc->irq_base);
@@ -118,7 +118,7 @@ void irq_gc_ack_set_bit(struct irq_data *d)
  * irq_gc_ack_clr_bit - Ack pending interrupt via clearing bit
  * @d: irq_data
  */
-void irq_gc_ack_clr_bit(struct irq_data *d)
+static void irq_gc_ack_clr_bit(struct irq_data *d)
 {
 	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 	u32 mask = ~(1 << (d->irq - gc->irq_base));
@@ -132,7 +132,7 @@ void irq_gc_ack_clr_bit(struct irq_data *d)
  * irq_gc_mask_disable_reg_and_ack- Mask and ack pending interrupt
  * @d: irq_data
  */
-void irq_gc_mask_disable_reg_and_ack(struct irq_data *d)
+static void irq_gc_mask_disable_reg_and_ack(struct irq_data *d)
 {
 	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 	u32 mask = 1 << (d->irq - gc->irq_base);
@@ -147,7 +147,7 @@ void irq_gc_mask_disable_reg_and_ack(struct irq_data *d)
  * irq_gc_eoi - EOI interrupt
  * @d: irq_data
  */
-void irq_gc_eoi(struct irq_data *d)
+static void irq_gc_eoi(struct irq_data *d)
 {
 	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 	u32 mask = 1 << (d->irq - gc->irq_base);
@@ -165,7 +165,7 @@ void irq_gc_eoi(struct irq_data *d)
  * configured in a separate register and the wakeup active state is
  * just stored in a bitmask.
  */
-int irq_gc_set_wake(struct irq_data *d, unsigned int on)
+static int irq_gc_set_wake(struct irq_data *d, unsigned int on)
 {
 	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 	u32 mask = 1 << (d->irq - gc->irq_base);
@@ -208,6 +208,17 @@ irq_alloc_generic_chip(const char *name, int num_ct, unsigned int irq_base,
 		gc->reg_base = reg_base;
 		gc->chip_types->chip.name = name;
 		gc->chip_types->handler = handler;
+
+		gc->functions.gc_noop = irq_gc_noop;
+		gc->functions.gc_mask_disable_reg = irq_gc_mask_disable_reg;
+		gc->functions.gc_mask_set_bit = irq_gc_mask_set_bit;
+		gc->functions.gc_mask_clr_bit = irq_gc_mask_clr_bit;
+		gc->functions.gc_unmask_enable_reg = irq_gc_unmask_enable_reg;
+		gc->functions.gc_ack_set_bit = irq_gc_ack_set_bit;
+		gc->functions.gc_ack_clr_bit = irq_gc_ack_clr_bit;
+		gc->functions.gc_mask_disable_reg_and_ack = irq_gc_mask_disable_reg_and_ack;
+		gc->functions.gc_eoi = irq_gc_eoi;
+		gc->functions.gc_set_wake = irq_gc_set_wake;
 	}
 	return gc;
 }
-- 
1.7.7

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ