Path: blob/master/arch/arm/mach-mxs/include/mach/iomux.h
10820 views
/*1* Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH,2* <[email protected]>3* Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved.4*5* This program is free software; you can redistribute it and/or6* modify it under the terms of the GNU General Public License7* as published by the Free Software Foundation; either version 28* of the License, or (at your option) any later version.9* This program is distributed in the hope that it will be useful,10* but WITHOUT ANY WARRANTY; without even the implied warranty of11* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12* GNU General Public License for more details.13*14* You should have received a copy of the GNU General Public License15* along with this program; if not, write to the Free Software16* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,17* MA 02110-1301, USA.18*/1920#ifndef __MACH_MXS_IOMUX_H__21#define __MACH_MXS_IOMUX_H__2223/*24* IOMUX/PAD Bit field definitions25*26* PAD_BANK: 0..2 (3)27* PAD_PIN: 3..7 (5)28* PAD_MUXSEL: 8..9 (2)29* PAD_MA: 10..11 (2)30* PAD_MA_VALID: 12 (1)31* PAD_VOL: 13 (1)32* PAD_VOL_VALID: 14 (1)33* PAD_PULL: 15 (1)34* PAD_PULL_VALID: 16 (1)35* RESERVED: 17..31 (15)36*/37typedef u32 iomux_cfg_t;3839#define MXS_PAD_BANK_SHIFT 040#define MXS_PAD_BANK_MASK ((iomux_cfg_t)0x7 << MXS_PAD_BANK_SHIFT)41#define MXS_PAD_PIN_SHIFT 342#define MXS_PAD_PIN_MASK ((iomux_cfg_t)0x1f << MXS_PAD_PIN_SHIFT)43#define MXS_PAD_MUXSEL_SHIFT 844#define MXS_PAD_MUXSEL_MASK ((iomux_cfg_t)0x3 << MXS_PAD_MUXSEL_SHIFT)45#define MXS_PAD_MA_SHIFT 1046#define MXS_PAD_MA_MASK ((iomux_cfg_t)0x3 << MXS_PAD_MA_SHIFT)47#define MXS_PAD_MA_VALID_SHIFT 1248#define MXS_PAD_MA_VALID_MASK ((iomux_cfg_t)0x1 << MXS_PAD_MA_VALID_SHIFT)49#define MXS_PAD_VOL_SHIFT 1350#define MXS_PAD_VOL_MASK ((iomux_cfg_t)0x1 << MXS_PAD_VOL_SHIFT)51#define MXS_PAD_VOL_VALID_SHIFT 1452#define MXS_PAD_VOL_VALID_MASK ((iomux_cfg_t)0x1 << MXS_PAD_VOL_VALID_SHIFT)53#define MXS_PAD_PULL_SHIFT 1554#define MXS_PAD_PULL_MASK ((iomux_cfg_t)0x1 << MXS_PAD_PULL_SHIFT)55#define MXS_PAD_PULL_VALID_SHIFT 1656#define MXS_PAD_PULL_VALID_MASK ((iomux_cfg_t)0x1 << MXS_PAD_PULL_VALID_SHIFT)5758#define PAD_MUXSEL_0 059#define PAD_MUXSEL_1 160#define PAD_MUXSEL_2 261#define PAD_MUXSEL_GPIO 36263#define PAD_4MA 064#define PAD_8MA 165#define PAD_12MA 266#define PAD_16MA 36768#define PAD_1V8 069#define PAD_3V3 17071#define PAD_NOPULL 072#define PAD_PULLUP 17374#define MXS_PAD_4MA ((PAD_4MA << MXS_PAD_MA_SHIFT) | \75MXS_PAD_MA_VALID_MASK)76#define MXS_PAD_8MA ((PAD_8MA << MXS_PAD_MA_SHIFT) | \77MXS_PAD_MA_VALID_MASK)78#define MXS_PAD_12MA ((PAD_12MA << MXS_PAD_MA_SHIFT) | \79MXS_PAD_MA_VALID_MASK)80#define MXS_PAD_16MA ((PAD_16MA << MXS_PAD_MA_SHIFT) | \81MXS_PAD_MA_VALID_MASK)8283#define MXS_PAD_1V8 ((PAD_1V8 << MXS_PAD_VOL_SHIFT) | \84MXS_PAD_VOL_VALID_MASK)85#define MXS_PAD_3V3 ((PAD_3V3 << MXS_PAD_VOL_SHIFT) | \86MXS_PAD_VOL_VALID_MASK)8788#define MXS_PAD_NOPULL ((PAD_NOPULL << MXS_PAD_PULL_SHIFT) | \89MXS_PAD_PULL_VALID_MASK)90#define MXS_PAD_PULLUP ((PAD_PULLUP << MXS_PAD_PULL_SHIFT) | \91MXS_PAD_PULL_VALID_MASK)9293/* generic pad control used in most cases */94#define MXS_PAD_CTRL (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL)9596#define MXS_IOMUX_PAD(_bank, _pin, _muxsel, _ma, _vol, _pull) \97(((iomux_cfg_t)(_bank) << MXS_PAD_BANK_SHIFT) | \98((iomux_cfg_t)(_pin) << MXS_PAD_PIN_SHIFT) | \99((iomux_cfg_t)(_muxsel) << MXS_PAD_MUXSEL_SHIFT) | \100((iomux_cfg_t)(_ma) << MXS_PAD_MA_SHIFT) | \101((iomux_cfg_t)(_vol) << MXS_PAD_VOL_SHIFT) | \102((iomux_cfg_t)(_pull) << MXS_PAD_PULL_SHIFT))103104/*105* A pad becomes naked, when none of mA, vol or pull106* validity bits is set.107*/108#define MXS_IOMUX_PAD_NAKED(_bank, _pin, _muxsel) \109MXS_IOMUX_PAD(_bank, _pin, _muxsel, 0, 0, 0)110111static inline unsigned int PAD_BANK(iomux_cfg_t pad)112{113return (pad & MXS_PAD_BANK_MASK) >> MXS_PAD_BANK_SHIFT;114}115116static inline unsigned int PAD_PIN(iomux_cfg_t pad)117{118return (pad & MXS_PAD_PIN_MASK) >> MXS_PAD_PIN_SHIFT;119}120121static inline unsigned int PAD_MUXSEL(iomux_cfg_t pad)122{123return (pad & MXS_PAD_MUXSEL_MASK) >> MXS_PAD_MUXSEL_SHIFT;124}125126static inline unsigned int PAD_MA(iomux_cfg_t pad)127{128return (pad & MXS_PAD_MA_MASK) >> MXS_PAD_MA_SHIFT;129}130131static inline unsigned int PAD_MA_VALID(iomux_cfg_t pad)132{133return (pad & MXS_PAD_MA_VALID_MASK) >> MXS_PAD_MA_VALID_SHIFT;134}135136static inline unsigned int PAD_VOL(iomux_cfg_t pad)137{138return (pad & MXS_PAD_VOL_MASK) >> MXS_PAD_VOL_SHIFT;139}140141static inline unsigned int PAD_VOL_VALID(iomux_cfg_t pad)142{143return (pad & MXS_PAD_VOL_VALID_MASK) >> MXS_PAD_VOL_VALID_SHIFT;144}145146static inline unsigned int PAD_PULL(iomux_cfg_t pad)147{148return (pad & MXS_PAD_PULL_MASK) >> MXS_PAD_PULL_SHIFT;149}150151static inline unsigned int PAD_PULL_VALID(iomux_cfg_t pad)152{153return (pad & MXS_PAD_PULL_VALID_MASK) >> MXS_PAD_PULL_VALID_SHIFT;154}155156/*157* configures a single pad in the iomuxer158*/159int mxs_iomux_setup_pad(iomux_cfg_t pad);160161/*162* configures multiple pads163* convenient way to call the above function with tables164*/165int mxs_iomux_setup_multiple_pads(const iomux_cfg_t *pad_list, unsigned count);166167#endif /* __MACH_MXS_IOMUX_H__*/168169170