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