Hello Eric,<br><br><div class="gmail_quote">2011/2/10 Eric Miao <span dir="ltr">&lt;<a href="mailto:eric.y.miao@gmail.com">eric.y.miao@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Corrected the linux-arm-kernel ML address.<br>
<div><div></div><div class="h5"><br>
On Thu, Feb 10, 2011 at 10:24 AM, Eric Miao &lt;<a href="mailto:eric.y.miao@gmail.com">eric.y.miao@gmail.com</a>&gt; wrote:<br>
&gt; On Thu, Feb 10, 2011 at 7:53 AM, Yupeng Schneider<br>
&gt; &lt;<a href="mailto:yupeng.schneider@ipms.fraunhofer.de">yupeng.schneider@ipms.fraunhofer.de</a>&gt; wrote:<br>
&gt;&gt; Hi all,<br>
&gt;&gt;<br>
&gt;&gt; the following patch add the BSP for the Trizeps6 board with pxa168 Processor.<br>
&gt;&gt;<br>
&gt;&gt; Signed-off-by: Yupeng Schneider &lt;<a href="mailto:yupeng.schneider@googlemail.com">yupeng.schneider@googlemail.com</a>&gt;<br>
&gt;<br>
&gt; Hi Yupeng,<br>
&gt;<br>
&gt; This is really a nice patch. I would be better if this can be separated into<br>
&gt; some smaller patches further:<br></div></div></blockquote><div> </div><div>thank u  <br><br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div><div class="h5">
&gt;<br>
&gt; 1. some of the MFP macros in trizeps6.h, they are generic and can be<br>
&gt; placed into mfp-pxa168.h, or is there any reason that the macros in<br>
&gt; mfp-pxa168.h do not work on your board?<br></div></div></blockquote><div> </div><div>ok, i will place them into mfp-pxa168.h.  I just thought it is not prefered to change the mfp-pxa168 file.<br><br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div><div class="h5">
&gt;<br>
&gt; 2. individual patches for adding uart3, audio, and cpld<br></div></div></blockquote><div> </div><div> i would very glad to make them in small patchs. i am just now on travel, and will do that in several days when i am back.<br>
<br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div><div class="h5">
&gt;<br>
&gt; 3. then the patch for the board<br>
&gt;<br>
&gt; Sounds OK? Let me know your ideas.<br></div></div></blockquote><div> </div><div>AC97+UCB1400: Sound and Touchscreen is ok. The related pxa2xx-ac97 files have to be modified, the changes are not in this patch. If u want, i can patch them later too.<br>
<br>yours,<br>Yupeng<br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div><div class="h5">
&gt;<br>
&gt; Thanks<br>
&gt; - eric<br>
&gt;<br>
&gt;&gt; ---<br>
&gt;&gt;  arch/arm/mach-mmp/Kconfig                      |   29 ++<br>
&gt;&gt;  arch/arm/mach-mmp/Makefile                     |    1 +<br>
&gt;&gt;  arch/arm/mach-mmp/include/mach/audio.h         |   29 ++<br>
&gt;&gt;  arch/arm/mach-mmp/include/mach/pxa168.h        |   21 +<br>
&gt;&gt;  arch/arm/mach-mmp/include/mach/regs-apmu.h     |    1 +<br>
&gt;&gt;  arch/arm/mach-mmp/include/mach/trizeps6.h      |  122 ++++++<br>
&gt;&gt;  arch/arm/mach-mmp/include/mach/trizeps6_cpld.h |   87 +++++<br>
&gt;&gt;  arch/arm/mach-mmp/pxa168.c                     |   10 +<br>
&gt;&gt;  arch/arm/mach-mmp/trizeps6.c                   |  469<br>
&gt;&gt; ++++++++++++++++++++++++<br>
&gt;&gt;  arch/arm/mach-mmp/trizeps6_cpld.c              |  145 ++++++++<br>
&gt;&gt;  10 files changed, 914 insertions(+), 0 deletions(-)<br>
&gt;&gt;  create mode 100755 arch/arm/mach-mmp/include/mach/audio.h<br>
&gt;&gt;  create mode 100755 arch/arm/mach-mmp/include/mach/trizeps6.h<br>
&gt;&gt;  create mode 100755 arch/arm/mach-mmp/include/mach/trizeps6_cpld.h create<br>
&gt;&gt; mode 100755 arch/arm/mach-mmp/trizeps6.c<br>
&gt;&gt;  create mode 100755 arch/arm/mach-mmp/trizeps6_cpld.c<br>
&gt;&gt;<br>
&gt;&gt; diff --git a/arch/arm/mach-mmp/Kconfig b/arch/arm/mach-mmp/Kconfig index<br>
&gt;&gt; 0711d3b..8c6be81 100644<br>
&gt;&gt; --- a/arch/arm/mach-mmp/Kconfig<br>
&gt;&gt; +++ b/arch/arm/mach-mmp/Kconfig<br>
&gt;&gt; @@ -64,6 +64,35 @@ config MACH_TETON_BGA<br>
&gt;&gt;          Say &#39;Y&#39; here if you want to support the Marvell PXA168-based<br>
&gt;&gt;          Teton BGA Development Board.<br>
&gt;&gt;<br>
&gt;&gt; +comment &quot;Third Party Dev Platforms (sorted by vendor name)&quot;<br>
&gt;&gt; +<br>
&gt;&gt; +config MACH_TRIZEPS6<br>
&gt;&gt; +       bool &quot;Keith und Koep Trizeps6 DIMM-Module&quot;<br>
&gt;&gt; +       select TRIZEPS6_PCMCIA<br>
&gt;&gt; +       select CPU_PXA168<br>
&gt;&gt; +       help<br>
&gt;&gt; +         Say &#39;Y&#39; here if you want to support TRIZEPS VI board Development Board.<br>
&gt;&gt; +<br>
&gt;&gt; +choice<br>
&gt;&gt; +       prompt &quot;Select base board for Trizeps module&quot;<br>
&gt;&gt; +       depends on MACH_TRIZEPS6<br>
&gt;&gt; +<br>
&gt;&gt; +config MACH_TRIZEPS6_CONXS<br>
&gt;&gt; +       bool &quot;ConXS Eval Board&quot;<br>
&gt;&gt; +<br>
&gt;&gt; +config MACH_TRIZEPS6_UCONXS<br>
&gt;&gt; +       bool &quot;uConXS Eval Board&quot;<br>
&gt;&gt; +<br>
&gt;&gt; +config MACH_TRIZEPS6_ANY<br>
&gt;&gt; +       bool &quot;another Board&quot;<br>
&gt;&gt; +<br>
&gt;&gt; +endchoice<br>
&gt;&gt; +<br>
&gt;&gt; +config TRIZEPS6_PCMCIA<br>
&gt;&gt; +       bool<br>
&gt;&gt; +       help<br>
&gt;&gt; +         Enable PCMCIA support for Trizeps modules<br>
&gt;&gt; +<br>
&gt;&gt;  endmenu<br>
&gt;&gt;<br>
&gt;&gt;  config CPU_PXA168<br>
&gt;&gt; diff --git a/arch/arm/mach-mmp/Makefile b/arch/arm/mach-mmp/Makefile index<br>
&gt;&gt; 751cdbf..1b8744f 100644<br>
&gt;&gt; --- a/arch/arm/mach-mmp/Makefile<br>
&gt;&gt; +++ b/arch/arm/mach-mmp/Makefile<br>
&gt;&gt; @@ -18,3 +18,4 @@ obj-$(CONFIG_MACH_TTC_DKB)    += ttc_dkb.o<br>
&gt;&gt;  obj-$(CONFIG_MACH_FLINT)       += flint.o<br>
&gt;&gt;  obj-$(CONFIG_MACH_MARVELL_JASPER) += jasper.o<br>
&gt;&gt;  obj-$(CONFIG_MACH_TETON_BGA)   += teton_bga.o<br>
&gt;&gt; +obj-$(CONFIG_MACH_TRIZEPS6)    += trizeps6.o trizeps6_cpld.o<br>
&gt;&gt; diff --git a/arch/arm/mach-mmp/include/mach/audio.h<br>
&gt;&gt; b/arch/arm/mach-mmp/include/mach/audio.h<br>
&gt;&gt; index 0000000..6ef474f<br>
&gt;&gt; --- /dev/null<br>
&gt;&gt; +++ b/arch/arm/mach-mmp/include/mach/audio.h<br>
&gt;&gt; @@ -0,0 +1,29 @@<br>
&gt;&gt; +#ifndef __ASM_ARCH_AUDIO_H__<br>
&gt;&gt; +#define __ASM_ARCH_AUDIO_H__<br>
&gt;&gt; +<br>
&gt;&gt; +#include &lt;sound/core.h&gt;<br>
&gt;&gt; +#include &lt;sound/pcm.h&gt;<br>
&gt;&gt; +#include &lt;sound/ac97_codec.h&gt;<br>
&gt;&gt; +<br>
&gt;&gt; +/*<br>
&gt;&gt; + * @reset_gpio: AC97 reset gpio (normally gpio113 or gpio95)<br>
&gt;&gt; + *              a -1 value means no gpio will be used for reset<br>
&gt;&gt; + * @codec_pdata: AC97 codec platform_data<br>
&gt;&gt; +<br>
&gt;&gt; + * reset_gpio should only be specified for pxa27x CPUs where a silicon +<br>
&gt;&gt; * bug prevents correct operation of the reset line. If not specified, + *<br>
&gt;&gt; the default behaviour on these CPUs is to consider gpio 113 as the + *<br>
&gt;&gt; AC97 reset line, which is the default on most boards.<br>
&gt;&gt; + */<br>
&gt;&gt; +struct pxa2xx_audio_ops_t {<br>
&gt;&gt; +       int (*startup)(struct snd_pcm_substream *, void *);<br>
&gt;&gt; +       void (*shutdown)(struct snd_pcm_substream *, void *);<br>
&gt;&gt; +       void (*suspend)(void *);<br>
&gt;&gt; +       void (*resume)(void *);<br>
&gt;&gt; +       void *priv;<br>
&gt;&gt; +       int reset_gpio;<br>
&gt;&gt; +       void *codec_pdata[AC97_BUS_MAX_DEVICES];<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +#endif<br>
&gt;&gt; diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h<br>
&gt;&gt; b/arch/arm/mach-mmp/include/mach/pxa168.h<br>
&gt;&gt; index 1801e42..c4a9977 100644<br>
&gt;&gt; --- a/arch/arm/mach-mmp/include/mach/pxa168.h<br>
&gt;&gt; +++ b/arch/arm/mach-mmp/include/mach/pxa168.h<br>
&gt;&gt; @@ -14,9 +14,12 @@ extern void pxa168_clear_keypad_wakeup(void);<br>
&gt;&gt;  #include &lt;video/pxa168fb.h&gt;<br>
&gt;&gt;  #include &lt;plat/pxa27x_keypad.h&gt;<br>
&gt;&gt;  #include &lt;mach/cputype.h&gt;<br>
&gt;&gt; +#include &lt;linux/pxa168_eth.h&gt;<br>
&gt;&gt; +#include &lt;mach/audio.h&gt;<br>
&gt;&gt;<br>
&gt;&gt;  extern struct pxa_device_desc pxa168_device_uart1;<br>
&gt;&gt;  extern struct pxa_device_desc pxa168_device_uart2;<br>
&gt;&gt; +extern struct pxa_device_desc pxa168_device_uart3;<br>
&gt;&gt;  extern struct pxa_device_desc pxa168_device_twsi0;<br>
&gt;&gt;  extern struct pxa_device_desc pxa168_device_twsi1;<br>
&gt;&gt;  extern struct pxa_device_desc pxa168_device_pwm1;<br>
&gt;&gt; @@ -31,6 +34,9 @@ extern struct pxa_device_desc pxa168_device_ssp5;<br>
&gt;&gt;  extern struct pxa_device_desc pxa168_device_nand;<br>
&gt;&gt;  extern struct pxa_device_desc pxa168_device_fb;<br>
&gt;&gt;  extern struct pxa_device_desc pxa168_device_keypad;<br>
&gt;&gt; +extern struct pxa_device_desc pxa168_device_mfu;<br>
&gt;&gt; +extern struct pxa_device_desc pxa168_device_ac97;<br>
&gt;&gt; +<br>
&gt;&gt;<br>
&gt;&gt;  static inline int pxa168_add_uart(int id)<br>
&gt;&gt;  {<br>
&gt;&gt; @@ -39,6 +45,7 @@ static inline int pxa168_add_uart(int id)<br>
&gt;&gt;        switch (id) {<br>
&gt;&gt;        case 1: d = &amp;pxa168_device_uart1; break;<br>
&gt;&gt;        case 2: d = &amp;pxa168_device_uart2; break;<br>
&gt;&gt; +       case 3: d = &amp;pxa168_device_uart3; break;<br>
&gt;&gt;        }<br>
&gt;&gt;<br>
&gt;&gt;        if (d == NULL)<br>
&gt;&gt; @@ -117,4 +124,18 @@ static inline int pxa168_add_keypad(struct<br>
&gt;&gt; pxa27x_keypad_platform_data *data)<br>
&gt;&gt;        return pxa_register_device(&amp;pxa168_device_keypad, data, sizeof(*data));<br>
&gt;&gt;  }<br>
&gt;&gt;<br>
&gt;&gt; +static inline int pxa168_add_mfu(struct pxa168_eth_platform_data *data) +{<br>
&gt;&gt; +#if defined(CONFIG_PXA168_ETH)<br>
&gt;&gt; +       return pxa_register_device(&amp;pxa168_device_mfu, data, sizeof(*data)); +#else<br>
&gt;&gt; +       return 0;<br>
&gt;&gt; +#endif<br>
&gt;&gt; +}<br>
&gt;&gt; +<br>
&gt;&gt; +static inline int pxa168_add_ac97(struct pxa2xx_audio_ops_t *ops) +{<br>
&gt;&gt; +       return pxa_register_device(&amp;pxa168_device_ac97, ops , sizeof(*ops)); +}<br>
&gt;&gt; +<br>
&gt;&gt;  #endif /* __ASM_MACH_PXA168_H */<br>
&gt;&gt; diff --git a/arch/arm/mach-mmp/include/mach/regs-apmu.h<br>
&gt;&gt; b/arch/arm/mach-mmp/include/mach/regs-apmu.h<br>
&gt;&gt; index ac47023..68d39bc 100644<br>
&gt;&gt; --- a/arch/arm/mach-mmp/include/mach/regs-apmu.h<br>
&gt;&gt; +++ b/arch/arm/mach-mmp/include/mach/regs-apmu.h<br>
&gt;&gt; @@ -27,6 +27,7 @@<br>
&gt;&gt;  #define APMU_DMA       APMU_REG(0x064)<br>
&gt;&gt;  #define APMU_GEU       APMU_REG(0x068)<br>
&gt;&gt;  #define APMU_BUS       APMU_REG(0x06c)<br>
&gt;&gt; +#define APMU_MFU       APMU_REG(0x0fc)<br>
&gt;&gt;<br>
&gt;&gt;  #define APMU_FNCLK_EN  (1 &lt;&lt; 4)<br>
&gt;&gt;  #define APMU_AXICLK_EN (1 &lt;&lt; 3)<br>
&gt;&gt; diff --git a/arch/arm/mach-mmp/include/mach/trizeps6.h<br>
&gt;&gt; b/arch/arm/mach-mmp/include/mach/trizeps6.h<br>
&gt;&gt; index 0000000..40b526a<br>
&gt;&gt; --- /dev/null<br>
&gt;&gt; +++ b/arch/arm/mach-mmp/include/mach/trizeps6.h<br>
&gt;&gt; @@ -0,0 +1,122 @@<br>
&gt;&gt; +/************************************************************************<br>
&gt;&gt; + * Include file for TRIZEPS6 SoM and ConXS eval-board<br>
&gt;&gt; + * Copyright (c) Yupeng Schneider<br>
&gt;&gt; + * 2010<br>
&gt;&gt; +<br>
&gt;&gt; ************************************************************************/ +<br>
&gt;&gt; +/*<br>
&gt;&gt; + * Includes/Defines<br>
&gt;&gt; + */<br>
&gt;&gt; +#ifndef _TRIPEPS6_H_<br>
&gt;&gt; +#define _TRIPEPS6_H_<br>
&gt;&gt; +<br>
&gt;&gt; +#define STUART_SODIMM  1<br>
&gt;&gt; +<br>
&gt;&gt; +/* UART */<br>
&gt;&gt; +#define GPIO104_UART1_DSR      MFP_CFG(GPIO104, AF2)<br>
&gt;&gt; +#define GPIO105_UART1_DCD      MFP_CFG(GPIO105, AF2)<br>
&gt;&gt; +#define GPIO107_UART2_TXD      MFP_CFG_DRV(GPIO126, AF2, FAST)<br>
&gt;&gt; +#define GPIO107_UART2_RXD      MFP_CFG_DRV(GPIO36, AF2, FAST)<br>
&gt;&gt; +#define GPIO109_UART2_CTS      MFP_CFG(GPIO123, AF2)<br>
&gt;&gt; +#define GPIO109_UART2_RTS      MFP_CFG(GPIO124, AF2)<br>
&gt;&gt; +#define GPIO30_UART3_TXD       MFP_CFG_DRV(GPIO30, AF2, FAST)<br>
&gt;&gt; +#define GPIO31_UART3_RXD       MFP_CFG_DRV(GPIO31, AF2, FAST)<br>
&gt;&gt; +#define GPIO32_UART3_CTS       MFP_CFG(GPIO32, AF2)<br>
&gt;&gt; +#define GPIO33_UART3_RTS       MFP_CFG(GPIO33, AF2)<br>
&gt;&gt; +<br>
&gt;&gt; +/* MMC2 */<br>
&gt;&gt; +#define        GPIO122_MMC2_DAT3       MFP_CFG_DRV(GPIO122, AF4, FAST)<br>
&gt;&gt; +#define        GPIO121_MMC2_DAT2       MFP_CFG_DRV(GPIO121, AF4, FAST)<br>
&gt;&gt; +#define        GPIO120_MMC2_DAT1       MFP_CFG_DRV(GPIO120, AF4, FAST)<br>
&gt;&gt; +#define        GPIO119_MMC2_DAT0       MFP_CFG_DRV(GPIO119, AF4, FAST)<br>
&gt;&gt; +#define        GPIO28_MMC2_CMD         MFP_CFG_DRV(GPIO28, AF6, FAST)<br>
&gt;&gt; +#define        GPIO29_MMC2_CLK         MFP_CFG_DRV(GPIO29, AF6, FAST)<br>
&gt;&gt; +#define GPIO53_MMC2_CD         MFP_CFG(GPIO53, AF0)<br>
&gt;&gt; +<br>
&gt;&gt; +/*MMC4*/<br>
&gt;&gt; +#define        GPIO78_MMC4_DAT3        MFP_CFG_DRV(GPIO78, AF5, FAST)<br>
&gt;&gt; +#define        GPIO79_MMC4_DAT2        MFP_CFG_DRV(GPIO79, AF5, FAST)<br>
&gt;&gt; +#define        GPIO80_MMC4_DAT1        MFP_CFG_DRV(GPIO80, AF5, FAST)<br>
&gt;&gt; +#define        GPIO81_MMC4_DAT0        MFP_CFG_DRV(GPIO81, AF5, FAST)<br>
&gt;&gt; +#define        GPIO82_MMC4_CMD         MFP_CFG_DRV(GPIO82, AF5, FAST)<br>
&gt;&gt; +#define        GPIO83_MMC4_CLK         MFP_CFG_DRV(GPIO83, AF5, FAST)<br>
&gt;&gt; +<br>
&gt;&gt; +/* I2C */<br>
&gt;&gt; +#define GPIO102_CI2C_SDA       MFP_CFG(GPIO102, AF1)<br>
&gt;&gt; +<br>
&gt;&gt; +/* MFU */<br>
&gt;&gt; +#define GPIO86_TX_CLK   MFP_CFG(GPIO86, AF5)<br>
&gt;&gt; +#define GPIO87_TX_EN    MFP_CFG(GPIO87, AF5)<br>
&gt;&gt; +#define GPIO88_TX_DQ3   MFP_CFG(GPIO88, AF5)<br>
&gt;&gt; +#define GPIO89_TX_DQ2   MFP_CFG(GPIO89, AF5)<br>
&gt;&gt; +#define GPIO90_TX_DQ1   MFP_CFG(GPIO90, AF5)<br>
&gt;&gt; +#define GPIO91_TX_DQ0   MFP_CFG(GPIO91, AF5)<br>
&gt;&gt; +#define GPIO92_MII_CRS   MFP_CFG(GPIO92, AF5)<br>
&gt;&gt; +#define GPIO93_MII_COL   MFP_CFG(GPIO93, AF5)<br>
&gt;&gt; +#define GPIO94_RX_CLK   MFP_CFG(GPIO94, AF5)<br>
&gt;&gt; +#define GPIO95_RX_ER   MFP_CFG(GPIO95, AF5)<br>
&gt;&gt; +#define GPIO96_RX_DQ3   MFP_CFG(GPIO96, AF5)<br>
&gt;&gt; +#define GPIO97_RX_DQ2   MFP_CFG(GPIO97, AF5)<br>
&gt;&gt; +#define GPIO98_RX_DQ1   MFP_CFG(GPIO98, AF5)<br>
&gt;&gt; +#define GPIO99_RX_DQ0   MFP_CFG(GPIO99, AF5)<br>
&gt;&gt; +#define GPIO100_MII_MDC   MFP_CFG(GPIO100, AF5)<br>
&gt;&gt; +#define GPIO101_MII_MDIO   MFP_CFG(GPIO101, AF5)<br>
&gt;&gt; +#define GPIO103_RX_DV   MFP_CFG(GPIO103, AF5)<br>
&gt;&gt; +<br>
&gt;&gt; +/* AC97 */<br>
&gt;&gt; +#define GPIO115_AC97_BITCLK    MFP_CFG(GPIO115, AF6)<br>
&gt;&gt; +#define GPIO114_AC97_SDATA_IN_0        MFP_CFG(GPIO114, AF6)<br>
&gt;&gt; +#define GPIO116_AC97_SDATA_IN_1        MFP_CFG(GPIO116, AF6)<br>
&gt;&gt; +#define GPIO117_AC97_SDATA_OUT MFP_CFG(GPIO117, AF6)<br>
&gt;&gt; +#define GPIO118_AC97_SYNC      MFP_CFG(GPIO118, AF6)<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +#define TRIZEPS6_PHYS_BASE             0xd4000000<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +#define TRIZEPS6_PIC_PHYS      (0x88000000)    /* CS0-3 Logic chip on ConXS */<br>
&gt;&gt; +                               /* Logic on ConXS-board CSFR register*/<br>
&gt;&gt; +#define TRIZEPS6_CFSR_PHYS     (TRIZEPS6_PIC_PHYS)<br>
&gt;&gt; +                               /* Logic on ConXS-board BOCR register*/<br>
&gt;&gt; +#define TRIZEPS6_BOCR_PHYS     (TRIZEPS6_PIC_PHYS+0x00200000)<br>
&gt;&gt; +                               /* Logic on ConXS-board IRCR register*/<br>
&gt;&gt; +#define TRIZEPS6_IRCR_PHYS     (TRIZEPS6_PIC_PHYS+0x00300000)<br>
&gt;&gt; +                               /* Logic on ConXS-board UPSR register*/<br>
&gt;&gt; +#define TRIZEPS6_UPSR_PHYS     (TRIZEPS6_PIC_PHYS+0x00280000)<br>
&gt;&gt; +                               /* Logic on ConXS-board DICR register*/<br>
&gt;&gt; +#define TRIZEPS6_DICR_PHYS     (TRIZEPS6_PIC_PHYS+0x00380000)<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +#define TRIZEPS6_CPLD_PHYS  (0x8e000000) /* CPLD on Trizeps6 module */ +<br>
&gt;&gt; +#define TRIZEPS6_CPLD_CTRL_PHYS (TRIZEPS6_CPLD_PHYS)<br>
&gt;&gt; +#define TRIZEPS6_CPLD_FTUR_PHYS (TRIZEPS6_CPLD_PHYS+0x4)<br>
&gt;&gt; +#define TRIZEPS6_CPLD_HIBE_PHYS (TRIZEPS6_CPLD_PHYS+0x8)<br>
&gt;&gt; +#define TRIZEPS6_CPLD_PWM_PHYS (TRIZEPS6_CPLD_PHYS+0xc)<br>
&gt;&gt; +#define TRIZEPS6_CPLD_PLDR_PHYS (TRIZEPS6_CPLD_PHYS+0x10)<br>
&gt;&gt; +#define TRIZEPS6_CPLD_PSET_PHYS (TRIZEPS6_CPLD_PHYS+0x14)<br>
&gt;&gt; +#define TRIZEPS6_CPLD_TTLO_PHYS (TRIZEPS6_CPLD_PHYS+0x18)<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +/* MMC socket */<br>
&gt;&gt; +#define GPIO_MMC2_DET          53<br>
&gt;&gt; +#define TRIZEPS6_MMC2_IRQ      IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO53))<br>
&gt;&gt; +#define GPIO_MMC4_DET          41<br>
&gt;&gt; +#define TRIZEPS6_MMC4_IRQ      IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO41)<br>
&gt;&gt; +<br>
&gt;&gt; +/* Off-module PIC on ConXS board */<br>
&gt;&gt; +#define GPIO_PIC               51<br>
&gt;&gt; +#define TRIZEPS6_PIC_IRQ       IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO51)<br>
&gt;&gt; +<br>
&gt;&gt; +/* PCMCIA socket Compact Flash */<br>
&gt;&gt; +#define GPIO_PCD               43              /* PCMCIA Card Detect */<br>
&gt;&gt; +#define TRIZEPS6_CD_IRQ                IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO43)<br>
&gt;&gt; +#define GPIO_PRDY              113             /* READY / nINT */<br>
&gt;&gt; +#define TRIZEPS6_READY_NINT    IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO113) +<br>
&gt;&gt; +#define trizeps6_GPIO_CODEC_IRQ                116<br>
&gt;&gt; +<br>
&gt;&gt; +extern void trizeps6_ac97_acreset(int i);<br>
&gt;&gt; +<br>
&gt;&gt; +#endif /* _TRIPEPS6_H_ */<br>
&gt;&gt; diff --git a/arch/arm/mach-mmp/include/mach/trizeps6_cpld.h<br>
&gt;&gt; b/arch/arm/mach-mmp/include/mach/trizeps6_cpld.h<br>
&gt;&gt; index 0000000..8538a6b<br>
&gt;&gt; --- /dev/null<br>
&gt;&gt; +++ b/arch/arm/mach-mmp/include/mach/trizeps6_cpld.h<br>
&gt;&gt; @@ -0,0 +1,87 @@<br>
&gt;&gt; +#ifndef _TRIPEPS6_CPLD_H_<br>
&gt;&gt; +#define _TRIPEPS6_CPLD_H_<br>
&gt;&gt; +<br>
&gt;&gt; +/* index of resource */<br>
&gt;&gt; +#define CTRL_S         0<br>
&gt;&gt; +#define CTRL_R         1<br>
&gt;&gt; +#define FTUR_S         2<br>
&gt;&gt; +#define FTUR_R         3<br>
&gt;&gt; +#define HIBE_S         4<br>
&gt;&gt; +#define HIBE_R         5<br>
&gt;&gt; +#define PWM            6<br>
&gt;&gt; +#define PLDR_S         7<br>
&gt;&gt; +#define PLDR_R         8<br>
&gt;&gt; +#define PSET_S         9<br>
&gt;&gt; +#define PSET_R         10<br>
&gt;&gt; +#define TTLO_S         11<br>
&gt;&gt; +#define TTLO_R         12<br>
&gt;&gt; +<br>
&gt;&gt; +#define CPLD_CTRL_S cpld.addr[CTRL_S].val<br>
&gt;&gt; +#define CPLD_CTRL_R cpld.addr[CTRL_R].val<br>
&gt;&gt; +#define CPLD_CONTROL_GR                        (1 &lt;&lt; 0)<br>
&gt;&gt; +#define CPLD_CONTROL_CODEC             (1 &lt;&lt; 2)<br>
&gt;&gt; +#define CPLD_CONTROL_ETHPHY            (1 &lt;&lt; 3)<br>
&gt;&gt; +#define CPLD_CONTROL_RWL               (1 &lt;&lt; 4)<br>
&gt;&gt; +#define CPLD_CONTROL_RBT               (1 &lt;&lt; 5)<br>
&gt;&gt; +<br>
&gt;&gt; +#define CPLD_FTUR_S cpld.addr[FTUR_S].val<br>
&gt;&gt; +#define CPLD_FTUR_R cpld.addr[FTUR_R].val<br>
&gt;&gt; +#define CPLD_FEATURE_UART3_SODIMM      (1 &lt;&lt; 0)<br>
&gt;&gt; +#define CPLD_FEATURE_UART3_BT          (1 &lt;&lt; 1)<br>
&gt;&gt; +#define CPLD_FEATURE_CF_MODE           (1 &lt;&lt; 2)<br>
&gt;&gt; +#define CPLD_FEATURE_TTLIO             (1 &lt;&lt; 3)<br>
&gt;&gt; +#define CPLD_PWM_SODIMM_P69            (1 &lt;&lt; 4)<br>
&gt;&gt; +#define CPLD_PWM_SODIMM_P77            (1 &lt;&lt; 5)<br>
&gt;&gt; +#define CPLD_PWM_SODIMM_P106   (1 &lt;&lt; 6)<br>
&gt;&gt; +#define CPLD_BT_PWM_SODIMM             (1 &lt;&lt; 7)<br>
&gt;&gt; +<br>
&gt;&gt; +#define CPLD_HIBE_S cpld.addr[HIBE_S].val<br>
&gt;&gt; +#define CPLD_HIBE_R cpld.addr[HIBE_R].val<br>
&gt;&gt; +#define CPLD_HIBERNATE_MODE                            (1 &lt;&lt; 0)<br>
&gt;&gt; +#define CPLD_HIBERNATE_WAKE_TOUCH              (1 &lt;&lt; 1)<br>
&gt;&gt; +#define CPLD_HIBERNATE_WAKE_PMIC               (1 &lt;&lt; 2)<br>
&gt;&gt; +#define CPLD_HIBERNATE_WAKE_IRQ_P43            (1 &lt;&lt; 3)<br>
&gt;&gt; +<br>
&gt;&gt; +#define CPLD_PWM cpld.addr[PWM].val<br>
&gt;&gt; +<br>
&gt;&gt; +#define CPLD_PINLDR    cpld.addr[PINLDR].val<br>
&gt;&gt; +#define CPLD_PINLDR_P69                                        (1 &lt;&lt; 0)<br>
&gt;&gt; +#define CPLD_PINLDR_P100_PSKTSEL               (1 &lt;&lt; 1)<br>
&gt;&gt; +#define CPLD_PINLDR_P98_CFNREG                 (1 &lt;&lt; 2)<br>
&gt;&gt; +#define CPLD_PINLDR_P104_CFNIOIS16             (1 &lt;&lt; 3)<br>
&gt;&gt; +#define CPLD_PINLDR_P93_RDNWR                  (1 &lt;&lt; 4)<br>
&gt;&gt; +#define CPLD_PINLDR_P104_IRQ_P43               (1 &lt;&lt; 5)<br>
&gt;&gt; +<br>
&gt;&gt; +#define CPLD_PSET_S cpld.addr[PSET_S].val<br>
&gt;&gt; +#define CPLD_PSET_R cpld.addr[PSET_R].val<br>
&gt;&gt; +#define CPLD_PINSET_P69                                        (1 &lt;&lt; 0)<br>
&gt;&gt; +#define CPLD_PINSET_P100_PSKTSEL               (1 &lt;&lt; 1)<br>
&gt;&gt; +#define CPLD_PINSET_P98_CFNREG                 (1 &lt;&lt; 2)<br>
&gt;&gt; +#define CPLD_PINSET_P104_CFNIOIS16             (1 &lt;&lt; 3)<br>
&gt;&gt; +#define CPLD_PINSET_P93_RDnWR                  (1 &lt;&lt; 4)<br>
&gt;&gt; +<br>
&gt;&gt; +#define CPLD_TTLO_S cpld.addr[TTLO_S].val<br>
&gt;&gt; +#define CPLD_TTLO_R cpld.addr[TTLO_R].val<br>
&gt;&gt; +#define CPLD_TTLIO_W_A8                        (1 &lt;&lt; 0)<br>
&gt;&gt; +#define CPLD_TTLIO_W_A9                        (1 &lt;&lt; 1)<br>
&gt;&gt; +#define CPLD_TTLIO_W_A10               (1 &lt;&lt; 2)<br>
&gt;&gt; +#define CPLD_TTLIO_W_A11               (1 &lt;&lt; 3)<br>
&gt;&gt; +#define CPLD_TTLIO_W_A12               (1 &lt;&lt; 4)<br>
&gt;&gt; +#define CPLD_TTLIO_W_A13               (1 &lt;&lt; 5)<br>
&gt;&gt; +#define CPLD_TTLIO_W_A14               (1 &lt;&lt; 6)<br>
&gt;&gt; +#define CPLD_TTLIO_W_A15               (1 &lt;&lt; 7)<br>
&gt;&gt; +#define CPLD_TTLIO_r_A0                        (1 &lt;&lt; 0)<br>
&gt;&gt; +#define CPLD_TTLIO_r_A1                        (1 &lt;&lt; 1)<br>
&gt;&gt; +#define CPLD_TTLIO_r_A2                        (1 &lt;&lt; 2)<br>
&gt;&gt; +#define CPLD_TTLIO_r_A3                        (1 &lt;&lt; 3)<br>
&gt;&gt; +#define CPLD_TTLIO_r_A4                        (1 &lt;&lt; 4)<br>
&gt;&gt; +#define CPLD_TTLIO_r_A5                        (1 &lt;&lt; 5)<br>
&gt;&gt; +#define CPLD_TTLIO_r_A6                        (1 &lt;&lt; 6)<br>
&gt;&gt; +#define CPLD_TTLIO_r_A7                        (1 &lt;&lt; 7)<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +extern unsigned short trizeps6_cpld_readw(unsigned int reg);<br>
&gt;&gt; +extern inline void trizeps6_cpld_writew(unsigned int reg, unsigned short<br>
&gt;&gt; value);<br>
&gt;&gt; +<br>
&gt;&gt; +#endif /* _TRIPEPS6_CPLD_H_ */<br>
&gt;&gt; diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c index<br>
&gt;&gt; 72b4e76..9c2396e 100644<br>
&gt;&gt; --- a/arch/arm/mach-mmp/pxa168.c<br>
&gt;&gt; +++ b/arch/arm/mach-mmp/pxa168.c<br>
&gt;&gt; @@ -66,6 +66,7 @@ void __init pxa168_init_irq(void)<br>
&gt;&gt;  /* APB peripheral clocks */<br>
&gt;&gt;  static APBC_CLK(uart1, PXA168_UART1, 1, 14745600);<br>
&gt;&gt;  static APBC_CLK(uart2, PXA168_UART2, 1, 14745600);<br>
&gt;&gt; +static APBC_CLK(uart3, PXA168_UART3, 1, 14745600);<br>
&gt;&gt;  static APBC_CLK(twsi0, PXA168_TWSI0, 1, 33000000);<br>
&gt;&gt;  static APBC_CLK(twsi1, PXA168_TWSI1, 1, 33000000);<br>
&gt;&gt;  static APBC_CLK(pwm1, PXA168_PWM1, 1, 13000000);<br>
&gt;&gt; @@ -78,14 +79,18 @@ static APBC_CLK(ssp3, PXA168_SSP3, 4, 0);<br>
&gt;&gt;  static APBC_CLK(ssp4, PXA168_SSP4, 4, 0);<br>
&gt;&gt;  static APBC_CLK(ssp5, PXA168_SSP5, 4, 0);<br>
&gt;&gt;  static APBC_CLK(keypad, PXA168_KPC, 0, 32000);<br>
&gt;&gt; +static APBC_CLK(ac97, PXA168_AC97, 0, 24576000);<br>
&gt;&gt; +<br>
&gt;&gt;<br>
&gt;&gt;  static APMU_CLK(nand, NAND, 0x01db, 208000000);<br>
&gt;&gt;  static APMU_CLK(lcd, LCD, 0x7f, 312000000);<br>
&gt;&gt; +static APMU_CLK(mfu, MFU, 0x9, 0);<br>
&gt;&gt;<br>
&gt;&gt;  /* device and clock bindings */<br>
&gt;&gt;  static struct clk_lookup pxa168_clkregs[] = {<br>
&gt;&gt;        INIT_CLKREG(&amp;clk_uart1, &quot;pxa2xx-uart.0&quot;, NULL),<br>
&gt;&gt;        INIT_CLKREG(&amp;clk_uart2, &quot;pxa2xx-uart.1&quot;, NULL),<br>
&gt;&gt; +       INIT_CLKREG(&amp;clk_uart3, &quot;pxa2xx-uart.2&quot;, NULL),<br>
&gt;&gt;        INIT_CLKREG(&amp;clk_twsi0, &quot;pxa2xx-i2c.0&quot;, NULL),<br>
&gt;&gt;        INIT_CLKREG(&amp;clk_twsi1, &quot;pxa2xx-i2c.1&quot;, NULL),<br>
&gt;&gt;        INIT_CLKREG(&amp;clk_pwm1, &quot;pxa168-pwm.0&quot;, NULL),<br>
&gt;&gt; @@ -100,6 +105,8 @@ static struct clk_lookup pxa168_clkregs[] = {<br>
&gt;&gt;        INIT_CLKREG(&amp;clk_nand, &quot;pxa3xx-nand&quot;, NULL),<br>
&gt;&gt;        INIT_CLKREG(&amp;clk_lcd, &quot;pxa168-fb&quot;, NULL),<br>
&gt;&gt;        INIT_CLKREG(&amp;clk_keypad, &quot;pxa27x-keypad&quot;, NULL),<br>
&gt;&gt; +       INIT_CLKREG(&amp;clk_mfu, &quot;pxa168-eth&quot;, &quot;MFUCLK&quot;),<br>
&gt;&gt; +       INIT_CLKREG(&amp;clk_ac97, &quot;pxa2xx-ac97&quot;, &quot;AC97CLK&quot;),<br>
&gt;&gt;  };<br>
&gt;&gt;<br>
&gt;&gt;  static int __init pxa168_init(void)<br>
&gt;&gt; @@ -149,6 +156,7 @@ void pxa168_clear_keypad_wakeup(void)<br>
&gt;&gt;  /* on-chip devices */<br>
&gt;&gt;  PXA168_DEVICE(uart1, &quot;pxa2xx-uart&quot;, 0, UART1, 0xd4017000, 0x30, 21, 22);<br>
&gt;&gt; PXA168_DEVICE(uart2, &quot;pxa2xx-uart&quot;, 1, UART2, 0xd4018000, 0x30, 23, 24);<br>
&gt;&gt; +PXA168_DEVICE(uart3, &quot;pxa2xx-uart&quot;, 2, UART3, 0xd4026000, 0x30, 23, 24);<br>
&gt;&gt;  PXA168_DEVICE(twsi0, &quot;pxa2xx-i2c&quot;, 0, TWSI0, 0xd4011000, 0x28);<br>
&gt;&gt;  PXA168_DEVICE(twsi1, &quot;pxa2xx-i2c&quot;, 1, TWSI1, 0xd4025000, 0x28);<br>
&gt;&gt;  PXA168_DEVICE(pwm1, &quot;pxa168-pwm&quot;, 0, NONE, 0xd401a000, 0x10);<br>
&gt;&gt; @@ -163,3 +171,5 @@ PXA168_DEVICE(ssp4, &quot;pxa168-ssp&quot;, 3, SSP4, 0xd4020000,<br>
&gt;&gt; 0x40, 58, 59);<br>
&gt;&gt;  PXA168_DEVICE(ssp5, &quot;pxa168-ssp&quot;, 4, SSP5, 0xd4021000, 0x40, 60, 61);<br>
&gt;&gt; PXA168_DEVICE(fb, &quot;pxa168-fb&quot;, -1, LCD, 0xd420b000, 0x1c8);<br>
&gt;&gt;  PXA168_DEVICE(keypad, &quot;pxa27x-keypad&quot;, -1, KEYPAD, 0xd4012000, 0x4c);<br>
&gt;&gt; +PXA168_DEVICE(mfu, &quot;pxa168-eth&quot;, -1, MFU, 0xc0800000, 0x0FFF);<br>
&gt;&gt; +PXA168_DEVICE(ac97, &quot;pxa2xx-ac97&quot;, -1, AC97, 0xd402B000, 0x0fff); diff<br>
&gt;&gt; --git a/arch/arm/mach-mmp/trizeps6.c b/arch/arm/mach-mmp/trizeps6.c index<br>
&gt;&gt; 0000000..a935f14<br>
&gt;&gt; --- /dev/null<br>
&gt;&gt; +++ b/arch/arm/mach-mmp/trizeps6.c<br>
&gt;&gt; @@ -0,0 +1,469 @@<br>
&gt;&gt; +/*<br>
&gt;&gt; + *  linux/arch/arm/mach-mmp/trizeps6.c<br>
&gt;&gt; + *<br>
&gt;&gt; + *  Support for the Keith und Koep Trizeps6 Modul Platform<br>
&gt;&gt; + *  based on Marvell PXA168-CPU<br>
&gt;&gt; + *<br>
&gt;&gt; + *  Author:    Yupeng Schneider<br>
&gt;&gt; + *<br>
&gt;&gt; + *  This program is free software; you can redistribute it and/or modify<br>
&gt;&gt; + *  it under the terms of the GNU General Public License version 2 as + *<br>
&gt;&gt;  publishhed by the Free Software Foundation.<br>
&gt;&gt; + */<br>
&gt;&gt; +<br>
&gt;&gt; +#include &lt;linux/init.h&gt;<br>
&gt;&gt; +#include &lt;linux/kernel.h&gt;<br>
&gt;&gt; +#include &lt;linux/platform_device.h&gt;<br>
&gt;&gt; +#include &lt;linux/mtd/mtd.h&gt;<br>
&gt;&gt; +#include &lt;linux/mtd/partitions.h&gt;<br>
&gt;&gt; +#include &lt;linux/mtd/nand.h&gt;<br>
&gt;&gt; +#include &lt;linux/delay.h&gt;<br>
&gt;&gt; +#include &lt;asm/mach-types.h&gt;<br>
&gt;&gt; +#include &lt;asm/mach/arch.h&gt;<br>
&gt;&gt; +#include &lt;mach/addr-map.h&gt;<br>
&gt;&gt; +#include &lt;mach/mfp-pxa168.h&gt;<br>
&gt;&gt; +#include &lt;mach/pxa168.h&gt;<br>
&gt;&gt; +#include &lt;mach/gpio.h&gt;<br>
&gt;&gt; +#include &lt;linux/pxa168_eth.h&gt;<br>
&gt;&gt; +#include &lt;mach/irqs.h&gt;<br>
&gt;&gt; +#include &lt;mach/trizeps6.h&gt;<br>
&gt;&gt; +#include &lt;mach/trizeps6_cpld.h&gt;<br>
&gt;&gt; +#include &quot;common.h&quot;<br>
&gt;&gt; +#include &lt;linux/mmc/sdhci.h&gt;<br>
&gt;&gt; +#include &lt;linux/ucb1400.h&gt;<br>
&gt;&gt; +#include &lt;mach/audio.h&gt;<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +static unsigned long trizeps6_pin_config[] __initdata = {<br>
&gt;&gt; +       /* Data Flash Interface */<br>
&gt;&gt; +       GPIO0_DFI_D15,<br>
&gt;&gt; +       GPIO1_DFI_D14,<br>
&gt;&gt; +       GPIO2_DFI_D13,<br>
&gt;&gt; +       GPIO3_DFI_D12,<br>
&gt;&gt; +       GPIO4_DFI_D11,<br>
&gt;&gt; +       GPIO5_DFI_D10,<br>
&gt;&gt; +       GPIO6_DFI_D9,<br>
&gt;&gt; +       GPIO7_DFI_D8,<br>
&gt;&gt; +       GPIO8_DFI_D7,<br>
&gt;&gt; +       GPIO9_DFI_D6,<br>
&gt;&gt; +       GPIO10_DFI_D5,<br>
&gt;&gt; +       GPIO11_DFI_D4,<br>
&gt;&gt; +       GPIO12_DFI_D3,<br>
&gt;&gt; +       GPIO13_DFI_D2,<br>
&gt;&gt; +       GPIO14_DFI_D1,<br>
&gt;&gt; +       GPIO15_DFI_D0,<br>
&gt;&gt; +<br>
&gt;&gt; +       /* Static Memory Controller */<br>
&gt;&gt; +       GPIO18_SMC_nCS0,<br>
&gt;&gt; +       GPIO34_SMC_nCS1,<br>
&gt;&gt; +       GPIO23_SMC_nLUA,<br>
&gt;&gt; +       GPIO25_SMC_nLLA,<br>
&gt;&gt; +       GPIO28_SMC_RDY,<br>
&gt;&gt; +       GPIO29_SMC_SCLK,<br>
&gt;&gt; +       GPIO35_SMC_BE1,<br>
&gt;&gt; +       GPIO36_SMC_BE2,<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +       /* UART1 */<br>
&gt;&gt; +       GPIO107_UART1_RXD,<br>
&gt;&gt; +       GPIO108_UART1_TXD,<br>
&gt;&gt; +       GPIO107_UART1_RXD,<br>
&gt;&gt; +       GPIO108_UART1_TXD,<br>
&gt;&gt; +       GPIO109_UART1_RTS,<br>
&gt;&gt; +       GPIO110_UART1_CTS,<br>
&gt;&gt; +       GPIO111_UART1_RI,<br>
&gt;&gt; +       GPIO104_UART1_DSR,<br>
&gt;&gt; +       GPIO112_UART1_DTR,<br>
&gt;&gt; +       GPIO105_UART1_DCD,<br>
&gt;&gt; +<br>
&gt;&gt; +       /* UART2 */<br>
&gt;&gt; +       GPIO107_UART2_TXD,<br>
&gt;&gt; +       GPIO107_UART2_RXD,<br>
&gt;&gt; +       GPIO109_UART2_CTS,<br>
&gt;&gt; +       GPIO109_UART2_RTS,<br>
&gt;&gt; +<br>
&gt;&gt; +       /* UART3 */<br>
&gt;&gt; +       GPIO30_UART3_TXD,<br>
&gt;&gt; +       GPIO31_UART3_RXD,<br>
&gt;&gt; +       GPIO32_UART3_CTS,<br>
&gt;&gt; +       GPIO33_UART3_RTS,<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +       /* MFU */<br>
&gt;&gt; +       GPIO86_TX_CLK,<br>
&gt;&gt; +       GPIO87_TX_EN,<br>
&gt;&gt; +       GPIO88_TX_DQ3,<br>
&gt;&gt; +       GPIO89_TX_DQ2,<br>
&gt;&gt; +       GPIO90_TX_DQ1,<br>
&gt;&gt; +       GPIO91_TX_DQ0,<br>
&gt;&gt; +       GPIO92_MII_CRS,<br>
&gt;&gt; +       GPIO93_MII_COL,<br>
&gt;&gt; +       GPIO94_RX_CLK,<br>
&gt;&gt; +       GPIO95_RX_ER,<br>
&gt;&gt; +       GPIO96_RX_DQ3,<br>
&gt;&gt; +       GPIO97_RX_DQ2,<br>
&gt;&gt; +       GPIO98_RX_DQ1,<br>
&gt;&gt; +       GPIO99_RX_DQ0,<br>
&gt;&gt; +       GPIO100_MII_MDC,<br>
&gt;&gt; +       GPIO101_MII_MDIO,<br>
&gt;&gt; +       GPIO103_RX_DV,<br>
&gt;&gt; +<br>
&gt;&gt; +       /* USB OTG */<br>
&gt;&gt; +       GPIO85_GPIO,<br>
&gt;&gt; +       GPIO47_GPIO,<br>
&gt;&gt; +<br>
&gt;&gt; +       /* i2c bus */<br>
&gt;&gt; +       GPIO102_CI2C_SDA,<br>
&gt;&gt; +       GPIO106_CI2C_SCL,<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +       /* MMC2 */<br>
&gt;&gt; +       GPIO122_MMC2_DAT3 | MFP_PULL_HIGH,<br>
&gt;&gt; +       GPIO121_MMC2_DAT2 | MFP_PULL_HIGH,<br>
&gt;&gt; +       GPIO120_MMC2_DAT1 | MFP_PULL_HIGH,<br>
&gt;&gt; +       GPIO119_MMC2_DAT0 | MFP_PULL_HIGH,<br>
&gt;&gt; +       GPIO28_MMC2_CMD | MFP_PULL_HIGH,<br>
&gt;&gt; +       GPIO29_MMC2_CLK,<br>
&gt;&gt; +       GPIO53_MMC2_CD | MFP_PULL_LOW,                  /* TRIZEPS6_MMC2_IRQ */<br>
&gt;&gt; +<br>
&gt;&gt; +       /* MMC4 */<br>
&gt;&gt; +       GPIO78_MMC4_DAT3 | MFP_PULL_HIGH,<br>
&gt;&gt; +       GPIO79_MMC4_DAT2 | MFP_PULL_HIGH,<br>
&gt;&gt; +       GPIO80_MMC4_DAT1 | MFP_PULL_HIGH,<br>
&gt;&gt; +       GPIO81_MMC4_DAT0 | MFP_PULL_HIGH,<br>
&gt;&gt; +       GPIO82_MMC4_CMD | MFP_PULL_HIGH,<br>
&gt;&gt; +       GPIO83_MMC4_CLK,<br>
&gt;&gt; +<br>
&gt;&gt; +       /* LCD */<br>
&gt;&gt; +       GPIO56_LCD_FCLK_RD,<br>
&gt;&gt; +       GPIO57_LCD_LCLK_A0,<br>
&gt;&gt; +       GPIO58_LCD_PCLK_WR,<br>
&gt;&gt; +       GPIO59_LCD_DENA_BIAS,<br>
&gt;&gt; +       GPIO60_LCD_DD0,<br>
&gt;&gt; +       GPIO61_LCD_DD1,<br>
&gt;&gt; +       GPIO62_LCD_DD2,<br>
&gt;&gt; +       GPIO63_LCD_DD3,<br>
&gt;&gt; +       GPIO64_LCD_DD4,<br>
&gt;&gt; +       GPIO65_LCD_DD5,<br>
&gt;&gt; +       GPIO66_LCD_DD6,<br>
&gt;&gt; +       GPIO67_LCD_DD7,<br>
&gt;&gt; +       GPIO68_LCD_DD8,<br>
&gt;&gt; +       GPIO69_LCD_DD9,<br>
&gt;&gt; +       GPIO70_LCD_DD10,<br>
&gt;&gt; +       GPIO71_LCD_DD11,<br>
&gt;&gt; +       GPIO72_LCD_DD12,<br>
&gt;&gt; +       GPIO73_LCD_DD13,<br>
&gt;&gt; +       GPIO74_LCD_DD14,<br>
&gt;&gt; +       GPIO75_LCD_DD15,<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +       /* AC97 */<br>
&gt;&gt; +       GPIO115_AC97_BITCLK,<br>
&gt;&gt; +       GPIO114_AC97_SDATA_IN_0,<br>
&gt;&gt; +       GPIO117_AC97_SDATA_OUT,<br>
&gt;&gt; +       GPIO118_AC97_SYNC,<br>
&gt;&gt; +       GPIO116_GPIO,<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +       GPIO51_GPIO,                    /* TRIZEPS6_PIC_IRQ */<br>
&gt;&gt; +       GPIO27_GPIO,                    /* Ethernet IRQ */<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +/****************************************************************************<br>
&gt;&gt; + * CPLD<br>
&gt;&gt; +<br>
&gt;&gt; ****************************************************************************/<br>
&gt;&gt; +<br>
&gt;&gt; +static struct resource tri6_cpld_resources[] = {<br>
&gt;&gt; +       [CTRL_S] = {<br>
&gt;&gt; +               .start  = TRIZEPS6_CPLD_CTRL_PHYS,<br>
&gt;&gt; +               .end    = TRIZEPS6_CPLD_CTRL_PHYS+1,<br>
&gt;&gt; +               .flags  = IORESOURCE_MEM,<br>
&gt;&gt; +       },<br>
&gt;&gt; +       [CTRL_R] = {<br>
&gt;&gt; +               .start  = TRIZEPS6_CPLD_CTRL_PHYS+2,<br>
&gt;&gt; +               .end    = TRIZEPS6_CPLD_CTRL_PHYS+3,<br>
&gt;&gt; +               .flags  = IORESOURCE_MEM,<br>
&gt;&gt; +       },<br>
&gt;&gt; +       [FTUR_S] = {<br>
&gt;&gt; +               .start  = TRIZEPS6_CPLD_FTUR_PHYS,<br>
&gt;&gt; +               .end    = TRIZEPS6_CPLD_FTUR_PHYS+1,<br>
&gt;&gt; +               .flags  = IORESOURCE_MEM,<br>
&gt;&gt; +       },<br>
&gt;&gt; +       [FTUR_R] = {<br>
&gt;&gt; +               .start  = TRIZEPS6_CPLD_FTUR_PHYS+2,<br>
&gt;&gt; +               .end    = TRIZEPS6_CPLD_FTUR_PHYS+3,<br>
&gt;&gt; +               .flags  = IORESOURCE_MEM,<br>
&gt;&gt; +       },<br>
&gt;&gt; +       [HIBE_S] = {<br>
&gt;&gt; +               .start  = TRIZEPS6_CPLD_HIBE_PHYS,<br>
&gt;&gt; +               .end    = TRIZEPS6_CPLD_HIBE_PHYS+1,<br>
&gt;&gt; +               .flags  = IORESOURCE_MEM,<br>
&gt;&gt; +       },<br>
&gt;&gt; +       [HIBE_R] = {<br>
&gt;&gt; +               .start  = TRIZEPS6_CPLD_HIBE_PHYS+2,<br>
&gt;&gt; +               .end    = TRIZEPS6_CPLD_HIBE_PHYS+3,<br>
&gt;&gt; +               .flags  = IORESOURCE_MEM,<br>
&gt;&gt; +       },<br>
&gt;&gt; +       [PWM] = {<br>
&gt;&gt; +               .start  = TRIZEPS6_CPLD_PWM_PHYS,<br>
&gt;&gt; +               .end    = TRIZEPS6_CPLD_PWM_PHYS+1,<br>
&gt;&gt; +               .flags  = IORESOURCE_MEM,<br>
&gt;&gt; +       },<br>
&gt;&gt; +       [PLDR_S] = {<br>
&gt;&gt; +               .start  = TRIZEPS6_CPLD_PLDR_PHYS,<br>
&gt;&gt; +               .end    = TRIZEPS6_CPLD_PLDR_PHYS+1,<br>
&gt;&gt; +               .flags  = IORESOURCE_MEM,<br>
&gt;&gt; +       },<br>
&gt;&gt; +       [PLDR_R] = {<br>
&gt;&gt; +               .start  = TRIZEPS6_CPLD_PLDR_PHYS+2,<br>
&gt;&gt; +               .end    = TRIZEPS6_CPLD_PLDR_PHYS+3,<br>
&gt;&gt; +               .flags  = IORESOURCE_MEM,<br>
&gt;&gt; +       },<br>
&gt;&gt; +       [PSET_S] = {<br>
&gt;&gt; +               .start  = TRIZEPS6_CPLD_PSET_PHYS,<br>
&gt;&gt; +               .end    = TRIZEPS6_CPLD_PSET_PHYS+1,<br>
&gt;&gt; +               .flags  = IORESOURCE_MEM,<br>
&gt;&gt; +       },<br>
&gt;&gt; +       [PSET_R] = {<br>
&gt;&gt; +               .start  = TRIZEPS6_CPLD_PSET_PHYS+2,<br>
&gt;&gt; +               .end    = TRIZEPS6_CPLD_PSET_PHYS+3,<br>
&gt;&gt; +               .flags  = IORESOURCE_MEM,<br>
&gt;&gt; +       },<br>
&gt;&gt; +       [TTLO_S] = {<br>
&gt;&gt; +               .start  = TRIZEPS6_CPLD_TTLO_PHYS,<br>
&gt;&gt; +               .end    = TRIZEPS6_CPLD_TTLO_PHYS+1,<br>
&gt;&gt; +               .flags  = IORESOURCE_MEM,<br>
&gt;&gt; +       },<br>
&gt;&gt; +       [TTLO_R] = {<br>
&gt;&gt; +               .start  = TRIZEPS6_CPLD_TTLO_PHYS+2,<br>
&gt;&gt; +               .end    = TRIZEPS6_CPLD_TTLO_PHYS+3,<br>
&gt;&gt; +               .flags  = IORESOURCE_MEM,<br>
&gt;&gt; +       },<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +static int tri6_cpld_platdata = 1;<br>
&gt;&gt; +<br>
&gt;&gt; +static struct platform_device cpld_device = {<br>
&gt;&gt; +       .name           = &quot;trizeps6-cpld&quot;,<br>
&gt;&gt; +       .id             = -1,<br>
&gt;&gt; +       .num_resources  = ARRAY_SIZE(tri6_cpld_resources),<br>
&gt;&gt; +       .resource       = tri6_cpld_resources,<br>
&gt;&gt; +       .dev            = {<br>
&gt;&gt; +               .platform_data = &amp;tri6_cpld_platdata,<br>
&gt;&gt; +       }<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +/******************************************************************************<br>
&gt;&gt; + * Audio and Touchscreen<br>
&gt;&gt; +<br>
&gt;&gt; ******************************************************************************/<br>
&gt;&gt; +<br>
&gt;&gt; +static struct ucb1400_pdata trizeps6_ucb1400_pdata = {<br>
&gt;&gt; +       .irq            =  gpio_to_irq(trizeps6_GPIO_CODEC_IRQ),<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +static struct pxa2xx_audio_ops_t trizeps6_ac97_pdata = {<br>
&gt;&gt; +       .codec_pdata    = { &amp;trizeps6_ucb1400_pdata, },<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +static struct platform_device trizeps6_ucb1400_device = {<br>
&gt;&gt; +       .name           = &quot;ucb1400_core&quot;,<br>
&gt;&gt; +       .id             = -1,<br>
&gt;&gt; +       .dev            = {<br>
&gt;&gt; +               .platform_data = &amp;trizeps6_ucb1400_pdata,<br>
&gt;&gt; +       },<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +static void __init trizeps6_ts_init(void)<br>
&gt;&gt; +{<br>
&gt;&gt; +       pxa168_add_ac97(&amp;trizeps6_ac97_pdata);<br>
&gt;&gt; +       platform_device_register(&amp;trizeps6_ucb1400_device);<br>
&gt;&gt; +}<br>
&gt;&gt; +<br>
&gt;&gt; +void trizeps6_ac97_acreset(int i)<br>
&gt;&gt; +{      unsigned short value;<br>
&gt;&gt; +<br>
&gt;&gt; +       if (i == 1) {<br>
&gt;&gt; +<br>
&gt;&gt; +               value = trizeps6_cpld_readw(CTRL_S);<br>
&gt;&gt; +               trizeps6_cpld_writew(CTRL_S, value | CPLD_CONTROL_CODEC);<br>
&gt;&gt; +       }<br>
&gt;&gt; +       if (!i) {<br>
&gt;&gt; +               value = trizeps6_cpld_readw(CTRL_R);<br>
&gt;&gt; +               trizeps6_cpld_writew(CTRL_R, value | CPLD_CONTROL_CODEC);<br>
&gt;&gt; +       }<br>
&gt;&gt; +}<br>
&gt;&gt; +<br>
&gt;&gt; +/******************************************************************************<br>
&gt;&gt; + * Ethernet<br>
&gt;&gt; +<br>
&gt;&gt; ******************************************************************************/<br>
&gt;&gt; +static int trizeps6_eth_init(void)<br>
&gt;&gt; +{<br>
&gt;&gt; +       unsigned short value;<br>
&gt;&gt; +<br>
&gt;&gt; +       value = trizeps6_cpld_readw(CTRL_R);<br>
&gt;&gt; +       trizeps6_cpld_writew(CTRL_R, value | CPLD_CONTROL_ETHPHY);<br>
&gt;&gt; +       return 0;<br>
&gt;&gt; +<br>
&gt;&gt; +}<br>
&gt;&gt; +<br>
&gt;&gt; +static struct pxa168_eth_platform_data trizeps6_eth_data = {<br>
&gt;&gt; +       .phy_addr       = 0x1f,<br>
&gt;&gt; +       .port_number = 0,<br>
&gt;&gt; +       .init           = trizeps6_eth_init,<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +/******************************************************************************<br>
&gt;&gt; + * NAND<br>
&gt;&gt; +<br>
&gt;&gt; ******************************************************************************/<br>
&gt;&gt; +static struct pxa3xx_nand_timing stnand02gw3b2d_timing = {<br>
&gt;&gt; +       .tCH    = 10,<br>
&gt;&gt; +       .tCS    = 40,<br>
&gt;&gt; +       .tWH    = 20,<br>
&gt;&gt; +       .tWP    = 24,<br>
&gt;&gt; +       .tRH    = 20,<br>
&gt;&gt; +       .tRP    = 24,<br>
&gt;&gt; +       .tR         = 50000,<br>
&gt;&gt; +       .tWHR   = 120,<br>
&gt;&gt; +       .tAR    = 20,<br>
&gt;&gt; +<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +static struct pxa3xx_nand_cmdset largepage_cmdset = {<br>
&gt;&gt; +       .read1          = 0x3000,<br>
&gt;&gt; +       .read2          = 0x0050,<br>
&gt;&gt; +       .program        = 0x1080,<br>
&gt;&gt; +       .read_status    = 0x0070,<br>
&gt;&gt; +       .read_id        = 0x0090,<br>
&gt;&gt; +       .erase          = 0xD060,<br>
&gt;&gt; +       .reset          = 0x00FF,<br>
&gt;&gt; +       .lock           = 0x002A,<br>
&gt;&gt; +       .unlock         = 0x2423,<br>
&gt;&gt; +       .lock_status    = 0x007A,<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +static struct pxa3xx_nand_flash trizeps6_flashes[] = {<br>
&gt;&gt; +       {<br>
&gt;&gt; +               .timing = &amp;stnand02gw3b2d_timing,<br>
&gt;&gt; +               .cmdset = &amp;largepage_cmdset,<br>
&gt;&gt; +               .page_per_block = 64,<br>
&gt;&gt; +               .page_size      = 2048,<br>
&gt;&gt; +               .flash_width    = 8,<br>
&gt;&gt; +               .dfc_width      = 8,<br>
&gt;&gt; +               .num_blocks     = 2048,<br>
&gt;&gt; +               .chip_id        = 0xda20,<br>
&gt;&gt; +       },<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +static struct mtd_partition trizeps6_nand_partitions[] = {<br>
&gt;&gt; +       {<br>
&gt;&gt; +               .name           = &quot;bootloader&quot;,<br>
&gt;&gt; +               .offset         = 0,<br>
&gt;&gt; +               .size           = SZ_16M,<br>
&gt;&gt; +               .mask_flags     = MTD_WRITEABLE,<br>
&gt;&gt; +       }, {<br>
&gt;&gt; +               .name           = &quot;reserved&quot;,<br>
&gt;&gt; +               .offset         = MTDPART_OFS_APPEND,<br>
&gt;&gt; +               .size           = SZ_128K,<br>
&gt;&gt; +               .mask_flags     = MTD_WRITEABLE,<br>
&gt;&gt; +       }, {<br>
&gt;&gt; +               .name           = &quot;kernel&quot;,<br>
&gt;&gt; +               .offset         = MTDPART_OFS_APPEND,<br>
&gt;&gt; +               .size           = (2*SZ_2M + SZ_1M),<br>
&gt;&gt; +               .mask_flags     = 0,<br>
&gt;&gt; +       }, {<br>
&gt;&gt; +               .name           = &quot;filesystem&quot;,<br>
&gt;&gt; +               .offset         = MTDPART_OFS_APPEND,<br>
&gt;&gt; +               .size = (SZ_256M - 3*SZ_8M),<br>
&gt;&gt; +               .mask_flags     = 0,<br>
&gt;&gt; +       }<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +static struct pxa3xx_nand_platform_data trizeps6_nand_info = {<br>
&gt;&gt; +       .enable_arbiter = 1,<br>
&gt;&gt; +       .parts          = trizeps6_nand_partitions,<br>
&gt;&gt; +       .nr_parts       = ARRAY_SIZE(trizeps6_nand_partitions),<br>
&gt;&gt; +       .flash      = trizeps6_flashes,<br>
&gt;&gt; +       .num_flash  = ARRAY_SIZE(trizeps6_flashes),<br>
&gt;&gt; +       .keep_config = 0<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +static struct i2c_board_info trizeps6_i2c_devices[]  = {<br>
&gt;&gt; +       { I2C_BOARD_INFO(&quot;pcf8593&quot;, 0x51), },<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +/******************************************************************************<br>
&gt;&gt; + * LCD<br>
&gt;&gt; +<br>
&gt;&gt; ******************************************************************************/<br>
&gt;&gt; +static struct fb_videomode trizeps6_video_modes[] = {<br>
&gt;&gt; +       [0] = {<br>
&gt;&gt; +               .pixclock       = 39720,<br>
&gt;&gt; +               .refresh        = 60,<br>
&gt;&gt; +               .xres           = 640,<br>
&gt;&gt; +               .yres           = 480,<br>
&gt;&gt; +               .hsync_len      = 63,<br>
&gt;&gt; +               .left_margin    = 12,<br>
&gt;&gt; +               .right_margin   = 12,<br>
&gt;&gt; +               .vsync_len      = 4,<br>
&gt;&gt; +               .upper_margin   = 32,<br>
&gt;&gt; +               .lower_margin   = 10,<br>
&gt;&gt; +               .sync           = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT,<br>
&gt;&gt; +       },<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +static struct pxa168fb_mach_info trizeps6_lcd_info = {<br>
&gt;&gt; +       .id                     = &quot;Base-trizeps6&quot;,<br>
&gt;&gt; +       .modes                  = trizeps6_video_modes,<br>
&gt;&gt; +       .num_modes              = ARRAY_SIZE(trizeps6_video_modes),<br>
&gt;&gt; +       .pix_fmt                = PIX_FMT_RGB565,<br>
&gt;&gt; +       .io_pin_allocation_mode = PIN_MODE_DUMB_16_GPIO,<br>
&gt;&gt; +       .dumb_mode              = DUMB_MODE_RGB565,<br>
&gt;&gt; +       .active                 = 1,<br>
&gt;&gt; +       .panel_rbswap           = 1,<br>
&gt;&gt; +       .invert_pixclock        = 0,<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +static struct platform_device *trizeps6_devices[] __initdata = {<br>
&gt;&gt; +       &amp;cpld_device,<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +static void __init trizeps6_init(void)<br>
&gt;&gt; +{<br>
&gt;&gt; +       mfp_config(ARRAY_AND_SIZE(trizeps6_pin_config));<br>
&gt;&gt; +<br>
&gt;&gt; +       pxa168_add_uart(1);<br>
&gt;&gt; +       pxa168_add_uart(2);<br>
&gt;&gt; +#ifdef STUART_SODIMM<br>
&gt;&gt; +       pxa168_add_uart(3);<br>
&gt;&gt; +#endif<br>
&gt;&gt; +       pxa168_add_nand(&amp;trizeps6_nand_info);<br>
&gt;&gt; +       platform_add_devices(trizeps6_devices,<br>
&gt;&gt; +                                       ARRAY_SIZE(trizeps6_devices));<br>
&gt;&gt; +<br>
&gt;&gt; +       pxa168_add_fb(&amp;trizeps6_lcd_info);<br>
&gt;&gt; +       pxa168_add_mfu(&amp;trizeps6_eth_data);<br>
&gt;&gt; +       pxa168_add_twsi(0, NULL, ARRAY_AND_SIZE(trizeps6_i2c_devices));<br>
&gt;&gt; +       trizeps6_ts_init();<br>
&gt;&gt; +}<br>
&gt;&gt; +<br>
&gt;&gt; +static void __init trizeps6_map_io(void)<br>
&gt;&gt; +{<br>
&gt;&gt; +       mmp_map_io();<br>
&gt;&gt; +}<br>
&gt;&gt; +<br>
&gt;&gt; +MACHINE_START(TRIZEPS6, &quot;PXA168-based Keith &amp; Koep Trizeps VI Development<br>
&gt;&gt; Module&quot;)<br>
&gt;&gt; +       /* MAINTAINER(&quot;Yupeng Schneider&quot; &lt;<a href="mailto:yupeng.schneider@googlemail.com">yupeng.schneider@googlemail.com</a>&gt;) */<br>
&gt;&gt; +       .map_io         = trizeps6_map_io,<br>
&gt;&gt; +       .init_irq       = pxa168_init_irq,<br>
&gt;&gt; +       .timer          = &amp;pxa168_timer,<br>
&gt;&gt; +       .init_machine   = trizeps6_init,<br>
&gt;&gt; +MACHINE_END<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; diff --git a/arch/arm/mach-mmp/trizeps6_cpld.c<br>
&gt;&gt; b/arch/arm/mach-mmp/trizeps6_cpld.c<br>
&gt;&gt; index 0000000..2577b0f<br>
&gt;&gt; --- /dev/null<br>
&gt;&gt; +++ b/arch/arm/mach-mmp/trizeps6_cpld.c<br>
&gt;&gt; @@ -0,0 +1,145 @@<br>
&gt;&gt; +/*<br>
&gt;&gt; + *  linux/arch/arm/mach-mmp/trizeps6_cpld.c<br>
&gt;&gt; + *<br>
&gt;&gt; + *<br>
&gt;&gt; + *  Author:    Yupeng Schneider<br>
&gt;&gt; + *  Created:   27 10, 2010<br>
&gt;&gt; + *  Copyright: Yupeng Schneider<br>
&gt;&gt; + *<br>
&gt;&gt; + *  This program is free software; you can redistribute it and/or modify<br>
&gt;&gt; + *  it under the terms of the GNU General Public License version 2 as + *<br>
&gt;&gt;  published by the Free Software Foundation.*/<br>
&gt;&gt; +<br>
&gt;&gt; +#include &lt;linux/kernel.h&gt;<br>
&gt;&gt; +#include &lt;linux/ioport.h&gt;<br>
&gt;&gt; +#include &lt;linux/platform_device.h&gt;<br>
&gt;&gt; +#include &lt;linux/device.h&gt;<br>
&gt;&gt; +#include &lt;linux/module.h&gt;<br>
&gt;&gt; +<br>
&gt;&gt; +#include &lt;asm/io.h&gt;<br>
&gt;&gt; +#include &lt;asm/delay.h&gt;<br>
&gt;&gt; +#include &lt;mach/trizeps6.h&gt;<br>
&gt;&gt; +#include &lt;mach/trizeps6_cpld.h&gt;<br>
&gt;&gt; +<br>
&gt;&gt; +struct cpld_info {<br>
&gt;&gt; +       struct region {<br>
&gt;&gt; +               struct resource *res;<br>
&gt;&gt; +               struct resource *req;<br>
&gt;&gt; +               void __iomem    *iom;<br>
&gt;&gt; +               unsigned short   val;<br>
&gt;&gt; +       } addr[7];<br>
&gt;&gt; +} cpld_info;<br>
&gt;&gt; +<br>
&gt;&gt; +static struct cpld_info cpld = { { { 0 } } };<br>
&gt;&gt; +<br>
&gt;&gt; +inline void trizeps6_cpld_writew(unsigned int reg, unsigned short value) +{<br>
&gt;&gt; +       if ((cpld.addr[reg].iom != NULL))<br>
&gt;&gt; +               writew(value, cpld.addr[reg].iom);<br>
&gt;&gt; +<br>
&gt;&gt; +}<br>
&gt;&gt; +<br>
&gt;&gt; +unsigned short trizeps6_cpld_readw(unsigned int reg)<br>
&gt;&gt; +{<br>
&gt;&gt; +       short value = 0;<br>
&gt;&gt; +       if (reg != HIBE_S || reg != HIBE_R || reg != PWM || reg != PSET_S || reg<br>
&gt;&gt; != PSET_R) {<br>
&gt;&gt; +<br>
&gt;&gt; +               if ((cpld.addr[reg].iom != NULL))<br>
&gt;&gt; +                       value = readw(cpld.addr[reg].iom);<br>
&gt;&gt; +       }<br>
&gt;&gt; +       return value;<br>
&gt;&gt; +}<br>
&gt;&gt; +EXPORT_SYMBOL(trizeps6_cpld_readw);<br>
&gt;&gt; +<br>
&gt;&gt; +static int trizeps6_cpld_probe(struct platform_device *pdev)<br>
&gt;&gt; +{<br>
&gt;&gt; +       int i;<br>
&gt;&gt; +<br>
&gt;&gt; +       CPLD_CTRL_R = CPLD_CONTROL_ETHPHY | CPLD_CONTROL_GR;<br>
&gt;&gt; +#ifdef STUART_SODIMM<br>
&gt;&gt; +       CPLD_FTUR_S = CPLD_FEATURE_UART3_SODIMM;<br>
&gt;&gt; +#endif<br>
&gt;&gt; +       for (i = CTRL_S; i &lt;= TTLO_R; i++) {<br>
&gt;&gt; +               cpld.addr[i].res = platform_get_resource(pdev, IORESOURCE_MEM, i);<br>
&gt;&gt; +               if (cpld.addr[i].res == NULL) {<br>
&gt;&gt; +                       dev_err(&amp;pdev-&gt;dev, &quot;cannot get resource %d area\n&quot;, i);<br>
&gt;&gt; +                       return -EIO;<br>
&gt;&gt; +               }<br>
&gt;&gt; +               cpld.addr[i].req = request_mem_region(cpld.addr[i].res-&gt;start,<br>
&gt;&gt; +                                                       2, pdev-&gt;name);<br>
&gt;&gt; +               if (cpld.addr[i].req == NULL) {<br>
&gt;&gt; +                       dev_err(&amp;pdev-&gt;dev, &quot;cannot claim addr area %d\n&quot;, i);<br>
&gt;&gt; +                       return -EIO;<br>
&gt;&gt; +               }<br>
&gt;&gt; +               cpld.addr[i].iom = ioremap(cpld.addr[i].res-&gt;start, 2);<br>
&gt;&gt; +               if (cpld.addr[i].iom == NULL) {<br>
&gt;&gt; +                       dev_err(&amp;pdev-&gt;dev, &quot;cannot remap addr area %d\n&quot;, i);<br>
&gt;&gt; +                       return -EIO;<br>
&gt;&gt; +               }<br>
&gt;&gt; +               switch (i) {<br>
&gt;&gt; +               case CTRL_R:<br>
&gt;&gt; +                       trizeps6_cpld_writew(CTRL_R, CPLD_CTRL_R);<br>
&gt;&gt; +                       break;<br>
&gt;&gt; +               case FTUR_S:<br>
&gt;&gt; +                       trizeps6_cpld_writew(FTUR_S, CPLD_FTUR_S);<br>
&gt;&gt; +                       break;<br>
&gt;&gt; +               default:<br>
&gt;&gt; +                       ;<br>
&gt;&gt; +<br>
&gt;&gt; +               }<br>
&gt;&gt; +               dev_dbg(&amp;pdev-&gt;dev, &quot;mapped region  [%d] %08x -&gt; %p\n&quot;, i,<br>
&gt;&gt; +                               (int)cpld.addr[i].req-&gt;start, cpld.addr[i].iom);<br>
&gt;&gt; +       }<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +       return 0;<br>
&gt;&gt; +}<br>
&gt;&gt; +<br>
&gt;&gt; +static int trizeps6_cpld_remove(struct platform_device *pdev)<br>
&gt;&gt; +{<br>
&gt;&gt; +       dev_dbg(&amp;pdev-&gt;dev, &quot;trizeps6_cpld_remove()\n&quot;);<br>
&gt;&gt; +       return 0;<br>
&gt;&gt; +}<br>
&gt;&gt; +<br>
&gt;&gt; +#ifdef CONFIG_PM<br>
&gt;&gt; +static int trizeps6_cpld_suspend(struct platform_device *pdev,<br>
&gt;&gt; pm_message_t state)<br>
&gt;&gt; +{<br>
&gt;&gt; +       return 0;<br>
&gt;&gt; +}<br>
&gt;&gt; +<br>
&gt;&gt; +static int trizeps6_cpld_resume(struct platform_device *pdev)<br>
&gt;&gt; +{<br>
&gt;&gt; +       return 0;<br>
&gt;&gt; +}<br>
&gt;&gt; +#endif<br>
&gt;&gt; +<br>
&gt;&gt; +static struct platform_driver trizeps6_cpld_driver = {<br>
&gt;&gt; +       .probe          = trizeps6_cpld_probe,<br>
&gt;&gt; +       .remove         = trizeps6_cpld_remove,<br>
&gt;&gt; +#ifdef CONFIG_PM<br>
&gt;&gt; +       .suspend        = trizeps6_cpld_suspend,<br>
&gt;&gt; +       .resume         = trizeps6_cpld_resume,<br>
&gt;&gt; +#endif<br>
&gt;&gt; +       .driver         = {<br>
&gt;&gt; +               .name           = &quot;trizeps6-cpld&quot;,<br>
&gt;&gt; +       },<br>
&gt;&gt; +};<br>
&gt;&gt; +<br>
&gt;&gt; +<br>
&gt;&gt; +static int __devinit trizeps6_cpld_init(void)<br>
&gt;&gt; +{<br>
&gt;&gt; +<br>
&gt;&gt; +       return platform_driver_register(&amp;trizeps6_cpld_driver);<br>
&gt;&gt; +}<br>
&gt;&gt; +<br>
&gt;&gt; +static void trizeps6_cpld_exit(void)<br>
&gt;&gt; +{<br>
&gt;&gt; +       platform_driver_unregister(&amp;trizeps6_cpld_driver);<br>
&gt;&gt; +}<br>
&gt;&gt; +<br>
&gt;&gt; +arch_initcall(trizeps6_cpld_init);<br>
&gt;&gt; +module_exit(trizeps6_cpld_exit);<br>
&gt;&gt; +<br>
&gt;&gt; +MODULE_AUTHOR(&quot;Yupeng Schneider &lt;<a href="mailto:yupeng.schneider@googlemail.com">yupeng.schneider@googlemail.com</a>&gt;&quot;);<br>
&gt;&gt; +MODULE_DESCRIPTION(&quot;Trizeps VI CPLD&quot;);<br>
&gt;&gt; +MODULE_LICENSE(&quot;GPL&quot;);<br>
&gt;&gt; --<br>
&gt;&gt; 1.6.3.3<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;<br>
</div></div></blockquote></div><br>