[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

3.3V patch for Ricoh PCIC (RF5C[23]96)



野口@名古屋です.

もうずいぶん前にポストした件ですが...
RicohのPCカードコントローラ用の3.3V PCカード対応patch,遅ればせながら
流します.

Mobile Gear II for DoCoMo のPC card slotとCompact Flash I slotで
それらしい動作をしてくれることを確認してあります.


これでバッテリの持ちがどれぐらい良くなるかが楽しみです.
# 自分ではhpcmipsをまだ運用できていなくて,測っておりません.


ちょっと問題点があるので,書いておきます.

- Planex GW-CF11H (CF Type I 無線LAN) 
  hpcmips稼動中にカードを挿し込んでも,うまくカードを初期化できません.
  hpcmips起動前に先にカードを挿しておく場合は,使えます.


それでは.

-----------------------------
Hiroshi Noguchi (野口 宏)
ngc@ff.iij4u.or.jp
http://www.ff.iij4u.or.jp/~ngc/

-------- 以下,patch -----------------------------------------------

--- sys.org/dev/ic/i82365.c	Mon Jun 24 07:05:00 2002
+++ sys.MG2/dev/ic/i82365.c	Fri Sep 27 16:32:32 2002
@@ -119,6 +119,7 @@
 	struct pcic_handle *h;
 {
 	int reg;
+	int	vendor;
 
 	/*
 	 * the chip_id of the cirrus toggles between 11 and 00 after a write.
@@ -141,12 +142,46 @@
 
 	reg = pcic_read(h, PCIC_IDENT);
 
-	if ((reg & PCIC_IDENT_REV_MASK) == PCIC_IDENT_REV_I82365SLR0)
-		return (PCIC_VENDOR_I82365SLR0);
-	else
-		return (PCIC_VENDOR_I82365SLR1);
+	switch( reg ){
+	  case PCIC_IDENT_ID_INTEL0:
+		vendor = PCIC_VENDOR_I82365SLR0;
+		goto l_check_ricoh;
+
+	  case PCIC_IDENT_ID_INTEL1:
+		vendor = PCIC_VENDOR_I82365SLR1;
+
+	  l_check_ricoh:;
+		/*
+		 * check for Ricoh RF5C[23]96
+		 */
+		reg = pcic_read( h, PCIC_RICOH_REG_CHIP_ID );
+		switch( reg ){
+		  case PCIC_RICOH_CHIP_ID_5C296:
+			vendor = PCIC_VENDOR_RICOH_5C296;
+			break;
+		  case PCIC_RICOH_CHIP_ID_5C396:
+			vendor = PCIC_VENDOR_RICOH_5C396;
+			break;
+		  default:
+			break;
+		}
+		break;
+	  case PCIC_IDENT_ID_INTEL2:
+		vendor = PCIC_VENDOR_I82365SL_DF;
+		break;
+	  case PCIC_IDENT_ID_IBM1:
+	  case PCIC_IDENT_ID_IBM2:
+		vendor = PCIC_VENDOR_IBM;
+		break;
+	  case PCIC_IDENT_ID_IBM3:
+		vendor = PCIC_VENDOR_IBM_KING;
+		break;
+	  default:
+		vendor = PCIC_VENDOR_UNKNOWN;
+		break;
+	}
 
-	return (PCIC_VENDOR_UNKNOWN);
+	return ( vendor );
 }
 
 char *
@@ -162,6 +197,16 @@
 		return ("Cirrus PD6710");
 	case PCIC_VENDOR_CIRRUS_PD672X:
 		return ("Cirrus PD672X");
+	case PCIC_VENDOR_I82365SL_DF:
+		return ("Intel 82365SL-DF");
+	case PCIC_VENDOR_RICOH_5C296:
+		return ("Ricoh RF5C296");
+	case PCIC_VENDOR_RICOH_5C396:
+		return ("Ricoh RF5C396");
+	case PCIC_VENDOR_IBM:
+		return ("IBM PCIC");
+	case PCIC_VENDOR_IBM_KING:
+		return ("IBM KING");
 	}
 
 	return ("Unknown controller");
@@ -1386,6 +1431,37 @@
 	 * we are changing Vcc (Toff).
 	 */
 	pcic_delay(h, 300 + 100, "pccen0");
+
+	/*
+	 * power hack for RICOH RF5C[23]96
+	 */
+	switch( h->vendor ){
+	  case PCIC_VENDOR_RICOH_5C296:
+	  case PCIC_VENDOR_RICOH_5C396:
+		do{
+			int	vcc_3v = 0;
+			int	regtmp;
+
+			if( (pcic_read( h, PCIC_CARD_DETECT ) & PCIC_CARD_DETECT_GPI_ENABLE) == 0 ){
+				vcc_3v = (pcic_read( h, PCIC_IF_STATUS ) & PCIC_IF_STATUS_GPI) ? 1 : 0;
+				DPRINTF( ("\nGPI pin = %s\n", vcc_3v ? "1 (3.3V ready?)" : "0 (5V only?)") );
+			} else{
+				DPRINTF( ("\nGPI Enable pin is enabled. Can't use to sense VS1\n") );
+			}
+
+			regtmp = pcic_read( h, PCIC_RICOH_REG_MCR2 );
+			regtmp &= ~PCIC_RICOH_MCR2_VCC_SEL_MASK;
+			if( vcc_3v ){
+				regtmp |= PCIC_RICOH_MCR2_VCC_SEL_3V;
+			} else{
+				regtmp |= PCIC_RICOH_MCR2_VCC_SEL_5V;
+			}
+			pcic_write( h, PCIC_RICOH_REG_MCR2, regtmp );
+		} while( 0 );
+		break;
+	  default:
+		break;
+	}
 
 #ifdef VADEM_POWER_HACK
 	bus_space_write_1(sc->iot, sc->ioh, PCIC_REG_INDEX, 0x0e);
--- sys.org/dev/ic/i82365reg.h	Mon Jun 24 07:05:00 2002
+++ sys.MG2/dev/ic/i82365reg.h	Fri Sep 27 16:38:19 2002
@@ -63,6 +63,13 @@
 #define	PCIC_IDENT_REV_I82365SLR0		0x02
 #define	PCIC_IDENT_REV_I82365SLR1		0x03
 
+#define	PCIC_IDENT_ID_INTEL0		0x82
+#define	PCIC_IDENT_ID_INTEL1		0x83
+#define	PCIC_IDENT_ID_INTEL2		0x84
+#define	PCIC_IDENT_ID_IBM1			0x88
+#define	PCIC_IDENT_ID_IBM2			0x89
+#define	PCIC_IDENT_ID_IBM3			0x8A
+
 #define	PCIC_IF_STATUS				0x01	/* RO */
 #define	PCIC_IF_STATUS_GPI			0x80 /* General Purpose Input */
 #define	PCIC_IF_STATUS_POWERACTIVE		0x40
@@ -336,3 +343,11 @@
 #define PCIC_CIRRUS_EXTENDED_DATA		0x2F
 #define PCIC_CIRRUS_EXT_CONTROL_1		0x03
 #define PCIC_CIRRUS_EXT_CONTROL_1_PCI_INTR_MASK	0x18
+
+#define	PCIC_RICOH_REG_CHIP_ID			0x3A
+#define	PCIC_RICOH_CHIP_ID_5C296			0x32
+#define	PCIC_RICOH_CHIP_ID_5C396			0xB2
+#define	PCIC_RICOH_REG_MCR2				0x2F
+#define	PCIC_RICOH_MCR2_VCC_SEL_MASK		0x01
+#define	PCIC_RICOH_MCR2_VCC_SEL_3V			0x01
+#define	PCIC_RICOH_MCR2_VCC_SEL_5V			0x00
--- sys.org/dev/ic/i82365var.h	Mon Jun 24 07:05:00 2002
+++ sys.MG2/dev/ic/i82365var.h	Fri Sep 27 16:39:01 2002
@@ -100,6 +100,11 @@
 #define	PCIC_VENDOR_I82365SLR1		2
 #define	PCIC_VENDOR_CIRRUS_PD6710	3
 #define	PCIC_VENDOR_CIRRUS_PD672X	4
+#define	PCIC_VENDOR_I82365SL_DF		5
+#define	PCIC_VENDOR_IBM				6
+#define	PCIC_VENDOR_IBM_KING		7
+#define	PCIC_VENDOR_RICOH_5C296		8
+#define	PCIC_VENDOR_RICOH_5C396		9
 
 /*
  * This is sort of arbitrary.  It merely needs to be "enough". It can be