// SPDX-License-Identifier: GPL-2.0 /* * drivers/pcmcia/sa1100_h3600.c * * PCMCIA implementation routines for H3600 * */ #include #include #include #include #include "l1110.h" #include "sa1100_generic.h" static int l1110_pcmcia_hw_init(struct soc_pcmcia_socket *skt) { struct device *dev = skt->socket.dev.parent; struct l1110 *l; int err; skt->stat[SOC_STAT_CD].name = skt->nr ? "pcmcia1-detect" : "pcmcia0-detect"; skt->stat[SOC_STAT_RDY].name = skt->nr ? "pcmcia1-ready" : "pcmcia0-ready"; err = soc_pcmcia_request_gpiods(skt); if (err) return err; err = l1110_init(dev, &l, skt->nr ? 0x19000000 : 0x1a000000, skt->nr); if (err) return err; skt->socket.driver_data = l; return 0; } static void l1110_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state) { struct l1110 *l = skt->socket.driver_data; l1110_socket_state(l, state); } static int l1110_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) { struct l1110 *l = skt->socket.driver_data; return l1110_configure_socket(l, state); } static struct pcmcia_low_level l1110_pcmcia_ops = { .owner = THIS_MODULE, .hw_init = l1110_pcmcia_hw_init, .socket_state = l1110_pcmcia_socket_state, .configure_socket = l1110_pcmcia_configure_socket, }; int pcmcia_h3600_init(struct device *dev) { struct ipaq_option_id *id = dev->platform_data; if (!machine_is_h3600() || !id) return -ENODEV; if (id->vendor != 0x1125 || id->device != 0x0001) return -ENODEV; return sa11xx_drv_pcmcia_probe(dev, &l1110_pcmcia_ops, 0, 2); }