core support for Freescale mx31
authorSascha Hauer <s.hauer@pengutronix.de>
Sun, 30 Mar 2008 10:30:43 +0000 (11:30 +0100)
committerPeter Pearse <peter.pearse@arm.com>
Sun, 30 Mar 2008 10:30:43 +0000 (11:30 +0100)
This patch adds the core support for Freescale mx31

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Guennadi Liakhovetski <lg@denx.de>
cpu/arm1136/mx31/Makefile [new file with mode: 0644]
cpu/arm1136/mx31/generic.c [new file with mode: 0644]
cpu/arm1136/mx31/interrupts.c [new file with mode: 0644]
cpu/arm1136/mx31/serial.c [new file with mode: 0644]
include/asm-arm/arch-mx31/mx31-regs.h [new file with mode: 0644]
include/asm-arm/arch-mx31/mx31.h [new file with mode: 0644]

diff --git a/cpu/arm1136/mx31/Makefile b/cpu/arm1136/mx31/Makefile
new file mode 100644 (file)
index 0000000..1fc8eea
--- /dev/null
@@ -0,0 +1,44 @@
+#
+# (C) Copyright 2000-2008
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# 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 Foundatio; 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., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(SOC).a
+
+COBJS  = interrupts.o serial.o generic.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
+
+all:   $(obj).depend $(LIB)
+
+$(LIB):        $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS)
+
+#######################################################################
+##
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
diff --git a/cpu/arm1136/mx31/generic.c b/cpu/arm1136/mx31/generic.c
new file mode 100644 (file)
index 0000000..297d616
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * (C) Copyright 2007
+ * Sascha Hauer, Pengutronix
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/arch/mx31-regs.h>
+
+static u32 mx31_decode_pll(u32 reg, u32 infreq)
+{
+       u32 mfi = (reg >> 10) & 0xf;
+       u32 mfn = reg & 0x3f;
+       u32 mfd = (reg >> 16) & 0x3f;
+       u32 pd =  (reg >> 26) & 0xf;
+
+       mfi = mfi <= 5 ? 5 : mfi;
+       mfd += 1;
+       pd += 1;
+
+       return ((2 * (infreq >> 10) * (mfi * mfd + mfn)) /
+               (mfd * pd)) << 10;
+}
+
+u32 mx31_get_mpl_dpdgck_clk(void)
+{
+       u32 infreq;
+
+       if ((__REG(CCM_CCMR) & CCMR_PRCS_MASK) == CCMR_FPM)
+               infreq = CONFIG_MX31_CLK32 * 1024;
+       else
+               infreq = CONFIG_MX31_HCLK_FREQ;
+
+       return mx31_decode_pll(__REG(CCM_MPCTL), infreq); }
+
+u32 mx31_get_mcu_main_clk(void)
+{
+       /* For now we assume mpl_dpdgck_clk == mcu_main_clk
+        * which should be correct for most boards
+        */
+       return mx31_get_mpl_dpdgck_clk();
+}
+
+u32 mx31_get_ipg_clk(void)
+{
+       u32 freq = mx31_get_mcu_main_clk();
+       u32 pdr0 = __REG(CCM_PDR0);
+
+       freq /= ((pdr0 >> 3) & 0x7) + 1;
+       freq /= ((pdr0 >> 6) & 0x3) + 1;
+
+       return freq;
+}
+
+void mx31_dump_clocks(void)
+{
+       u32 cpufreq = mx31_get_mcu_main_clk();
+       printf("mx31 cpu clock: %dMHz\n", cpufreq / 1000000);
+       printf("ipg clock     : %dHz\n", mx31_get_ipg_clk());
+}
+
+void mx31_gpio_mux(unsigned long mode)
+{
+       unsigned long reg, shift, tmp;
+
+       reg = IOMUXC_BASE + (mode & 0xfc);
+       shift = (~mode & 0x3) * 8;
+
+       tmp = __REG(reg);
+       tmp &= ~(0xff << shift);
+       tmp |= ((mode >> 8) & 0xff) << shift;
+       __REG(reg) = tmp;
+}
+
+#if defined(CONFIG_DISPLAY_CPUINFO)
+int print_cpuinfo(void)
+{
+       printf("CPU:   Freescale i.MX31 at %d MHz\n",
+               mx31_get_mcu_main_clk() / 1000000);
+       return 0;
+}
+#endif
diff --git a/cpu/arm1136/mx31/interrupts.c b/cpu/arm1136/mx31/interrupts.c
new file mode 100644 (file)
index 0000000..189f601
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * (C) Copyright 2007
+ * Sascha Hauer, Pengutronix
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/arch/mx31-regs.h>
+
+#define TIMER_BASE 0x53f90000 /* General purpose timer 1 */
+
+/* General purpose timers registers */
+#define GPTCR   __REG(TIMER_BASE) /* Control register */
+#define GPTPR  __REG(TIMER_BASE + 0x4) /* Prescaler register */
+#define GPTSR   __REG(TIMER_BASE + 0x8) /* Status register */
+#define GPTCNT __REG(TIMER_BASE + 0x24) /* Counter register */
+
+/* General purpose timers bitfields */
+#define GPTCR_SWR       (1<<15) /* Software reset */
+#define GPTCR_FRR       (1<<9)  /* Freerun / restart */
+#define GPTCR_CLKSOURCE_32 (4<<6)  /* Clock source */
+#define GPTCR_TEN       (1)     /* Timer enable */
+
+/*
+ * nothing really to do with interrupts, just starts up a counter.
+ */
+int interrupt_init(void)
+{
+       int i;
+
+       /* setup GP Timer 1 */
+       GPTCR = GPTCR_SWR;
+       for (i = 0; i < 100; i++) GPTCR = 0; /* We have no udelay by now */
+       GPTPR = 0; /* 32Khz */
+       /* Freerun Mode, PERCLK1 input */
+       GPTCR |= GPTCR_CLKSOURCE_32 | GPTCR_TEN;
+
+       return 0;
+}
+
+void reset_timer_masked(void)
+{
+       GPTCR = 0;
+       /* Freerun Mode, PERCLK1 input*/
+       GPTCR = GPTCR_CLKSOURCE_32 | GPTCR_TEN;
+}
+
+ulong get_timer_masked(void)
+{
+       ulong val = GPTCNT;
+       return val;
+}
+
+ulong get_timer(ulong base)
+{
+       return get_timer_masked() - base;
+}
+
+void set_timer(ulong t)
+{
+}
+
+/* delay x useconds AND perserve advance timstamp value */
+void udelay(unsigned long usec)
+{
+       ulong tmo, tmp;
+
+       if (usec >= 1000) {
+       /* "big" number, spread normalization to seconds */
+               /* start to normalize for usec to ticks per sec */
+               tmo = usec / 1000;
+               /* find number of "ticks" to wait to achieve target */
+               tmo *= CFG_HZ;
+               tmo /= 1000;    /* finish normalize. */
+       } else {
+               /* else small number, don't kill it prior to HZ multiply */
+               tmo = usec * CFG_HZ;
+               tmo /= (1000*1000);
+       }
+
+       tmp = get_timer(0);             /* get current timestamp */
+       if ((tmo + tmp + 1) < tmp)
+               /* setting this forward will roll time stamp */
+               /* reset "advancing" timestamp to 0, set lastinc value */
+               reset_timer_masked();
+       else
+               /* else, set advancing stamp wake up time */
+               tmo     += tmp;
+       while (get_timer_masked() < tmo)/* loop till event */
+               /*NOP*/;
+}
+
+void reset_cpu(ulong addr)
+{
+       __REG16(WDOG_BASE) = 4;
+}
diff --git a/cpu/arm1136/mx31/serial.c b/cpu/arm1136/mx31/serial.c
new file mode 100644 (file)
index 0000000..f7e1b3b
--- /dev/null
@@ -0,0 +1,230 @@
+/*
+ * (c) 2007 Sascha Hauer <s.hauer@pengutronix.de>
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *
+ */
+
+#include <common.h>
+
+#if defined CONFIG_MX31_UART
+
+#include <asm/arch/mx31.h>
+
+#define __REG(x)     (*((volatile u32 *)(x)))
+
+#ifdef CFG_MX31_UART1
+#define UART_PHYS 0x43f90000
+#elif defined(CFG_MX31_UART2)
+#define UART_PHYS 0x43f94000
+#elif defined(CFG_MX31_UART3)
+#define UART_PHYS 0x5000c000
+#elif defined(CFG_MX31_UART4)
+#define UART_PHYS 0x43fb0000
+#elif defined(CFG_MX31_UART5)
+#define UART_PHYS 0x43fb4000
+#else
+#error "define CFG_MX31_UARTx to use the mx31 UART driver"
+#endif
+
+/* Register definitions */
+#define URXD  0x0  /* Receiver Register */
+#define UTXD  0x40 /* Transmitter Register */
+#define UCR1  0x80 /* Control Register 1 */
+#define UCR2  0x84 /* Control Register 2 */
+#define UCR3  0x88 /* Control Register 3 */
+#define UCR4  0x8c /* Control Register 4 */
+#define UFCR  0x90 /* FIFO Control Register */
+#define USR1  0x94 /* Status Register 1 */
+#define USR2  0x98 /* Status Register 2 */
+#define UESC  0x9c /* Escape Character Register */
+#define UTIM  0xa0 /* Escape Timer Register */
+#define UBIR  0xa4 /* BRM Incremental Register */
+#define UBMR  0xa8 /* BRM Modulator Register */
+#define UBRC  0xac /* Baud Rate Count Register */
+#define UTS   0xb4 /* UART Test Register (mx31) */
+
+/* UART Control Register Bit Fields.*/
+#define  URXD_CHARRDY    (1<<15)
+#define  URXD_ERR        (1<<14)
+#define  URXD_OVRRUN     (1<<13)
+#define  URXD_FRMERR     (1<<12)
+#define  URXD_BRK        (1<<11)
+#define  URXD_PRERR      (1<<10)
+#define  UCR1_ADEN       (1<<15) /* Auto dectect interrupt */
+#define  UCR1_ADBR       (1<<14) /* Auto detect baud rate */
+#define  UCR1_TRDYEN     (1<<13) /* Transmitter ready interrupt enable */
+#define  UCR1_IDEN       (1<<12) /* Idle condition interrupt */
+#define  UCR1_RRDYEN     (1<<9)  /* Recv ready interrupt enable */
+#define  UCR1_RDMAEN     (1<<8)  /* Recv ready DMA enable */
+#define  UCR1_IREN       (1<<7)  /* Infrared interface enable */
+#define  UCR1_TXMPTYEN   (1<<6)  /* Transimitter empty interrupt enable */
+#define  UCR1_RTSDEN     (1<<5)  /* RTS delta interrupt enable */
+#define  UCR1_SNDBRK     (1<<4)  /* Send break */
+#define  UCR1_TDMAEN     (1<<3)  /* Transmitter ready DMA enable */
+#define  UCR1_UARTCLKEN  (1<<2)  /* UART clock enabled */
+#define  UCR1_DOZE       (1<<1)  /* Doze */
+#define  UCR1_UARTEN     (1<<0)  /* UART enabled */
+#define  UCR2_ESCI              (1<<15) /* Escape seq interrupt enable */
+#define  UCR2_IRTS      (1<<14) /* Ignore RTS pin */
+#define  UCR2_CTSC      (1<<13) /* CTS pin control */
+#define  UCR2_CTS        (1<<12) /* Clear to send */
+#define  UCR2_ESCEN      (1<<11) /* Escape enable */
+#define  UCR2_PREN       (1<<8)  /* Parity enable */
+#define  UCR2_PROE       (1<<7)  /* Parity odd/even */
+#define  UCR2_STPB       (1<<6)         /* Stop */
+#define  UCR2_WS         (1<<5)         /* Word size */
+#define  UCR2_RTSEN      (1<<4)         /* Request to send interrupt enable */
+#define  UCR2_TXEN       (1<<2)         /* Transmitter enabled */
+#define  UCR2_RXEN       (1<<1)         /* Receiver enabled */
+#define  UCR2_SRST      (1<<0)  /* SW reset */
+#define  UCR3_DTREN     (1<<13) /* DTR interrupt enable */
+#define  UCR3_PARERREN   (1<<12) /* Parity enable */
+#define  UCR3_FRAERREN   (1<<11) /* Frame error interrupt enable */
+#define  UCR3_DSR        (1<<10) /* Data set ready */
+#define  UCR3_DCD        (1<<9)  /* Data carrier detect */
+#define  UCR3_RI         (1<<8)  /* Ring indicator */
+#define  UCR3_TIMEOUTEN  (1<<7)  /* Timeout interrupt enable */
+#define  UCR3_RXDSEN    (1<<6)  /* Receive status interrupt enable */
+#define  UCR3_AIRINTEN   (1<<5)  /* Async IR wake interrupt enable */
+#define  UCR3_AWAKEN    (1<<4)  /* Async wake interrupt enable */
+#define  UCR3_REF25     (1<<3)  /* Ref freq 25 MHz */
+#define  UCR3_REF30     (1<<2)  /* Ref Freq 30 MHz */
+#define  UCR3_INVT      (1<<1)  /* Inverted Infrared transmission */
+#define  UCR3_BPEN      (1<<0)  /* Preset registers enable */
+#define  UCR4_CTSTL_32   (32<<10) /* CTS trigger level (32 chars) */
+#define  UCR4_INVR      (1<<9)  /* Inverted infrared reception */
+#define  UCR4_ENIRI     (1<<8)  /* Serial infrared interrupt enable */
+#define  UCR4_WKEN      (1<<7)  /* Wake interrupt enable */
+#define  UCR4_REF16     (1<<6)  /* Ref freq 16 MHz */
+#define  UCR4_IRSC      (1<<5)  /* IR special case */
+#define  UCR4_TCEN      (1<<3)  /* Transmit complete interrupt enable */
+#define  UCR4_BKEN      (1<<2)  /* Break condition interrupt enable */
+#define  UCR4_OREN      (1<<1)  /* Receiver overrun interrupt enable */
+#define  UCR4_DREN      (1<<0)  /* Recv data ready interrupt enable */
+#define  UFCR_RXTL_SHF   0       /* Receiver trigger level shift */
+#define  UFCR_RFDIV      (7<<7)  /* Reference freq divider mask */
+#define  UFCR_TXTL_SHF   10      /* Transmitter trigger level shift */
+#define  USR1_PARITYERR  (1<<15) /* Parity error interrupt flag */
+#define  USR1_RTSS      (1<<14) /* RTS pin status */
+#define  USR1_TRDY      (1<<13) /* Transmitter ready interrupt/dma flag */
+#define  USR1_RTSD      (1<<12) /* RTS delta */
+#define  USR1_ESCF      (1<<11) /* Escape seq interrupt flag */
+#define  USR1_FRAMERR    (1<<10) /* Frame error interrupt flag */
+#define  USR1_RRDY       (1<<9)         /* Receiver ready interrupt/dma flag */
+#define  USR1_TIMEOUT    (1<<7)         /* Receive timeout interrupt status */
+#define  USR1_RXDS      (1<<6)  /* Receiver idle interrupt flag */
+#define  USR1_AIRINT    (1<<5)  /* Async IR wake interrupt flag */
+#define  USR1_AWAKE     (1<<4)  /* Aysnc wake interrupt flag */
+#define  USR2_ADET      (1<<15) /* Auto baud rate detect complete */
+#define  USR2_TXFE      (1<<14) /* Transmit buffer FIFO empty */
+#define  USR2_DTRF      (1<<13) /* DTR edge interrupt flag */
+#define  USR2_IDLE      (1<<12) /* Idle condition */
+#define  USR2_IRINT     (1<<8)  /* Serial infrared interrupt flag */
+#define  USR2_WAKE      (1<<7)  /* Wake */
+#define  USR2_RTSF      (1<<4)  /* RTS edge interrupt flag */
+#define  USR2_TXDC      (1<<3)  /* Transmitter complete */
+#define  USR2_BRCD      (1<<2)  /* Break condition */
+#define  USR2_ORE        (1<<1)         /* Overrun error */
+#define  USR2_RDR        (1<<0)         /* Recv data ready */
+#define  UTS_FRCPERR    (1<<13) /* Force parity error */
+#define  UTS_LOOP        (1<<12) /* Loop tx and rx */
+#define  UTS_TXEMPTY    (1<<6)  /* TxFIFO empty */
+#define  UTS_RXEMPTY    (1<<5)  /* RxFIFO empty */
+#define  UTS_TXFULL     (1<<4)  /* TxFIFO full */
+#define  UTS_RXFULL     (1<<3)  /* RxFIFO full */
+#define  UTS_SOFTRST    (1<<0)  /* Software reset */
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void serial_setbrg(void)
+{
+       u32 clk = mx31_get_ipg_clk();
+
+       if (!gd->baudrate)
+               gd->baudrate = CONFIG_BAUDRATE;
+
+       __REG(UART_PHYS + UFCR) = 4 << 7; /* divide input clock by 2 */
+       __REG(UART_PHYS + UBIR) = 0xf;
+       __REG(UART_PHYS + UBMR) = clk / (2 * gd->baudrate);
+
+}
+
+int serial_getc(void)
+{
+       while (__REG(UART_PHYS + UTS) & UTS_RXEMPTY);
+       return __REG(UART_PHYS + URXD);
+}
+
+void serial_putc(const char c)
+{
+       __REG(UART_PHYS + UTXD) = c;
+
+       /* wait for transmitter to be ready */
+       while (!(__REG(UART_PHYS + UTS) & UTS_TXEMPTY));
+
+       /* If \n, also do \r */
+       if (c == '\n')
+               serial_putc('\r');
+}
+
+/*
+ * Test whether a character is in the RX buffer  */
+int serial_tstc(void)
+{
+       /* If receive fifo is empty, return false */
+       if (__REG(UART_PHYS + UTS) & UTS_RXEMPTY)
+               return 0;
+       return 1;
+}
+
+void serial_puts(const char *s)
+{
+       while (*s) {
+               serial_putc(*s++);
+       }
+}
+
+/*
+ * Initialise the serial port with the given baudrate. The settings
+ * are always 8 data bits, no parity, 1 stop bit, no start bits.
+ *
+ */
+int serial_init(void)
+{
+       __REG(UART_PHYS + UCR1) = 0x0;
+       __REG(UART_PHYS + UCR2) = 0x0;
+
+       while (!(__REG(UART_PHYS + UCR2) & UCR2_SRST));
+
+       __REG(UART_PHYS + UCR3) = 0x0704;
+       __REG(UART_PHYS + UCR4) = 0x8000;
+       __REG(UART_PHYS + UESC) = 0x002b;
+       __REG(UART_PHYS + UTIM) = 0x0;
+
+       __REG(UART_PHYS + UTS) = 0x0;
+
+       serial_setbrg();
+
+       __REG(UART_PHYS + UCR2) = UCR2_WS | UCR2_IRTS | UCR2_RXEN | \
+                                       UCR2_TXEN | UCR2_SRST;
+
+       __REG(UART_PHYS + UCR1) = UCR1_UARTEN;
+
+       return 0;
+}
+
+
+#endif /* CONFIG_MX31 */
diff --git a/include/asm-arm/arch-mx31/mx31-regs.h b/include/asm-arm/arch-mx31/mx31-regs.h
new file mode 100644 (file)
index 0000000..ece6420
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ *
+ * (c) 2007 Pengutronix, Sascha Hauer <s.hauer@pengutronix.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __ASM_ARCH_MX31_REGS_H
+#define __ASM_ARCH_MX31_REGS_H
+
+#define __REG(x)     (*((volatile u32 *)(x)))
+#define __REG16(x)   (*((volatile u16 *)(x)))
+#define __REG8(x)    (*((volatile u8 *)(x)))
+
+#define CCM_BASE       0x53f80000
+#define CCM_CCMR       (CCM_BASE + 0x00)
+#define CCM_PDR0       (CCM_BASE + 0x04)
+#define CCM_PDR1       (CCM_BASE + 0x08)
+#define CCM_RCSR       (CCM_BASE + 0x0c)
+#define CCM_MPCTL      (CCM_BASE + 0x10)
+#define CCM_UPCTL      (CCM_BASE + 0x10)
+#define CCM_SPCTL      (CCM_BASE + 0x18)
+#define CCM_COSR       (CCM_BASE + 0x1C)
+
+#define CCMR_MDS       (1 << 7)
+#define CCMR_SBYCS     (1 << 4)
+#define CCMR_MPE       (1 << 3)
+#define CCMR_PRCS_MASK (3 << 1)
+#define CCMR_FPM       (1 << 1)
+#define CCMR_CKIH      (2 << 1)
+
+#define PDR0_CSI_PODF(x)       (((x) & 0x1ff) << 23)
+#define PDR0_PER_PODF(x)       (((x) & 0x1f) << 16)
+#define PDR0_HSP_PODF(x)       (((x) & 0x7) << 11)
+#define PDR0_NFC_PODF(x)       (((x) & 0x7) << 8)
+#define PDR0_IPG_PODF(x)       (((x) & 0x3) << 6)
+#define PDR0_MAX_PODF(x)       (((x) & 0x7) << 3)
+#define PDR0_MCU_PODF(x)       ((x) & 0x7)
+
+#define PLL_PD(x)              (((x) & 0xf) << 26)
+#define PLL_MFD(x)             (((x) & 0x3ff) << 16)
+#define PLL_MFI(x)             (((x) & 0xf) << 10)
+#define PLL_MFN(x)             (((x) & 0x3ff) << 0)
+
+#define WEIM_BASE      0xb8002000
+#define CSCR_U(x)      (WEIM_BASE + (x) * 0x10)
+#define CSCR_L(x)      (WEIM_BASE + 4 + (x) * 0x10)
+#define CSCR_A(x)      (WEIM_BASE + 8 + (x) * 0x10)
+
+#define IOMUXC_BASE    0x43FAC000
+#define IOMUXC_GPR     (IOMUXC_BASE + 0x8)
+#define IOMUXC_SW_MUX_CTL(x)   (IOMUXC_BASE + 0xc + (x) * 4)
+#define IOMUXC_SW_PAD_CTL(x)   (IOMUXC_BASE + 0x154 + (x) * 4)
+
+#define IPU_BASE               0x53fc0000
+#define IPU_CONF               IPU_BASE
+
+#define IPU_CONF_PXL_ENDIAN    (1<<8)
+#define IPU_CONF_DU_EN         (1<<7)
+#define IPU_CONF_DI_EN         (1<<6)
+#define IPU_CONF_ADC_EN                (1<<5)
+#define IPU_CONF_SDC_EN                (1<<4)
+#define IPU_CONF_PF_EN         (1<<3)
+#define IPU_CONF_ROT_EN                (1<<2)
+#define IPU_CONF_IC_EN         (1<<1)
+#define IPU_CONF_SCI_EN                (1<<0)
+
+#define WDOG_BASE              0x53FDC000
+
+/*
+ * Signal Multiplexing (IOMUX)
+ */
+
+/* bits in the SW_MUX_CTL registers */
+#define MUX_CTL_OUT_GPIO_DR    (0 << 4)
+#define MUX_CTL_OUT_FUNC       (1 << 4)
+#define MUX_CTL_OUT_ALT1       (2 << 4)
+#define MUX_CTL_OUT_ALT2       (3 << 4)
+#define MUX_CTL_OUT_ALT3       (4 << 4)
+#define MUX_CTL_OUT_ALT4       (5 << 4)
+#define MUX_CTL_OUT_ALT5       (6 << 4)
+#define MUX_CTL_OUT_ALT6       (7 << 4)
+#define MUX_CTL_IN_NONE                (0 << 0)
+#define MUX_CTL_IN_GPIO                (1 << 0)
+#define MUX_CTL_IN_FUNC                (2 << 0)
+#define MUX_CTL_IN_ALT1                (4 << 0)
+#define MUX_CTL_IN_ALT2                (8 << 0)
+
+#define MUX_CTL_FUNC           (MUX_CTL_OUT_FUNC | MUX_CTL_IN_FUNC)
+#define MUX_CTL_ALT1           (MUX_CTL_OUT_ALT1 | MUX_CTL_IN_ALT1)
+#define MUX_CTL_ALT2           (MUX_CTL_OUT_ALT2 | MUX_CTL_IN_ALT2)
+#define MUX_CTL_GPIO           (MUX_CTL_OUT_GPIO_DR | MUX_CTL_IN_GPIO)
+
+/* Register offsets based on IOMUXC_BASE */
+/* 0x00 .. 0x7b */
+#define MUX_CTL_RTS1           0x7c
+#define MUX_CTL_CTS1           0x7d
+#define MUX_CTL_DTR_DCE1       0x7e
+#define MUX_CTL_DSR_DCE1       0x7f
+#define MUX_CTL_CSPI2_SCLK     0x80
+#define MUX_CTL_CSPI2_SPI_RDY  0x81
+#define MUX_CTL_RXD1           0x82
+#define MUX_CTL_TXD1           0x83
+#define MUX_CTL_CSPI2_MISO     0x84
+/* 0x85 .. 0x8a */
+#define MUX_CTL_CSPI2_MOSI     0x8b
+
+/* The modes a specific pin can be in
+ * these macros can be used in mx31_gpio_mux() and have the form
+ * MUX_[contact name]__[pin function]
+ */
+#define MUX_RXD1__UART1_RXD_MUX        ((MUX_CTL_FUNC << 8) | MUX_CTL_RXD1)
+#define MUX_TXD1__UART1_TXD_MUX        ((MUX_CTL_FUNC << 8) | MUX_CTL_TXD1)
+#define MUX_RTS1__UART1_RTS_B  ((MUX_CTL_FUNC << 8) | MUX_CTL_RTS1)
+#define MUX_RTS1__UART1_CTS_B  ((MUX_CTL_FUNC << 8) | MUX_CTL_CTS1)
+
+#define MUX_CSPI2_MOSI__I2C2_SCL ((MUX_CTL_ALT1 << 8) | MUX_CTL_CSPI2_MOSI)
+#define MUX_CSPI2_MISO__I2C2_SCL ((MUX_CTL_ALT1 << 8) | MUX_CTL_CSPI2_MISO)
+
+#endif /* __ASM_ARCH_MX31_REGS_H */
diff --git a/include/asm-arm/arch-mx31/mx31.h b/include/asm-arm/arch-mx31/mx31.h
new file mode 100644 (file)
index 0000000..f89a401
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ *
+ * (c) 2007 Pengutronix, Sascha Hauer <s.hauer@pengutronix.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __ASM_ARCH_MX31_H
+#define __ASM_ARCH_MX31_H
+
+u32 mx31_get_mpl_dpdgck_clk(void);
+u32 mx31_get_mcu_main_clk(void);
+u32 mx31_get_ipg_clk(void);
+void mx31_gpio_mux(unsigned long mode);
+
+#endif /* __ASM_ARCH_MX31_H */