diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-28 17:03:14 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-28 17:03:14 -0400 |
commit | 0fe41b8982001cd14ee2c77cd776735a5024e98b (patch) | |
tree | 83e65d595c413d55259ea14fb97748ce5efe5707 /arch/arm/mach-mx1 | |
parent | eedf2c5296a8dfaaf9aec1a938c1d3bd73159a30 (diff) | |
parent | 9759d22c8348343b0da4e25d6150c41712686c14 (diff) |
Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm: (422 commits)
[ARM] 5435/1: fix compile warning in sanity_check_meminfo()
[ARM] 5434/1: ARM: OMAP: Fix mailbox compile for 24xx
[ARM] pxa: fix the bad assumption that PCMCIA sockets always start with 0
[ARM] pxa: fix Colibri PXA300 and PXA320 LCD backlight pins
imxfb: Fix TFT mode
i.MX21/27: remove ifdef CONFIG_FB_IMX
imxfb: add clock support
mxc: add arch_reset() function
clkdev: add possibility to get a clock based on the device name
i.MX1: remove fb support from mach-imx
[ARM] pxa: build arch/arm/plat-pxa/mfp.c only when PXA3xx or ARCH_MMP defined
Gemini: Add support for Teltonika RUT100
Gemini: gpiolib based GPIO support v2
MAINTAINERS: add myself as Gemini architecture maintainer
ARM: Add Gemini architecture v3
[ARM] OMAP: Fix compile for omap2_init_common_hw()
MAINTAINERS: Add myself as Faraday ARM core variant maintainer
ARM: Add support for FA526 v2
[ARM] acorn,ebsa110,footbridge,integrator,sa1100: Convert asm/io.h to linux/io.h
[ARM] collie: fix two minor formatting nits
...
Diffstat (limited to 'arch/arm/mach-mx1')
-rw-r--r-- | arch/arm/mach-mx1/Kconfig | 7 | ||||
-rw-r--r-- | arch/arm/mach-mx1/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/mach-mx1/clock.c | 40 | ||||
-rw-r--r-- | arch/arm/mach-mx1/devices.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-mx1/mx1ads.c | 68 | ||||
-rw-r--r-- | arch/arm/mach-mx1/scb9328.c | 160 |
6 files changed, 242 insertions, 37 deletions
diff --git a/arch/arm/mach-mx1/Kconfig b/arch/arm/mach-mx1/Kconfig index 2b59fc74784f..eb7660f5d4b7 100644 --- a/arch/arm/mach-mx1/Kconfig +++ b/arch/arm/mach-mx1/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | if ARCH_MX1 | 1 | if ARCH_MX1 |
2 | 2 | ||
3 | comment "MX1 Platforms" | 3 | comment "MX1 platforms:" |
4 | 4 | ||
5 | config MACH_MXLADS | 5 | config MACH_MXLADS |
6 | bool | 6 | bool |
@@ -11,4 +11,9 @@ config ARCH_MX1ADS | |||
11 | help | 11 | help |
12 | Say Y here if you are using Motorola MX1ADS/MXLADS boards | 12 | Say Y here if you are using Motorola MX1ADS/MXLADS boards |
13 | 13 | ||
14 | config MACH_SCB9328 | ||
15 | bool "Synertronixx scb9328" | ||
16 | help | ||
17 | Say Y here if you are using a Synertronixx scb9328 board | ||
18 | |||
14 | endif | 19 | endif |
diff --git a/arch/arm/mach-mx1/Makefile b/arch/arm/mach-mx1/Makefile index b969719011fa..82f1309568ef 100644 --- a/arch/arm/mach-mx1/Makefile +++ b/arch/arm/mach-mx1/Makefile | |||
@@ -8,3 +8,4 @@ obj-y += generic.o clock.o devices.o | |||
8 | 8 | ||
9 | # Specific board support | 9 | # Specific board support |
10 | obj-$(CONFIG_ARCH_MX1ADS) += mx1ads.o | 10 | obj-$(CONFIG_ARCH_MX1ADS) += mx1ads.o |
11 | obj-$(CONFIG_MACH_SCB9328) += scb9328.o \ No newline at end of file | ||
diff --git a/arch/arm/mach-mx1/clock.c b/arch/arm/mach-mx1/clock.c index 4bcd1ece55f5..0d0f306851d0 100644 --- a/arch/arm/mach-mx1/clock.c +++ b/arch/arm/mach-mx1/clock.c | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | #include <mach/clock.h> | 26 | #include <mach/clock.h> |
27 | #include <mach/hardware.h> | 27 | #include <mach/hardware.h> |
28 | #include <mach/common.h> | ||
28 | #include "crm_regs.h" | 29 | #include "crm_regs.h" |
29 | 30 | ||
30 | static int _clk_enable(struct clk *clk) | 31 | static int _clk_enable(struct clk *clk) |
@@ -87,33 +88,6 @@ static int _clk_parent_set_rate(struct clk *clk, unsigned long rate) | |||
87 | return clk->parent->set_rate(clk->parent, rate); | 88 | return clk->parent->set_rate(clk->parent, rate); |
88 | } | 89 | } |
89 | 90 | ||
90 | /* | ||
91 | * get the system pll clock in Hz | ||
92 | * | ||
93 | * mfi + mfn / (mfd +1) | ||
94 | * f = 2 * f_ref * -------------------- | ||
95 | * pd + 1 | ||
96 | */ | ||
97 | static unsigned long mx1_decode_pll(unsigned int pll, u32 f_ref) | ||
98 | { | ||
99 | unsigned long long ll; | ||
100 | unsigned long quot; | ||
101 | |||
102 | u32 mfi = (pll >> 10) & 0xf; | ||
103 | u32 mfn = pll & 0x3ff; | ||
104 | u32 mfd = (pll >> 16) & 0x3ff; | ||
105 | u32 pd = (pll >> 26) & 0xf; | ||
106 | |||
107 | mfi = mfi <= 5 ? 5 : mfi; | ||
108 | |||
109 | ll = 2 * (unsigned long long)f_ref * | ||
110 | ((mfi << 16) + (mfn << 16) / (mfd + 1)); | ||
111 | quot = (pd + 1) * (1 << 16); | ||
112 | ll += quot / 2; | ||
113 | do_div(ll, quot); | ||
114 | return (unsigned long)ll; | ||
115 | } | ||
116 | |||
117 | static unsigned long clk16m_get_rate(struct clk *clk) | 91 | static unsigned long clk16m_get_rate(struct clk *clk) |
118 | { | 92 | { |
119 | return 16000000; | 93 | return 16000000; |
@@ -188,7 +162,7 @@ static struct clk prem_clk = { | |||
188 | 162 | ||
189 | static unsigned long system_clk_get_rate(struct clk *clk) | 163 | static unsigned long system_clk_get_rate(struct clk *clk) |
190 | { | 164 | { |
191 | return mx1_decode_pll(__raw_readl(CCM_SPCTL0), | 165 | return mxc_decode_pll(__raw_readl(CCM_SPCTL0), |
192 | clk_get_rate(clk->parent)); | 166 | clk_get_rate(clk->parent)); |
193 | } | 167 | } |
194 | 168 | ||
@@ -200,7 +174,7 @@ static struct clk system_clk = { | |||
200 | 174 | ||
201 | static unsigned long mcu_clk_get_rate(struct clk *clk) | 175 | static unsigned long mcu_clk_get_rate(struct clk *clk) |
202 | { | 176 | { |
203 | return mx1_decode_pll(__raw_readl(CCM_MPCTL0), | 177 | return mxc_decode_pll(__raw_readl(CCM_MPCTL0), |
204 | clk_get_rate(clk->parent)); | 178 | clk_get_rate(clk->parent)); |
205 | } | 179 | } |
206 | 180 | ||
@@ -488,7 +462,7 @@ static struct clk clko_clk = { | |||
488 | }; | 462 | }; |
489 | 463 | ||
490 | static struct clk dma_clk = { | 464 | static struct clk dma_clk = { |
491 | .name = "dma_clk", | 465 | .name = "dma", |
492 | .parent = &hclk, | 466 | .parent = &hclk, |
493 | .round_rate = _clk_parent_round_rate, | 467 | .round_rate = _clk_parent_round_rate, |
494 | .set_rate = _clk_parent_set_rate, | 468 | .set_rate = _clk_parent_set_rate, |
@@ -539,7 +513,7 @@ static struct clk gpt_clk = { | |||
539 | }; | 513 | }; |
540 | 514 | ||
541 | static struct clk uart_clk = { | 515 | static struct clk uart_clk = { |
542 | .name = "uart_clk", | 516 | .name = "uart", |
543 | .parent = &perclk[0], | 517 | .parent = &perclk[0], |
544 | .round_rate = _clk_parent_round_rate, | 518 | .round_rate = _clk_parent_round_rate, |
545 | .set_rate = _clk_parent_set_rate, | 519 | .set_rate = _clk_parent_set_rate, |
@@ -621,7 +595,7 @@ static struct clk *mxc_clks[] = { | |||
621 | &rtc_clk, | 595 | &rtc_clk, |
622 | }; | 596 | }; |
623 | 597 | ||
624 | int __init mxc_clocks_init(unsigned long fref) | 598 | int __init mx1_clocks_init(unsigned long fref) |
625 | { | 599 | { |
626 | struct clk **clkp; | 600 | struct clk **clkp; |
627 | unsigned int reg; | 601 | unsigned int reg; |
@@ -652,5 +626,7 @@ int __init mxc_clocks_init(unsigned long fref) | |||
652 | clk_enable(&hclk); | 626 | clk_enable(&hclk); |
653 | clk_enable(&fclk); | 627 | clk_enable(&fclk); |
654 | 628 | ||
629 | mxc_timer_init(&gpt_clk); | ||
630 | |||
655 | return 0; | 631 | return 0; |
656 | } | 632 | } |
diff --git a/arch/arm/mach-mx1/devices.c b/arch/arm/mach-mx1/devices.c index a95644193f3f..97f42d96d7a1 100644 --- a/arch/arm/mach-mx1/devices.c +++ b/arch/arm/mach-mx1/devices.c | |||
@@ -23,10 +23,11 @@ | |||
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
25 | #include <linux/gpio.h> | 25 | #include <linux/gpio.h> |
26 | |||
27 | #include <mach/irqs.h> | 26 | #include <mach/irqs.h> |
28 | #include <mach/hardware.h> | 27 | #include <mach/hardware.h> |
29 | 28 | ||
29 | #include "devices.h" | ||
30 | |||
30 | static struct resource imx_csi_resources[] = { | 31 | static struct resource imx_csi_resources[] = { |
31 | [0] = { | 32 | [0] = { |
32 | .start = 0x00224000, | 33 | .start = 0x00224000, |
diff --git a/arch/arm/mach-mx1/mx1ads.c b/arch/arm/mach-mx1/mx1ads.c index 3200cf60e384..7ae229bc1b79 100644 --- a/arch/arm/mach-mx1/mx1ads.c +++ b/arch/arm/mach-mx1/mx1ads.c | |||
@@ -16,6 +16,8 @@ | |||
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/mtd/physmap.h> | 18 | #include <linux/mtd/physmap.h> |
19 | #include <linux/i2c.h> | ||
20 | #include <linux/i2c/pcf857x.h> | ||
19 | 21 | ||
20 | #include <asm/mach-types.h> | 22 | #include <asm/mach-types.h> |
21 | #include <asm/mach/arch.h> | 23 | #include <asm/mach/arch.h> |
@@ -25,7 +27,11 @@ | |||
25 | #include <mach/hardware.h> | 27 | #include <mach/hardware.h> |
26 | #include <mach/common.h> | 28 | #include <mach/common.h> |
27 | #include <mach/imx-uart.h> | 29 | #include <mach/imx-uart.h> |
28 | #include <mach/iomux-mx1-mx2.h> | 30 | #include <mach/irqs.h> |
31 | #ifdef CONFIG_I2C_IMX | ||
32 | #include <mach/i2c.h> | ||
33 | #endif | ||
34 | #include <mach/iomux.h> | ||
29 | #include "devices.h" | 35 | #include "devices.h" |
30 | 36 | ||
31 | /* | 37 | /* |
@@ -105,6 +111,55 @@ static struct platform_device flash_device = { | |||
105 | }; | 111 | }; |
106 | 112 | ||
107 | /* | 113 | /* |
114 | * I2C | ||
115 | */ | ||
116 | |||
117 | #ifdef CONFIG_I2C_IMX | ||
118 | static int i2c_pins[] = { | ||
119 | PA15_PF_I2C_SDA, | ||
120 | PA16_PF_I2C_SCL, | ||
121 | }; | ||
122 | |||
123 | static int i2c_init(struct device *dev) | ||
124 | { | ||
125 | return mxc_gpio_setup_multiple_pins(i2c_pins, | ||
126 | ARRAY_SIZE(i2c_pins), "I2C"); | ||
127 | } | ||
128 | |||
129 | static void i2c_exit(struct device *dev) | ||
130 | { | ||
131 | mxc_gpio_release_multiple_pins(i2c_pins, | ||
132 | ARRAY_SIZE(i2c_pins)); | ||
133 | } | ||
134 | |||
135 | static struct pcf857x_platform_data pcf857x_data[] = { | ||
136 | { | ||
137 | .gpio_base = 4 * 32, | ||
138 | }, { | ||
139 | .gpio_base = 4 * 32 + 16, | ||
140 | } | ||
141 | }; | ||
142 | |||
143 | static struct imxi2c_platform_data mx1ads_i2c_data = { | ||
144 | .bitrate = 100000, | ||
145 | .init = i2c_init, | ||
146 | .exit = i2c_exit, | ||
147 | }; | ||
148 | |||
149 | static struct i2c_board_info mx1ads_i2c_devices[] = { | ||
150 | { | ||
151 | I2C_BOARD_INFO("pcf857x", 0x22), | ||
152 | .type = "pcf8575", | ||
153 | .platform_data = &pcf857x_data[0], | ||
154 | }, { | ||
155 | I2C_BOARD_INFO("pcf857x", 0x24), | ||
156 | .type = "pcf8575", | ||
157 | .platform_data = &pcf857x_data[1], | ||
158 | }, | ||
159 | }; | ||
160 | #endif | ||
161 | |||
162 | /* | ||
108 | * Board init | 163 | * Board init |
109 | */ | 164 | */ |
110 | static void __init mx1ads_init(void) | 165 | static void __init mx1ads_init(void) |
@@ -115,12 +170,19 @@ static void __init mx1ads_init(void) | |||
115 | 170 | ||
116 | /* Physmap flash */ | 171 | /* Physmap flash */ |
117 | mxc_register_device(&flash_device, &mx1ads_flash_data); | 172 | mxc_register_device(&flash_device, &mx1ads_flash_data); |
173 | |||
174 | /* I2C */ | ||
175 | #ifdef CONFIG_I2C_IMX | ||
176 | i2c_register_board_info(0, mx1ads_i2c_devices, | ||
177 | ARRAY_SIZE(mx1ads_i2c_devices)); | ||
178 | |||
179 | mxc_register_device(&imx_i2c_device, &mx1ads_i2c_data); | ||
180 | #endif | ||
118 | } | 181 | } |
119 | 182 | ||
120 | static void __init mx1ads_timer_init(void) | 183 | static void __init mx1ads_timer_init(void) |
121 | { | 184 | { |
122 | mxc_clocks_init(32000); | 185 | mx1_clocks_init(32000); |
123 | mxc_timer_init("gpt_clk"); | ||
124 | } | 186 | } |
125 | 187 | ||
126 | struct sys_timer mx1ads_timer = { | 188 | struct sys_timer mx1ads_timer = { |
diff --git a/arch/arm/mach-mx1/scb9328.c b/arch/arm/mach-mx1/scb9328.c new file mode 100644 index 000000000000..0e71f3fa28bf --- /dev/null +++ b/arch/arm/mach-mx1/scb9328.c | |||
@@ -0,0 +1,160 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-mx1/scb9328.c | ||
3 | * | ||
4 | * Copyright (c) 2004 Sascha Hauer <saschahauer@web.de> | ||
5 | * Copyright (c) 2006-2008 Juergen Beisert <jbeisert@netscape.net> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #include <linux/platform_device.h> | ||
14 | #include <linux/mtd/physmap.h> | ||
15 | #include <linux/interrupt.h> | ||
16 | #include <linux/dm9000.h> | ||
17 | |||
18 | #include <asm/mach-types.h> | ||
19 | #include <asm/mach/arch.h> | ||
20 | #include <asm/mach/time.h> | ||
21 | |||
22 | #include <mach/common.h> | ||
23 | #include <mach/hardware.h> | ||
24 | #include <mach/irqs.h> | ||
25 | #include <mach/imx-uart.h> | ||
26 | #include <mach/iomux.h> | ||
27 | |||
28 | #include "devices.h" | ||
29 | |||
30 | /* | ||
31 | * This scb9328 has a 32MiB flash | ||
32 | */ | ||
33 | static struct resource flash_resource = { | ||
34 | .start = IMX_CS0_PHYS, | ||
35 | .end = IMX_CS0_PHYS + (32 * 1024 * 1024) - 1, | ||
36 | .flags = IORESOURCE_MEM, | ||
37 | }; | ||
38 | |||
39 | static struct physmap_flash_data scb_flash_data = { | ||
40 | .width = 2, | ||
41 | }; | ||
42 | |||
43 | static struct platform_device scb_flash_device = { | ||
44 | .name = "physmap-flash", | ||
45 | .id = 0, | ||
46 | .dev = { | ||
47 | .platform_data = &scb_flash_data, | ||
48 | }, | ||
49 | .resource = &flash_resource, | ||
50 | .num_resources = 1, | ||
51 | }; | ||
52 | |||
53 | /* | ||
54 | * scb9328 has a DM9000 network controller | ||
55 | * connected to CS5, with 16 bit data path | ||
56 | * and interrupt connected to GPIO 3 | ||
57 | */ | ||
58 | |||
59 | /* | ||
60 | * internal datapath is fixed 16 bit | ||
61 | */ | ||
62 | static struct dm9000_plat_data dm9000_platdata = { | ||
63 | .flags = DM9000_PLATF_16BITONLY, | ||
64 | }; | ||
65 | |||
66 | /* | ||
67 | * the DM9000 drivers wants two defined address spaces | ||
68 | * to gain access to address latch registers and the data path. | ||
69 | */ | ||
70 | static struct resource dm9000x_resources[] = { | ||
71 | [0] = { | ||
72 | .name = "address area", | ||
73 | .start = IMX_CS5_PHYS, | ||
74 | .end = IMX_CS5_PHYS + 1, | ||
75 | .flags = IORESOURCE_MEM /* address access */ | ||
76 | }, | ||
77 | [1] = { | ||
78 | .name = "data area", | ||
79 | .start = IMX_CS5_PHYS + 4, | ||
80 | .end = IMX_CS5_PHYS + 5, | ||
81 | .flags = IORESOURCE_MEM /* data access */ | ||
82 | }, | ||
83 | [2] = { | ||
84 | .start = IRQ_GPIOC(3), | ||
85 | .end = IRQ_GPIOC(3), | ||
86 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL | ||
87 | }, | ||
88 | }; | ||
89 | |||
90 | static struct platform_device dm9000x_device = { | ||
91 | .name = "dm9000", | ||
92 | .id = 0, | ||
93 | .num_resources = ARRAY_SIZE(dm9000x_resources), | ||
94 | .resource = dm9000x_resources, | ||
95 | .dev = { | ||
96 | .platform_data = &dm9000_platdata, | ||
97 | } | ||
98 | }; | ||
99 | |||
100 | static int mxc_uart1_pins[] = { | ||
101 | PC9_PF_UART1_CTS, | ||
102 | PC10_PF_UART1_RTS, | ||
103 | PC11_PF_UART1_TXD, | ||
104 | PC12_PF_UART1_RXD, | ||
105 | }; | ||
106 | |||
107 | static int uart1_mxc_init(struct platform_device *pdev) | ||
108 | { | ||
109 | return mxc_gpio_setup_multiple_pins(mxc_uart1_pins, | ||
110 | ARRAY_SIZE(mxc_uart1_pins), "UART1"); | ||
111 | } | ||
112 | |||
113 | static int uart1_mxc_exit(struct platform_device *pdev) | ||
114 | { | ||
115 | mxc_gpio_release_multiple_pins(mxc_uart1_pins, | ||
116 | ARRAY_SIZE(mxc_uart1_pins)); | ||
117 | return 0; | ||
118 | } | ||
119 | |||
120 | static struct imxuart_platform_data uart_pdata = { | ||
121 | .init = uart1_mxc_init, | ||
122 | .exit = uart1_mxc_exit, | ||
123 | .flags = IMXUART_HAVE_RTSCTS, | ||
124 | }; | ||
125 | |||
126 | static struct platform_device *devices[] __initdata = { | ||
127 | &scb_flash_device, | ||
128 | &dm9000x_device, | ||
129 | }; | ||
130 | |||
131 | /* | ||
132 | * scb9328_init - Init the CPU card itself | ||
133 | */ | ||
134 | static void __init scb9328_init(void) | ||
135 | { | ||
136 | mxc_register_device(&imx_uart1_device, &uart_pdata); | ||
137 | |||
138 | printk(KERN_INFO"Scb9328: Adding devices\n"); | ||
139 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
140 | } | ||
141 | |||
142 | static void __init scb9328_timer_init(void) | ||
143 | { | ||
144 | mx1_clocks_init(32000); | ||
145 | } | ||
146 | |||
147 | static struct sys_timer scb9328_timer = { | ||
148 | .init = scb9328_timer_init, | ||
149 | }; | ||
150 | |||
151 | MACHINE_START(SCB9328, "Synertronixx scb9328") | ||
152 | /* Sascha Hauer */ | ||
153 | .phys_io = 0x00200000, | ||
154 | .io_pg_offst = ((0xe0200000) >> 18) & 0xfffc, | ||
155 | .boot_params = 0x08000100, | ||
156 | .map_io = mxc_map_io, | ||
157 | .init_irq = mxc_init_irq, | ||
158 | .timer = &scb9328_timer, | ||
159 | .init_machine = scb9328_init, | ||
160 | MACHINE_END | ||