xref: /linux/drivers/pcmcia/sa1111_neponset.c (revision 597473720f4dc69749542bfcfed4a927a43d935e)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * linux/drivers/pcmcia/sa1100_neponset.c
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * Neponset PCMCIA specific routines
61da177e4SLinus Torvalds  */
71da177e4SLinus Torvalds #include <linux/module.h>
81da177e4SLinus Torvalds #include <linux/kernel.h>
91da177e4SLinus Torvalds #include <linux/device.h>
101da177e4SLinus Torvalds #include <linux/errno.h>
111da177e4SLinus Torvalds #include <linux/init.h>
121da177e4SLinus Torvalds 
131da177e4SLinus Torvalds #include <asm/mach-types.h>
141da177e4SLinus Torvalds 
151da177e4SLinus Torvalds #include "sa1111_generic.h"
16*e2125d05SRussell King #include "max1600.h"
171da177e4SLinus Torvalds 
181da177e4SLinus Torvalds /*
191da177e4SLinus Torvalds  * Neponset uses the Maxim MAX1600, with the following connections:
201da177e4SLinus Torvalds  *
211da177e4SLinus Torvalds  *   MAX1600      Neponset
221da177e4SLinus Torvalds  *
231da177e4SLinus Torvalds  *    A0VCC        SA-1111 GPIO A<1>
241da177e4SLinus Torvalds  *    A1VCC        SA-1111 GPIO A<0>
251da177e4SLinus Torvalds  *    A0VPP        CPLD NCR A0VPP
261da177e4SLinus Torvalds  *    A1VPP        CPLD NCR A1VPP
271da177e4SLinus Torvalds  *    B0VCC        SA-1111 GPIO A<2>
281da177e4SLinus Torvalds  *    B1VCC        SA-1111 GPIO A<3>
291da177e4SLinus Torvalds  *    B0VPP        ground (slot B is CF)
301da177e4SLinus Torvalds  *    B1VPP        ground (slot B is CF)
311da177e4SLinus Torvalds  *
321da177e4SLinus Torvalds  *     VX          VCC (5V)
331da177e4SLinus Torvalds  *     VY          VCC3_3 (3.3V)
341da177e4SLinus Torvalds  *     12INA       12V
351da177e4SLinus Torvalds  *     12INB       ground (slot B is CF)
361da177e4SLinus Torvalds  *
371da177e4SLinus Torvalds  * The MAX1600 CODE pin is tied to ground, placing the device in
381da177e4SLinus Torvalds  * "Standard Intel code" mode. Refer to the Maxim data sheet for
391da177e4SLinus Torvalds  * the corresponding truth table.
401da177e4SLinus Torvalds  */
41*e2125d05SRussell King static int neponset_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
42*e2125d05SRussell King {
43*e2125d05SRussell King 	struct max1600 *m;
44*e2125d05SRussell King 	int ret;
45*e2125d05SRussell King 
46*e2125d05SRussell King 	ret = max1600_init(skt->socket.dev.parent, &m,
47*e2125d05SRussell King 			   skt->nr ? MAX1600_CHAN_B : MAX1600_CHAN_A,
48*e2125d05SRussell King 			   MAX1600_CODE_LOW);
49*e2125d05SRussell King 	if (ret == 0)
50*e2125d05SRussell King 		skt->driver_data = m;
51*e2125d05SRussell King 
52*e2125d05SRussell King 	return ret;
53*e2125d05SRussell King }
541da177e4SLinus Torvalds 
551da177e4SLinus Torvalds static int
561da177e4SLinus Torvalds neponset_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state)
571da177e4SLinus Torvalds {
58*e2125d05SRussell King 	struct max1600 *m = skt->driver_data;
591da177e4SLinus Torvalds 	int ret;
601da177e4SLinus Torvalds 
611da177e4SLinus Torvalds 	ret = sa1111_pcmcia_configure_socket(skt, state);
62*e2125d05SRussell King 	if (ret == 0)
63*e2125d05SRussell King 		ret = max1600_configure(m, state->Vcc, state->Vpp);
641da177e4SLinus Torvalds 
6565c77dcaSRussell King 	return ret;
661da177e4SLinus Torvalds }
671da177e4SLinus Torvalds 
681da177e4SLinus Torvalds static struct pcmcia_low_level neponset_pcmcia_ops = {
691da177e4SLinus Torvalds 	.owner			= THIS_MODULE,
70*e2125d05SRussell King 	.hw_init		= neponset_pcmcia_hw_init,
711da177e4SLinus Torvalds 	.configure_socket	= neponset_pcmcia_configure_socket,
72701a5dc0SRussell King - ARM Linux 	.first			= 0,
73701a5dc0SRussell King - ARM Linux 	.nr			= 2,
741da177e4SLinus Torvalds };
751da177e4SLinus Torvalds 
76b29cf62cSRussell King int pcmcia_neponset_init(struct sa1111_dev *sadev)
771da177e4SLinus Torvalds {
78701a5dc0SRussell King - ARM Linux 	sa11xx_drv_pcmcia_ops(&neponset_pcmcia_ops);
793f8df892SRussell King 	return sa1111_pcmcia_add(sadev, &neponset_pcmcia_ops,
80701a5dc0SRussell King - ARM Linux 				 sa11xx_drv_pcmcia_add_one);
811da177e4SLinus Torvalds }
82