diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-arm/arch-db8500/common.h | 2 | ||||
-rw-r--r-- | include/asm-arm/arch-db8500/gpio.h | 526 | ||||
-rw-r--r-- | include/configs/u8500.h | 1 | ||||
-rw-r--r-- | include/db8500_gpio.h | 43 | ||||
-rw-r--r-- | include/db8500_pincfg.h | 173 |
5 files changed, 217 insertions, 528 deletions
diff --git a/include/asm-arm/arch-db8500/common.h b/include/asm-arm/arch-db8500/common.h index 81f100a50..42fb8928f 100644 --- a/include/asm-arm/arch-db8500/common.h +++ b/include/asm-arm/arch-db8500/common.h @@ -127,7 +127,5 @@ typedef u32 t_physical_address; typedef u32 t_logical_address; /*function prototypes*/ -void gpio_init(void); - int board_early_access(block_dev_desc_t *block_dev); #endif /* _DB8500_COMMON_H_ */ diff --git a/include/asm-arm/arch-db8500/gpio.h b/include/asm-arm/arch-db8500/gpio.h deleted file mode 100644 index fbff7fcb6..000000000 --- a/include/asm-arm/arch-db8500/gpio.h +++ /dev/null @@ -1,526 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2009 - * - * See file CREDITS for list of people who contributed to this - * project. - * - * 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 - */ -#ifndef _MOP500_GPIO_h -#define _MOP500_GPIO_h - -#include <asm/types.h> -#include <asm/io.h> -#include <asm/errno.h> - -#include <asm/arch/common.h> - -#define GPIO_TOTAL_PINS 268 - -#define GPIO_PINS_PER_BLOCK 32 -#define GPIO_BLOCKS_COUNT (GPIO_TOTAL_PINS/GPIO_PINS_PER_BLOCK +1) -#define GPIO_BLOCK(pin) ( ( ( pin + GPIO_PINS_PER_BLOCK ) >> 5) - 1 ) - - -struct gpio_register { - u32 gpio_dat; /* GPIO data register *//*0x000 */ - u32 gpio_dats; /* GPIO data Set register *//*0x004 */ - u32 gpio_datc; /* GPIO data Clear register *//*0x008 */ - u32 gpio_pdis; /* GPIO Pull disable register *//*0x00C */ - u32 gpio_dir; /* GPIO data direction register *//*0x010 */ - u32 gpio_dirs; /* GPIO data dir Set register *//*0x014 */ - u32 gpio_dirc; /* GPIO data dir Clear register *//*0x018 */ - u32 gpio_slpm; /* GPIO Sleep mode register *//*0x01C */ - u32 gpio_afsa; /* GPIO AltFun A Select reg *//*0x020 */ - u32 gpio_afsb; /* GPIO AltFun B Select reg *//*0x024 */ - u32 gpio_lowemi; /* GPIO low EMI Select reg *//*0x028 */ - u32 reserved_1[(0x040 - 0x02C) >> 2]; /*0x028-0x3C Reserved*/ - u32 gpio_rimsc; /* GPIO rising edge intr set/clear *//*0x040 */ - u32 gpio_fimsc; /* GPIO falling edge interrupt set/clear register *//*0x044 */ - u32 gpio_mis; /* GPIO masked interrupt status register *//*0x048 */ - u32 gpio_ic; /* GPIO Interrupt Clear register *//*0x04C */ - u32 gpio_rwimsc; /* GPIO Rising-edge Wakeup IMSC register *//*0x050 */ - u32 gpio_fwimsc; /* GPIO Falling-edge Wakeup IMSC register *//*0x054 */ - u32 gpio_wks; /* GPIO Wakeup Status register *//*0x058 */ -}; - -/* Error values returned by functions */ -typedef enum { - GPIO_OK = 0, /* (0) */ - GPIO_UNSUPPORTED_HW = -2, /* NOMADIK_UNSUPPORTED_HW, (-2) */ - GPIO_UNSUPPORTED_FEATURE = -3, /* NOMADIK_UNSUPPORTED_FEATURE, (-3) */ - GPIO_INVALID_PARAMETER = -4, /* NOMADIK_INVALID_PARAMETER, (-4) */ - GPIO_REQUEST_NOT_APPLICABLE = -5, /* NOMADIK_REQUEST_NOT_APPLICABLE, (-5) */ - GPIO_REQUEST_PENDING = -6, /* NOMADIK_REQUEST_PENDING, (-6) */ - GPIO_NOT_CONFIGURED = -7, /* NOMADIK_NOT_CONFIGURED, (-7) */ - GPIO_INTERNAL_ERROR = -8, /* NOMADIK_INTERNAL_ERROR, (-8) */ - GPIO_INTERNAL_EVENT = 1, /* NOMADIK_INTERNAL_EVENT,*/ - GPIO_REMAINING_EVENT = 2, /* NOMADIK_REMAINING_PENDING_EVENTS,*/ - GPIO_NO_MORE_PENDING_EVENT = 3, /* NOMADIK_NO_MORE_PENDING_EVENT,*/ - GPIO_INVALID_CLIENT = -25, - GPIO_INVALID_PIN = -26, - GPIO_PIN_BUSY = -27, - GPIO_PIN_NOT_ALLOCATED = -28, - GPIO_WRONG_CLIENT = -29, - GPIO_UNSUPPORTED_ALTFUNC = -30, - -} gpio_error; - -/*GPIO DEVICE ID */ -typedef enum { - GPIO_DEVICE_ID_0, - GPIO_DEVICE_ID_1, - GPIO_DEVICE_ID_2, - GPIO_DEVICE_ID_3, - GPIO_DEVICE_ID_INVALID -} gpio_device_id; - -/* - * Pin description To be used in SOFTWARE mode: refers to a pin. - */ -typedef enum { - GPIO_PIN_0, - GPIO_PIN_1, - GPIO_PIN_2, - GPIO_PIN_3, - GPIO_PIN_4, - GPIO_PIN_5, - GPIO_PIN_6, - GPIO_PIN_7, - GPIO_PIN_8, - GPIO_PIN_9, - GPIO_PIN_10, - GPIO_PIN_11, - GPIO_PIN_12, - GPIO_PIN_13, - GPIO_PIN_14, - GPIO_PIN_15, - GPIO_PIN_16, - GPIO_PIN_17, - GPIO_PIN_18, - GPIO_PIN_19, - GPIO_PIN_20, - GPIO_PIN_21, - GPIO_PIN_22, - GPIO_PIN_23, - GPIO_PIN_24, - GPIO_PIN_25, - GPIO_PIN_26, - GPIO_PIN_27, - GPIO_PIN_28, - GPIO_PIN_29, - GPIO_PIN_30, - GPIO_PIN_31, - GPIO_PIN_32, - GPIO_PIN_33, - GPIO_PIN_34, - GPIO_PIN_35, - GPIO_PIN_36, - GPIO_PIN_37, - GPIO_PIN_38, - GPIO_PIN_39, - GPIO_PIN_40, - GPIO_PIN_41, - GPIO_PIN_42, - GPIO_PIN_43, - GPIO_PIN_44, - GPIO_PIN_45, - GPIO_PIN_46, - GPIO_PIN_47, - GPIO_PIN_48, - GPIO_PIN_49, - GPIO_PIN_50, - GPIO_PIN_51, - GPIO_PIN_52, - GPIO_PIN_53, - GPIO_PIN_54, - GPIO_PIN_55, - GPIO_PIN_56, - GPIO_PIN_57, - GPIO_PIN_58, - GPIO_PIN_59, - GPIO_PIN_60, - GPIO_PIN_61, - GPIO_PIN_62, - GPIO_PIN_63, - GPIO_PIN_64, - GPIO_PIN_65, - GPIO_PIN_66, - GPIO_PIN_67, - GPIO_PIN_68, - GPIO_PIN_69, - GPIO_PIN_70, - GPIO_PIN_71, - GPIO_PIN_72, - GPIO_PIN_73, - GPIO_PIN_74, - GPIO_PIN_75, - GPIO_PIN_76, - GPIO_PIN_77, - GPIO_PIN_78, - GPIO_PIN_79, - GPIO_PIN_80, - GPIO_PIN_81, - GPIO_PIN_82, - GPIO_PIN_83, - GPIO_PIN_84, - GPIO_PIN_85, - GPIO_PIN_86, - GPIO_PIN_87, - GPIO_PIN_88, - GPIO_PIN_89, - GPIO_PIN_90, - GPIO_PIN_91, - GPIO_PIN_92, - GPIO_PIN_93, - GPIO_PIN_94, - GPIO_PIN_95, - GPIO_PIN_96, - GPIO_PIN_97, - GPIO_PIN_98, - GPIO_PIN_99, - GPIO_PIN_100, - GPIO_PIN_101, - GPIO_PIN_102, - GPIO_PIN_103, - GPIO_PIN_104, - GPIO_PIN_105, - GPIO_PIN_106, - GPIO_PIN_107, - GPIO_PIN_108, - GPIO_PIN_109, - GPIO_PIN_110, - GPIO_PIN_111, - GPIO_PIN_112, - GPIO_PIN_113, - GPIO_PIN_114, - GPIO_PIN_115, - GPIO_PIN_116, - GPIO_PIN_117, - GPIO_PIN_118, - GPIO_PIN_119, - GPIO_PIN_120, - GPIO_PIN_121, - GPIO_PIN_122, - GPIO_PIN_123, - GPIO_PIN_124, - GPIO_PIN_125, - GPIO_PIN_126, - GPIO_PIN_127, - GPIO_PIN_128, - GPIO_PIN_129, - GPIO_PIN_130, - GPIO_PIN_131, - GPIO_PIN_132, - GPIO_PIN_133, - GPIO_PIN_134, - GPIO_PIN_135, - GPIO_PIN_136, - GPIO_PIN_137, - GPIO_PIN_138, - GPIO_PIN_139, - GPIO_PIN_140, - GPIO_PIN_141, - GPIO_PIN_142, - GPIO_PIN_143, - GPIO_PIN_144, - GPIO_PIN_145, - GPIO_PIN_146, - GPIO_PIN_147, - GPIO_PIN_148, - GPIO_PIN_149, - GPIO_PIN_150, - GPIO_PIN_151, - GPIO_PIN_152, - GPIO_PIN_153, - GPIO_PIN_154, - GPIO_PIN_155, - GPIO_PIN_156, - GPIO_PIN_157, - GPIO_PIN_158, - GPIO_PIN_159, - GPIO_PIN_160, - GPIO_PIN_161, - GPIO_PIN_162, - GPIO_PIN_163, - GPIO_PIN_164, - GPIO_PIN_165, - GPIO_PIN_166, - GPIO_PIN_167, - GPIO_PIN_168, - GPIO_PIN_169, - GPIO_PIN_170, - GPIO_PIN_171, - GPIO_PIN_172, - GPIO_PIN_173, - GPIO_PIN_174, - GPIO_PIN_175, - GPIO_PIN_176, - GPIO_PIN_177, - GPIO_PIN_178, - GPIO_PIN_179, - GPIO_PIN_180, - GPIO_PIN_181, - GPIO_PIN_182, - GPIO_PIN_183, - GPIO_PIN_184, - GPIO_PIN_185, - GPIO_PIN_186, - GPIO_PIN_187, - GPIO_PIN_188, - GPIO_PIN_189, - GPIO_PIN_190, - GPIO_PIN_191, - GPIO_PIN_192, - GPIO_PIN_193, - GPIO_PIN_194, - GPIO_PIN_195, - GPIO_PIN_196, - GPIO_PIN_197, - GPIO_PIN_198, - GPIO_PIN_199, - GPIO_PIN_200, - GPIO_PIN_201, - GPIO_PIN_202, - GPIO_PIN_203, - GPIO_PIN_204, - GPIO_PIN_205, - GPIO_PIN_206, - GPIO_PIN_207, - GPIO_PIN_208, - GPIO_PIN_209, - GPIO_PIN_210, - GPIO_PIN_211, - GPIO_PIN_212, - GPIO_PIN_213, - GPIO_PIN_214, - GPIO_PIN_215, - GPIO_PIN_216, - GPIO_PIN_217, - GPIO_PIN_218, - GPIO_PIN_219, - GPIO_PIN_220, - GPIO_PIN_221, - GPIO_PIN_222, - GPIO_PIN_223, - GPIO_PIN_224, - GPIO_PIN_225, - GPIO_PIN_226, - GPIO_PIN_227, - GPIO_PIN_228, - GPIO_PIN_229, - GPIO_PIN_230, - GPIO_PIN_231, - GPIO_PIN_232, - GPIO_PIN_233, - GPIO_PIN_234, - GPIO_PIN_235, - GPIO_PIN_236, - GPIO_PIN_237, - GPIO_PIN_238, - GPIO_PIN_239, - GPIO_PIN_240, - GPIO_PIN_241, - GPIO_PIN_242, - GPIO_PIN_243, - GPIO_PIN_244, - GPIO_PIN_245, - GPIO_PIN_246, - GPIO_PIN_247, - GPIO_PIN_248, - GPIO_PIN_249, - GPIO_PIN_250, - GPIO_PIN_251, - GPIO_PIN_252, - GPIO_PIN_253, - GPIO_PIN_254, - GPIO_PIN_255, - GPIO_PIN_256, - GPIO_PIN_257, - GPIO_PIN_258, - GPIO_PIN_259, - GPIO_PIN_260, - GPIO_PIN_261, - GPIO_PIN_262, - GPIO_PIN_263, - GPIO_PIN_264, - GPIO_PIN_265, - GPIO_PIN_266, - GPIO_PIN_267 -} gpio_pin; - -/* - * Alternate Function: - * refered in altfun_table to pointout particular altfun to be enabled - * when using GPIO_ALT_FUNCTION A/B/C enable/disable operation - */ -typedef enum { - GPIO_ALT_UART_0_MODEM, - GPIO_ALT_UART_0_NO_MODEM, - GPIO_ALT_UART_1, - GPIO_ALT_UART_2, - GPIO_ALT_I2C_0, - GPIO_ALT_I2C_1, - GPIO_ALT_I2C_2, - GPIO_ALT_I2C_3, - GPIO_ALT_MSP_0, - GPIO_ALT_MSP_1, - GPIO_ALT_MSP_2, - GPIO_ALT_MSP_3, - GPIO_ALT_MSP_4, - GPIO_ALT_MSP_5, - GPIO_ALT_SSP_0, - GPIO_ALT_SSP_1, - GPIO_ALT_MM_CARD0, - GPIO_ALT_SD_CARD0, - GPIO_ALT_DMA_0, - GPIO_ALT_DMA_1, - GPIO_ALT_HSI0, - GPIO_ALT_CCIR656_INPUT, - GPIO_ALT_CCIR656_OUTPUT, - GPIO_ALT_LCD_PANEL, - GPIO_ALT_MDIF, - GPIO_ALT_SDRAM, - GPIO_ALT_HAMAC_AUDIO_DBG, - GPIO_ALT_HAMAC_VIDEO_DBG, - GPIO_ALT_CLOCK_RESET, - GPIO_ALT_TSP, - GPIO_ALT_IRDA, - GPIO_ALT_USB_MINIMUM, - GPIO_ALT_USB_I2C, - GPIO_ALT_OWM, - GPIO_ALT_PWL, - GPIO_ALT_FSMC, - GPIO_ALT_COMP_FLASH, - GPIO_ALT_SRAM_NOR_FLASH, - GPIO_ALT_FSMC_ADDLINE_0_TO_15, - GPIO_ALT_SCROLL_KEY, - GPIO_ALT_MSHC, - GPIO_ALT_HPI, - GPIO_ALT_USB_OTG, - GPIO_ALT_SDIO, - GPIO_ALT_HSMMC, - GPIO_ALT_FSMC_ADD_DATA_0_TO_25, - GPIO_ALT_HSI1, - GPIO_ALT_NOR, - GPIO_ALT_NAND, - GPIO_ALT_KEYPAD, - GPIO_ALT_VPIP, - GPIO_ALT_CAM, - GPIO_ALT_CCP1, - GPIO_ALT_EMMC, - GPIO_ALT_POP_EMMC, - GPIO_ALT_SPI_0, - GPIO_ALT_SPI_1, - GPIO_ALT_SPI_2, - GPIO_ALT_SPI_3, - GPIO_ALT_FUNMAX /* Add new alt func before this */ -} gpio_alt_function; - -/* Defines pin assignment(Software mode or Alternate mode) */ -typedef enum { - GPIO_MODE_LEAVE_UNCHANGED, /* Parameter will be ignored by the function. */ - GPIO_MODE_SOFTWARE, /* Pin connected to GPIO (SW controlled) */ - GPIO_ALTF_A, /* Pin connected to alternate function 1 (HW periph 1) */ - GPIO_ALTF_B, /* Pin connected to alternate function 2 (HW periph 2) */ - GPIO_ALTF_C, /* Pin connected to alternate function 3 (HW periph 3) */ - GPIO_ALTF_FIND, /* Pin connected to alternate function 3 (HW periph 3) */ - GPIO_ALTF_DISABLE /* Pin connected to alternate function 3 (HW periph 3) */ -} gpio_mode; - -/* Defines GPIO pin direction */ -typedef enum { - GPIO_DIR_LEAVE_UNCHANGED, /* Parameter will be ignored by the function. */ - GPIO_DIR_INPUT, /* GPIO set as input */ - GPIO_DIR_OUTPUT /* GPIO set as output */ -} gpio_direction; - -/* Interrupt trigger mode */ -typedef enum { - GPIO_TRIG_LEAVE_UNCHANGED, /* Parameter will be ignored by the function */ - GPIO_TRIG_DISABLE, /* Triggers no IT */ - GPIO_TRIG_RISING_EDGE, /* Triggers an IT on a rising edge */ - GPIO_TRIG_FALLING_EDGE, /* Triggers an IT on a falling edge */ - GPIO_TRIG_BOTH_EDGES, /* Triggers an IT on a rising and a falling edge */ - GPIO_TRIG_HIGH_LEVEL, /* Triggers an IT on a high level */ - GPIO_TRIG_LOW_LEVEL /* Triggers an IT on a low level */ -} gpio_trig; /* Interrupt trigger mode, or disable */ - -/* Configuration parameters for one GPIO pin.*/ -typedef struct { - gpio_mode mode; /* Defines mode (SOFTWARE or Alternate). */ - gpio_direction direction; /* Define pin direction (in SOFTWARE mode only). */ - gpio_trig trig; /* Interrupt trigger (in SOFTWARE mode only) */ - char *dev_name; /* Name of client driver who owns the gpio pin */ -} gpio_config; - -/* GPIO pin data*/ -typedef enum { - GPIO_DATA_LOW, /* GPIO pin status is low. */ - GPIO_DATA_HIGH /* GPIO pin status is high. */ -} gpio_data; - -/* GPIO behaviour in sleep mode */ -typedef enum { - GPIO_SLEEP_MODE_LEAVE_UNCHANGED, /* Parameter will be ignored by the function. */ - GPIO_SLEEP_MODE_INPUT_DEFAULTVOLT, /* GPIO is an input with pull up/down enabled - when in sleep mode. */ - GPIO_SLEEP_MODE_CONTROLLED_BY_GPIO /* GPIO pin is controlled by GPIO IP. So mode, - direction and data values for GPIO pin in - sleep mode are determined by configuration - set to GPIO pin before entering to sleep mode. */ -} gpio_sleep_mode; - -/* GPIO ability to wake the system up from sleep mode.*/ -typedef enum { - GPIO_WAKE_LEAVE_UNCHANGED, /* Parameter will be ignored by the function. */ - GPIO_WAKE_DISABLE, /* GPIO will not wake the system from sleep mode. */ - GPIO_WAKE_LOW_LEVEL, /* GPIO will wake the system up on a LOW level. */ - GPIO_WAKE_HIGH_LEVEL, /* GPIO will wake the system up on a HIGH level. */ - GPIO_WAKE_RISING_EDGE, /* GPIO will wake the system up on a RISING edge. */ - GPIO_WAKE_FALLING_EDGE, /* GPIO will wake the system up on a FALLING edge. */ - GPIO_WAKE_BOTH_EDGES /* GPIO will wake the system up on both RISING and FALLING edge. */ -} gpio_wake; - -/* Configuration parameters for one GPIO pin in sleep mode.*/ -typedef struct { - gpio_sleep_mode sleep_mode; /* GPIO behaviour in sleep mode. */ - gpio_wake wake; /* GPIO ability to wake up the system. */ -} gpio_sleep_config; - -/*------------------------------------------------------------------------ - * Functions declaration - * refer ./Documentation/arm/STM-Nomadik/gpio_user_guide.txt - *----------------------------------------------------------------------*/ - -extern gpio_error gpio_setpinconfig(gpio_pin pin_id, gpio_config * pin_config); -extern gpio_error gpio_resetpinconfig(gpio_pin pin_id, char *dev_name); -extern int gpio_writepin(gpio_pin pin_id, gpio_data value, char *dev_name); -extern int gpio_readpin(gpio_pin pin_id, gpio_data * value); -extern int gpio_altfuncenable(gpio_alt_function altfunc, - char *dev_name); -extern int gpio_altfuncdisable(gpio_alt_function altfunc, - char *dev_name); - -struct gpio_altfun_data { - u16 altfun; - u16 start; - u16 end; - t_bool cont; - u8 type; -}; - -#endif /* __INC_GPIO_H */ diff --git a/include/configs/u8500.h b/include/configs/u8500.h index 7a0284c0b..0bca0dcf6 100644 --- a/include/configs/u8500.h +++ b/include/configs/u8500.h @@ -309,6 +309,7 @@ /* * U8500 GPIO register base for 9 banks */ +#define CONFIG_DB8500_GPIO #define CFG_GPIO_0_BASE 0x8012E000 #define CFG_GPIO_1_BASE 0x8012E080 #define CFG_GPIO_2_BASE 0x8000E000 diff --git a/include/db8500_gpio.h b/include/db8500_gpio.h new file mode 100644 index 000000000..67d7e4d56 --- /dev/null +++ b/include/db8500_gpio.h @@ -0,0 +1,43 @@ +/* + * Structures and registers for GPIO access in the Nomadik SoC + * + * Code ported from Nomadik GPIO driver in ST-Ericsson Linux kernel code. + * The purpose is that GPIO config found in kernel should work by simply + * copy-paste it to U-boot. + * + * Ported to U-boot by: + * Copyright (C) 2010 Joakim Axelsson <joakim.axelsson AT stericsson.com> + * Copyright (C) 2008 STMicroelectronics + * Author: Prafulla WADASKAR <prafulla.wadaskar@st.com> + * Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __DB8500_GPIO_H__ +#define __DB8500_GPIO_H__ + +/* Alternate functions: function C is set in hw by setting both A and B */ +enum db8500_gpio_alt { + DB8500_GPIO_ALT_GPIO = 0, + DB8500_GPIO_ALT_A = 1, + DB8500_GPIO_ALT_B = 2, + DB8500_GPIO_ALT_C = (DB8500_GPIO_ALT_A | DB8500_GPIO_ALT_B) +}; + +enum db8500_gpio_pull { + DB8500_GPIO_PULL_NONE, + DB8500_GPIO_PULL_UP, + DB8500_GPIO_PULL_DOWN +}; + +void db8500_gpio_set_pull(unsigned gpio, enum db8500_gpio_pull pull); +void db8500_gpio_make_input(unsigned gpio); +int db8500_gpio_get_input(unsigned gpio); +void db8500_gpio_make_output(unsigned gpio, int val); +void db8500_gpio_set_output(unsigned gpio, int val); + +#endif /* __DB8500_GPIO_H__ */ + diff --git a/include/db8500_pincfg.h b/include/db8500_pincfg.h new file mode 100644 index 000000000..d1bcb65a9 --- /dev/null +++ b/include/db8500_pincfg.h @@ -0,0 +1,173 @@ +/* + * Copyright (C) ST-Ericsson SA 2010 + * + * Code ported from Nomadik GPIO driver in ST-Ericsson Linux kernel code. + * The purpose is that GPIO config found in kernel should work by simply + * copy-paste it to U-boot. Ported 2010 to U-boot by: + * Author: Joakim Axelsson <joakim.axelsson AT stericsson.com> + * + * License terms: GNU General Public License, version 2 + * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson + * + * + * Based on arch/arm/mach-pxa/include/mach/mfp.h: + * Copyright (C) 2007 Marvell International Ltd. + * eric miao <eric.miao@marvell.com> + */ + +#ifndef __DB8500_PINCFG_H +#define __DB8500_PINCFG_H + +#include "db8500_gpio.h" + +/* + * U-boot info: + * SLPM (sleep mode) config will be ignored by U-boot but it is still + * possible to configure it in order to keep cut-n-paste compability + * with Linux kernel config. + * + * pin configurations are represented by 32-bit integers: + * + * bit 0.. 8 - Pin Number (512 Pins Maximum) + * bit 9..10 - Alternate Function Selection + * bit 11..12 - Pull up/down state + * bit 13 - Sleep mode behaviour (not used in U-boot) + * bit 14 - Direction + * bit 15 - Value (if output) + * bit 16..18 - SLPM pull up/down state (not used in U-boot) + * bit 19..20 - SLPM direction (not used in U-boot) + * bit 21..22 - SLPM Value (if output) (not used in U-boot) + * + * to facilitate the definition, the following macros are provided + * + * PIN_CFG_DEFAULT - default config (0): + * pull up/down = disabled + * sleep mode = input/wakeup + * direction = input + * value = low + * SLPM direction = same as normal + * SLPM pull = same as normal + * SLPM value = same as normal + * + * PIN_CFG - default config with alternate function + * PIN_CFG_PULL - default config with alternate function and pull up/down + */ + +typedef unsigned long pin_cfg_t; + +/* Sleep mode */ +enum db8500_gpio_slpm { + DB8500_GPIO_SLPM_INPUT, + DB8500_GPIO_SLPM_WAKEUP_ENABLE = DB8500_GPIO_SLPM_INPUT, + DB8500_GPIO_SLPM_NOCHANGE, + DB8500_GPIO_SLPM_WAKEUP_DISABLE = DB8500_GPIO_SLPM_NOCHANGE, +}; + +#define PIN_NUM_MASK 0x1ff +#define PIN_NUM(x) ((x) & PIN_NUM_MASK) + +#define PIN_ALT_SHIFT 9 +#define PIN_ALT_MASK (0x3 << PIN_ALT_SHIFT) +#define PIN_ALT(x) (((x) & PIN_ALT_MASK) >> PIN_ALT_SHIFT) +#define PIN_GPIO (DB8500_GPIO_ALT_GPIO << PIN_ALT_SHIFT) +#define PIN_ALT_A (DB8500_GPIO_ALT_A << PIN_ALT_SHIFT) +#define PIN_ALT_B (DB8500_GPIO_ALT_B << PIN_ALT_SHIFT) +#define PIN_ALT_C (DB8500_GPIO_ALT_C << PIN_ALT_SHIFT) + +#define PIN_PULL_SHIFT 11 +#define PIN_PULL_MASK (0x3 << PIN_PULL_SHIFT) +#define PIN_PULL(x) (((x) & PIN_PULL_MASK) >> PIN_PULL_SHIFT) +#define PIN_PULL_NONE (DB8500_GPIO_PULL_NONE << PIN_PULL_SHIFT) +#define PIN_PULL_UP (DB8500_GPIO_PULL_UP << PIN_PULL_SHIFT) +#define PIN_PULL_DOWN (DB8500_GPIO_PULL_DOWN << PIN_PULL_SHIFT) + +#define PIN_SLPM_SHIFT 13 +#define PIN_SLPM_MASK (0x1 << PIN_SLPM_SHIFT) +#define PIN_SLPM(x) (((x) & PIN_SLPM_MASK) >> PIN_SLPM_SHIFT) +#define PIN_SLPM_MAKE_INPUT (DB8500_GPIO_SLPM_INPUT << PIN_SLPM_SHIFT) +#define PIN_SLPM_NOCHANGE (DB8500_GPIO_SLPM_NOCHANGE << PIN_SLPM_SHIFT) +/* These two replace the above in DB8500v2+ */ +#define PIN_SLPM_WAKEUP_ENABLE \ + (DB8500_GPIO_SLPM_WAKEUP_ENABLE << PIN_SLPM_SHIFT) +#define PIN_SLPM_WAKEUP_DISABLE \ + (DB8500_GPIO_SLPM_WAKEUP_DISABLE << PIN_SLPM_SHIFT) + +#define PIN_DIR_SHIFT 14 +#define PIN_DIR_MASK (0x1 << PIN_DIR_SHIFT) +#define PIN_DIR(x) (((x) & PIN_DIR_MASK) >> PIN_DIR_SHIFT) +#define PIN_DIR_INPUT (0 << PIN_DIR_SHIFT) +#define PIN_DIR_OUTPUT (1 << PIN_DIR_SHIFT) + +#define PIN_VAL_SHIFT 15 +#define PIN_VAL_MASK (0x1 << PIN_VAL_SHIFT) +#define PIN_VAL(x) (((x) & PIN_VAL_MASK) >> PIN_VAL_SHIFT) +#define PIN_VAL_LOW (0 << PIN_VAL_SHIFT) +#define PIN_VAL_HIGH (1 << PIN_VAL_SHIFT) + +#define PIN_SLPM_PULL_SHIFT 16 +#define PIN_SLPM_PULL_MASK (0x7 << PIN_SLPM_PULL_SHIFT) +#define PIN_SLPM_PULL(x) \ + (((x) & PIN_SLPM_PULL_MASK) >> PIN_SLPM_PULL_SHIFT) +#define PIN_SLPM_PULL_NONE \ + ((1 + DB8500_GPIO_PULL_NONE) << PIN_SLPM_PULL_SHIFT) +#define PIN_SLPM_PULL_UP \ + ((1 + DB8500_GPIO_PULL_UP) << PIN_SLPM_PULL_SHIFT) +#define PIN_SLPM_PULL_DOWN \ + ((1 + DB8500_GPIO_PULL_DOWN) << PIN_SLPM_PULL_SHIFT) + +#define PIN_SLPM_DIR_SHIFT 19 +#define PIN_SLPM_DIR_MASK (0x3 << PIN_SLPM_DIR_SHIFT) +#define PIN_SLPM_DIR(x) \ + (((x) & PIN_SLPM_DIR_MASK) >> PIN_SLPM_DIR_SHIFT) +#define PIN_SLPM_DIR_INPUT ((1 + 0) << PIN_SLPM_DIR_SHIFT) +#define PIN_SLPM_DIR_OUTPUT ((1 + 1) << PIN_SLPM_DIR_SHIFT) + +#define PIN_SLPM_VAL_SHIFT 21 +#define PIN_SLPM_VAL_MASK (0x3 << PIN_SLPM_VAL_SHIFT) +#define PIN_SLPM_VAL(x) \ + (((x) & PIN_SLPM_VAL_MASK) >> PIN_SLPM_VAL_SHIFT) +#define PIN_SLPM_VAL_LOW ((1 + 0) << PIN_SLPM_VAL_SHIFT) +#define PIN_SLPM_VAL_HIGH ((1 + 1) << PIN_SLPM_VAL_SHIFT) + +/* Shortcuts. Use these instead of separate DIR, PULL, and VAL. */ +#define PIN_INPUT_PULLDOWN (PIN_DIR_INPUT | PIN_PULL_DOWN) +#define PIN_INPUT_PULLUP (PIN_DIR_INPUT | PIN_PULL_UP) +#define PIN_INPUT_NOPULL (PIN_DIR_INPUT | PIN_PULL_NONE) +#define PIN_OUTPUT_LOW (PIN_DIR_OUTPUT | PIN_VAL_LOW) +#define PIN_OUTPUT_HIGH (PIN_DIR_OUTPUT | PIN_VAL_HIGH) + +#define PIN_SLPM_INPUT_PULLDOWN (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_DOWN) +#define PIN_SLPM_INPUT_PULLUP (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_UP) +#define PIN_SLPM_INPUT_NOPULL (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_NONE) +#define PIN_SLPM_OUTPUT_LOW (PIN_SLPM_DIR_OUTPUT | PIN_SLPM_VAL_LOW) +#define PIN_SLPM_OUTPUT_HIGH (PIN_SLPM_DIR_OUTPUT | PIN_SLPM_VAL_HIGH) + +#define PIN_CFG_DEFAULT (0) + +#define PIN_CFG(num, alt) \ + (PIN_CFG_DEFAULT |\ + (PIN_NUM(num) | PIN_##alt)) + +#define PIN_CFG_INPUT(num, alt, pull) \ + (PIN_CFG_DEFAULT |\ + (PIN_NUM(num) | PIN_##alt | PIN_INPUT_##pull)) + +#define PIN_CFG_OUTPUT(num, alt, val) \ + (PIN_CFG_DEFAULT |\ + (PIN_NUM(num) | PIN_##alt | PIN_OUTPUT_##val)) + +#define PIN_CFG_PULL(num, alt, pull) \ + ((PIN_CFG_DEFAULT & ~PIN_PULL_MASK) |\ + (PIN_NUM(num) | PIN_##alt | PIN_PULL_##pull)) + +/** + * db8500_gpio_config_pins - configure several pins at once + * @cfgs: array of pin configurations + * @num: number of elments in the array + * + * Configures several GPIO pins. + */ +void db8500_gpio_config_pins(pin_cfg_t *cfgs, size_t num); + +#endif + |