diff options
Diffstat (limited to 'arch/arm/plat-mxc/iomux-v3.c')
-rw-r--r-- | arch/arm/plat-mxc/iomux-v3.c | 67 |
1 files changed, 66 insertions, 1 deletions
diff --git a/arch/arm/plat-mxc/iomux-v3.c b/arch/arm/plat-mxc/iomux-v3.c index b318c6a222d5..8734103bf790 100644 --- a/arch/arm/plat-mxc/iomux-v3.c +++ b/arch/arm/plat-mxc/iomux-v3.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2006 Freescale Semiconductor, Inc. All Rights Reserved. + * Copyright 2004-2011 Freescale Semiconductor, Inc. * Copyright (C) 2008 by Sascha Hauer <kernel@pengutronix.de> * Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH, * <armlinux@phytec.de> @@ -32,6 +32,35 @@ static void __iomem *base; /* + * Read a single pad in the iomuxer + */ +int mxc_iomux_v3_get_pad(struct pad_desc *pad) +{ + pad->mux_mode = __raw_readl(base + pad->mux_ctrl_ofs) & 0xFF; + pad->pad_ctrl = __raw_readl(base + pad->pad_ctrl_ofs) & 0x1FFFF; + pad->select_input = __raw_readl(base + pad->select_input_ofs) & 0x7; + + return 0; +} +EXPORT_SYMBOL(mxc_iomux_v3_get_pad); + +/* + * Read multiple pads in the iomuxer + */ +int mxc_iomux_v3_get_multiple_pads(struct pad_desc *pad_list, unsigned count) +{ + struct pad_desc *p = pad_list; + int i; + int ret; + + for (i = 0; i < count; i++) { + mxc_iomux_v3_get_pad(p); + p++; + } + return 0; +} +EXPORT_SYMBOL(mxc_iomux_v3_get_multiple_pads); +/* * setups a single pad in the iomuxer */ int mxc_iomux_v3_setup_pad(struct pad_desc *pad) @@ -65,6 +94,42 @@ int mxc_iomux_v3_setup_multiple_pads(struct pad_desc *pad_list, unsigned count) } EXPORT_SYMBOL(mxc_iomux_v3_setup_multiple_pads); +int mxc_iomux_v3_setup_pad_ext(struct pad_cfg *pd) +{ + struct pad_desc *pad = &(pd->pd); + + if (pad->mux_ctrl_ofs) + __raw_writel(pad->mux_mode, base + pad->mux_ctrl_ofs); + + if (pad->select_input_ofs) + __raw_writel(pad->select_input, + base + pad->select_input_ofs); + + if (pd->pad_ctrl && pad->pad_ctrl_ofs) + __raw_writel(pd->pad_ctrl, base + pad->pad_ctrl_ofs); + else if (!(pad->pad_ctrl & NO_PAD_CTRL) && pad->pad_ctrl_ofs) + __raw_writel(pad->pad_ctrl, base + pad->pad_ctrl_ofs); + return 0; +} +EXPORT_SYMBOL(mxc_iomux_v3_setup_pad_ext); + +int mxc_iomux_v3_setup_multiple_pads_ext(struct pad_cfg *pad_list, + unsigned count) +{ + struct pad_cfg *p = pad_list; + int i; + int ret; + + for (i = 0; i < count; i++) { + ret = mxc_iomux_v3_setup_pad_ext(p); + if (ret) + return ret; + p++; + } + return 0; +} +EXPORT_SYMBOL(mxc_iomux_v3_setup_multiple_pads_ext); + void mxc_iomux_v3_init(void __iomem *iomux_v3_base) { base = iomux_v3_base; |