[PATCH 02/17] ARM: pxa: Access SMEMC via virtual addresses

Eric Miao eric.y.miao at gmail.com
Wed Nov 3 10:37:14 EDT 2010


On Wed, Nov 3, 2010 at 7:51 AM, Marek Vasut <marek.vasut at gmail.com> wrote:
> This is important because on PXA3xx, the physical mapping of SMEMC registers
> differs from the one on PXA2xx. In order to get PCMCIA working on both PXA2xx
> and PXA320, the PCMCIA driver was adjusted accordingly as well.
>
> Also, various places in the kernel had to be patched to use
> __raw_read/__raw_write.
>
> Signed-off-by: Marek Vasut <marek.vasut at gmail.com>
> Acked-by: Haojian Zhuang <haojian.zhuang at gmail.com>
> ---
>  arch/arm/mach-pxa/cm-x2xx.c                  |   13 +++--
>  arch/arm/mach-pxa/cpufreq-pxa2xx.c           |   10 ++--
>  arch/arm/mach-pxa/csb726.c                   |    7 ++-
>  arch/arm/mach-pxa/generic.c                  |    1 +
>  arch/arm/mach-pxa/h5000.c                    |    9 ++--
>  arch/arm/mach-pxa/include/mach/pxa-smemc.h   |   74 ++++++++++++++++++++++++++
>  arch/arm/mach-pxa/include/mach/pxa2xx-regs.h |   55 -------------------
>  arch/arm/mach-pxa/lpd270.c                   |    3 +-
>  arch/arm/mach-pxa/lubbock.c                  |    3 +-
>  arch/arm/mach-pxa/mainstone.c                |    5 +-
>  arch/arm/mach-pxa/pxa25x.c                   |    5 +-
>  arch/arm/mach-pxa/pxa27x.c                   |   10 ++--
>  arch/arm/mach-pxa/pxa3xx.c                   |    5 +-
>  arch/arm/mach-pxa/sleep.S                    |    2 +-
>  arch/arm/mach-pxa/smemc.c                    |   51 ++++++------------
>  arch/arm/mach-pxa/spitz.c                    |    5 +-
>  arch/arm/mach-pxa/stargate2.c                |    3 +-
>  arch/arm/mach-pxa/tosa.c                     |    7 ++-
>  arch/arm/mach-pxa/trizeps4.c                 |    3 +-
>  arch/arm/mach-pxa/xcep.c                     |    5 +-
>  arch/arm/mach-pxa/zeus.c                     |    5 +-
>  drivers/pcmcia/pxa2xx_base.c                 |   65 +++++++++++++++-------
>  22 files changed, 196 insertions(+), 150 deletions(-)
>  create mode 100644 arch/arm/mach-pxa/include/mach/pxa-smemc.h
>
> diff --git a/arch/arm/mach-pxa/cm-x2xx.c b/arch/arm/mach-pxa/cm-x2xx.c
> index ca8ad86..bb33b0f 100644
> --- a/arch/arm/mach-pxa/cm-x2xx.c
> +++ b/arch/arm/mach-pxa/cm-x2xx.c
> @@ -24,6 +24,7 @@
>  #include <mach/pxa2xx-regs.h>
>  #include <mach/audio.h>
>  #include <mach/pxafb.h>
> +#include <mach/pxa-smemc.h>
>
>  #include <asm/hardware/it8152.h>
>
> @@ -392,9 +393,9 @@ static int cmx2xx_suspend(struct sys_device *dev, pm_message_t state)
>        cmx2xx_pci_suspend();
>
>        /* save MSC registers */
> -       sleep_save_msc[0] = MSC0;
> -       sleep_save_msc[1] = MSC1;
> -       sleep_save_msc[2] = MSC2;
> +       sleep_save_msc[0] = __raw_readl(MSC0);
> +       sleep_save_msc[1] = __raw_readl(MSC1);
> +       sleep_save_msc[2] = __raw_readl(MSC2);
>
>        /* setup power saving mode registers */
>        PCFR = 0x0;
> @@ -416,9 +417,9 @@ static int cmx2xx_resume(struct sys_device *dev)
>        cmx2xx_pci_resume();
>
>        /* restore MSC registers */
> -       MSC0 = sleep_save_msc[0];
> -       MSC1 = sleep_save_msc[1];
> -       MSC2 = sleep_save_msc[2];
> +       __raw_writel(sleep_save_msc[0], MSC0);
> +       __raw_writel(sleep_save_msc[1], MSC1);
> +       __raw_writel(sleep_save_msc[2], MSC2);
>
>        return 0;
>  }
> diff --git a/arch/arm/mach-pxa/cpufreq-pxa2xx.c b/arch/arm/mach-pxa/cpufreq-pxa2xx.c
> index 58093d9..1af67ad 100644
> --- a/arch/arm/mach-pxa/cpufreq-pxa2xx.c
> +++ b/arch/arm/mach-pxa/cpufreq-pxa2xx.c
> @@ -38,8 +38,10 @@
>  #include <linux/cpufreq.h>
>  #include <linux/err.h>
>  #include <linux/regulator/consumer.h>
> +#include <linux/io.h>
>
>  #include <mach/pxa2xx-regs.h>
> +#include <mach/pxa-smemc.h>
>
>  #ifdef DEBUG
>  static unsigned int freq_debug;
> @@ -242,7 +244,7 @@ static void pxa27x_guess_max_freq(void)
>
>  static void init_sdram_rows(void)
>  {
> -       uint32_t mdcnfg = MDCNFG;
> +       uint32_t mdcnfg = __raw_readl(MDCNFG);
>        unsigned int drac2 = 0, drac0 = 0;
>
>        if (mdcnfg & (MDCNFG_DE2 | MDCNFG_DE3))
> @@ -331,8 +333,8 @@ static int pxa_set_target(struct cpufreq_policy *policy,
>         * we need to preset the smaller DRI before the change.  If we're
>         * speeding up we need to set the larger DRI value after the change.
>         */
> -       preset_mdrefr = postset_mdrefr = MDREFR;
> -       if ((MDREFR & MDREFR_DRI_MASK) > mdrefr_dri(new_freq_mem)) {
> +       preset_mdrefr = postset_mdrefr = __raw_readl(MDREFR);
> +       if ((__raw_readl(MDREFR) & MDREFR_DRI_MASK) > mdrefr_dri(new_freq_mem)) {

The second __raw_readl() isn't necessary actually, could be something like
below:

	preset_mdrefr = postset_mdrefr = __raw_readl(MDREFR);
	if ((preset_mdrefr & MDREFR_DRI_MASK) > mdrefr_dri(new_freq_mem)) {
		preset_mdrefr = (preset_mdrefr & ~MDREFR_DRI_MASK);
		preset_mdrefr |= mdrefr_dri(new_freq_mem);
	}
	postset_mdrefr =
		(postset_mdrefr & ~MDREFR_DRI_MASK) | mdrefr_dri(new_freq_mem);



>                preset_mdrefr = (preset_mdrefr & ~MDREFR_DRI_MASK);
>                preset_mdrefr |= mdrefr_dri(new_freq_mem);
>        }
> @@ -370,7 +372,7 @@ static int pxa_set_target(struct cpufreq_policy *policy,
>  3:             nop                                                     \n\
>          "
>                     : "=&r" (unused)
> -                    : "r" (&MDREFR), "r" (cclkcfg),
> +                    : "r" (MDREFR), "r" (cclkcfg),
>                       "r" (preset_mdrefr), "r" (postset_mdrefr)
>                     : "r4", "r5");
>        local_irq_restore(flags);
> diff --git a/arch/arm/mach-pxa/csb726.c b/arch/arm/mach-pxa/csb726.c
> index 225a2a1..2429666 100644
> --- a/arch/arm/mach-pxa/csb726.c
> +++ b/arch/arm/mach-pxa/csb726.c
> @@ -27,6 +27,7 @@
>  #include <mach/ohci.h>
>  #include <mach/pxa2xx-regs.h>
>  #include <mach/audio.h>
> +#include <mach/pxa-smemc.h>
>
>  #include "generic.h"
>  #include "devices.h"
> @@ -255,9 +256,9 @@ static struct platform_device *devices[] __initdata = {
>  static void __init csb726_init(void)
>  {
>        pxa2xx_mfp_config(ARRAY_AND_SIZE(csb726_pin_config));
> -/*     MSC1 = 0x7ffc3ffc; *//* LAN9215/EXP_CS */
> -/*     MSC2 = 0x06697ff4; *//* none/SM501 */
> -       MSC2 = (MSC2 & ~0xffff) | 0x7ff4; /* SM501 */
> +/*     __raw_writel(0x7ffc3ffc, MSC1); *//* LAN9215/EXP_CS */
> +/*     __raw_writel(0x06697ff4, MSC2); *//* none/SM501 */
> +       __raw_writel((__raw_readl(MSC2) & ~0xffff) | 0x7ff4, MSC2); /* SM501 */
>
>        pxa_set_ffuart_info(NULL);
>        pxa_set_btuart_info(NULL);
> diff --git a/arch/arm/mach-pxa/generic.c b/arch/arm/mach-pxa/generic.c
> index 6a5f379..05f6227 100644
> --- a/arch/arm/mach-pxa/generic.c
> +++ b/arch/arm/mach-pxa/generic.c
> @@ -28,6 +28,7 @@
>
>  #include <mach/reset.h>
>  #include <mach/gpio.h>
> +#include <mach/pxa-smemc.h>
>
>  #include "generic.h"
>
> diff --git a/arch/arm/mach-pxa/h5000.c b/arch/arm/mach-pxa/h5000.c
> index 0ef1635..42e60c6 100644
> --- a/arch/arm/mach-pxa/h5000.c
> +++ b/arch/arm/mach-pxa/h5000.c
> @@ -32,6 +32,7 @@
>  #include <mach/pxa25x.h>
>  #include <mach/h5000.h>
>  #include <mach/udc.h>
> +#include <mach/pxa-smemc.h>
>
>  #include "generic.h"
>
> @@ -172,11 +173,11 @@ static unsigned long h5000_pin_config[] __initdata = {
>
>  static void fix_msc(void)
>  {
> -       MSC0 = 0x129c24f2;
> -       MSC1 = 0x7ff424fa;
> -       MSC2 = 0x7ff47ff4;
> +       __raw_writel(0x129c24f2, MSC0);
> +       __raw_writel(0x7ff424fa, MSC1);
> +       __raw_writel(0x7ff47ff4, MSC2);
>
> -       MDREFR |= 0x02080000;
> +       __raw_writel(__raw_readl(MDREFR) | 0x02080000, MDREFR);
>  }
>
>  /*
> diff --git a/arch/arm/mach-pxa/include/mach/pxa-smemc.h b/arch/arm/mach-pxa/include/mach/pxa-smemc.h
> new file mode 100644
> index 0000000..e3b270b
> --- /dev/null
> +++ b/arch/arm/mach-pxa/include/mach/pxa-smemc.h

I'd rather this being short as smemc.h, or regs-smemc.h, but not
necessarily pxa-, it's being implied by arch/arm/mach-pxa/ already.

> @@ -0,0 +1,74 @@
> +/*
> + * Static memory controller register definitions for PXA CPUs
> + *
> + * Copyright (C) 2010 Marek Vasut <marek.vasut at gmail.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#ifndef __PXA_SMEMC_REGS_H
> +#define __PXA_SMEMC_REGS_H
> +
> +#define        PXA2XX_SMEMC_BASE       0x48000000
> +#define        PXA3XX_SMEMC_BASE       0x4a000000
> +#define        PXA_SMEMC_VIRT          0xf6000000

I'd rather this being short as SMEMC_VIRT, we have PXA_ all over already.

> +
> +#define MDCNFG         (PXA_SMEMC_VIRT + 0x00)  /* SDRAM Configuration Register 0 */
> +#define MDREFR         (PXA_SMEMC_VIRT + 0x04)  /* SDRAM Refresh Control Register */

These two registers are actually referenced in sleep.S and standby.S as
well, so you might check those two files as well.

> +#define MSC0           (PXA_SMEMC_VIRT + 0x08)  /* Static Memory Control Register 0 */
> +#define MSC1           (PXA_SMEMC_VIRT + 0x0C)  /* Static Memory Control Register 1 */
> +#define MSC2           (PXA_SMEMC_VIRT + 0x10)  /* Static Memory Control Register 2 */
> +#define MECR           (PXA_SMEMC_VIRT + 0x14)  /* Expansion Memory (PCMCIA/Compact Flash) Bus Configuration */
> +#define SXLCR          (PXA_SMEMC_VIRT + 0x18)  /* LCR value to be written to SDRAM-Timing Synchronous Flash */
> +#define SXCNFG         (PXA_SMEMC_VIRT + 0x1C)  /* Synchronous Static Memory Control Register */
> +#define SXMRS          (PXA_SMEMC_VIRT + 0x24)  /* MRS value to be written to Synchronous Flash or SMROM */
> +#define MCMEM0         (PXA_SMEMC_VIRT + 0x28)  /* Card interface Common Memory Space Socket 0 Timing */
> +#define MCMEM1         (PXA_SMEMC_VIRT + 0x2C)  /* Card interface Common Memory Space Socket 1 Timing */
> +#define MCATT0         (PXA_SMEMC_VIRT + 0x30)  /* Card interface Attribute Space Socket 0 Timing Configuration */
> +#define MCATT1         (PXA_SMEMC_VIRT + 0x34)  /* Card interface Attribute Space Socket 1 Timing Configuration */
> +#define MCIO0          (PXA_SMEMC_VIRT + 0x38)  /* Card interface I/O Space Socket 0 Timing Configuration */
> +#define MCIO1          (PXA_SMEMC_VIRT + 0x3C)  /* Card interface I/O Space Socket 1 Timing Configuration */
> +#define MDMRS          (PXA_SMEMC_VIRT + 0x40)  /* MRS value to be written to SDRAM */
> +#define BOOT_DEF       (PXA_SMEMC_VIRT + 0x44)  /* Read-Only Boot-Time Register. Contains BOOT_SEL and PKG_SEL */
> +#define MEMCLKCFG      (PXA_SMEMC_VIRT + 0x68) /* Clock Configuration */
> +#define CSADRCFG0      (PXA_SMEMC_VIRT + 0x80) /* Address Configuration Register for CS0 */
> +#define CSADRCFG1      (PXA_SMEMC_VIRT + 0x84) /* Address Configuration Register for CS1 */
> +#define CSADRCFG2      (PXA_SMEMC_VIRT + 0x88) /* Address Configuration Register for CS2 */
> +#define CSADRCFG3      (PXA_SMEMC_VIRT + 0x8C) /* Address Configuration Register for CS3 */
> +
> +/*
> + * More handy macros for PCMCIA
> + *
> + * Arg is socket number
> + */
> +#define MCMEM(s)       (PXA_SMEMC_VIRT + 0x28 + ((s)<<2))  /* Card interface Common Memory Space Socket s Timing */
> +#define MCATT(s)       (PXA_SMEMC_VIRT + 0x30 + ((s)<<2))  /* Card interface Attribute Space Socket s Timing Configuration */
> +#define MCIO(s)                (PXA_SMEMC_VIRT + 0x38 + ((s)<<2))  /* Card interface I/O Space Socket s Timing Configuration */
> +
> +/* MECR register defines */
> +#define MECR_NOS       (1 << 0)        /* Number Of Sockets: 0 -> 1 sock, 1 -> 2 sock */
> +#define MECR_CIT       (1 << 1)        /* Card Is There: 0 -> no card, 1 -> card inserted */
> +
> +#define MDCNFG_DE0     (1 << 0)        /* SDRAM Bank 0 Enable */
> +#define MDCNFG_DE1     (1 << 1)        /* SDRAM Bank 1 Enable */
> +#define MDCNFG_DE2     (1 << 16)       /* SDRAM Bank 2 Enable */
> +#define MDCNFG_DE3     (1 << 17)       /* SDRAM Bank 3 Enable */
> +
> +#define MDREFR_K0DB4   (1 << 29)       /* SDCLK0 Divide by 4 Control/Status */
> +#define MDREFR_K2FREE  (1 << 25)       /* SDRAM Free-Running Control */
> +#define MDREFR_K1FREE  (1 << 24)       /* SDRAM Free-Running Control */
> +#define MDREFR_K0FREE  (1 << 23)       /* SDRAM Free-Running Control */
> +#define MDREFR_SLFRSH  (1 << 22)       /* SDRAM Self-Refresh Control/Status */
> +#define MDREFR_APD     (1 << 20)       /* SDRAM/SSRAM Auto-Power-Down Enable */
> +#define MDREFR_K2DB2   (1 << 19)       /* SDCLK2 Divide by 2 Control/Status */
> +#define MDREFR_K2RUN   (1 << 18)       /* SDCLK2 Run Control/Status */
> +#define MDREFR_K1DB2   (1 << 17)       /* SDCLK1 Divide by 2 Control/Status */
> +#define MDREFR_K1RUN   (1 << 16)       /* SDCLK1 Run Control/Status */
> +#define MDREFR_E1PIN   (1 << 15)       /* SDCKE1 Level Control/Status */
> +#define MDREFR_K0DB2   (1 << 14)       /* SDCLK0 Divide by 2 Control/Status */
> +#define MDREFR_K0RUN   (1 << 13)       /* SDCLK0 Run Control/Status */
> +#define MDREFR_E0PIN   (1 << 12)       /* SDCKE0 Level Control/Status */
> +
> +#endif
> diff --git a/arch/arm/mach-pxa/include/mach/pxa2xx-regs.h b/arch/arm/mach-pxa/include/mach/pxa2xx-regs.h
> index dd0fc1c..ee6ced1 100644
> --- a/arch/arm/mach-pxa/include/mach/pxa2xx-regs.h
> +++ b/arch/arm/mach-pxa/include/mach/pxa2xx-regs.h
> @@ -17,61 +17,6 @@
>  #include <mach/hardware.h>
>
>  /*
> - * Memory controller
> - */
> -
> -#define MDCNFG         __REG(0x48000000)  /* SDRAM Configuration Register 0 */
> -#define MDREFR         __REG(0x48000004)  /* SDRAM Refresh Control Register */
> -#define MSC0           __REG(0x48000008)  /* Static Memory Control Register 0 */
> -#define MSC1           __REG(0x4800000C)  /* Static Memory Control Register 1 */
> -#define MSC2           __REG(0x48000010)  /* Static Memory Control Register 2 */
> -#define MECR           __REG(0x48000014)  /* Expansion Memory (PCMCIA/Compact Flash) Bus Configuration */
> -#define SXLCR          __REG(0x48000018)  /* LCR value to be written to SDRAM-Timing Synchronous Flash */
> -#define SXCNFG         __REG(0x4800001C)  /* Synchronous Static Memory Control Register */
> -#define SXMRS          __REG(0x48000024)  /* MRS value to be written to Synchronous Flash or SMROM */
> -#define MCMEM0         __REG(0x48000028)  /* Card interface Common Memory Space Socket 0 Timing */
> -#define MCMEM1         __REG(0x4800002C)  /* Card interface Common Memory Space Socket 1 Timing */
> -#define MCATT0         __REG(0x48000030)  /* Card interface Attribute Space Socket 0 Timing Configuration */
> -#define MCATT1         __REG(0x48000034)  /* Card interface Attribute Space Socket 1 Timing Configuration */
> -#define MCIO0          __REG(0x48000038)  /* Card interface I/O Space Socket 0 Timing Configuration */
> -#define MCIO1          __REG(0x4800003C)  /* Card interface I/O Space Socket 1 Timing Configuration */
> -#define MDMRS          __REG(0x48000040)  /* MRS value to be written to SDRAM */
> -#define BOOT_DEF       __REG(0x48000044)  /* Read-Only Boot-Time Register. Contains BOOT_SEL and PKG_SEL */
> -
> -/*
> - * More handy macros for PCMCIA
> - *
> - * Arg is socket number
> - */
> -#define MCMEM(s)       __REG2(0x48000028, (s)<<2 )  /* Card interface Common Memory Space Socket s Timing */
> -#define MCATT(s)       __REG2(0x48000030, (s)<<2 )  /* Card interface Attribute Space Socket s Timing Configuration */
> -#define MCIO(s)                __REG2(0x48000038, (s)<<2 )  /* Card interface I/O Space Socket s Timing Configuration */
> -
> -/* MECR register defines */
> -#define MECR_NOS       (1 << 0)        /* Number Of Sockets: 0 -> 1 sock, 1 -> 2 sock */
> -#define MECR_CIT       (1 << 1)        /* Card Is There: 0 -> no card, 1 -> card inserted */
> -
> -#define MDCNFG_DE0     (1 << 0)        /* SDRAM Bank 0 Enable */
> -#define MDCNFG_DE1     (1 << 1)        /* SDRAM Bank 1 Enable */
> -#define MDCNFG_DE2     (1 << 16)       /* SDRAM Bank 2 Enable */
> -#define MDCNFG_DE3     (1 << 17)       /* SDRAM Bank 3 Enable */
> -
> -#define MDREFR_K0DB4   (1 << 29)       /* SDCLK0 Divide by 4 Control/Status */
> -#define MDREFR_K2FREE  (1 << 25)       /* SDRAM Free-Running Control */
> -#define MDREFR_K1FREE  (1 << 24)       /* SDRAM Free-Running Control */
> -#define MDREFR_K0FREE  (1 << 23)       /* SDRAM Free-Running Control */
> -#define MDREFR_SLFRSH  (1 << 22)       /* SDRAM Self-Refresh Control/Status */
> -#define MDREFR_APD     (1 << 20)       /* SDRAM/SSRAM Auto-Power-Down Enable */
> -#define MDREFR_K2DB2   (1 << 19)       /* SDCLK2 Divide by 2 Control/Status */
> -#define MDREFR_K2RUN   (1 << 18)       /* SDCLK2 Run Control/Status */
> -#define MDREFR_K1DB2   (1 << 17)       /* SDCLK1 Divide by 2 Control/Status */
> -#define MDREFR_K1RUN   (1 << 16)       /* SDCLK1 Run Control/Status */
> -#define MDREFR_E1PIN   (1 << 15)       /* SDCKE1 Level Control/Status */
> -#define MDREFR_K0DB2   (1 << 14)       /* SDCLK0 Divide by 2 Control/Status */
> -#define MDREFR_K0RUN   (1 << 13)       /* SDCLK0 Run Control/Status */
> -#define MDREFR_E0PIN   (1 << 12)       /* SDCKE0 Level Control/Status */
> -
> -/*
>  * Power Manager
>  */
>
> diff --git a/arch/arm/mach-pxa/lpd270.c b/arch/arm/mach-pxa/lpd270.c
> index db615d5..86d94a3 100644
> --- a/arch/arm/mach-pxa/lpd270.c
> +++ b/arch/arm/mach-pxa/lpd270.c
> @@ -46,6 +46,7 @@
>  #include <mach/mmc.h>
>  #include <mach/irda.h>
>  #include <mach/ohci.h>
> +#include <mach/pxa-smemc.h>
>
>  #include "generic.h"
>  #include "devices.h"
> @@ -463,7 +464,7 @@ static void __init lpd270_init(void)
>        pxa_set_btuart_info(NULL);
>        pxa_set_stuart_info(NULL);
>
> -       lpd270_flash_data[0].width = (BOOT_DEF & 1) ? 2 : 4;
> +       lpd270_flash_data[0].width = (__raw_readl(BOOT_DEF) & 1) ? 2 : 4;
>        lpd270_flash_data[1].width = 4;
>
>        /*
> diff --git a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c
> index 5b1cc1c..f9dfea7 100644
> --- a/arch/arm/mach-pxa/lubbock.c
> +++ b/arch/arm/mach-pxa/lubbock.c
> @@ -50,6 +50,7 @@
>  #include <mach/pxafb.h>
>  #include <mach/mmc.h>
>  #include <mach/pm.h>
> +#include <mach/pxa-smemc.h>
>
>  #include "generic.h"
>  #include "clock.h"
> @@ -525,7 +526,7 @@ static void __init lubbock_init(void)
>        pxa_set_ac97_info(NULL);
>
>        lubbock_flash_data[0].width = lubbock_flash_data[1].width =
> -               (BOOT_DEF & 1) ? 2 : 4;
> +               (__raw_readl(BOOT_DEF) & 1) ? 2 : 4;
>        /* Compensate for the nROMBT switch which swaps the flash banks */
>        printk(KERN_NOTICE "Lubbock configured to boot from %s (bank %d)\n",
>               flashboot?"Flash":"ROM", flashboot);
> diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c
> index 63f4e1c..31729ee 100644
> --- a/arch/arm/mach-pxa/mainstone.c
> +++ b/arch/arm/mach-pxa/mainstone.c
> @@ -41,7 +41,7 @@
>  #include <asm/mach/irq.h>
>  #include <asm/mach/flash.h>
>
> -#include <plat/pxa27x.h>
> +#include <mach/pxa27x.h>
>  #include <mach/gpio.h>
>  #include <mach/mainstone.h>
>  #include <mach/audio.h>
> @@ -51,6 +51,7 @@
>  #include <mach/irda.h>
>  #include <mach/ohci.h>
>  #include <plat/pxa27x_keypad.h>
> +#include <mach/pxa-smemc.h>
>
>  #include "generic.h"
>  #include "devices.h"
> @@ -565,7 +566,7 @@ static void __init mainstone_init(void)
>        pxa_set_btuart_info(NULL);
>        pxa_set_stuart_info(NULL);
>
> -       mst_flash_data[0].width = (BOOT_DEF & 1) ? 2 : 4;
> +       mst_flash_data[0].width = (__raw_readl(BOOT_DEF) & 1) ? 2 : 4;
>        mst_flash_data[1].width = 4;
>
>        /* Compensate for SW7 which swaps the flash banks */
> diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c
> index acde987..3aefcbc 100644
> --- a/arch/arm/mach-pxa/pxa25x.c
> +++ b/arch/arm/mach-pxa/pxa25x.c
> @@ -30,6 +30,7 @@
>  #include <mach/reset.h>
>  #include <mach/pm.h>
>  #include <mach/dma.h>
> +#include <mach/pxa-smemc.h>
>
>  #include <asm/mach/map.h>
>
> @@ -324,8 +325,8 @@ void __init pxa26x_init_irq(void)
>
>  static struct map_desc pxa25x_io_desc[] __initdata = {
>        {       /* Mem Ctl */
> -               .virtual        =  0xf6000000,
> -               .pfn            = __phys_to_pfn(0x48000000),
> +               .virtual        =  PXA_SMEMC_VIRT,
> +               .pfn            = __phys_to_pfn(PXA2XX_SMEMC_BASE),
>                .length         = 0x00200000,
>                .type           = MT_DEVICE
>        },
> diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c
> index 764b9ac..dd0cb80 100644
> --- a/arch/arm/mach-pxa/pxa27x.c
> +++ b/arch/arm/mach-pxa/pxa27x.c
> @@ -17,6 +17,7 @@
>  #include <linux/suspend.h>
>  #include <linux/platform_device.h>
>  #include <linux/sysdev.h>
> +#include <linux/io.h>
>
>  #include <mach/hardware.h>
>  #include <asm/irq.h>
> @@ -27,6 +28,7 @@
>  #include <mach/ohci.h>
>  #include <mach/pm.h>
>  #include <mach/dma.h>
> +#include <mach/pxa-smemc.h>
>
>  #include <plat/i2c.h>
>
> @@ -257,7 +259,7 @@ enum {
>
>  void pxa27x_cpu_pm_save(unsigned long *sleep_save)
>  {
> -       SAVE(MDREFR);
> +       sleep_save[SLEEP_SAVE_MDREFR] = __raw_readl(MDREFR);
>        SAVE(PCFR);
>
>        SAVE(CKEN);
> @@ -266,7 +268,7 @@ void pxa27x_cpu_pm_save(unsigned long *sleep_save)
>
>  void pxa27x_cpu_pm_restore(unsigned long *sleep_save)
>  {
> -       RESTORE(MDREFR);
> +       __raw_writel(sleep_save[SLEEP_SAVE_MDREFR], MDREFR);
>        RESTORE(PCFR);
>
>        PSSR = PSSR_RDH | PSSR_PH;
> @@ -375,8 +377,8 @@ void __init pxa27x_init_irq(void)
>
>  static struct map_desc pxa27x_io_desc[] __initdata = {
>        {       /* Mem Ctl */
> -               .virtual        =  0xf6000000,
> -               .pfn            = __phys_to_pfn(0x48000000),
> +               .virtual        =  PXA_SMEMC_VIRT,
> +               .pfn            = __phys_to_pfn(PXA2XX_SMEMC_BASE),
>                .length         = 0x00200000,
>                .type           = MT_DEVICE
>        }, {    /* IMem ctl */
> diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c
> index bb60664..0ed26a0 100644
> --- a/arch/arm/mach-pxa/pxa3xx.c
> +++ b/arch/arm/mach-pxa/pxa3xx.c
> @@ -30,6 +30,7 @@
>  #include <mach/pm.h>
>  #include <mach/dma.h>
>  #include <mach/regs-intc.h>
> +#include <mach/pxa-smemc.h>
>  #include <plat/i2c.h>
>
>  #include <asm/mach/map.h>
> @@ -584,8 +585,8 @@ void __init pxa3xx_init_irq(void)
>
>  static struct map_desc pxa3xx_io_desc[] __initdata = {
>        {       /* Mem Ctl */
> -               .virtual        =  0xf6000000,
> -               .pfn            = __phys_to_pfn(0x4a000000),
> +               .virtual        =  PXA_SMEMC_VIRT,
> +               .pfn            = __phys_to_pfn(PXA3XX_SMEMC_BASE),
>                .length         = 0x00200000,
>                .type           = MT_DEVICE
>        }
> diff --git a/arch/arm/mach-pxa/sleep.S b/arch/arm/mach-pxa/sleep.S
> index 52c30b0..227df3a 100644
> --- a/arch/arm/mach-pxa/sleep.S
> +++ b/arch/arm/mach-pxa/sleep.S
> @@ -14,7 +14,7 @@
>  #include <linux/linkage.h>
>  #include <asm/assembler.h>
>  #include <mach/hardware.h>
> -
> +#include <mach/pxa-smemc.h>
>  #include <mach/pxa2xx-regs.h>
>
>  #define MDREFR_KDIV    0x200a4000      // all banks
> diff --git a/arch/arm/mach-pxa/smemc.c b/arch/arm/mach-pxa/smemc.c
> index d6f6904..91edda8 100644
> --- a/arch/arm/mach-pxa/smemc.c
> +++ b/arch/arm/mach-pxa/smemc.c
> @@ -9,50 +9,37 @@
>  #include <linux/sysdev.h>
>
>  #include <mach/hardware.h>
> -
> -#define SMEMC_PHYS_BASE        (0x4A000000)
> -#define SMEMC_PHYS_SIZE        (0x90)
> -
> -#define MSC0           (0x08)  /* Static Memory Controller Register 0 */
> -#define MSC1           (0x0C)  /* Static Memory Controller Register 1 */
> -#define SXCNFG         (0x1C)  /* Synchronous Static Memory Control Register */
> -#define MEMCLKCFG      (0x68)  /* Clock Configuration */
> -#define CSADRCFG0      (0x80)  /* Address Configuration Register for CS0 */
> -#define CSADRCFG1      (0x84)  /* Address Configuration Register for CS1 */
> -#define CSADRCFG2      (0x88)  /* Address Configuration Register for CS2 */
> -#define CSADRCFG3      (0x8C)  /* Address Configuration Register for CS3 */
> +#include <mach/pxa-smemc.h>
>
>  #ifdef CONFIG_PM
> -static void __iomem *smemc_mmio_base;
> -
>  static unsigned long msc[2];
>  static unsigned long sxcnfg, memclkcfg;
>  static unsigned long csadrcfg[4];
>
>  static int pxa3xx_smemc_suspend(struct sys_device *dev, pm_message_t state)
>  {
> -       msc[0] = __raw_readl(smemc_mmio_base + MSC0);
> -       msc[1] = __raw_readl(smemc_mmio_base + MSC1);
> -       sxcnfg = __raw_readl(smemc_mmio_base + SXCNFG);
> -       memclkcfg = __raw_readl(smemc_mmio_base + MEMCLKCFG);
> -       csadrcfg[0] = __raw_readl(smemc_mmio_base + CSADRCFG0);
> -       csadrcfg[1] = __raw_readl(smemc_mmio_base + CSADRCFG1);
> -       csadrcfg[2] = __raw_readl(smemc_mmio_base + CSADRCFG2);
> -       csadrcfg[3] = __raw_readl(smemc_mmio_base + CSADRCFG3);
> +       msc[0] = __raw_readl(MSC0);
> +       msc[1] = __raw_readl(MSC1);
> +       sxcnfg = __raw_readl(SXCNFG);
> +       memclkcfg = __raw_readl(MEMCLKCFG);
> +       csadrcfg[0] = __raw_readl(CSADRCFG0);
> +       csadrcfg[1] = __raw_readl(CSADRCFG1);
> +       csadrcfg[2] = __raw_readl(CSADRCFG2);
> +       csadrcfg[3] = __raw_readl(CSADRCFG3);
>
>        return 0;
>  }
>
>  static int pxa3xx_smemc_resume(struct sys_device *dev)
>  {
> -       __raw_writel(msc[0], smemc_mmio_base + MSC0);
> -       __raw_writel(msc[1], smemc_mmio_base + MSC1);
> -       __raw_writel(sxcnfg, smemc_mmio_base + SXCNFG);
> -       __raw_writel(memclkcfg, smemc_mmio_base + MEMCLKCFG);
> -       __raw_writel(csadrcfg[0], smemc_mmio_base + CSADRCFG0);
> -       __raw_writel(csadrcfg[1], smemc_mmio_base + CSADRCFG1);
> -       __raw_writel(csadrcfg[2], smemc_mmio_base + CSADRCFG2);
> -       __raw_writel(csadrcfg[3], smemc_mmio_base + CSADRCFG3);
> +       __raw_writel(msc[0], MSC0);
> +       __raw_writel(msc[1], MSC1);
> +       __raw_writel(sxcnfg, SXCNFG);
> +       __raw_writel(memclkcfg, MEMCLKCFG);
> +       __raw_writel(csadrcfg[0], CSADRCFG0);
> +       __raw_writel(csadrcfg[1], CSADRCFG1);
> +       __raw_writel(csadrcfg[2], CSADRCFG2);
> +       __raw_writel(csadrcfg[3], CSADRCFG3);
>
>        return 0;
>  }
> @@ -73,10 +60,6 @@ static int __init smemc_init(void)
>        int ret = 0;
>
>        if (cpu_is_pxa3xx()) {
> -               smemc_mmio_base = ioremap(SMEMC_PHYS_BASE, SMEMC_PHYS_SIZE);
> -               if (smemc_mmio_base == NULL)
> -                       return -ENODEV;
> -
>                ret = sysdev_class_register(&smemc_sysclass);
>                if (ret)
>                        return ret;
> diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c
> index 38bcc2a..3ead559 100644
> --- a/arch/arm/mach-pxa/spitz.c
> +++ b/arch/arm/mach-pxa/spitz.c
> @@ -45,6 +45,7 @@
>  #include <mach/pxa2xx_spi.h>
>  #include <mach/spitz.h>
>  #include <mach/sharpsl_pm.h>
> +#include <mach/pxa-smemc.h>
>
>  #include <plat/i2c.h>
>
> @@ -931,8 +932,8 @@ static void spitz_poweroff(void)
>  static void spitz_restart(char mode, const char *cmd)
>  {
>        /* Bootloader magic for a reboot */
> -       if ((MSC0 & 0xffff0000) == 0x7ff00000)
> -               MSC0 = (MSC0 & 0xffff) | 0x7ee00000;
> +       if ((__raw_readl(MSC0) & 0xffff0000) == 0x7ff00000)
> +               __raw_writel((__raw_readl(MSC0) & 0xffff) | 0x7ee00000, MSC0);

introduce a intermediate variable for the result of a read to avoid it
being read twice.

>
>        spitz_poweroff();
>  }
> diff --git a/arch/arm/mach-pxa/stargate2.c b/arch/arm/mach-pxa/stargate2.c
> index 19f5378..70ffc36 100644
> --- a/arch/arm/mach-pxa/stargate2.c
> +++ b/arch/arm/mach-pxa/stargate2.c
> @@ -48,6 +48,7 @@
>  #include <mach/udc.h>
>  #include <mach/pxa2xx_spi.h>
>  #include <mach/pxa27x-udc.h>
> +#include <mach/pxa-smemc.h>
>
>  #include <linux/spi/spi.h>
>  #include <linux/mfd/da903x.h>
> @@ -976,7 +977,7 @@ static void __init stargate2_init(void)
>  {
>        /* This is probably a board specific hack as this must be set
>           prior to connecting the MFP stuff up. */
> -       MECR &= ~MECR_NOS;
> +       __raw_writel(__raw_readl(MECR) & ~MECR_NOS, MECR);
>
>        pxa2xx_mfp_config(ARRAY_AND_SIZE(stargate2_pin_config));
>
> diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c
> index 3883385..e36c3c3 100644
> --- a/arch/arm/mach-pxa/tosa.c
> +++ b/arch/arm/mach-pxa/tosa.c
> @@ -46,6 +46,7 @@
>  #include <mach/tosa_bt.h>
>  #include <mach/pxa2xx_spi.h>
>  #include <mach/audio.h>
> +#include <mach/pxa-smemc.h>
>
>  #include <asm/mach/arch.h>
>  #include <mach/tosa.h>
> @@ -893,9 +894,11 @@ static void tosa_poweroff(void)
>
>  static void tosa_restart(char mode, const char *cmd)
>  {
> +       uint32_t msc0 = __raw_readl(MSC0);
> +
>        /* Bootloader magic for a reboot */
> -       if((MSC0 & 0xffff0000) == 0x7ff00000)
> -               MSC0 = (MSC0 & 0xffff) | 0x7ee00000;
> +       if((msc0 & 0xffff0000) == 0x7ff00000)
> +               __raw_writel((msc0 & 0xffff) | 0x7ee00000, MSC0);
>
>        tosa_poweroff();
>  }
> diff --git a/arch/arm/mach-pxa/trizeps4.c b/arch/arm/mach-pxa/trizeps4.c
> index ab3b933..2a3c28c 100644
> --- a/arch/arm/mach-pxa/trizeps4.c
> +++ b/arch/arm/mach-pxa/trizeps4.c
> @@ -47,6 +47,7 @@
>  #include <mach/mmc.h>
>  #include <mach/irda.h>
>  #include <mach/ohci.h>
> +#include <mach/pxa-smemc.h>
>  #include <plat/i2c.h>
>
>  #include "generic.h"
> @@ -542,7 +543,7 @@ static void __init trizeps4_map_io(void)
>        pxa27x_map_io();
>        iotable_init(trizeps4_io_desc, ARRAY_SIZE(trizeps4_io_desc));
>
> -       if ((MSC0 & 0x8) && (BOOT_DEF & 0x1)) {
> +       if ((__raw_readl(MSC0) & 0x8) && (__raw_readl(BOOT_DEF) & 0x1)) {
>                /* if flash is 16 bit wide its a Trizeps4 WL */
>                __machine_arch_type = MACH_TYPE_TRIZEPS4WL;
>                trizeps4_flash_data[0].width = 2;
> diff --git a/arch/arm/mach-pxa/xcep.c b/arch/arm/mach-pxa/xcep.c
> index 99744f4..67073e0 100644
> --- a/arch/arm/mach-pxa/xcep.c
> +++ b/arch/arm/mach-pxa/xcep.c
> @@ -31,6 +31,7 @@
>  #include <mach/hardware.h>
>  #include <mach/pxa2xx-regs.h>
>  #include <mach/mfp-pxa25x.h>
> +#include <mach/pxa-smemc.h>
>
>  #include "generic.h"
>
> @@ -172,9 +173,9 @@ static void __init xcep_init(void)
>
>        /* See Intel XScale Developer's Guide for details */
>        /* Set RDF and RDN to appropriate values (chip select 3 (smc91x)) */
> -       MSC1 = (MSC1 & 0xffff) | 0xD5540000;
> +       __raw_writel((__raw_readl(MSC1) & 0xffff) | 0xD5540000, MSC1);
>        /* Set RDF and RDN to appropriate values (chip select 5 (fpga)) */
> -       MSC2 = (MSC2 & 0xffff) | 0x72A00000;
> +       __raw_writel((__raw_readl(MSC2) & 0xffff) | 0x72A00000, MSC2);
>
>        platform_add_devices(ARRAY_AND_SIZE(devices));
>        pxa_set_i2c_info(&xcep_i2c_platform_data);
> diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c
> index 0909df2..2f21144 100644
> --- a/arch/arm/mach-pxa/zeus.c
> +++ b/arch/arm/mach-pxa/zeus.c
> @@ -47,6 +47,7 @@
>  #include <mach/audio.h>
>  #include <mach/arcom-pcmcia.h>
>  #include <mach/zeus.h>
> +#include <mach/pxa-smemc.h>
>
>  #include "generic.h"
>
> @@ -828,8 +829,8 @@ static void __init zeus_init(void)
>        pr_info("Zeus CPLD V%dI%d\n", (system_rev & 0xf0) >> 4, (system_rev & 0x0f));
>
>        /* Fix timings for dm9000s (CS1/CS2)*/
> -       MSC0 = (MSC0 & 0xffff) | (dm9000_msc << 16);
> -       MSC1 = (MSC1 & 0xffff0000) | dm9000_msc;
> +       __raw_writel((MSC0 & 0xffff) | (dm9000_msc << 16), MSC0);
> +       __raw_writel((MSC1 & 0xffff0000) | dm9000_msc, MSC1);

This isn't correct.

>
>        pm_power_off = zeus_power_off;
>        zeus_setup_apm();
> diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c
> index ae07b4d..65a8b6f 100644
> --- a/drivers/pcmcia/pxa2xx_base.c
> +++ b/drivers/pcmcia/pxa2xx_base.c
> @@ -26,6 +26,7 @@
>  #include <linux/platform_device.h>
>
>  #include <mach/hardware.h>
> +#include <mach/pxa-smemc.h>
>  #include <asm/io.h>
>  #include <asm/irq.h>
>  #include <asm/system.h>
> @@ -116,37 +117,49 @@ static inline u_int pxa2xx_pcmcia_cmd_time(u_int mem_clk_10khz,
>
>  static int pxa2xx_pcmcia_set_mcmem( int sock, int speed, int clock )
>  {
> -       MCMEM(sock) = ((pxa2xx_mcxx_setup(speed, clock)
> +       uint32_t val;
> +
> +       val = ((pxa2xx_mcxx_setup(speed, clock)
>                & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT)
>                | ((pxa2xx_mcxx_asst(speed, clock)
>                & MCXX_ASST_MASK) << MCXX_ASST_SHIFT)
>                | ((pxa2xx_mcxx_hold(speed, clock)
>                & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT);
>
> +       __raw_writel(val, MCMEM(sock));
> +
>        return 0;
>  }
>
>  static int pxa2xx_pcmcia_set_mcio( int sock, int speed, int clock )
>  {
> -       MCIO(sock) = ((pxa2xx_mcxx_setup(speed, clock)
> +       uint32_t val;
> +
> +       val = ((pxa2xx_mcxx_setup(speed, clock)
>                & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT)
>                | ((pxa2xx_mcxx_asst(speed, clock)
>                & MCXX_ASST_MASK) << MCXX_ASST_SHIFT)
>                | ((pxa2xx_mcxx_hold(speed, clock)
>                & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT);
>
> +       __raw_writel(val, MCIO(sock));
> +
>        return 0;
>  }
>
>  static int pxa2xx_pcmcia_set_mcatt( int sock, int speed, int clock )
>  {
> -       MCATT(sock) = ((pxa2xx_mcxx_setup(speed, clock)
> +       uint32_t val;
> +
> +       val = ((pxa2xx_mcxx_setup(speed, clock)
>                & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT)
>                | ((pxa2xx_mcxx_asst(speed, clock)
>                & MCXX_ASST_MASK) << MCXX_ASST_SHIFT)
>                | ((pxa2xx_mcxx_hold(speed, clock)
>                & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT);
>
> +       __raw_writel(val, MCATT(sock));
> +
>        return 0;
>  }
>
> @@ -205,19 +218,18 @@ pxa2xx_pcmcia_frequency_change(struct soc_pcmcia_socket *skt,
>  static void pxa2xx_configure_sockets(struct device *dev)
>  {
>        struct pcmcia_low_level *ops = dev->platform_data;
> -
>        /*
>         * We have at least one socket, so set MECR:CIT
>         * (Card Is There)
>         */
> -       MECR |= MECR_CIT;
> +       uint32_t mecr = MECR_CIT;
>
>        /* Set MECR:NOS (Number Of Sockets) */
>        if ((ops->first + ops->nr) > 1 ||
>            machine_is_viper() || machine_is_arcom_zeus())
> -               MECR |= MECR_NOS;
> -       else
> -               MECR &= ~MECR_NOS;
> +               mecr |= MECR_NOS;
> +
> +       __raw_writel(mecr, MECR);

This looks to be a bit inconsistent with the original code?

>  }
>
>  static const char *skt_names[] = {
> @@ -272,14 +284,24 @@ static int pxa2xx_drv_pcmcia_probe(struct platform_device *dev)
>        struct soc_pcmcia_socket *skt;
>
>        ops = (struct pcmcia_low_level *)dev->dev.platform_data;
> -       if (!ops)
> -               return -ENODEV;
> +       if (!ops) {
> +               ret = -ENODEV;
> +               goto err0;
> +       }
> +
> +       if (cpu_is_pxa320() && ops->nr > 1) {
> +               dev_err(&dev->dev, "pxa320 supports only one pcmcia slot");
> +               ret = -EINVAL;
> +               goto err0;
> +       }

This change doesn't look to be part of this patch?

>
>        pxa2xx_drv_pcmcia_ops(ops);
>
>        sinfo = kzalloc(SKT_DEV_INFO_SIZE(ops->nr), GFP_KERNEL);
> -       if (!sinfo)
> -               return -ENOMEM;
> +       if (!sinfo) {
> +               ret = -ENOMEM;
> +               goto err0;
> +       }
>
>        sinfo->nskt = ops->nr;
>
> @@ -295,18 +317,19 @@ static int pxa2xx_drv_pcmcia_probe(struct platform_device *dev)
>
>                ret = pxa2xx_drv_pcmcia_add_one(skt);
>                if (ret)
> -                       break;
> +                       goto err1;
>        }
>
> -       if (ret) {
> -               while (--i >= 0)
> -                       soc_pcmcia_remove_one(&sinfo->skt[i]);
> -               kfree(sinfo);
> -       } else {
> -               pxa2xx_configure_sockets(&dev->dev);
> -               dev_set_drvdata(&dev->dev, sinfo);
> -       }
> +       pxa2xx_configure_sockets(&dev->dev);
> +       dev_set_drvdata(&dev->dev, sinfo);
>
> +       return 0;
> +
> +err1:
> +       while (--i >= 0)
> +               soc_pcmcia_remove_one(&sinfo->skt[i]);
> +       kfree(sinfo);
> +err0:
>        return ret;
>  }
>
> --
> 1.7.2.3
>
>



More information about the linux-arm-kernel mailing list