<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.thinkwiki.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zdeqb</id>
	<title>ThinkWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.thinkwiki.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zdeqb"/>
	<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/wiki/Special:Contributions/Zdeqb"/>
	<updated>2026-05-01T20:08:01Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.12</generator>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=760ed_yenta_patch&amp;diff=37989</id>
		<title>760ed yenta patch</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=760ed_yenta_patch&amp;diff=37989"/>
		<updated>2008-06-14T15:41:33Z</updated>

		<summary type="html">&lt;p&gt;Zdeqb: this patch is also needed for 760EL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a kernel patch for a IBM Thinkpad [[:Category:760ED|760ED]] notebook.&lt;br /&gt;
&lt;br /&gt;
The pci irq pin of the ti1130 pcmcia bridge is not connected.&lt;br /&gt;
To use the cardbus, the kernel has to route the cardbus irq to an isa irq.&lt;br /&gt;
This patch detects an valid irq and route cardbus interupts to isa instead &lt;br /&gt;
of pci. (If a valid pci irq is detected it should use it and not the isa irq.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
diff -u linux-2.6.15.1/drivers/pcmcia/i82365.h linux-2.6.15.1-jck/drivers/pcmcia/i82365.h&lt;br /&gt;
--- linux-2.6.15.1/drivers/pcmcia/i82365.h	2006-01-15 07:16:02.000000000 +0100&lt;br /&gt;
+++ linux-2.6.15.1-jck/drivers/pcmcia/i82365.h	2006-02-18 17:34:35.000000000 +0100&lt;br /&gt;
@@ -88,13 +88,14 @@&lt;br /&gt;
 #define I365_IRQ_MASK	0x0F&lt;br /&gt;
 &lt;br /&gt;
 /* Flags for I365_CSC and I365_CSCINT*/&lt;br /&gt;
-#define I365_CSC_BVD1	0x01&lt;br /&gt;
-#define I365_CSC_STSCHG	0x01&lt;br /&gt;
-#define I365_CSC_BVD2	0x02&lt;br /&gt;
-#define I365_CSC_READY	0x04&lt;br /&gt;
-#define I365_CSC_DETECT	0x08&lt;br /&gt;
-#define I365_CSC_ANY	0x0F&lt;br /&gt;
-#define I365_CSC_GPI	0x10&lt;br /&gt;
+#define I365_CSC_BVD1		0x01&lt;br /&gt;
+#define I365_CSC_STSCHG		0x01&lt;br /&gt;
+#define I365_CSC_BVD2		0x02&lt;br /&gt;
+#define I365_CSC_READY		0x04&lt;br /&gt;
+#define I365_CSC_DETECT		0x08&lt;br /&gt;
+#define I365_CSC_ANY		0x0F&lt;br /&gt;
+#define I365_CSC_GPI		0x10&lt;br /&gt;
+#define I365_CSC_IRQ_MASK	0xF0&lt;br /&gt;
 &lt;br /&gt;
 /* Flags for I365_ADDRWIN */&lt;br /&gt;
 #define I365_ENA_IO(map)	(0x40 &amp;lt;&amp;lt; (map))&lt;br /&gt;
diff -u linux-2.6.15.1/drivers/pcmcia/ti113x.h linux-2.6.15.1-jck/drivers/pcmcia/ti113x.h&lt;br /&gt;
--- linux-2.6.15.1/drivers/pcmcia/ti113x.h	2006-01-15 07:16:02.000000000 +0100&lt;br /&gt;
+++ linux-2.6.15.1-jck/drivers/pcmcia/ti113x.h	2006-03-15 10:13:32.000000000 +0100&lt;br /&gt;
@@ -304,6 +304,18 @@&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
+static int ti113x_init(struct yenta_socket *socket)&lt;br /&gt;
+{&lt;br /&gt;
+        u8 new, reg = exca_readb(socket, I365_INTCTL);&lt;br /&gt;
+&lt;br /&gt;
+        new = reg &amp;amp; ~I365_INTR_ENA;&lt;br /&gt;
+        if ( socket-&amp;gt;dev-&amp;gt;irq ) /* PCI IRQ */&lt;br /&gt;
+                new |= I365_INTR_ENA;&lt;br /&gt;
+        if (new != reg)&lt;br /&gt;
+                exca_writeb(socket, I365_INTCTL, new);&lt;br /&gt;
+        return 0;&lt;br /&gt;
+}&lt;br /&gt;
+&lt;br /&gt;
 static int ti_override(struct yenta_socket *socket)&lt;br /&gt;
 {&lt;br /&gt;
 	u8 new, reg = exca_readb(socket, I365_INTCTL);&lt;br /&gt;
@@ -317,14 +329,42 @@&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
+static void ti113x_use_isa_irq(struct yenta_socket *socket)&lt;br /&gt;
+{&lt;br /&gt;
+	int isa_irq;&lt;br /&gt;
+	u8 intctl;&lt;br /&gt;
+	u32 isa_irq_mask;&lt;br /&gt;
+&lt;br /&gt;
+	/* get a free isa int */&lt;br /&gt;
+	isa_irq_mask = 0;&lt;br /&gt;
+        if (isa_probe)&lt;br /&gt;
+                isa_irq_mask = yenta_probe_irq(socket, 0x0ef8); /* 0x0ef8 =&amp;gt; only common isa irqs */&lt;br /&gt;
+	if ( !(isa_irq_mask &amp;amp; 0xFFFF) ) return; /* no useable isa irq found */&lt;br /&gt;
+	for(isa_irq = -1 ; isa_irq_mask ; isa_irq++ ) /* choose highest available */&lt;br /&gt;
+		isa_irq_mask &amp;gt;&amp;gt;= 1;&lt;br /&gt;
+&lt;br /&gt;
+	exca_writeb(socket, I365_CSCINT, (isa_irq &amp;lt;&amp;lt; 4) );  /* CSC */&lt;br /&gt;
+&lt;br /&gt;
+	socket-&amp;gt;cb_irq = isa_irq;&lt;br /&gt;
+&lt;br /&gt;
+	intctl = exca_readb(socket, I365_INTCTL);&lt;br /&gt;
+	intctl &amp;amp;= ~(I365_INTR_ENA | I365_IRQ_MASK);	/* CSC Enable */&lt;br /&gt;
+	exca_writeb(socket, I365_INTCTL, intctl );&lt;br /&gt;
+&lt;br /&gt;
+        printk(KERN_INFO &amp;quot;Yenta TI113x: using isa irq %d\n&amp;quot;, isa_irq);&lt;br /&gt;
+}&lt;br /&gt;
+&lt;br /&gt;
 static int ti113x_override(struct yenta_socket *socket)&lt;br /&gt;
 {&lt;br /&gt;
 	u8 cardctl;&lt;br /&gt;
 &lt;br /&gt;
 	cardctl = config_readb(socket, TI113X_CARD_CONTROL);&lt;br /&gt;
 	cardctl &amp;amp;= ~(TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_IREQ | TI113X_CCR_PCI_CSC);&lt;br /&gt;
-	if (socket-&amp;gt;cb_irq)&lt;br /&gt;
+	if (socket-&amp;gt;dev-&amp;gt;irq)&lt;br /&gt;
 		cardctl |= TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_CSC | TI113X_CCR_PCI_IREQ;&lt;br /&gt;
+	else&lt;br /&gt;
+		ti113x_use_isa_irq(socket);&lt;br /&gt;
+&lt;br /&gt;
 	config_writeb(socket, TI113X_CARD_CONTROL, cardctl);&lt;br /&gt;
 &lt;br /&gt;
 	return ti_override(socket);&lt;br /&gt;
diff -u linux-2.6.15.1/drivers/pcmcia/yenta_socket.c linux-2.6.15.1-jck/drivers/pcmcia/yenta_socket.c&lt;br /&gt;
--- linux-2.6.15.1/drivers/pcmcia/yenta_socket.c	2006-01-15 07:16:02.000000000 +0100&lt;br /&gt;
+++ linux-2.6.15.1-jck/drivers/pcmcia/yenta_socket.c	2006-03-12 01:05:34.000000000 +0100&lt;br /&gt;
@@ -50,7 +50,7 @@&lt;br /&gt;
 #define to_ns(cycles)	((cycles)*120)&lt;br /&gt;
 &lt;br /&gt;
 static int yenta_probe_cb_irq(struct yenta_socket *socket);&lt;br /&gt;
-&lt;br /&gt;
+static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mask);&lt;br /&gt;
 &lt;br /&gt;
 static unsigned int override_bios;&lt;br /&gt;
 module_param(override_bios, uint, 0000);&lt;br /&gt;
@@ -379,9 +379,12 @@&lt;br /&gt;
 &lt;br /&gt;
 		/* ISA interrupt control? */&lt;br /&gt;
 		intr = exca_readb(socket, I365_INTCTL);&lt;br /&gt;
-		intr = (intr &amp;amp; ~0xf);&lt;br /&gt;
-		if (!socket-&amp;gt;cb_irq) {&lt;br /&gt;
-			intr |= state-&amp;gt;io_irq;&lt;br /&gt;
+		intr &amp;amp;= ~(I365_IRQ_MASK);&lt;br /&gt;
+		if (!socket-&amp;gt;dev-&amp;gt;irq) {  /* is there a valid pci irq ? */&lt;br /&gt;
+			if(socket-&amp;gt;cb_irq)&lt;br /&gt;
+				intr |= socket-&amp;gt;cb_irq;&lt;br /&gt;
+			else&lt;br /&gt;
+				intr |= socket-&amp;gt;io_irq;&lt;br /&gt;
 			bridge |= CB_BRIDGE_INTR;&lt;br /&gt;
 		}&lt;br /&gt;
 		exca_writeb(socket, I365_INTCTL, intr);&lt;br /&gt;
@@ -391,7 +394,7 @@&lt;br /&gt;
 		reg = exca_readb(socket, I365_INTCTL) &amp;amp; (I365_RING_ENA | I365_INTR_ENA);&lt;br /&gt;
 		reg |= (state-&amp;gt;flags &amp;amp; SS_RESET) ? 0 : I365_PC_RESET;&lt;br /&gt;
 		reg |= (state-&amp;gt;flags &amp;amp; SS_IOCARD) ? I365_PC_IOCARD : 0;&lt;br /&gt;
-		if (state-&amp;gt;io_irq != socket-&amp;gt;cb_irq) {&lt;br /&gt;
+		if (state-&amp;gt;io_irq) {&lt;br /&gt;
 			reg |= state-&amp;gt;io_irq;&lt;br /&gt;
 			bridge |= CB_BRIDGE_INTR;&lt;br /&gt;
 		}&lt;br /&gt;
@@ -404,8 +407,10 @@&lt;br /&gt;
 		if (exca_readb(socket, I365_POWER) != reg)&lt;br /&gt;
 			exca_writeb(socket, I365_POWER, reg);&lt;br /&gt;
 &lt;br /&gt;
-		/* CSC interrupt: no ISA irq for CSC */&lt;br /&gt;
-		reg = I365_CSC_DETECT;&lt;br /&gt;
+		reg = exca_readb(socket, I365_CSCINT);  /*keep isa IRQs for CSC*/&lt;br /&gt;
+		reg &amp;amp;= I365_CSC_IRQ_MASK;&lt;br /&gt;
+		reg |= I365_CSC_DETECT;&lt;br /&gt;
+&lt;br /&gt;
 		if (state-&amp;gt;flags &amp;amp; SS_IOCARD) {&lt;br /&gt;
 			if (state-&amp;gt;csc_mask &amp;amp; SS_STSCHG) reg |= I365_CSC_STSCHG;&lt;br /&gt;
 		} else {&lt;br /&gt;
@@ -868,7 +873,7 @@&lt;br /&gt;
 		.override	= ti113x_override,&lt;br /&gt;
 		.save_state	= ti_save_state,&lt;br /&gt;
 		.restore_state	= ti_restore_state,&lt;br /&gt;
-		.sock_init	= ti_init,&lt;br /&gt;
+		.sock_init	= ti113x_init,&lt;br /&gt;
 	},&lt;br /&gt;
 	[CARDBUS_TYPE_TI12XX]	= {&lt;br /&gt;
 		.override	= ti12xx_override,&lt;br /&gt;
@@ -922,6 +927,7 @@&lt;br /&gt;
 	int i;&lt;br /&gt;
 	unsigned long val;&lt;br /&gt;
 	u32 mask;&lt;br /&gt;
+	u8 reg;&lt;br /&gt;
 &lt;br /&gt;
 	/*&lt;br /&gt;
 	 * Probe for usable interrupts using the force&lt;br /&gt;
@@ -929,6 +935,7 @@&lt;br /&gt;
 	 */&lt;br /&gt;
 	cb_writel(socket, CB_SOCKET_EVENT, -1);&lt;br /&gt;
 	cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK);&lt;br /&gt;
+	reg = exca_readb(socket, I365_CSCINT); /* save */&lt;br /&gt;
 	exca_writeb(socket, I365_CSCINT, 0);&lt;br /&gt;
 	val = probe_irq_on() &amp;amp; isa_irq_mask;&lt;br /&gt;
 	for (i = 1; i &amp;lt; 16; i++) {&lt;br /&gt;
@@ -940,7 +947,7 @@&lt;br /&gt;
 		cb_writel(socket, CB_SOCKET_EVENT, -1);&lt;br /&gt;
 	}&lt;br /&gt;
 	cb_writel(socket, CB_SOCKET_MASK, 0);&lt;br /&gt;
-	exca_writeb(socket, I365_CSCINT, 0);&lt;br /&gt;
+	exca_writeb(socket, I365_CSCINT, reg); /* restore */&lt;br /&gt;
 &lt;br /&gt;
 	mask = probe_irq_mask(val) &amp;amp; 0xffff;&lt;br /&gt;
 &lt;br /&gt;
@@ -971,6 +978,8 @@&lt;br /&gt;
 /* probes the PCI interrupt, use only on override functions */&lt;br /&gt;
 static int yenta_probe_cb_irq(struct yenta_socket *socket)&lt;br /&gt;
 {&lt;br /&gt;
+	u8 reg;&lt;br /&gt;
+&lt;br /&gt;
 	if (!socket-&amp;gt;cb_irq)&lt;br /&gt;
 		return -1;&lt;br /&gt;
 &lt;br /&gt;
@@ -982,7 +991,9 @@&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	/* generate interrupt, wait */&lt;br /&gt;
-	exca_writeb(socket, I365_CSCINT, I365_CSC_STSCHG);&lt;br /&gt;
+	reg = exca_readb(socket, I365_CSCINT); /* save */&lt;br /&gt;
+	exca_writeb(socket, I365_CSCINT, reg | I365_CSC_STSCHG);&lt;br /&gt;
+&lt;br /&gt;
 	cb_writel(socket, CB_SOCKET_EVENT, -1);&lt;br /&gt;
 	cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK);&lt;br /&gt;
 	cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS);&lt;br /&gt;
@@ -991,7 +1002,7 @@&lt;br /&gt;
 &lt;br /&gt;
 	/* disable interrupts */&lt;br /&gt;
 	cb_writel(socket, CB_SOCKET_MASK, 0);&lt;br /&gt;
-	exca_writeb(socket, I365_CSCINT, 0);&lt;br /&gt;
+	exca_writeb(socket, I365_CSCINT, reg); /* restore */&lt;br /&gt;
 	cb_writel(socket, CB_SOCKET_EVENT, -1);&lt;br /&gt;
 	exca_readb(socket, I365_CSC);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{HELP|&lt;br /&gt;
It is untested if these changes are not breaking other ti pcmcia bridges.&lt;br /&gt;
( Maybe someone can test this patch on other hardware.&lt;br /&gt;
And please review the changes, especially those in yenta_socket.c )&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:760ED]]&lt;br /&gt;
[[Category:760EL]]&lt;/div&gt;</summary>
		<author><name>Zdeqb</name></author>
		
	</entry>
</feed>