patch-2.4.19 linux-2.4.19/drivers/pcmcia/sa1100_badge4.c

Next file: linux-2.4.19/drivers/pcmcia/sa1100_cerf.c
Previous file: linux-2.4.19/drivers/pcmcia/sa1100_assabet.c
Back to the patch index
Back to the overall index

diff -urN linux-2.4.18/drivers/pcmcia/sa1100_badge4.c linux-2.4.19/drivers/pcmcia/sa1100_badge4.c
@@ -0,0 +1,172 @@
+/*
+ * linux/drivers/pcmcia/sa1100_badge4.c
+ *
+ * BadgePAD 4 PCMCIA specific routines
+ *
+ *   Christopher Hoover <ch@hpl.hp.com>
+ *
+ * Copyright (C) 2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/arch/badge4.h>
+#include <asm/hardware/sa1111.h>
+
+#include "sa1100_generic.h"
+#include "sa1111_generic.h"
+
+/*
+ * BadgePAD 4 Details
+ *
+ * PCM Vcc:
+ *
+ *  PCM Vcc on BadgePAD 4 can be jumpered for 3.3V (short pins 1 and 3
+ *  on JP6) or 5V (short pins 3 and 5 on JP6).  N.B., 5V supply rail
+ *  is enabled by the SA-1110's BADGE4_GPIO_PCMEN5V (GPIO 24).
+ *
+ * PCM Vpp:
+ *
+ *  PCM Vpp on BadgePAD 4 can be jumpered for 12V (short pins 2 and 4
+ *  on JP6) or tied to PCM Vcc (short pins 4 and 6 on JP6).  N.B., 12V
+ *  operation requires that the power supply actually supply 12V.
+ *
+ * CF Vcc:
+ *
+ *  CF Vcc on BadgePAD 4 can be jumpered either for 3.3V (short pins 1
+ *  and 2 on JP10) or 5V (short pins 2 and 3 on JP10).  The note above
+ *  about the 5V supply rail applies.
+ *
+ * There's no way programmatically to determine how a given board is
+ * jumpered.  This code assumes a default jumpering: 5V PCM Vcc (pins
+ * 3 and 5 shorted) and PCM Vpp = PCM Vcc (pins 4 and 6 shorted) and
+ * no jumpering for CF Vcc.  If this isn't correct, Override these
+ * defaults with a pcmv setup argument: pcmv=<pcm vcc>,<pcm vpp>,<cf
+ * vcc>.  E.g. pcmv=33,120,50 indicates 3.3V PCM Vcc, 12.0V PCM Vpp,
+ * and 5.0V CF Vcc.
+ *
+ */
+
+static int badge4_pcmvcc = 50;
+static int badge4_pcmvpp = 50;
+static int badge4_cfvcc = 0;
+
+static int badge4_pcmcia_init(struct pcmcia_init *init)
+{
+	printk(KERN_INFO __FUNCTION__
+	       ": badge4_pcmvcc=%d, badge4_pcmvpp=%d, badge4_cfvcc=%d\n",
+	       badge4_pcmvcc, badge4_pcmvpp, badge4_cfvcc);
+
+	return sa1111_pcmcia_init(init);
+}
+
+static int badge4_pcmcia_shutdown(void)
+{
+	int rc = sa1111_pcmcia_shutdown();
+
+	/* be sure to disable 5V use */
+	badge4_set_5V(BADGE4_5V_PCMCIA_SOCK0, 0);
+	badge4_set_5V(BADGE4_5V_PCMCIA_SOCK1, 0);
+
+	return rc;
+}
+
+static void complain_about_jumpering(const char *whom,
+				     const char *supply,
+				     int given, int wanted)
+{
+	printk(KERN_ERR
+	 "%s: %s %d.%dV wanted but board is jumpered for %s %d.%dV operation"
+	 "; re-jumper the board and/or use pcmv=xx,xx,xx\n",
+	       whom, supply,
+	       wanted / 10, wanted % 10,
+	       supply,
+	       given / 10, given % 10);
+}
+
+static unsigned badge4_need_5V_bitmap = 0;
+
+static int
+badge4_pcmcia_configure_socket(const struct pcmcia_configure *conf)
+{
+	int ret;
+
+	switch (conf->sock) {
+	case 0:
+		if ((conf->vcc != 0) &&
+		    (conf->vcc != badge4_pcmvcc)) {
+			complain_about_jumpering(__FUNCTION__, "pcmvcc",
+						 badge4_pcmvcc, conf->vcc);
+			return -1;
+		}
+		if ((conf->vpp != 0) &&
+		    (conf->vpp != badge4_pcmvpp)) {
+			complain_about_jumpering(__FUNCTION__, "pcmvpp",
+						 badge4_pcmvpp, conf->vpp);
+			return -1;
+		}
+		break;
+
+	case 1:
+		if ((conf->vcc != 0) &&
+		    (conf->vcc != badge4_cfvcc)) {
+			complain_about_jumpering(__FUNCTION__, "cfvcc",
+						 badge4_cfvcc, conf->vcc);
+			return -1;
+		}
+		break;
+
+	default:
+		return -1;
+	}
+
+	ret = sa1111_pcmcia_configure_socket(conf);
+	if (ret == 0) {
+		unsigned long flags;
+		int need5V;
+
+		local_irq_save(flags);
+
+		need5V = ((conf->vcc == 50) || (conf->vpp == 50));
+
+		badge4_set_5V(BADGE4_5V_PCMCIA_SOCK(conf->sock), need5V);
+
+		local_irq_restore(flags);
+	}
+
+	return 0;
+}
+
+struct pcmcia_low_level badge4_pcmcia_ops = {
+	init:			badge4_pcmcia_init,
+	shutdown:		badge4_pcmcia_shutdown,
+	socket_state:		sa1111_pcmcia_socket_state,
+	get_irq_info:		sa1111_pcmcia_get_irq_info,
+	configure_socket:	badge4_pcmcia_configure_socket,
+
+	socket_init:		sa1111_pcmcia_socket_init,
+	socket_suspend:		sa1111_pcmcia_socket_suspend,
+};
+
+
+static int __init pcmv_setup(char *s)
+{
+	int v[4];
+
+	s = get_options(s, ARRAY_SIZE(v), v);
+
+	if (v[0] >= 1) badge4_pcmvcc = v[1];
+	if (v[0] >= 2) badge4_pcmvpp = v[2];
+	if (v[0] >= 3) badge4_cfvcc = v[3];
+
+	return 1;
+}
+
+__setup("pcmv=", pcmv_setup);

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)