Commit 83f53220f8313f097cdf181928be13bafbb697ea
Committed by
Russell King
1 parent
3d9edf09d4
Exists in
master
and in
7 other branches
[ARM] 4432/5: davinci: pin mux support
Support pin multiplexing configurations driver for TI DaVinci SoC Signed-off-by: Vladimir Barinov <vbarinov@ru.mvista.com> Acked-by: Kevin Hilman <khilman@mvista.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Showing 4 changed files with 154 additions and 31 deletions Side-by-side Diff
arch/arm/mach-davinci/Makefile
arch/arm/mach-davinci/mux.c
1 | +/* | |
2 | + * DaVinci pin multiplexing configurations | |
3 | + * | |
4 | + * Author: Vladimir Barinov, MontaVista Software, Inc. <source@mvista.com> | |
5 | + * | |
6 | + * 2007 (c) MontaVista Software, Inc. This file is licensed under | |
7 | + * the terms of the GNU General Public License version 2. This program | |
8 | + * is licensed "as is" without any warranty of any kind, whether express | |
9 | + * or implied. | |
10 | + */ | |
11 | +#include <linux/io.h> | |
12 | +#include <linux/spinlock.h> | |
13 | + | |
14 | +#include <asm/hardware.h> | |
15 | + | |
16 | +#include <asm/arch/mux.h> | |
17 | + | |
18 | +/* System control register offsets */ | |
19 | +#define PINMUX0 0x00 | |
20 | +#define PINMUX1 0x04 | |
21 | + | |
22 | +static DEFINE_SPINLOCK(mux_lock); | |
23 | + | |
24 | +void davinci_mux_peripheral(unsigned int mux, unsigned int enable) | |
25 | +{ | |
26 | + u32 pinmux, muxreg = PINMUX0; | |
27 | + | |
28 | + if (mux >= DAVINCI_MUX_LEVEL2) { | |
29 | + muxreg = PINMUX1; | |
30 | + mux -= DAVINCI_MUX_LEVEL2; | |
31 | + } | |
32 | + | |
33 | + spin_lock(&mux_lock); | |
34 | + pinmux = davinci_readl(DAVINCI_SYSTEM_MODULE_BASE + muxreg); | |
35 | + if (enable) | |
36 | + pinmux |= (1 << mux); | |
37 | + else | |
38 | + pinmux &= ~(1 << mux); | |
39 | + davinci_writel(pinmux, DAVINCI_SYSTEM_MODULE_BASE + muxreg); | |
40 | + spin_unlock(&mux_lock); | |
41 | +} |
arch/arm/mach-davinci/psc.c
... | ... | @@ -25,39 +25,40 @@ |
25 | 25 | #include <asm/io.h> |
26 | 26 | #include <asm/hardware.h> |
27 | 27 | #include <asm/arch/psc.h> |
28 | +#include <asm/arch/mux.h> | |
28 | 29 | |
29 | -#define PTCMD __REG(0x01C41120) | |
30 | -#define PDSTAT __REG(0x01C41200) | |
31 | -#define PDCTL1 __REG(0x01C41304) | |
32 | -#define EPCPR __REG(0x01C41070) | |
33 | -#define PTSTAT __REG(0x01C41128) | |
30 | +/* PSC register offsets */ | |
31 | +#define EPCPR 0x070 | |
32 | +#define PTCMD 0x120 | |
33 | +#define PTSTAT 0x128 | |
34 | +#define PDSTAT 0x200 | |
35 | +#define PDCTL1 0x304 | |
36 | +#define MDSTAT 0x800 | |
37 | +#define MDCTL 0xA00 | |
34 | 38 | |
35 | -#define MDSTAT IO_ADDRESS(0x01C41800) | |
36 | -#define MDCTL IO_ADDRESS(0x01C41A00) | |
39 | +/* System control register offsets */ | |
40 | +#define VDD3P3V_PWDN 0x48 | |
37 | 41 | |
38 | -#define PINMUX0 __REG(0x01c40000) | |
39 | -#define PINMUX1 __REG(0x01c40004) | |
40 | -#define VDD3P3V_PWDN __REG(0x01C40048) | |
41 | - | |
42 | 42 | static void davinci_psc_mux(unsigned int id) |
43 | 43 | { |
44 | 44 | switch (id) { |
45 | 45 | case DAVINCI_LPSC_ATA: |
46 | - PINMUX0 |= (1 << 17) | (1 << 16); | |
46 | + davinci_mux_peripheral(DAVINCI_MUX_HDIREN, 1); | |
47 | + davinci_mux_peripheral(DAVINCI_MUX_ATAEN, 1); | |
47 | 48 | break; |
48 | 49 | case DAVINCI_LPSC_MMC_SD: |
49 | 50 | /* VDD power manupulations are done in U-Boot for CPMAC |
50 | 51 | * so applies to MMC as well |
51 | 52 | */ |
52 | 53 | /*Set up the pull regiter for MMC */ |
53 | - VDD3P3V_PWDN = 0x0; | |
54 | - PINMUX1 &= (~(1 << 9)); | |
54 | + davinci_writel(0, DAVINCI_SYSTEM_MODULE_BASE + VDD3P3V_PWDN); | |
55 | + davinci_mux_peripheral(DAVINCI_MUX_MSTK, 0); | |
55 | 56 | break; |
56 | 57 | case DAVINCI_LPSC_I2C: |
57 | - PINMUX1 |= (1 << 7); | |
58 | + davinci_mux_peripheral(DAVINCI_MUX_I2C, 1); | |
58 | 59 | break; |
59 | 60 | case DAVINCI_LPSC_McBSP: |
60 | - PINMUX1 |= (1 << 10); | |
61 | + davinci_mux_peripheral(DAVINCI_MUX_ASP, 1); | |
61 | 62 | break; |
62 | 63 | default: |
63 | 64 | break; |
64 | 65 | |
65 | 66 | |
66 | 67 | |
67 | 68 | |
68 | 69 | |
69 | 70 | |
70 | 71 | |
71 | 72 | |
... | ... | @@ -67,33 +68,59 @@ |
67 | 68 | /* Enable or disable a PSC domain */ |
68 | 69 | void davinci_psc_config(unsigned int domain, unsigned int id, char enable) |
69 | 70 | { |
70 | - volatile unsigned int *mdstat = (unsigned int *)((int)MDSTAT + 4 * id); | |
71 | - volatile unsigned int *mdctl = (unsigned int *)((int)MDCTL + 4 * id); | |
71 | + u32 epcpr, ptcmd, ptstat, pdstat, pdctl1, mdstat, mdctl, mdstat_mask; | |
72 | 72 | |
73 | 73 | if (id < 0) |
74 | 74 | return; |
75 | 75 | |
76 | + mdctl = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE + MDCTL + 4 * id); | |
76 | 77 | if (enable) |
77 | - *mdctl |= 0x00000003; /* Enable Module */ | |
78 | + mdctl |= 0x00000003; /* Enable Module */ | |
78 | 79 | else |
79 | - *mdctl &= 0xFFFFFFF2; /* Disable Module */ | |
80 | + mdctl &= 0xFFFFFFF2; /* Disable Module */ | |
81 | + davinci_writel(mdctl, DAVINCI_PWR_SLEEP_CNTRL_BASE + MDCTL + 4 * id); | |
80 | 82 | |
81 | - if ((PDSTAT & 0x00000001) == 0) { | |
82 | - PDCTL1 |= 0x1; | |
83 | - PTCMD = (1 << domain); | |
84 | - while ((((EPCPR >> domain) & 1) == 0)); | |
83 | + pdstat = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE + PDSTAT); | |
84 | + if ((pdstat & 0x00000001) == 0) { | |
85 | + pdctl1 = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE + PDCTL1); | |
86 | + pdctl1 |= 0x1; | |
87 | + davinci_writel(pdctl1, DAVINCI_PWR_SLEEP_CNTRL_BASE + PDCTL1); | |
85 | 88 | |
86 | - PDCTL1 |= 0x100; | |
87 | - while (!(((PTSTAT >> domain) & 1) == 0)); | |
89 | + ptcmd = 1 << domain; | |
90 | + davinci_writel(ptcmd, DAVINCI_PWR_SLEEP_CNTRL_BASE + PTCMD); | |
91 | + | |
92 | + do { | |
93 | + epcpr = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE + | |
94 | + EPCPR); | |
95 | + } while ((((epcpr >> domain) & 1) == 0)); | |
96 | + | |
97 | + pdctl1 = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE + PDCTL1); | |
98 | + pdctl1 |= 0x100; | |
99 | + davinci_writel(pdctl1, DAVINCI_PWR_SLEEP_CNTRL_BASE + PDCTL1); | |
100 | + | |
101 | + do { | |
102 | + ptstat = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE + | |
103 | + PTSTAT); | |
104 | + } while (!(((ptstat >> domain) & 1) == 0)); | |
88 | 105 | } else { |
89 | - PTCMD = (1 << domain); | |
90 | - while (!(((PTSTAT >> domain) & 1) == 0)); | |
106 | + ptcmd = 1 << domain; | |
107 | + davinci_writel(ptcmd, DAVINCI_PWR_SLEEP_CNTRL_BASE + PTCMD); | |
108 | + | |
109 | + do { | |
110 | + ptstat = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE + | |
111 | + PTSTAT); | |
112 | + } while (!(((ptstat >> domain) & 1) == 0)); | |
91 | 113 | } |
92 | 114 | |
93 | 115 | if (enable) |
94 | - while (!((*mdstat & 0x0000001F) == 0x3)); | |
116 | + mdstat_mask = 0x3; | |
95 | 117 | else |
96 | - while (!((*mdstat & 0x0000001F) == 0x2)); | |
118 | + mdstat_mask = 0x2; | |
119 | + | |
120 | + do { | |
121 | + mdstat = davinci_readl(DAVINCI_PWR_SLEEP_CNTRL_BASE + | |
122 | + MDSTAT + 4 * id); | |
123 | + } while (!((mdstat & 0x0000001F) == mdstat_mask)); | |
97 | 124 | |
98 | 125 | if (enable) |
99 | 126 | davinci_psc_mux(id); |
include/asm-arm/arch-davinci/mux.h
1 | +/* | |
2 | + * DaVinci pin multiplexing defines | |
3 | + * | |
4 | + * Author: Vladimir Barinov, MontaVista Software, Inc. <source@mvista.com> | |
5 | + * | |
6 | + * 2007 (c) MontaVista Software, Inc. This file is licensed under | |
7 | + * the terms of the GNU General Public License version 2. This program | |
8 | + * is licensed "as is" without any warranty of any kind, whether express | |
9 | + * or implied. | |
10 | + */ | |
11 | +#ifndef __ASM_ARCH_MUX_H | |
12 | +#define __ASM_ARCH_MUX_H | |
13 | + | |
14 | +#define DAVINCI_MUX_AEAW0 0 | |
15 | +#define DAVINCI_MUX_AEAW1 1 | |
16 | +#define DAVINCI_MUX_AEAW2 2 | |
17 | +#define DAVINCI_MUX_AEAW3 3 | |
18 | +#define DAVINCI_MUX_AEAW4 4 | |
19 | +#define DAVINCI_MUX_AECS4 10 | |
20 | +#define DAVINCI_MUX_AECS5 11 | |
21 | +#define DAVINCI_MUX_VLYNQWD0 12 | |
22 | +#define DAVINCI_MUX_VLYNQWD1 13 | |
23 | +#define DAVINCI_MUX_VLSCREN 14 | |
24 | +#define DAVINCI_MUX_VLYNQEN 15 | |
25 | +#define DAVINCI_MUX_HDIREN 16 | |
26 | +#define DAVINCI_MUX_ATAEN 17 | |
27 | +#define DAVINCI_MUX_RGB666 22 | |
28 | +#define DAVINCI_MUX_RGB888 23 | |
29 | +#define DAVINCI_MUX_LOEEN 24 | |
30 | +#define DAVINCI_MUX_LFLDEN 25 | |
31 | +#define DAVINCI_MUX_CWEN 26 | |
32 | +#define DAVINCI_MUX_CFLDEN 27 | |
33 | +#define DAVINCI_MUX_HPIEN 29 | |
34 | +#define DAVINCI_MUX_1394EN 30 | |
35 | +#define DAVINCI_MUX_EMACEN 31 | |
36 | + | |
37 | +#define DAVINCI_MUX_LEVEL2 32 | |
38 | +#define DAVINCI_MUX_UART0 (DAVINCI_MUX_LEVEL2 + 0) | |
39 | +#define DAVINCI_MUX_UART1 (DAVINCI_MUX_LEVEL2 + 1) | |
40 | +#define DAVINCI_MUX_UART2 (DAVINCI_MUX_LEVEL2 + 2) | |
41 | +#define DAVINCI_MUX_U2FLO (DAVINCI_MUX_LEVEL2 + 3) | |
42 | +#define DAVINCI_MUX_PWM0 (DAVINCI_MUX_LEVEL2 + 4) | |
43 | +#define DAVINCI_MUX_PWM1 (DAVINCI_MUX_LEVEL2 + 5) | |
44 | +#define DAVINCI_MUX_PWM2 (DAVINCI_MUX_LEVEL2 + 6) | |
45 | +#define DAVINCI_MUX_I2C (DAVINCI_MUX_LEVEL2 + 7) | |
46 | +#define DAVINCI_MUX_SPI (DAVINCI_MUX_LEVEL2 + 8) | |
47 | +#define DAVINCI_MUX_MSTK (DAVINCI_MUX_LEVEL2 + 9) | |
48 | +#define DAVINCI_MUX_ASP (DAVINCI_MUX_LEVEL2 + 10) | |
49 | +#define DAVINCI_MUX_CLK0 (DAVINCI_MUX_LEVEL2 + 16) | |
50 | +#define DAVINCI_MUX_CLK1 (DAVINCI_MUX_LEVEL2 + 17) | |
51 | +#define DAVINCI_MUX_TIMIN (DAVINCI_MUX_LEVEL2 + 18) | |
52 | + | |
53 | +extern void davinci_mux_peripheral(unsigned int mux, unsigned int enable); | |
54 | + | |
55 | +#endif /* __ASM_ARCH_MUX_H */ |