Skip to contentSkip to conversation

8xx PCMCIA: support for MPC885ADS and MPC866ADS

PATCH In review Vitaly Bordug 4 participants 5 messages Nov 18, 2005 – Nov 23, 2005 Pcmcia

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 8xx PCMCIA: support for MPC885ADS and MPC866ADS

This adds adds PCMCIA supported for both MPC885ADS and MPC866ADS.

This is established not together with FADS, because 885 does not have io_block_mapping() for BCSR area. Also, some cleanups done both for 885ADS and MBX.

Signature · 1 line
Sincerely, Vitaly
drivers/pcmcia/m8xx_pcmcia.c +91 -6
index 6d9f71c..5b7a04f 100644
@@ -9,6 +9,9 @@
  *     <[email protected]>
  * Further fixes, v2.6 kernel port
  *     <[email protected]>
+ * 
+ * Some fixes, additions (C) 2005 Montavista Software, Inc. 
+ *     <[email protected]>
  *
  * "The ExCA standard specifies that socket controllers should provide
  * two IO and five memory windows per socket, which can be independently
@@ -97,6 +100,11 @@ MODULE_LICENSE("Dual MPL/GPL");
 #endif
 #endif
 
+#if defined(CONFIG_MPC885ADS)
+#define CONFIG_PCMCIA_SLOT_A
+#define PCMCIA_GLITCHY_CD
+#endif
+
 /* Cyclades ACS uses both slots */
 #ifdef CONFIG_PRxK
 #define CONFIG_PCMCIA_SLOT_A
@@ -374,11 +382,80 @@ static int voltage_set(int slot, int vcc
 	}
 
 	/* first, turn off all power */
-	out_be32(&((u32 *)BCSR1), in_be32(&((u32 *)BCSR1)) & ~(BCSR1_PCCVCC_MASK | BCSR1_PCCVPP_MASK));
+	out_be32((u32 *)BCSR1, in_be32((u32 *)BCSR1) & ~(BCSR1_PCCVCC_MASK | BCSR1_PCCVPP_MASK));
+
+	/* enable new powersettings */
+	out_be32((u32 *)BCSR1, in_be32((u32 *)BCSR1) | reg);
+
+	return 0;
+}
+
+#define socket_get(_slot_) PCMCIA_SOCKET_KEY_5V
+
+static void hardware_enable(int slot)
+{
+	out_be32((u32 *)BCSR1, in_be32((u32 *)BCSR1) & ~BCSR1_PCCEN);
+}
+
+static void hardware_disable(int slot)
+{
+	out_be32((u32 *)BCSR1, in_be32((u32 *)BCSR1) |  BCSR1_PCCEN);
+}
+
+#endif
+
+/* MPC885ADS Boards */
+
+#if defined(CONFIG_MPC885ADS)
+
+#define PCMCIA_BOARD_MSG "MPC885ADS"
+
+static int voltage_set(int slot, int vcc, int vpp)
+{
+	u32 reg = 0;
+	unsigned *bcsr_io;
+
+	bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
+
+	switch(vcc) {
+		case 0:
+			break;
+		case 33:
+			reg |= BCSR1_PCCVCC0;
+			break;
+		case 50:
+			reg |= BCSR1_PCCVCC1;
+			break;
+		default:
+			return 1;
+	}
+
+	switch(vpp) {
+		case 0:
+			break;
+		case 33:
+		case 50:
+			if(vcc == vpp)
+				reg |= BCSR1_PCCVPP1;
+			else
+				return 1;
+			break;
+		case 120:
+			if ((vcc == 33) || (vcc == 50))
+				reg |= BCSR1_PCCVPP0;
+			else
+				return 1;
+		default:
+			return 1;
+	}
+
+	/* first, turn off all power */
+	out_be32(bcsr_io, in_be32(bcsr_io) & ~(BCSR1_PCCVCC_MASK | BCSR1_PCCVPP_MASK));
 
 	/* enable new powersettings */
-	out_be32(&((u32 *)BCSR1), in_be32(&((u32 *)BCSR1)) | reg);
+	out_be32(bcsr_io, in_be32(bcsr_io) | reg);
 
+	iounmap(bcsr_io);
 	return 0;
 }
 
@@ -386,12 +463,20 @@ static int voltage_set(int slot, int vcc
 
 static void hardware_enable(int slot)
 {
-	out_be32(&((u32 *)BCSR1), in_be32(&((u32 *)BCSR1)) & ~BCSR1_PCCEN);
+	unsigned *bcsr_io;
+
+	bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
+	out_be32(bcsr_io, in_be32(bcsr_io) & ~BCSR1_PCCEN);
+	iounmap(bcsr_io);
 }
 
 static void hardware_disable(int slot)
 {
-	out_be32(&((u32 *)BCSR1), in_be32(&((u32 *)BCSR1)) |  BCSR1_PCCEN);
+	unsigned *bcsr_io;
+
+	bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
+	out_be32(bcsr_io, in_be32(bcsr_io) |  BCSR1_PCCEN);
+	iounmap(bcsr_io);
 }
 
 #endif
@@ -440,10 +525,10 @@ static int voltage_set(int slot, int vcc
 	}
 
 	/* first, turn off all power */
-	out_8(&((u8 *)MBX_CSR2_ADDR), in_8(&((u8 *)MBX_CSR2_ADDR)) & ~(CSR2_VCC_MASK | CSR2_VPP_MASK));
+	out_8((u8 *)MBX_CSR2_ADDR, in_8((u8 *)MBX_CSR2_ADDR) & ~(CSR2_VCC_MASK | CSR2_VPP_MASK));
 
 	/* enable new powersettings */
-	out_8(&((u8 *)MBX_CSR2_ADDR), in_8(&((u8 *)MBX_CSR2_ADDR)) | reg);
+	out_8((u8 *)MBX_CSR2_ADDR, in_8((u8 *)MBX_CSR2_ADDR) | reg);
 
 	return 0;
 }
#1 lore raw

Hi Vitaly,

Quoted 7 lines · Vitaly Bordug

This adds adds PCMCIA supported for both MPC885ADS and MPC866ADS.

This is established not together with FADS, because 885 does not have io_block_mapping() for BCSR area.
Also, some cleanups done both for 885ADS and MBX.

<snip>

Review

Quoted 1 line
(quoted diff) +1 -0
+	bcsr_io = ioremap(BCSR1, sizeof(unsigned long));

Shouldnt you handle ioremap() failure? Most 85xx code written by Kumar also does not.

#2 lore raw
Quoted 9 lines · Marcelo Tosatti

Hi Vitaly,

Quoted 6 lines · Vitaly Bordug

This adds adds PCMCIA supported for both MPC885ADS and MPC866ADS.

This is established not together with FADS, because 885 does not have io_block_mapping() for BCSR area.
Also, some cleanups done both for 885ADS and MBX.

Quoted 8 lines
Quoted 1 line

<snip>

Review

Quoted 1 line
(quoted diff) +1 -0
+	bcsr_io = ioremap(BCSR1, sizeof(unsigned long));

Shouldnt you handle ioremap() failure? Most 85xx code written by Kumar also does not.

Ok, I'll take a hint to go audit my code for ioremap() returns :)

- kumar

#3 lore raw
In reply to Marcelo Tosatti
Quoted 2 lines · Marcelo Tosatti

Shouldnt you handle ioremap() failure? Most 85xx code written by Kumar also does not.

And do what if it fails? Chances are you don't have any way to report an error message or panic at this point. In fact, there are a few silly tests like this where the failure tries to panic or print some message that will never be seen. Fortunately, the code will never fail and we will never take such code paths.

	-- Dan
#4 lore raw
Quoted 6 lines · Dan Malek
Quoted 2 lines · Marcelo Tosatti

Shouldnt you handle ioremap() failure? Most 85xx code written by Kumar also does not.

Quoted 6 lines

And do what if it fails? Chances are you don't have any way to report an error message or panic at this point. In fact, there are a few silly tests like this where the failure tries to panic or print some message that will never be seen. Fortunately, the code will never fail and we will never take such code paths.

OK! Was talking BS then.