summaryrefslogtreecommitdiff
path: root/cleopatre/linux-2.6.25.10-spc300/arch
diff options
context:
space:
mode:
authorsave2009-10-12 07:54:19 +0000
committersave2009-10-12 07:54:19 +0000
commit25f448971011499df37e673fcb420da50faae3e7 (patch)
tree6af4bac2a2295a69d09a1144b22a4455cb9a25d2 /cleopatre/linux-2.6.25.10-spc300/arch
parent9f448f6d9d2b934b15210db18ebb3db75c180c57 (diff)
cleo/linux/machine: move gpio site
move from spc300-devices to a dedicated file: spc300-device-gpio git-svn-id: svn+ssh://pessac/svn/cesar/trunk@6073 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cleopatre/linux-2.6.25.10-spc300/arch')
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/Makefile2
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/spc300-device-gpio.c180
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/spc300-devices.c146
3 files changed, 185 insertions, 143 deletions
diff --git a/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/Makefile b/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/Makefile
index c2b24b4499..7e2aa560f8 100644
--- a/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/Makefile
+++ b/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/Makefile
@@ -2,6 +2,6 @@
# Makefile for the linux kernel.
#
-obj-y := spc300.o spc300-devices.o spc300-device-wdt.o
+obj-y := spc300.o spc300-devices.o spc300-device-wdt.o spc300-device-gpio.o
obj-$(CONFIG_MACH_ARIZONA) += board-arizona.o
obj-$(CONFIG_MACH_SPK300G) += board-spk300g.o
diff --git a/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/spc300-device-gpio.c b/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/spc300-device-gpio.c
new file mode 100644
index 0000000000..c43586acf4
--- /dev/null
+++ b/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/spc300-device-gpio.c
@@ -0,0 +1,180 @@
+/*
+ * arch/arm/mach-spc300/spc300_device_gpio.c
+ *
+ * (C) Copyright 2009 SPiDCOM Technologies
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/interrupt.h>
+
+#include <asm/hardware.h>
+#include <asm/arch/nvram.h>
+#include <asm/gpio.h>
+
+static char spc300_gpio_labels[MAX_INTERNAL_GPIOS][16];
+static struct gpio_chip spc300_gpio_chips[MAX_INTERNAL_GPIOS];
+
+/**
+ * Set a gpio direction to input.
+ *
+ * \param chip gpio number chip.
+ * \param offset number offset for this chip (should be 0).
+ * \return error code.
+ */
+int spc300_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
+{
+ GPIO_SWPORTA_DDR_VA &= ~(1 << chip->base);
+ return (GPIO_SWPORTA_DDR_VA & (1<<chip->base)) ? -1 : 0;
+}
+
+/**
+ * Set a gpio direction to output.
+ *
+ * \param chip gpio number chip.
+ * \param offset number offset for this chip (should be 0).
+ * \param value initial value to set.
+ * \return error code.
+ */
+int spc300_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int value)
+{
+ //Set initial value before setting direction
+ //to be sure that initial value is set when gpio is configured
+ //it's important for reset pin for example.
+ if(value)
+ {
+ GPIO_SWPORTA_DR_VA |= (1 << chip->base);
+ value = 1;
+ }
+ else
+ {
+ GPIO_SWPORTA_DR_VA &= ~(1 << chip->base);
+ }
+
+ GPIO_SWPORTA_DDR_VA |= (1 << chip->base);
+
+ //Check direction
+ if(!(GPIO_SWPORTA_DDR_VA & (1<<chip->base)))
+ return -1;
+ //check initial value
+ return (((GPIO_SWPORTA_DR_VA & (1 << chip->base)) >> chip->base) == value) ? 0 : -1;
+}
+
+/**
+ * Get a gpio value.
+ *
+ * \param chip gpio number chip.
+ * \param offset number offset for this chip (should be 0).
+ * \return value of this gpio.
+ */
+int spc300_gpio_get_value(struct gpio_chip *chip, unsigned offset)
+{
+ return (GPIO_EXT_PORTA_VA & (1 << chip->base)) ? 1 : 0;
+}
+
+/**
+ * Set a gpio value.
+ *
+ * \param chip gpio number chip.
+ * \param offset number offset for this chip (should be 0).
+ * \param value value to set.
+ */
+void spc300_gpio_set_value(struct gpio_chip *chip, unsigned offset, int value)
+{
+ if(value)
+ GPIO_SWPORTA_DR_VA |= (1 << chip->base);
+ else
+ GPIO_SWPORTA_DR_VA &= ~(1 << chip->base);
+}
+
+/**
+ * Setup only one GPIO through libgpio.
+ *
+ * \param num gpio number.
+ */
+static void spc300_gpio_one_setup(int num)
+{
+ uint32_t gpio_config;
+ struct gpio_chip *chip = &spc300_gpio_chips[num];
+
+ chip->can_sleep = 0;
+ chip->base = num;
+ chip->ngpio = 1;
+ chip->label = spc300_gpio_labels[num];
+ chip->get = NULL;
+ chip->set = NULL;
+ chip->direction_input = NULL;
+ chip->direction_output = NULL;
+
+ if(num < MIN_INTERNAL_GPIOS)
+ gpio_config = ((spc300_nvram.gpio_0_7_cfg >> (num*4)) & 0xF);
+ else
+ gpio_config = ((spc300_nvram.gpio_8_15_cfg >> ((num-MIN_INTERNAL_GPIOS)*4)) & 0xF);
+
+ //Check if gpio_config is ARM gpios
+ if(gpio_config == 0)
+ {
+ //check allowed direction
+ switch((spc300_nvram.gpio_allow_dir >> (num*2)) & 0x3)
+ {
+ case 3: //bi-directional
+ chip->get = &spc300_gpio_get_value;
+ chip->set = &spc300_gpio_set_value;
+ chip->direction_input = &spc300_gpio_direction_input;
+ chip->direction_output = &spc300_gpio_direction_output;
+ break;
+ case 2: //input
+ chip->get = &spc300_gpio_get_value;
+ chip->set = &spc300_gpio_set_value;
+ chip->direction_output = &spc300_gpio_direction_output;
+ break;
+ case 1: //output
+ chip->get = &spc300_gpio_get_value;
+ chip->direction_input = &spc300_gpio_direction_input;
+ break;
+ }
+ //Setup GPIO number
+ gpiochip_add(chip);
+ }
+}
+
+/**
+ * Setup all GPIOs.
+ */
+void spc300_gpio_setup(void)
+{
+ int i;
+
+ //TODO:use nvram defines
+
+ //Register allowed gpios through gpio_lib
+ for(i=0 ; i<MIN_INTERNAL_GPIOS ; i++)
+ {
+ spc300_gpio_one_setup(i);
+ }
+
+ /* SPC300 package 1 so nbgpios=MAX_INTERNAL_GPIOS */
+ if(((spc300_nvram.pkg_cfg & 0x000000F0)>>8) < 5)
+ {
+ for(i=MIN_INTERNAL_GPIOS ; i<MAX_INTERNAL_GPIOS ; i++)
+ {
+ spc300_gpio_one_setup(i);
+ }
+ }
+}
+
diff --git a/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/spc300-devices.c b/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/spc300-devices.c
index c81979dc43..7bdeb16d08 100644
--- a/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/spc300-devices.c
+++ b/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/spc300-devices.c
@@ -29,7 +29,7 @@
#include <asm/hardware.h>
#include <asm/io.h>
-#include <asm/gpio.h>
+#include <asm/arch/gpio.h>
#include <asm/mach/arch.h>
#include <asm/arch/nvram.h>
@@ -202,8 +202,6 @@ static struct platform_device spc300_spictrl_device = {
/**
* GPIO Device Structure.
*/
-static char spc300_gpio_labels[MAX_INTERNAL_GPIOS][16];
-static struct gpio_chip spc300_gpio_chips[MAX_INTERNAL_GPIOS];
#ifdef CONFIG_SPC300_GPIO_USER_MODE
static struct resource spc300_gpio_resource[] = {
[0] = {
@@ -361,126 +359,6 @@ static struct platform_device spc300_pcm_device = {
};
-/**
- * Set a gpio direction to input.
- *
- * \param chip gpio number chip.
- * \param offset number offset for this chip (should be 0).
- * \return error code.
- */
-int spc300_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
-{
- GPIO_SWPORTA_DDR_VA &= ~(1 << chip->base);
- return (GPIO_SWPORTA_DDR_VA & (1<<chip->base)) ? -1 : 0;
-}
-/**
- * Set a gpio direction to output.
- *
- * \param chip gpio number chip.
- * \param offset number offset for this chip (should be 0).
- * \param value initial value to set.
- * \return error code.
- */
-int spc300_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int value)
-{
- //Set initial value before setting direction
- //to be sure that initial value is set when gpio is configured
- //it's important for reset pin for example.
- if(value)
- {
- GPIO_SWPORTA_DR_VA |= (1 << chip->base);
- value = 1;
- }
- else
- {
- GPIO_SWPORTA_DR_VA &= ~(1 << chip->base);
- }
-
- GPIO_SWPORTA_DDR_VA |= (1 << chip->base);
-
- //Check direction
- if(!(GPIO_SWPORTA_DDR_VA & (1<<chip->base)))
- return -1;
- //check initial value
- return (((GPIO_SWPORTA_DR_VA & (1 << chip->base)) >> chip->base) == value) ? 0 : -1;
-}
-/**
- * Get a gpio value.
- *
- * \param chip gpio number chip.
- * \param offset number offset for this chip (should be 0).
- * \return value of this gpio.
- */
-int spc300_gpio_get_value(struct gpio_chip *chip, unsigned offset)
-{
- return (GPIO_EXT_PORTA_VA & (1 << chip->base)) ? 1 : 0;
-}
-/**
- * Set a gpio value.
- *
- * \param chip gpio number chip.
- * \param offset number offset for this chip (should be 0).
- * \param value value to set.
- */
-void spc300_gpio_set_value(struct gpio_chip *chip, unsigned offset, int value)
-{
- if(value)
- GPIO_SWPORTA_DR_VA |= (1 << chip->base);
- else
- GPIO_SWPORTA_DR_VA &= ~(1 << chip->base);
-}
-
-/**
- * Setup GPIO through libgpio.
- *
- * \param chip gpio chip structure.
- * \param num gpio number.
- */
-static void spc300_gpio_setup(struct gpio_chip *chip, int num)
-{
- uint32_t gpio_config;
-
- chip->can_sleep = 0;
- chip->base = num;
- chip->ngpio = 1;
- chip->label = spc300_gpio_labels[num];
- chip->get = NULL;
- chip->set = NULL;
- chip->direction_input = NULL;
- chip->direction_output = NULL;
-
- if(num < MIN_INTERNAL_GPIOS)
- gpio_config = ((spc300_nvram.gpio_0_7_cfg >> (num*4)) & 0xF);
- else
- gpio_config = ((spc300_nvram.gpio_8_15_cfg >> ((num-MIN_INTERNAL_GPIOS)*4)) & 0xF);
-
- //Check if gpio_config is ARM gpios
- if(gpio_config == 0)
- {
- //check allowed direction
- switch((spc300_nvram.gpio_allow_dir >> (num*2)) & 0x3)
- {
- case 3: //bi-directional
- chip->get = &spc300_gpio_get_value;
- chip->set = &spc300_gpio_set_value;
- chip->direction_input = &spc300_gpio_direction_input;
- chip->direction_output = &spc300_gpio_direction_output;
- break;
- case 2: //input
- chip->get = &spc300_gpio_get_value;
- chip->set = &spc300_gpio_set_value;
- chip->direction_output = &spc300_gpio_direction_output;
- break;
- case 1: //output
- chip->get = &spc300_gpio_get_value;
- chip->direction_input = &spc300_gpio_direction_input;
- break;
- }
- //Setup GPIO number
- gpiochip_add(chip);
- }
-}
-
/**
@@ -577,24 +455,8 @@ void spc300_add_device_spictrl(void)
*/
void spc300_add_device_gpio(void)
{
- int i;
-
- //TODO:use nvram defines
-
- //Register allowed gpios through gpio_lib
- for(i=0 ; i<MIN_INTERNAL_GPIOS ; i++)
- {
- spc300_gpio_setup(&spc300_gpio_chips[i], i);
- }
-
- /* SPC300 package 1 so nbgpios=MAX_INTERNAL_GPIOS */
- if(((spc300_nvram.pkg_cfg & 0x000000F0)>>8) < 5)
- {
- for(i=MIN_INTERNAL_GPIOS ; i<MAX_INTERNAL_GPIOS ; i++)
- {
- spc300_gpio_setup(&spc300_gpio_chips[i], i);
- }
- }
+ //Setup GPIOs through libgpio
+ spc300_gpio_setup();
#ifdef CONFIG_SPC300_GPIO_USER_MODE
//Register gpio device driver for user_mode
@@ -603,7 +465,7 @@ void spc300_add_device_gpio(void)
}
/**
- * Register Watch-Dog device.
+ * Register Watchdog device.
*/
void spc300_add_device_wdt(void)
{