1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * linux/drivers/pcmcia/pxa2xx_palmld.c 4 * 5 * Driver for Palm LifeDrive PCMCIA 6 * 7 * Copyright (C) 2006 Alex Osborne <ato@meshy.org> 8 * Copyright (C) 2007-2011 Marek Vasut <marek.vasut@gmail.com> 9 */ 10 11#include <linux/module.h> 12#include <linux/platform_device.h> 13#include <linux/gpio.h> 14 15#include <asm/mach-types.h> 16#include <mach/palmld.h> 17#include "soc_common.h" 18 19static struct gpio palmld_pcmcia_gpios[] = { 20 { GPIO_NR_PALMLD_PCMCIA_POWER, GPIOF_INIT_LOW, "PCMCIA Power" }, 21 { GPIO_NR_PALMLD_PCMCIA_RESET, GPIOF_INIT_HIGH,"PCMCIA Reset" }, 22}; 23 24static int palmld_pcmcia_hw_init(struct soc_pcmcia_socket *skt) 25{ 26 int ret; 27 28 ret = gpio_request_array(palmld_pcmcia_gpios, 29 ARRAY_SIZE(palmld_pcmcia_gpios)); 30 31 skt->stat[SOC_STAT_RDY].gpio = GPIO_NR_PALMLD_PCMCIA_READY; 32 skt->stat[SOC_STAT_RDY].name = "PCMCIA Ready"; 33 34 return ret; 35} 36 37static void palmld_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) 38{ 39 gpio_free_array(palmld_pcmcia_gpios, ARRAY_SIZE(palmld_pcmcia_gpios)); 40} 41 42static void palmld_pcmcia_socket_state(struct soc_pcmcia_socket *skt, 43 struct pcmcia_state *state) 44{ 45 state->detect = 1; /* always inserted */ 46 state->vs_3v = 1; 47 state->vs_Xv = 0; 48} 49 50static int palmld_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, 51 const socket_state_t *state) 52{ 53 gpio_set_value(GPIO_NR_PALMLD_PCMCIA_POWER, 1); 54 gpio_set_value(GPIO_NR_PALMLD_PCMCIA_RESET, 55 !!(state->flags & SS_RESET)); 56 57 return 0; 58} 59 60static struct pcmcia_low_level palmld_pcmcia_ops = { 61 .owner = THIS_MODULE, 62 63 .first = 1, 64 .nr = 1, 65 66 .hw_init = palmld_pcmcia_hw_init, 67 .hw_shutdown = palmld_pcmcia_hw_shutdown, 68 69 .socket_state = palmld_pcmcia_socket_state, 70 .configure_socket = palmld_pcmcia_configure_socket, 71}; 72 73static struct platform_device *palmld_pcmcia_device; 74 75static int __init palmld_pcmcia_init(void) 76{ 77 int ret; 78 79 if (!machine_is_palmld()) 80 return -ENODEV; 81 82 palmld_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); 83 if (!palmld_pcmcia_device) 84 return -ENOMEM; 85 86 ret = platform_device_add_data(palmld_pcmcia_device, &palmld_pcmcia_ops, 87 sizeof(palmld_pcmcia_ops)); 88 89 if (!ret) 90 ret = platform_device_add(palmld_pcmcia_device); 91 92 if (ret) 93 platform_device_put(palmld_pcmcia_device); 94 95 return ret; 96} 97 98static void __exit palmld_pcmcia_exit(void) 99{ 100 platform_device_unregister(palmld_pcmcia_device); 101} 102 103module_init(palmld_pcmcia_init); 104module_exit(palmld_pcmcia_exit); 105 106MODULE_AUTHOR("Alex Osborne <ato@meshy.org>," 107 " Marek Vasut <marek.vasut@gmail.com>"); 108MODULE_DESCRIPTION("PCMCIA support for Palm LifeDrive"); 109MODULE_ALIAS("platform:pxa2xx-pcmcia"); 110MODULE_LICENSE("GPL"); 111