On Friday 19 December 2008, Sudhakar Rajashekhara wrote:
> Generalizes dm644x pinmux.
> 
> The existing pinmux layer works only when the PINMUX register has single bit
> field to enable the secondary function. DM646x can support secondary as well
> as tertiary pin functions. This new pinmux layer is similar to the one being
> used by OMAP architecture.
>
> Checkpatch script reports a false positive error at line no.465 of this patch.
> 
> This patch is based on the work originally done by Vladimir Barinov, when he
> was in MontaVista.
> 
> Signed-off-by: Sudhakar Rajashekhara <[email protected]>

Acked-by: David Brownell <[email protected]>


> ---
>  arch/arm/mach-davinci/Kconfig            |   25 ++++
>  arch/arm/mach-davinci/Makefile           |    4 +-
>  arch/arm/mach-davinci/include/mach/mux.h |  194 
> ++++++++++++++++++++++--------
>  arch/arm/mach-davinci/io.c               |    2 +
>  arch/arm/mach-davinci/mux.c              |   98 +++++++++++++---
>  arch/arm/mach-davinci/mux_cfg.c          |  136 +++++++++++++++++++++
>  arch/arm/mach-davinci/psc.c              |   31 +++---
>  drivers/mtd/nand/davinci_nand.c          |   20 ++--
>  8 files changed, 413 insertions(+), 97 deletions(-)
>  create mode 100644 arch/arm/mach-davinci/mux_cfg.c
> 
> diff --git a/arch/arm/mach-davinci/Kconfig b/arch/arm/mach-davinci/Kconfig
> index f82e6f4..20e55ea 100644
> --- a/arch/arm/mach-davinci/Kconfig
> +++ b/arch/arm/mach-davinci/Kconfig
> @@ -50,6 +50,31 @@ config MACH_DAVINCI_SFFSDR
>         Say Y here to select the Lyrtech Small Form Factor
>         Software Defined Radio (SFFSDR) board.
>  
> +config DAVINCI_MUX
> +     bool "DAVINCI multiplexing support"
> +     depends on ARCH_DAVINCI
> +     default y
> +     help
> +       Pin multiplexing support for DAVINCI boards. If your bootloader
> +       sets the multiplexing correctly, say N. Otherwise, or if unsure,
> +       say Y.
> +
> +config DAVINCI_MUX_DEBUG
> +        bool "Multiplexing debug output"
> +        depends on DAVINCI_MUX
> +        help
> +          Makes the multiplexing functions print out a lot of debug info.
> +          This is useful if you want to find out the correct values of the
> +          multiplexing registers.
> +
> +config DAVINCI_MUX_WARNINGS
> +        bool "Warn about pins the bootloader didn't set up"
> +        depends on DAVINCI_MUX
> +        help
> +          Choose Y here to warn whenever driver initialization logic needs
> +          to change the pin multiplexing setup.  When there are no warnings
> +          printed, it's safe to deselect DAVINCI_MUX for your product.
> +
>  config DAVINCI_RESET_CLOCKS
>       bool "Reset unused clocks during boot"
>       depends on ARCH_DAVINCI
> diff --git a/arch/arm/mach-davinci/Makefile b/arch/arm/mach-davinci/Makefile
> index 2a339db..24a9195 100644
> --- a/arch/arm/mach-davinci/Makefile
> +++ b/arch/arm/mach-davinci/Makefile
> @@ -5,7 +5,9 @@
>  
>  # Common objects
>  obj-y                        := time.o irq.o clock.o serial.o io.o id.o 
> psc.o \
> -                        gpio.o mux.o devices.o usb.o dma.o common.o iram.o
> +                        gpio.o devices.o usb.o dma.o common.o iram.o
> +
> +obj-$(CONFIG_DAVINCI_MUX)            += mux.o mux_cfg.o
>  
>  # Board specific
>  obj-$(CONFIG_MACH_DAVINCI_EVM)       += board-dm644x-evm.o
> diff --git a/arch/arm/mach-davinci/include/mach/mux.h 
> b/arch/arm/mach-davinci/include/mach/mux.h
> index 9e7cf69..cfe59cd 100644
> --- a/arch/arm/mach-davinci/include/mach/mux.h
> +++ b/arch/arm/mach-davinci/include/mach/mux.h
> @@ -1,60 +1,152 @@
>  /*
> - * DaVinci pin multiplexing defines
> + * Table of the DAVINCI register configurations for the PINMUX combinations
>   *
>   * Author: Vladimir Barinov, MontaVista Software, Inc. <[email protected]>
>   *
> + * Based on linux/include/asm-arm/arch-omap/mux.h:
> + * Copyright (C) 2003 - 2005 Nokia Corporation
> + *
> + * Written by Tony Lindgren
> + *
>   * 2007 (c) MontaVista Software, Inc. This file is licensed under
>   * the terms of the GNU General Public License version 2. This program
>   * is licensed "as is" without any warranty of any kind, whether express
>   * or implied.
> + *
> + * Copyright (C) 2008 Texas Instruments.
>   */
> -#ifndef __ASM_ARCH_MUX_H
> -#define __ASM_ARCH_MUX_H
> -
> -/* System control register offsets */
> -#define PINMUX0              0x00
> -#define PINMUX1                      0x04
> -
> -/* System control register bits */
> -#define DAVINCI_MUX_AEAW0    0
> -#define DAVINCI_MUX_AEAW1    1
> -#define DAVINCI_MUX_AEAW2    2
> -#define DAVINCI_MUX_AEAW3    3
> -#define DAVINCI_MUX_AEAW4    4
> -#define DAVINCI_MUX_AECS4    10
> -#define DAVINCI_MUX_AECS5    11
> -#define DAVINCI_MUX_VLYNQWD0 12
> -#define DAVINCI_MUX_VLYNQWD1 13
> -#define DAVINCI_MUX_VLSCREN  14
> -#define DAVINCI_MUX_VLYNQEN  15
> -#define DAVINCI_MUX_HDIREN   16
> -#define DAVINCI_MUX_ATAEN    17
> -#define DAVINCI_MUX_RGB666   22
> -#define DAVINCI_MUX_RGB888   23
> -#define DAVINCI_MUX_LOEEN    24
> -#define DAVINCI_MUX_LFLDEN   25
> -#define DAVINCI_MUX_CWEN     26
> -#define DAVINCI_MUX_CFLDEN   27
> -#define DAVINCI_MUX_HPIEN    29
> -#define DAVINCI_MUX_1394EN   30
> -#define DAVINCI_MUX_EMACEN   31
> -
> -#define DAVINCI_MUX_LEVEL2   32
> -#define DAVINCI_MUX_UART0    (DAVINCI_MUX_LEVEL2 + 0)
> -#define DAVINCI_MUX_UART1    (DAVINCI_MUX_LEVEL2 + 1)
> -#define DAVINCI_MUX_UART2    (DAVINCI_MUX_LEVEL2 + 2)
> -#define DAVINCI_MUX_U2FLO    (DAVINCI_MUX_LEVEL2 + 3)
> -#define DAVINCI_MUX_PWM0     (DAVINCI_MUX_LEVEL2 + 4)
> -#define DAVINCI_MUX_PWM1     (DAVINCI_MUX_LEVEL2 + 5)
> -#define DAVINCI_MUX_PWM2     (DAVINCI_MUX_LEVEL2 + 6)
> -#define DAVINCI_MUX_I2C              (DAVINCI_MUX_LEVEL2 + 7)
> -#define DAVINCI_MUX_SPI              (DAVINCI_MUX_LEVEL2 + 8)
> -#define DAVINCI_MUX_MSTK     (DAVINCI_MUX_LEVEL2 + 9)
> -#define DAVINCI_MUX_ASP              (DAVINCI_MUX_LEVEL2 + 10)
> -#define DAVINCI_MUX_CLK0     (DAVINCI_MUX_LEVEL2 + 16)
> -#define DAVINCI_MUX_CLK1     (DAVINCI_MUX_LEVEL2 + 17)
> -#define DAVINCI_MUX_TIMIN    (DAVINCI_MUX_LEVEL2 + 18)
> -
> -extern void davinci_mux_peripheral(unsigned int mux, unsigned int enable);
> -
> -#endif /* __ASM_ARCH_MUX_H */
> +
> +#ifndef __INC_MACH_MUX_H
> +#define __INC_MACH_MUX_H
> +
> +#include <mach/dm644x.h>
> +
> +/* System module registers */
> +#define PINMUX0                 (DAVINCI_SYSTEM_MODULE_BASE + 0x00)
> +#define PINMUX1                 (DAVINCI_SYSTEM_MODULE_BASE + 0x04)
> +/* dm355 only */
> +#define PINMUX2                 (DAVINCI_SYSTEM_MODULE_BASE + 0x08)
> +#define PINMUX3                 (DAVINCI_SYSTEM_MODULE_BASE + 0x0c)
> +#define PINMUX4                 (DAVINCI_SYSTEM_MODULE_BASE + 0x10)
> +
> +struct mux_config {
> +     char *name;
> +     const char *mux_reg_name;
> +     const unsigned int mux_reg;
> +     const unsigned char mask_offset;
> +     const unsigned char mask;
> +     const unsigned char mode;
> +     bool debug;
> +};
> +
> +enum davinci_dm644x_index {
> +     /* ATA and HDDIR functions */
> +     DM644X_HDIREN,
> +     DM644X_ATAEN,
> +     DM644X_ATAEN_DISABLE,
> +
> +     /* HPI functions */
> +     DM644X_HPIEN_DISABLE,
> +
> +     /* AEAW functions */
> +     DM644X_AEAW,
> +
> +     /* Memory Stick */
> +     DM644X_MSTK,
> +
> +     /* I2C */
> +     DM644X_I2C,
> +
> +     /* ASP function */
> +     DM644X_MCBSP,
> +
> +     /* PWM0 */
> +     DM644X_PWM0,
> +
> +     /* PWM1 */
> +     DM644X_PWM1,
> +
> +     /* PWM2 */
> +     DM644X_PWM2,
> +
> +     /* VLYNQ function */
> +     DM644X_VLYNQEN,
> +     DM644X_VLSCREN,
> +     DM644X_VLYNQWD,
> +
> +     /* EMAC and MDIO function */
> +     DM644X_EMACEN,
> +
> +     /* GPIO3V[0:16] pins */
> +     DM644X_GPIO3V,
> +
> +     /* GPIO pins */
> +     DM644X_GPIO0,
> +     DM644X_GPIO3,
> +     DM644X_GPIO43_44,
> +     DM644X_GPIO46_47,
> +
> +     /* VPBE */
> +     DM644X_RGB666,
> +
> +     /* LCD */
> +     DM644X_LOEEN,
> +     DM644X_LFLDEN,
> +};
> +
> +enum davinci_dm646x_index {
> +     /* ATA function */
> +     DM646X_ATAEN,
> +
> +     /* AUDIO Clock */
> +     DM646X_AUDCK1,
> +     DM646X_AUDCK0,
> +};
> +
> +enum davinci_dm355_index {
> +     /* MMC/SD 0 */
> +     DM355_MMCSD0,
> +
> +     /* MMC/SD 1 */
> +     DM355_SD1_CLK,
> +     DM355_SD1_CMD,
> +     DM355_SD1_DATA3,
> +     DM355_SD1_DATA2,
> +     DM355_SD1_DATA1,
> +     DM355_SD1_DATA0,
> +
> +     /* I2C */
> +     DM355_I2C_SDA,
> +     DM355_I2C_SCL,
> +
> +     /* ASP function */
> +     DM355_MCBSP0_BDX,
> +     DM355_MCBSP0_X,
> +     DM355_MCBSP0_BFSX,
> +     DM355_MCBSP0_BDR,
> +     DM355_MCBSP0_R,
> +     DM355_MCBSP0_BFSR,
> +
> +     /* SPI0 */
> +     DM355_SPI0_SDI,
> +     DM355_SPI0_SDENA0,
> +     DM355_SPI0_SDENA1,
> +};
> +
> +#ifdef CONFIG_DAVINCI_MUX
> +/* setup pin muxing */
> +extern void davinci_mux_init(void);
> +extern int davinci_mux_register(const struct mux_config *pins,
> +                             unsigned long size);
> +extern int davinci_cfg_reg(unsigned long reg_cfg);
> +#else
> +/* boot loader does it all (no warnings from CONFIG_DAVINCI_MUX_WARNINGS) */
> +static inline void davinci_mux_init(void)
> +{
> +}
> +static inline int davinci_cfg_reg(unsigned long reg_cfg) { return 0; }
> +#endif
> +
> +extern void (*davinci_pinmux_setup)(unsigned int id);
> +
> +#endif /* __INC_MACH_MUX_H */
> diff --git a/arch/arm/mach-davinci/io.c b/arch/arm/mach-davinci/io.c
> index 299515f..c493889 100644
> --- a/arch/arm/mach-davinci/io.c
> +++ b/arch/arm/mach-davinci/io.c
> @@ -18,6 +18,7 @@
>  
>  #include <asm/mach/map.h>
>  #include <mach/clock.h>
> +#include <mach/mux.h>
>  
>  extern void davinci_check_revision(void);
>  
> @@ -53,5 +54,6 @@ void __init davinci_map_common_io(void)
>  
>  void __init davinci_init_common_hw(void)
>  {
> +     davinci_mux_init();
>       davinci_clk_init();
>  }
> diff --git a/arch/arm/mach-davinci/mux.c b/arch/arm/mach-davinci/mux.c
> index be33108..7f670f0 100644
> --- a/arch/arm/mach-davinci/mux.c
> +++ b/arch/arm/mach-davinci/mux.c
> @@ -1,39 +1,103 @@
>  /*
> - * DaVinci pin multiplexing configurations
> + * Utility to set the DAVINCI MUX register from a table in mux.h
>   *
>   * Author: Vladimir Barinov, MontaVista Software, Inc. <[email protected]>
>   *
> + * Based on linux/arch/arm/plat-omap/mux.c:
> + * Copyright (C) 2003 - 2005 Nokia Corporation
> + *
> + * Written by Tony Lindgren
> + *
>   * 2007 (c) MontaVista Software, Inc. This file is licensed under
>   * the terms of the GNU General Public License version 2. This program
>   * is licensed "as is" without any warranty of any kind, whether express
>   * or implied.
> + *
> + * Copyright (C) 2008 Texas Instruments.
>   */
>  #include <linux/io.h>
>  #include <linux/module.h>
>  #include <linux/spinlock.h>
>  
>  #include <mach/hardware.h>
> -
>  #include <mach/mux.h>
>  
> -static DEFINE_SPINLOCK(mux_lock);
> +static const struct mux_config *mux_table;
> +static unsigned long pin_table_sz;
>  
> -void davinci_mux_peripheral(unsigned int mux, unsigned int enable)
> +int __init davinci_mux_register(const struct mux_config *pins,
> +                             unsigned long size)
>  {
> -     u32 pinmux, muxreg = PINMUX0;
> +     mux_table = pins;
> +     pin_table_sz = size;
> +
> +     return 0;
> +}
> +
> +/*
> + * Sets the DAVINCI MUX register based on the table
> + */
> +int __init_or_module davinci_cfg_reg(const unsigned long index)
> +{
> +     static DEFINE_SPINLOCK(mux_spin_lock);
> +
> +     unsigned long flags;
> +     const struct mux_config *cfg;
> +     unsigned int reg_orig = 0, reg = 0;
> +     unsigned int mask, warn = 0;
> +
> +     if (!mux_table)
> +             BUG();
> +
> +     if (index >= pin_table_sz) {
> +             printk(KERN_ERR "Invalid pin mux index: %lu (%lu)\n",
> +                    index, pin_table_sz);
> +             dump_stack();
> +             return -ENODEV;
> +     }
> +
> +     cfg = &mux_table[index];
> +
> +     if (cfg->name == NULL) {
> +             printk(KERN_ERR "No entry for the specified index\n");
> +             return -ENODEV;
> +     }
> +
> +     /* Check the mux register in question */
> +     if (cfg->mux_reg) {
> +             unsigned        tmp1, tmp2;
> +
> +             spin_lock_irqsave(&mux_spin_lock, flags);
> +             reg_orig = davinci_readl(cfg->mux_reg);
> +
> +             mask = (cfg->mask << cfg->mask_offset);
> +             tmp1 = reg_orig & mask;
> +             reg = reg_orig & ~mask;
> +
> +             tmp2 = (cfg->mode << cfg->mask_offset);
> +             reg |= tmp2;
> +
> +             if (tmp1 != tmp2)
> +                     warn = 1;
> +
> +             davinci_writel(reg, cfg->mux_reg);
> +             spin_unlock_irqrestore(&mux_spin_lock, flags);
> +     }
> +
> +     if (warn) {
> +#ifdef CONFIG_DAVINCI_MUX_WARNINGS
> +             printk(KERN_WARNING "MUX: initialized %s\n", cfg->name);
> +#endif
> +     }
>  
> -     if (mux >= DAVINCI_MUX_LEVEL2) {
> -             muxreg = PINMUX1;
> -             mux -= DAVINCI_MUX_LEVEL2;
> +#ifdef CONFIG_DAVINCI_MUX_DEBUG
> +     if (cfg->debug || warn) {
> +             printk(KERN_WARNING "MUX: Setting register %s\n", cfg->name);
> +             printk(KERN_WARNING "      %s (0x%08x) = 0x%08x -> 0x%08x\n",
> +                    cfg->mux_reg_name, cfg->mux_reg, reg_orig, reg);
>       }
> +#endif
>  
> -     spin_lock(&mux_lock);
> -     pinmux = davinci_readl(DAVINCI_SYSTEM_MODULE_BASE + muxreg);
> -     if (enable)
> -             pinmux |= (1 << mux);
> -     else
> -             pinmux &= ~(1 << mux);
> -     davinci_writel(pinmux, DAVINCI_SYSTEM_MODULE_BASE + muxreg);
> -     spin_unlock(&mux_lock);
> +     return 0;
>  }
> -EXPORT_SYMBOL(davinci_mux_peripheral);
> +EXPORT_SYMBOL(davinci_cfg_reg);
> diff --git a/arch/arm/mach-davinci/mux_cfg.c b/arch/arm/mach-davinci/mux_cfg.c
> new file mode 100644
> index 0000000..39a55ab
> --- /dev/null
> +++ b/arch/arm/mach-davinci/mux_cfg.c
> @@ -0,0 +1,136 @@
> +/*
> + * DAVINCI pin multiplexing configurations
> + *
> + * Author: Vladimir Barinov, MontaVista Software, Inc. <[email protected]>
> + *
> + * Based on linux/arch/arm/mach-omap1/mux.c:
> + * Copyright (C) 2003 - 2005 Nokia Corporation
> + *
> + * Written by Tony Lindgren
> + *
> + * 2007 (c) MontaVista Software, Inc. This file is licensed under
> + * the terms of the GNU General Public License version 2. This program
> + * is licensed "as is" without any warranty of any kind, whether express
> + * or implied.
> + *
> + * Copyright (C) 2008 Texas Instruments.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/init.h>
> +
> +#include <mach/hardware.h>
> +#include <mach/cpu.h>
> +#include <mach/mux.h>
> +
> +#define MUX_CFG(soc, desc, muxreg, mode_offset, mode_mask, mux_mode, dbg)\
> +[soc##_##desc] = {                                                   \
> +                     .name =  #desc,                                 \
> +                     .debug = dbg,                                   \
> +                     .mux_reg_name = "PINMUX"#muxreg,                \
> +                     .mux_reg = PINMUX##muxreg,                      \
> +                     .mask_offset = mode_offset,                     \
> +                     .mask = mode_mask,                              \
> +                     .mode = mux_mode,                               \
> +             },
> +
> +/*
> + *   soc     description     mux  mode   mode  mux    dbg
> + *                           reg  offset mask  mode
> + */
> +static const struct mux_config davinci_dm644x_pins[] = {
> +MUX_CFG(DM644X, HDIREN,              0,   16,    1,    1,     true)
> +MUX_CFG(DM644X, ATAEN,               0,   17,    1,    1,     true)
> +MUX_CFG(DM644X, ATAEN_DISABLE,       0,   17,    1,    0,     true)
> +
> +MUX_CFG(DM644X, HPIEN_DISABLE,       0,   29,    1,    0,     true)
> +
> +MUX_CFG(DM644X, AEAW,                0,   0,     31,   31,    true)
> +
> +MUX_CFG(DM644X, MSTK,                1,   9,     1,    0,     false)
> +
> +MUX_CFG(DM644X, I2C,         1,   7,     1,    1,     false)
> +
> +MUX_CFG(DM644X, MCBSP,               1,   10,    1,    1,     false)
> +
> +MUX_CFG(DM644X, PWM0,                1,   4,     1,    1,     false)
> +
> +MUX_CFG(DM644X, PWM1,                1,   5,     1,    1,     false)
> +
> +MUX_CFG(DM644X, PWM2,                1,   6,     1,    1,     false)
> +
> +MUX_CFG(DM644X, VLYNQEN,     0,   15,    1,    1,     false)
> +MUX_CFG(DM644X, VLSCREN,     0,   14,    1,    1,     false)
> +MUX_CFG(DM644X, VLYNQWD,     0,   12,    3,    3,     false)
> +
> +MUX_CFG(DM644X, EMACEN,              0,   31,    1,    1,     true)
> +
> +MUX_CFG(DM644X, GPIO3V,              0,   31,    1,    0,     true)
> +
> +MUX_CFG(DM644X, GPIO0,               0,   24,    1,    0,     true)
> +MUX_CFG(DM644X, GPIO3,               0,   25,    1,    0,     false)
> +MUX_CFG(DM644X, GPIO43_44,   1,   7,     1,    0,     false)
> +MUX_CFG(DM644X, GPIO46_47,   0,   22,    1,    0,     true)
> +
> +MUX_CFG(DM644X, RGB666,              0,   22,    1,    1,     true)
> +
> +MUX_CFG(DM644X, LOEEN,               0,   24,    1,    1,     true)
> +MUX_CFG(DM644X, LFLDEN,              0,   25,    1,    1,     false)
> +};
> +
> +/*
> + *   soc     description     mux  mode   mode  mux    dbg
> + *                           reg  offset mask  mode
> + */
> +static const struct mux_config davinci_dm646x_pins[] = {
> +MUX_CFG(DM646X, ATAEN,               0,   0,     1,    1,     true)
> +
> +MUX_CFG(DM646X, AUDCK1,              0,   29,    1,    0,     false)
> +
> +MUX_CFG(DM646X, AUDCK0,              0,   28,    1,    0,     false)
> +};
> +
> +/*
> + *   soc     description     mux  mode   mode  mux    dbg
> + *                           reg  offset mask  mode
> + */
> +static const struct mux_config davinci_dm355_pins[] = {
> +MUX_CFG(DM355,       MMCSD0,         4,   2,     1,    0,     false)
> +
> +MUX_CFG(DM355,       SD1_CLK,        3,   6,     1,    1,     false)
> +MUX_CFG(DM355,       SD1_CMD,        3,   7,     1,    1,     false)
> +MUX_CFG(DM355,       SD1_DATA3,      3,   8,     3,    1,     false)
> +MUX_CFG(DM355,       SD1_DATA2,      3,   10,    3,    1,     false)
> +MUX_CFG(DM355,       SD1_DATA1,      3,   12,    3,    1,     false)
> +MUX_CFG(DM355,       SD1_DATA0,      3,   14,    3,    1,     false)
> +
> +MUX_CFG(DM355,       I2C_SDA,        3,   19,    1,    1,     false)
> +MUX_CFG(DM355,       I2C_SCL,        3,   20,    1,    1,     false)
> +
> +MUX_CFG(DM355,       MCBSP0_BDX,     3,   0,     1,    1,     false)
> +MUX_CFG(DM355,       MCBSP0_X,       3,   1,     1,    1,     false)
> +MUX_CFG(DM355,       MCBSP0_BFSX,    3,   2,     1,    1,     false)
> +MUX_CFG(DM355,       MCBSP0_BDR,     3,   3,     1,    1,     false)
> +MUX_CFG(DM355,       MCBSP0_R,       3,   4,     1,    1,     false)
> +MUX_CFG(DM355,       MCBSP0_BFSR,    3,   5,     1,    1,     false)
> +
> +MUX_CFG(DM355,       SPI0_SDI,       4,   1,     1,    0,     false)
> +MUX_CFG(DM355,       SPI0_SDENA0,    4,   0,     1,    0,     false)
> +MUX_CFG(DM355,       SPI0_SDENA1,    3,   28,    1,    1,     false)
> +};
> +
> +void __init davinci_mux_init(void)
> +{
> +     if (cpu_is_davinci_dm644x())
> +             davinci_mux_register(davinci_dm644x_pins,
> +                                  ARRAY_SIZE(davinci_dm644x_pins));
> +     else if (cpu_is_davinci_dm646x())
> +             davinci_mux_register(davinci_dm646x_pins,
> +                                     ARRAY_SIZE(davinci_dm646x_pins));
> +     else if (cpu_is_davinci_dm355())
> +             davinci_mux_register(davinci_dm355_pins,
> +                                     ARRAY_SIZE(davinci_dm355_pins));
> +     else
> +             printk(KERN_ERR "PSC: DaVinci variant not supported\n");
> +}
> +
> diff --git a/arch/arm/mach-davinci/psc.c b/arch/arm/mach-davinci/psc.c
> index 804488b..ce4a17b 100644
> --- a/arch/arm/mach-davinci/psc.c
> +++ b/arch/arm/mach-davinci/psc.c
> @@ -48,8 +48,8 @@ static void dm6446_psc_mux(unsigned int id)
>  {
>       switch (id) {
>       case DAVINCI_LPSC_ATA:
> -             davinci_mux_peripheral(DAVINCI_MUX_HDIREN, 1);
> -             davinci_mux_peripheral(DAVINCI_MUX_ATAEN, 1);
> +             davinci_cfg_reg(DM644X_HDIREN);
> +             davinci_cfg_reg(DM644X_ATAEN);
>               break;
>       case DAVINCI_LPSC_MMC_SD:
>               /* VDD power manupulations are done in U-Boot for CPMAC
> @@ -57,13 +57,13 @@ static void dm6446_psc_mux(unsigned int id)
>                */
>               /*Set up the pull regiter for MMC */
>               davinci_writel(0, DAVINCI_SYSTEM_MODULE_BASE + VDD3P3V_PWDN);
> -             davinci_mux_peripheral(DAVINCI_MUX_MSTK, 0);
> +             davinci_cfg_reg(DM644X_MSTK);
>               break;
>       case DAVINCI_LPSC_I2C:
> -             davinci_mux_peripheral(DAVINCI_MUX_I2C, 1);
> +             davinci_cfg_reg(DM644X_I2C);
>               break;
>       case DAVINCI_LPSC_McBSP:
> -             davinci_mux_peripheral(DAVINCI_MUX_ASP, 1);
> +             davinci_cfg_reg(DM644X_MCBSP);
>               break;
>       default:
>               break;
> @@ -88,11 +88,12 @@ static void dm355_psc_mux(unsigned int id)
>       switch (id) {
>       case DM355_LPSC_MMC_SD1:        /* MMC1 */
>               /* expose DATA[0..3], CMD, CLK */
> -             tmp = davinci_readl(DM355_ARM_PINMUX3);
> -             tmp &= ~((3 << 14) | (3 << 12) | (3 << 10) | (3 << 8));
> -             tmp |=   (1 << 14) | (1 << 12) | (1 << 10) | (1 << 8)
> -                             | BIT(7) | BIT(6);
> -             davinci_writel(tmp, DM355_ARM_PINMUX3);
> +             davinci_cfg_reg(DM355_SD1_CLK);
> +             davinci_cfg_reg(DM355_SD1_CMD);
> +             davinci_cfg_reg(DM355_SD1_DATA3);
> +             davinci_cfg_reg(DM355_SD1_DATA2);
> +             davinci_cfg_reg(DM355_SD1_DATA1);
> +             davinci_cfg_reg(DM355_SD1_DATA0);
>               break;
>       case DM355_LPSC_McBSP1:         /* ASP1 */
>               /* our ASoC code currently doesn't use these IRQs */
> @@ -110,9 +111,7 @@ static void dm355_psc_mux(unsigned int id)
>               break;
>       case DAVINCI_LPSC_MMC_SD:       /* MMC0 */
>               /* expose all 6 MMC0 signals:  CLK, CMD, DATA[0..3] */
> -             tmp = davinci_readl(DM355_ARM_PINMUX4);
> -             tmp &= ~BIT(2);
> -             davinci_writel(tmp, DM355_ARM_PINMUX4);
> +             davinci_cfg_reg(DM355_MMCSD0);
>  
>               /* support EMDA for MMC0 RX */
>               tmp = davinci_readl(DM355_EDMA_EVTMUX);
> @@ -124,9 +123,7 @@ static void dm355_psc_mux(unsigned int id)
>                * NOTE: SPIO_SDENA0 and/or SPIO_SDENA1
>                * will need to be set too.
>                */
> -             tmp = davinci_readl(DM355_ARM_PINMUX4);
> -             tmp &= ~BIT(1);
> -             davinci_writel(tmp, DM355_ARM_PINMUX4);
> +             davinci_cfg_reg(DM355_SPI0_SDI);
>               break;
>       }
>  }
> diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c
> index 49bf37b..55e2eb5 100644
> --- a/drivers/mtd/nand/davinci_nand.c
> +++ b/drivers/mtd/nand/davinci_nand.c
> @@ -531,23 +531,19 @@ static void __init nand_dm6446evm_flash_init(struct 
> davinci_nand_info *info)
>        */
>       if (machine_is_davinci_evm()) {
>               /* Check for correct pin mux, reconfigure if necessary */
> -             tmp = davinci_readl(DAVINCI_SYSTEM_MODULE_BASE + PINMUX0);
> +             tmp = davinci_readl(PINMUX0);
>  
>               if ((tmp & 0x20020C1F) != 0x00000C1F) {
>                       /* Disable HPI and ATA mux */
> -                     davinci_mux_peripheral(DAVINCI_MUX_HPIEN, 0);
> -                     davinci_mux_peripheral(DAVINCI_MUX_ATAEN, 0);
> +                     davinci_cfg_reg(DM644X_HPIEN_DISABLE);
> +                     davinci_cfg_reg(DM644X_ATAEN_DISABLE);
>  
>                       /* Enable VLYNQ and AEAW */
> -                     davinci_mux_peripheral(DAVINCI_MUX_AEAW0, 1);
> -                     davinci_mux_peripheral(DAVINCI_MUX_AEAW1, 1);
> -                     davinci_mux_peripheral(DAVINCI_MUX_AEAW2, 1);
> -                     davinci_mux_peripheral(DAVINCI_MUX_AEAW3, 1);
> -                     davinci_mux_peripheral(DAVINCI_MUX_AEAW4, 1);
> -                     davinci_mux_peripheral(DAVINCI_MUX_VLSCREN, 1);
> -                     davinci_mux_peripheral(DAVINCI_MUX_VLYNQEN, 1);
> -
> -                     regval = davinci_readl(DAVINCI_SYSTEM_MODULE_BASE + 
> PINMUX0);
> +                     davinci_cfg_reg(DM644X_AEAW);
> +                     davinci_cfg_reg(DM644X_VLSCREN);
> +                     davinci_cfg_reg(DM644X_VLYNQEN);
> +
> +                     regval = davinci_readl(PINMUX0);
>  
>                       dev_warn(info->dev, "Warning: MUX config for NAND: Set 
> " \
>                                       "PINMUX0 reg to 0x%08x, was 0x%08x, 
> should be done " \
> -- 
> 1.5.4.1
> 
> _______________________________________________
> Davinci-linux-open-source mailing list
> [email protected]
> http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
> 
> 



_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to