1/* 2 * Generic GPIO 3 * 4 * Copyright (C) 2010, Broadcom Corporation. All Rights Reserved. 5 * 6 * Permission to use, copy, modify, and/or distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 13 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 15 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 16 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 * 18 * $Id: gen_gpio.c,v 1.1 2009/10/30 20:51:47 Exp $ 19 */ 20 21 22#include <linux/module.h> 23#include <linux/init.h> 24 25#include <typedefs.h> 26#include <bcmutils.h> 27#include <siutils.h> 28#include <bcmdevs.h> 29 30 31#define BCM947XX_GENGPIO_DEBUG 0 32#if BCM947XX_GENGPIO_DEBUG 33//#define DBG(x...) printk(KERN_DEBUG x) 34#define DBG(x...) printk(KERN_ERR x) 35#else 36#define DBG(x...) 37#endif 38 39 40 41static si_t *gpio_sih; 42int mask; 43 44 45static int 46gen_gpio_init(void) 47{ 48 if (!(gpio_sih = si_kattach(SI_OSH))) { 49 DBG("%s: si_kattach failed\n", __FUNCTION__); 50 return -ENODEV; 51 } 52 53 si_gpiosetcore(gpio_sih); 54 55 return 0; 56} 57 58static void 59gen_gpio_exit(void) 60{ 61 si_detach(gpio_sih); 62} 63 64/* GENERIC_GPIO calls */ 65int gpio_direction_input(unsigned gpio) 66{ 67 int ret; 68 69 ret = si_gpioouten(gpio_sih, (1<<gpio), 0, GPIO_APP_PRIORITY); 70 DBG("%s: gpio %d - input 0x%x\n", __FUNCTION__, gpio, ret); 71 return 0; 72} 73EXPORT_SYMBOL(gpio_direction_input); 74 75 76int gpio_direction_output(unsigned gpio, int value) 77{ 78 int out, outen; 79 80 outen = si_gpioouten(gpio_sih, (1<<gpio), (1<<gpio), GPIO_APP_PRIORITY); 81 out = si_gpioout(gpio_sih, (1<<gpio), (value ? (1<<gpio) : 0), GPIO_APP_PRIORITY); 82 DBG("%s: gpio %d, value %d - out 0x%x outen 0x%x\n", __FUNCTION__, gpio, value, out, outen); 83 return 0; 84} 85EXPORT_SYMBOL(gpio_direction_output); 86 87int gpio_get_value(unsigned int gpio) 88{ 89 uint32 get; 90 get = si_gpioin(gpio_sih); 91 92 get &= (1<<gpio); 93 94 return (get ? 1 : 0); 95} 96EXPORT_SYMBOL(gpio_get_value); 97 98void gpio_set_value(unsigned int gpio, int value) 99{ 100 si_gpioout(gpio_sih, (1<<gpio), (value ? (1<<gpio) : 0), GPIO_APP_PRIORITY); 101 return; 102} 103EXPORT_SYMBOL(gpio_set_value); 104 105int gpio_request(unsigned int gpio, const char *label) 106{ 107 int ret; 108 109 mask |= (1<<gpio); 110 111 ret = si_gpioreserve(gpio_sih, (1<<gpio), GPIO_APP_PRIORITY); 112 DBG("%s: gpio %d label %s mask 0x%x reserve 0x%x\n", __FUNCTION__, gpio, 113 label, mask, ret); 114 115 ret = si_gpiocontrol(gpio_sih, (1<<gpio), 0, GPIO_APP_PRIORITY); 116 DBG("%s: si_gpiocontrol 0x%x\n", __FUNCTION__, ret); 117 118 /* clear pulldown */ 119 ret = si_gpiopull(gpio_sih, 1/*pulldown*/, (1<<gpio), 0); 120 DBG("%s: si_gpiopull (down) 0x%x\n", __FUNCTION__, ret); 121 /* Set pullup */ 122 ret = si_gpiopull(gpio_sih, 0/*pullup*/, (1<<gpio), (1<<gpio)); 123 DBG("%s: si_gpiopull (up) 0x%x\n", __FUNCTION__, ret); 124 125 return 0; 126} 127EXPORT_SYMBOL(gpio_request); 128 129void gpio_free(unsigned int gpio) 130{ 131 mask &= ~(1<<gpio); 132 133 /* clear pullup */ 134 si_gpiopull(gpio_sih, 0/*pullup*/, (1<<gpio), GPIO_APP_PRIORITY); 135 si_gpiorelease(gpio_sih, (1<<gpio), GPIO_APP_PRIORITY); 136 137 DBG("%s: gpio %d mask 0x%x\n", __FUNCTION__, gpio, mask); 138 return; 139} 140EXPORT_SYMBOL(gpio_free); 141 142 143module_init(gen_gpio_init); 144module_exit(gen_gpio_exit); 145