[patches 5/8] pcmcia: use irq_mask to mark IRQs as (un)usable

Dominik Brodowski linux at dominikbrodowski.de
Tue Jan 11 11:58:50 EST 2005


Unset bits in the per-socket irq_mask to mark IRQs as unusable, if asked
to do so by the user in /etc/pcmcia/config.opts

Signed-off-by: Dominik Brodowski <linux at brodo.de>
---

 drivers/pcmcia/rsrc_mgr.c |   84 +++++++++++++++++++---------------------------
 1 files changed, 35 insertions(+), 49 deletions(-)


Index: 2.6.10/drivers/pcmcia/rsrc_mgr.c
===================================================================
--- 2.6.10.orig/drivers/pcmcia/rsrc_mgr.c	2004-12-26 14:50:47.528377012 +0100
+++ 2.6.10/drivers/pcmcia/rsrc_mgr.c	2004-12-26 14:50:51.833766687 +0100
@@ -151,65 +151,51 @@
 
 /*====================================================================*/
 
-static int adjust_irq(adjust_t *adj)
-{
-    int ret = CS_SUCCESS;
 #ifdef CONFIG_PCMCIA_PROBE
-    int irq;
-    irq_info_t *info;
-    
-    irq = adj->resource.irq.IRQ;
-    if ((irq < 0) || (irq > 15))
-	return CS_BAD_IRQ;
-    info = &irq_table[irq];
-
-    down(&rsrc_sem);
-    switch (adj->Action) {
-    case ADD_MANAGED_RESOURCE:
-	if (info->Attributes & RES_REMOVED)
-	    info->Attributes &= ~(RES_REMOVED|RES_ALLOCATED);
-	else
-	    if (adj->Attributes & RES_ALLOCATED) {
-		ret = CS_IN_USE;
-		break;
-	    }
-	if (adj->Attributes & RES_RESERVED)
-	    info->Attributes |= RES_RESERVED;
-	else
-	    info->Attributes &= ~RES_RESERVED;
-	break;
-    case REMOVE_MANAGED_RESOURCE:
-	if (info->Attributes & RES_REMOVED) {
-	    ret = 0;
-	    break;
-	}
-	if (info->Attributes & RES_ALLOCATED) {
-	    ret = CS_IN_USE;
-	    break;
-	}
-	info->Attributes |= RES_ALLOCATED|RES_REMOVED;
-	info->Attributes &= ~RES_RESERVED;
-	break;
-    default:
-	ret = CS_UNSUPPORTED_FUNCTION;
-	break;
-    }
-    up(&rsrc_sem);
-#endif
-    return ret;
+
+static int adjust_irq(struct pcmcia_socket *s, adjust_t *adj)
+{
+	int irq;
+	u32 mask;
+
+	irq = adj->resource.irq.IRQ;
+	if ((irq < 0) || (irq > 15))
+		return CS_BAD_IRQ;
+
+	if (adj->Action != REMOVE_MANAGED_RESOURCE)
+		return 0;
+
+	mask = 1 << irq;
+
+	if !(s->irq_mask & mask)
+		return 0;
+
+	s->irq_mask &= ~mask;
+
+	return 0;
 }
 
+#else
+
+static inline int adjust_irq(struct pcmcia_socket *s, adjust_t *adj) {
+	return CS_SUCCESS;
+}
+
+#endif
+
+
 int pcmcia_adjust_resource_info(adjust_t *adj)
 {
 	struct pcmcia_socket *s;
 	int ret = CS_UNSUPPORTED_FUNCTION;
 
-	if (adj->Resource == RES_IRQ)
-		return adjust_irq(adj);
-
 	down_read(&pcmcia_socket_list_rwsem);
 	list_for_each_entry(s, &pcmcia_socket_list, socket_list) {
-		if (s->resource_ops->adjust_resource)
+
+		if (adj->Resource == RES_IRQ)
+			ret = adjust_irq(s, adj);
+
+		else if (s->resource_ops->adjust_resource)
 			ret = s->resource_ops->adjust_resource(s, adj);
 	}
 	up_read(&pcmcia_socket_list_rwsem);



More information about the linux-pcmcia mailing list