mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
ARM: pxa: Access SMEMC via virtual addresses
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 <[email protected]> Acked-by: Haojian Zhuang <[email protected]> Signed-off-by: Eric Miao <[email protected]>
This commit is contained in:
parent
851982c1b6
commit
ad68bb9f7a
22 changed files with 176 additions and 136 deletions
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/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);
|
||||
}
|
||||
|
||||
static const char *skt_names[] = {
|
||||
|
|
|
|||
Loading…
Reference in a new issue