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
- Lines: 173
- Date:
Fri Aug 2 17:39:44 2002
- Orig file:
linux-2.4.18/drivers/pcmcia/sa1100_badge4.c
- Orig date:
Wed Dec 31 16:00:00 1969
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)