linux/arch/arm/plat-nomadik/include/plat/pincfg.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) ST-Ericsson SA 2010
   3 *
   4 * License terms: GNU General Public License, version 2
   5 * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
   6 *
   7 * Based on arch/arm/mach-pxa/include/mach/mfp.h:
   8 *   Copyright (C) 2007 Marvell International Ltd.
   9 *   eric miao <eric.miao@marvell.com>
  10 */
  11
  12#ifndef __PLAT_PINCFG_H
  13#define __PLAT_PINCFG_H
  14
  15/*
  16 * pin configurations are represented by 32-bit integers:
  17 *
  18 *      bit  0.. 8 - Pin Number (512 Pins Maximum)
  19 *      bit  9..10 - Alternate Function Selection
  20 *      bit 11..12 - Pull up/down state
  21 *      bit     13 - Sleep mode behaviour
  22 *      bit     14 - Direction
  23 *      bit     15 - Value (if output)
  24 *      bit 16..18 - SLPM pull up/down state
  25 *      bit 19..20 - SLPM direction
  26 *      bit 21..22 - SLPM Value (if output)
  27 *
  28 * to facilitate the definition, the following macros are provided
  29 *
  30 * PIN_CFG_DEFAULT - default config (0):
  31 *                   pull up/down = disabled
  32 *                   sleep mode = input/wakeup
  33 *                   direction = input
  34 *                   value = low
  35 *                   SLPM direction = same as normal
  36 *                   SLPM pull = same as normal
  37 *                   SLPM value = same as normal
  38 *
  39 * PIN_CFG         - default config with alternate function
  40 * PIN_CFG_PULL    - default config with alternate function and pull up/down
  41 */
  42
  43typedef unsigned long pin_cfg_t;
  44
  45#define PIN_NUM_MASK            0x1ff
  46#define PIN_NUM(x)              ((x) & PIN_NUM_MASK)
  47
  48#define PIN_ALT_SHIFT           9
  49#define PIN_ALT_MASK            (0x3 << PIN_ALT_SHIFT)
  50#define PIN_ALT(x)              (((x) & PIN_ALT_MASK) >> PIN_ALT_SHIFT)
  51#define PIN_GPIO                (NMK_GPIO_ALT_GPIO << PIN_ALT_SHIFT)
  52#define PIN_ALT_A               (NMK_GPIO_ALT_A << PIN_ALT_SHIFT)
  53#define PIN_ALT_B               (NMK_GPIO_ALT_B << PIN_ALT_SHIFT)
  54#define PIN_ALT_C               (NMK_GPIO_ALT_C << PIN_ALT_SHIFT)
  55
  56#define PIN_PULL_SHIFT          11
  57#define PIN_PULL_MASK           (0x3 << PIN_PULL_SHIFT)
  58#define PIN_PULL(x)             (((x) & PIN_PULL_MASK) >> PIN_PULL_SHIFT)
  59#define PIN_PULL_NONE           (NMK_GPIO_PULL_NONE << PIN_PULL_SHIFT)
  60#define PIN_PULL_UP             (NMK_GPIO_PULL_UP << PIN_PULL_SHIFT)
  61#define PIN_PULL_DOWN           (NMK_GPIO_PULL_DOWN << PIN_PULL_SHIFT)
  62
  63#define PIN_SLPM_SHIFT          13
  64#define PIN_SLPM_MASK           (0x1 << PIN_SLPM_SHIFT)
  65#define PIN_SLPM(x)             (((x) & PIN_SLPM_MASK) >> PIN_SLPM_SHIFT)
  66#define PIN_SLPM_MAKE_INPUT     (NMK_GPIO_SLPM_INPUT << PIN_SLPM_SHIFT)
  67#define PIN_SLPM_NOCHANGE       (NMK_GPIO_SLPM_NOCHANGE << PIN_SLPM_SHIFT)
  68/* These two replace the above in DB8500v2+ */
  69#define PIN_SLPM_WAKEUP_ENABLE  (NMK_GPIO_SLPM_WAKEUP_ENABLE << PIN_SLPM_SHIFT)
  70#define PIN_SLPM_WAKEUP_DISABLE (NMK_GPIO_SLPM_WAKEUP_DISABLE << PIN_SLPM_SHIFT)
  71
  72#define PIN_DIR_SHIFT           14
  73#define PIN_DIR_MASK            (0x1 << PIN_DIR_SHIFT)
  74#define PIN_DIR(x)              (((x) & PIN_DIR_MASK) >> PIN_DIR_SHIFT)
  75#define PIN_DIR_INPUT           (0 << PIN_DIR_SHIFT)
  76#define PIN_DIR_OUTPUT          (1 << PIN_DIR_SHIFT)
  77
  78#define PIN_VAL_SHIFT           15
  79#define PIN_VAL_MASK            (0x1 << PIN_VAL_SHIFT)
  80#define PIN_VAL(x)              (((x) & PIN_VAL_MASK) >> PIN_VAL_SHIFT)
  81#define PIN_VAL_LOW             (0 << PIN_VAL_SHIFT)
  82#define PIN_VAL_HIGH            (1 << PIN_VAL_SHIFT)
  83
  84#define PIN_SLPM_PULL_SHIFT     16
  85#define PIN_SLPM_PULL_MASK      (0x7 << PIN_SLPM_PULL_SHIFT)
  86#define PIN_SLPM_PULL(x)        \
  87        (((x) & PIN_SLPM_PULL_MASK) >> PIN_SLPM_PULL_SHIFT)
  88#define PIN_SLPM_PULL_NONE      \
  89        ((1 + NMK_GPIO_PULL_NONE) << PIN_SLPM_PULL_SHIFT)
  90#define PIN_SLPM_PULL_UP        \
  91        ((1 + NMK_GPIO_PULL_UP) << PIN_SLPM_PULL_SHIFT)
  92#define PIN_SLPM_PULL_DOWN      \
  93        ((1 + NMK_GPIO_PULL_DOWN) << PIN_SLPM_PULL_SHIFT)
  94
  95#define PIN_SLPM_DIR_SHIFT      19
  96#define PIN_SLPM_DIR_MASK       (0x3 << PIN_SLPM_DIR_SHIFT)
  97#define PIN_SLPM_DIR(x)         \
  98        (((x) & PIN_SLPM_DIR_MASK) >> PIN_SLPM_DIR_SHIFT)
  99#define PIN_SLPM_DIR_INPUT      ((1 + 0) << PIN_SLPM_DIR_SHIFT)
 100#define PIN_SLPM_DIR_OUTPUT     ((1 + 1) << PIN_SLPM_DIR_SHIFT)
 101
 102#define PIN_SLPM_VAL_SHIFT      21
 103#define PIN_SLPM_VAL_MASK       (0x3 << PIN_SLPM_VAL_SHIFT)
 104#define PIN_SLPM_VAL(x)         \
 105        (((x) & PIN_SLPM_VAL_MASK) >> PIN_SLPM_VAL_SHIFT)
 106#define PIN_SLPM_VAL_LOW        ((1 + 0) << PIN_SLPM_VAL_SHIFT)
 107#define PIN_SLPM_VAL_HIGH       ((1 + 1) << PIN_SLPM_VAL_SHIFT)
 108
 109/* Shortcuts.  Use these instead of separate DIR, PULL, and VAL.  */
 110#define PIN_INPUT_PULLDOWN      (PIN_DIR_INPUT | PIN_PULL_DOWN)
 111#define PIN_INPUT_PULLUP        (PIN_DIR_INPUT | PIN_PULL_UP)
 112#define PIN_INPUT_NOPULL        (PIN_DIR_INPUT | PIN_PULL_NONE)
 113#define PIN_OUTPUT_LOW          (PIN_DIR_OUTPUT | PIN_VAL_LOW)
 114#define PIN_OUTPUT_HIGH         (PIN_DIR_OUTPUT | PIN_VAL_HIGH)
 115
 116#define PIN_SLPM_INPUT_PULLDOWN (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_DOWN)
 117#define PIN_SLPM_INPUT_PULLUP   (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_UP)
 118#define PIN_SLPM_INPUT_NOPULL   (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_NONE)
 119#define PIN_SLPM_OUTPUT_LOW     (PIN_SLPM_DIR_OUTPUT | PIN_SLPM_VAL_LOW)
 120#define PIN_SLPM_OUTPUT_HIGH    (PIN_SLPM_DIR_OUTPUT | PIN_SLPM_VAL_HIGH)
 121
 122#define PIN_CFG_DEFAULT         (0)
 123
 124#define PIN_CFG(num, alt)               \
 125        (PIN_CFG_DEFAULT |\
 126         (PIN_NUM(num) | PIN_##alt))
 127
 128#define PIN_CFG_INPUT(num, alt, pull)           \
 129        (PIN_CFG_DEFAULT |\
 130         (PIN_NUM(num) | PIN_##alt | PIN_INPUT_##pull))
 131
 132#define PIN_CFG_OUTPUT(num, alt, val)           \
 133        (PIN_CFG_DEFAULT |\
 134         (PIN_NUM(num) | PIN_##alt | PIN_OUTPUT_##val))
 135
 136#define PIN_CFG_PULL(num, alt, pull)    \
 137        ((PIN_CFG_DEFAULT & ~PIN_PULL_MASK) |\
 138         (PIN_NUM(num) | PIN_##alt | PIN_PULL_##pull))
 139
 140extern int nmk_config_pin(pin_cfg_t cfg, bool sleep);
 141extern int nmk_config_pins(pin_cfg_t *cfgs, int num);
 142extern int nmk_config_pins_sleep(pin_cfg_t *cfgs, int num);
 143
 144#endif
 145