From mboxrd@z Thu Jan 1 00:00:00 1970 From: u.kleine-koenig@pengutronix.de (Uwe =?iso-8859-1?Q?Kleine-K=F6nig?=) Date: Tue, 30 Nov 2010 17:32:34 +0100 Subject: [PATCH 08/15] ARM: mxs: Add iomux support In-Reply-To: <1290754154-9428-9-git-send-email-shawn.guo@freescale.com> References: <1290754154-9428-1-git-send-email-shawn.guo@freescale.com> <1290754154-9428-9-git-send-email-shawn.guo@freescale.com> Message-ID: <20101130163234.GS20449@pengutronix.de> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Fri, Nov 26, 2010 at 02:49:07PM +0800, Shawn Guo wrote: > MXS-based SoCs implements iomux functions in block PINCTRL. > > Signed-off-by: Shawn Guo > --- > arch/arm/mach-mxs/include/mach/iomux-mx23.h | 29 +++++++ > arch/arm/mach-mxs/include/mach/iomux-mx28.h | 44 +++++++++++ > arch/arm/mach-mxs/include/mach/iomux.h | 77 +++++++++++++++++++ > arch/arm/mach-mxs/iomux.c | 110 +++++++++++++++++++++++++++ > 4 files changed, 260 insertions(+), 0 deletions(-) > create mode 100644 arch/arm/mach-mxs/include/mach/iomux-mx23.h > create mode 100644 arch/arm/mach-mxs/include/mach/iomux-mx28.h > create mode 100644 arch/arm/mach-mxs/include/mach/iomux.h > create mode 100644 arch/arm/mach-mxs/iomux.c > > diff --git a/arch/arm/mach-mxs/include/mach/iomux-mx23.h b/arch/arm/mach-mxs/include/mach/iomux-mx23.h > new file mode 100644 > index 0000000..3fc0439 > --- /dev/null > +++ b/arch/arm/mach-mxs/include/mach/iomux-mx23.h > @@ -0,0 +1,29 @@ > +/* > + * Copyright (C) 2009-2010 Amit Kucheria > + * Copyright (C) 2010 Freescale Semiconductor, Inc. > + * > + * The code contained herein is licensed under the GNU General Public > + * License. You may obtain a copy of the GNU General Public License > + * Version 2 or later at the following locations: > + * > + * http://www.opensource.org/licenses/gpl-license.html > + * http://www.gnu.org/copyleft/gpl.html > + */ > + > +#ifndef __MACH_IOMUX_MX23_H__ > +#define __MACH_IOMUX_MX23_H__ > + > +#include > + > +/* > + * The naming convention for the pad modes is MX23_PAD___ > + * If or refers to a GPIO, it is named GPIO__ > + * See also iomux.h > + * > + * BANK PIN MUX VOL MA PULL > + */ > +/* DUART */ > +#define MX23_PAD_PWM0__DUART_RX IOMUX_PAD(1, 26, PAD_MUXSEL_2, PAD_VOL_NONE, PAD_4MA, PAD_NOPULL) > +#define MX23_PAD_PWM1__DUART_TX IOMUX_PAD(1, 27, PAD_MUXSEL_2, PAD_VOL_NONE, PAD_4MA, PAD_NOPULL) > + > +#endif /* __MACH_IOMUX_MX23_H__ */ > diff --git a/arch/arm/mach-mxs/include/mach/iomux-mx28.h b/arch/arm/mach-mxs/include/mach/iomux-mx28.h > new file mode 100644 > index 0000000..ca37a15 > --- /dev/null > +++ b/arch/arm/mach-mxs/include/mach/iomux-mx28.h > @@ -0,0 +1,44 @@ > +/* > + * Copyright (C) 2009-2010 Amit Kucheria > + * Copyright (C) 2010 Freescale Semiconductor, Inc. > + * > + * The code contained herein is licensed under the GNU General Public > + * License. You may obtain a copy of the GNU General Public License > + * Version 2 or later at the following locations: > + * > + * http://www.opensource.org/licenses/gpl-license.html > + * http://www.gnu.org/copyleft/gpl.html > + */ > + > +#ifndef __MACH_IOMUX_MX28_H__ > +#define __MACH_IOMUX_MX28_H__ > + > +#include > + > +/* > + * The naming convention for the pad modes is MX28_PAD___ > + * If or refers to a GPIO, it is named GPIO__ > + * See also iomux.h > + * > + * BANK PIN MUX VOL MA PULL > + */ > +/* DUART */ > +#define MX28_PAD_PWM0__DUART_RX IOMUX_PAD(3, 16, PAD_MUXSEL_2, PAD_3V3, PAD_4MA, PAD_NOPULL) > +#define MX28_PAD_PWM1__DUART_TX IOMUX_PAD(3, 17, PAD_MUXSEL_2, PAD_3V3, PAD_4MA, PAD_NOPULL) > + > +/* FEC */ > +#define MX28_PAD_ENET0_MDC__ENET0_MDC IOMUX_PAD(4, 0, PAD_MUXSEL_0, PAD_3V3, PAD_8MA, PAD_PULL) > +#define MX28_PAD_ENET0_MDIO__ENET0_MDIO IOMUX_PAD(4, 1, PAD_MUXSEL_0, PAD_3V3, PAD_8MA, PAD_PULL) > +#define MX28_PAD_ENET0_RX_EN__ENET0_RX_EN IOMUX_PAD(4, 2, PAD_MUXSEL_0, PAD_3V3, PAD_8MA, PAD_PULL) > +#define MX28_PAD_ENET0_RXD0__ENET0_RXD0 IOMUX_PAD(4, 3, PAD_MUXSEL_0, PAD_3V3, PAD_8MA, PAD_PULL) > +#define MX28_PAD_ENET0_RXD1__ENET0_RXD1 IOMUX_PAD(4, 4, PAD_MUXSEL_0, PAD_3V3, PAD_8MA, PAD_PULL) > +#define MX28_PAD_ENET0_TX_EN__ENET0_TX_EN IOMUX_PAD(4, 6, PAD_MUXSEL_0, PAD_3V3, PAD_8MA, PAD_PULL) > +#define MX28_PAD_ENET0_TXD0__ENET0_TXD0 IOMUX_PAD(4, 7, PAD_MUXSEL_0, PAD_3V3, PAD_8MA, PAD_PULL) > +#define MX28_PAD_ENET0_TXD1__ENET0_TXD1 IOMUX_PAD(4, 8, PAD_MUXSEL_0, PAD_3V3, PAD_8MA, PAD_PULL) > +#define MX28_PAD_ENET_CLK__ENET_CLK IOMUX_PAD(4, 16, PAD_MUXSEL_0, PAD_3V3, PAD_8MA, PAD_PULL) > + > +/* GPIO */ > +#define MX28_PAD_SSP1_DATA3__GPIO_2_15 IOMUX_PAD(2, 15, PAD_MUXSEL_GPIO, PAD_3V3, PAD_4MA, PAD_NOPULL) > +#define MX28_PAD_ENET0_RX_CLK__GPIO_4_13 IOMUX_PAD(4, 13, PAD_MUXSEL_GPIO, PAD_3V3, PAD_4MA, PAD_NOPULL) > + > +#endif /* __MACH_IOMUX_MX28_H__ */ > diff --git a/arch/arm/mach-mxs/include/mach/iomux.h b/arch/arm/mach-mxs/include/mach/iomux.h > new file mode 100644 > index 0000000..27bcada > --- /dev/null > +++ b/arch/arm/mach-mxs/include/mach/iomux.h > @@ -0,0 +1,77 @@ > +/* > + * Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH, > + * > + * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved. > + * > + * 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., 51 Franklin Street, Fifth Floor, Boston, > + * MA 02110-1301, USA. > + */ > + > +#ifndef __MACH_MXS_IOMUX_H__ > +#define __MACH_MXS_IOMUX_H__ > + > +typedef struct pad_desc { > + unsigned bank:3; > + unsigned pin:5; > + unsigned muxsel:2; > + unsigned ma:3; > + unsigned vol:2; > + unsigned pull:1; > +} iomux_cfg_t; mxc just switches to u64 (IIRC) for pad descriptions because the values are easier to manipulate. This would be better for mxs, too. > + > +#define IOMUX_PAD(_bank, _pin, _muxsel, _vol, _ma, _pull) \ > + { \ > + .bank = _bank, \ > + .pin = _pin, \ > + .muxsel = _muxsel, \ > + .vol = _vol, \ > + .ma = _ma, \ > + .pull = _pull, \ > + } > + > +#define PAD_MUXSEL_0 0 > +#define PAD_MUXSEL_1 1 > +#define PAD_MUXSEL_2 2 > +#define PAD_MUXSEL_GPIO 3 > + > +#define PAD_1V8 0 > +#define PAD_3V3 1 > +#define PAD_VOL_NONE 2 > + > +#define PAD_4MA 0 > +#define PAD_8MA 1 > +#define PAD_12MA 2 > +#define PAD_16MA 3 > +#define PAD_MA_NONE 4 > + > +#define PAD_NOPULL 0 > +#define PAD_PULL 1 > + > +/* > + * setups a single pad in the iomuxer > + */ > +int mxs_iomux_setup_pad(iomux_cfg_t *pad); > + > +/* > + * setups multiple pads > + * convenient way to call the above function with tables > + */ > +int mxs_iomux_setup_multiple_pads(iomux_cfg_t *pad_list, unsigned count); > + > +/* > + * Initialise the iomux controller > + */ > +void mxs_iomux_init(void __iomem *iomux_base); > + > +#endif /* __MACH_MXS_IOMUX_H__*/ > diff --git a/arch/arm/mach-mxs/iomux.c b/arch/arm/mach-mxs/iomux.c > new file mode 100644 > index 0000000..803cadf > --- /dev/null > +++ b/arch/arm/mach-mxs/iomux.c > @@ -0,0 +1,110 @@ > +/* > + * Copyright 2004-2006,2010 Freescale Semiconductor, Inc. All Rights Reserved. > + * Copyright (C) 2008 by Sascha Hauer > + * Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH, > + * > + * > + * 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., 51 Franklin Street, Fifth Floor, Boston, > + * MA 02110-1301, USA. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +#include > +#include > + > +static void __iomem *base; > + > +/* > + * configures a single pad in the iomuxer > + */ > +int mxs_iomux_setup_pad(iomux_cfg_t *pad) > +{ > + u32 reg, ofs, bp, bm; > + > + /* muxsel */ > + ofs = pad->bank * 0x20 + pad->pin / 16 * 0x10; > + bp = pad->pin % 16 * 2; > + bm = 0x3 << bp; > + reg = __raw_readl(base + ofs); > + reg &= ~bm; > + reg |= pad->muxsel << bp; > + __raw_writel(reg, base + ofs); > + > + /* drive */ > + ofs = cpu_is_mx23() ? 0x200 : 0x300; > + ofs += pad->bank * 0x40 + pad->pin / 8 * 0x10; > + /* ma */ > + if (pad->ma != PAD_MA_NONE) > + { > + bp = pad->pin % 8 * 4; > + bm = 0x3 << bp; > + reg = __raw_readl(base + ofs); > + reg &= ~bm; > + reg |= pad->ma << bp; > + __raw_writel(reg, base + ofs); > + } > + /* vol */ > + if (pad->vol != PAD_VOL_NONE) > + { > + bp = pad->pin % 8 * 4 + 2; > + bm = 0x1 << bp; > + reg = __raw_readl(base + ofs); > + reg &= ~bm; > + reg |= pad->vol << bp; > + __raw_writel(reg, base + ofs); > + } > + > + /* pull */ > + ofs = cpu_is_mx23() ? 0x400 : 0x600; > + ofs += pad->bank * 0x10; > + bp = pad->pin; > + bm = 0x1 << bp; > + reg = __raw_readl(base + ofs); > + reg &= ~bm; > + reg |= pad->pull << bp; > + __raw_writel(reg, base + ofs); > + > + return 0; > +} > +EXPORT_SYMBOL(mxs_iomux_setup_pad); Really needed? > + > +int mxs_iomux_setup_multiple_pads(iomux_cfg_t *pad_list, unsigned count) > +{ > + iomux_cfg_t *p = pad_list; > + int i; > + int ret; > + > + for (i = 0; i < count; i++) { > + ret = mxs_iomux_setup_pad(p); > + if (ret) > + return ret; > + p++; > + } > + > + return 0; > +} > +EXPORT_SYMBOL(mxs_iomux_setup_multiple_pads); > + > +void mxs_iomux_init(void __iomem *iomux_base) > +{ > + base = iomux_base; > +} Best regards Uwe -- Pengutronix e.K. | Uwe Kleine-K?nig | Industrial Linux Solutions | http://www.pengutronix.de/ |