~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to arch/arm/mach-mx3/mm.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 *  Copyright (C) 1999,2000 Arm Limited
3
 
 *  Copyright (C) 2000 Deep Blue Solutions Ltd
4
 
 *  Copyright (C) 2002 Shane Nay (shane@minirl.com)
5
 
 *  Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
6
 
 *    - add MX31 specific definitions
7
 
 *
8
 
 * This program is free software; you can redistribute it and/or modify
9
 
 * it under the terms of the GNU General Public License as published by
10
 
 * the Free Software Foundation; either version 2 of the License, or
11
 
 * (at your option) any later version.
12
 
 *
13
 
 * This program is distributed in the hope that it will be useful,
14
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 
 * GNU General Public License for more details.
17
 
 */
18
 
 
19
 
#include <linux/mm.h>
20
 
#include <linux/init.h>
21
 
#include <linux/err.h>
22
 
 
23
 
#include <asm/pgtable.h>
24
 
#include <asm/mach/map.h>
25
 
#include <asm/hardware/cache-l2x0.h>
26
 
 
27
 
#include <mach/common.h>
28
 
#include <mach/hardware.h>
29
 
#include <mach/iomux-v3.h>
30
 
#include <mach/gpio.h>
31
 
#include <mach/irqs.h>
32
 
 
33
 
#ifdef CONFIG_SOC_IMX31
34
 
static struct map_desc mx31_io_desc[] __initdata = {
35
 
        imx_map_entry(MX31, X_MEMC, MT_DEVICE),
36
 
        imx_map_entry(MX31, AVIC, MT_DEVICE_NONSHARED),
37
 
        imx_map_entry(MX31, AIPS1, MT_DEVICE_NONSHARED),
38
 
        imx_map_entry(MX31, AIPS2, MT_DEVICE_NONSHARED),
39
 
        imx_map_entry(MX31, SPBA0, MT_DEVICE_NONSHARED),
40
 
};
41
 
 
42
 
/*
43
 
 * This function initializes the memory map. It is called during the
44
 
 * system startup to create static physical to virtual memory mappings
45
 
 * for the IO modules.
46
 
 */
47
 
void __init mx31_map_io(void)
48
 
{
49
 
        iotable_init(mx31_io_desc, ARRAY_SIZE(mx31_io_desc));
50
 
}
51
 
 
52
 
void __init imx31_init_early(void)
53
 
{
54
 
        mxc_set_cpu_type(MXC_CPU_MX31);
55
 
        mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR));
56
 
}
57
 
 
58
 
static struct mxc_gpio_port imx31_gpio_ports[] = {
59
 
        DEFINE_IMX_GPIO_PORT_IRQ(MX31, 0, 1, MX31_INT_GPIO1),
60
 
        DEFINE_IMX_GPIO_PORT_IRQ(MX31, 1, 2, MX31_INT_GPIO2),
61
 
        DEFINE_IMX_GPIO_PORT_IRQ(MX31, 2, 3, MX31_INT_GPIO3),
62
 
};
63
 
 
64
 
void __init mx31_init_irq(void)
65
 
{
66
 
        mxc_init_irq(MX31_IO_ADDRESS(MX31_AVIC_BASE_ADDR));
67
 
        mxc_gpio_init(imx31_gpio_ports, ARRAY_SIZE(imx31_gpio_ports));
68
 
}
69
 
#endif /* ifdef CONFIG_SOC_IMX31 */
70
 
 
71
 
#ifdef CONFIG_SOC_IMX35
72
 
static struct map_desc mx35_io_desc[] __initdata = {
73
 
        imx_map_entry(MX35, X_MEMC, MT_DEVICE),
74
 
        imx_map_entry(MX35, AVIC, MT_DEVICE_NONSHARED),
75
 
        imx_map_entry(MX35, AIPS1, MT_DEVICE_NONSHARED),
76
 
        imx_map_entry(MX35, AIPS2, MT_DEVICE_NONSHARED),
77
 
        imx_map_entry(MX35, SPBA0, MT_DEVICE_NONSHARED),
78
 
};
79
 
 
80
 
void __init mx35_map_io(void)
81
 
{
82
 
        iotable_init(mx35_io_desc, ARRAY_SIZE(mx35_io_desc));
83
 
}
84
 
 
85
 
void __init imx35_init_early(void)
86
 
{
87
 
        mxc_set_cpu_type(MXC_CPU_MX35);
88
 
        mxc_iomux_v3_init(MX35_IO_ADDRESS(MX35_IOMUXC_BASE_ADDR));
89
 
        mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR));
90
 
}
91
 
 
92
 
static struct mxc_gpio_port imx35_gpio_ports[] = {
93
 
        DEFINE_IMX_GPIO_PORT_IRQ(MX35, 0, 1, MX35_INT_GPIO1),
94
 
        DEFINE_IMX_GPIO_PORT_IRQ(MX35, 1, 2, MX35_INT_GPIO2),
95
 
        DEFINE_IMX_GPIO_PORT_IRQ(MX35, 2, 3, MX35_INT_GPIO3),
96
 
};
97
 
 
98
 
void __init mx35_init_irq(void)
99
 
{
100
 
        mxc_init_irq(MX35_IO_ADDRESS(MX35_AVIC_BASE_ADDR));
101
 
        mxc_gpio_init(imx35_gpio_ports, ARRAY_SIZE(imx35_gpio_ports));
102
 
}
103
 
#endif /* ifdef CONFIG_SOC_IMX35 */
104
 
 
105
 
#ifdef CONFIG_CACHE_L2X0
106
 
static int mxc_init_l2x0(void)
107
 
{
108
 
        void __iomem *l2x0_base;
109
 
        void __iomem *clkctl_base;
110
 
/*
111
 
 * First of all, we must repair broken chip settings. There are some
112
 
 * i.MX35 CPUs in the wild, comming with bogus L2 cache settings. These
113
 
 * misconfigured CPUs will run amok immediately when the L2 cache gets enabled.
114
 
 * Workaraound is to setup the correct register setting prior enabling the
115
 
 * L2 cache. This should not hurt already working CPUs, as they are using the
116
 
 * same value
117
 
 */
118
 
#define L2_MEM_VAL 0x10
119
 
 
120
 
        clkctl_base = ioremap(MX35_CLKCTL_BASE_ADDR, 4096);
121
 
        if (clkctl_base != NULL) {
122
 
                writel(0x00000515, clkctl_base + L2_MEM_VAL);
123
 
                iounmap(clkctl_base);
124
 
        } else {
125
 
                pr_err("L2 cache: Cannot fix timing. Trying to continue without\n");
126
 
        }
127
 
 
128
 
        l2x0_base = ioremap(MX3x_L2CC_BASE_ADDR, 4096);
129
 
        if (IS_ERR(l2x0_base)) {
130
 
                printk(KERN_ERR "remapping L2 cache area failed with %ld\n",
131
 
                                PTR_ERR(l2x0_base));
132
 
                return 0;
133
 
        }
134
 
 
135
 
        l2x0_init(l2x0_base, 0x00030024, 0x00000000);
136
 
 
137
 
        return 0;
138
 
}
139
 
 
140
 
arch_initcall(mxc_init_l2x0);
141
 
#endif