1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
From 278fb30cf0ce864e15505330238e891d88b3f965 Mon Sep 17 00:00:00 2001
From: Jan Luebbe <jlu@pengutronix.de>
Date: Sun, 31 Mar 2013 12:27:43 +0200
Subject: [PATCH 5/8] WIP: GPIO for am33xx
Signed-off-by: Jan Luebbe <jlu@pengutronix.de>
---
arch/arm/mach-omap/am33xx_generic.c | 28 ++++++++++++++++++++++++++++
arch/arm/mach-omap/am33xx_mux.c | 11 +++++++++++
arch/arm/mach-omap/include/mach/am33xx-mux.h | 1 +
3 files changed, 40 insertions(+)
diff --git a/arch/arm/mach-omap/am33xx_generic.c b/arch/arm/mach-omap/am33xx_generic.c
index d3014c2..bf03fcd 100644
--- a/arch/arm/mach-omap/am33xx_generic.c
+++ b/arch/arm/mach-omap/am33xx_generic.c
@@ -19,8 +19,10 @@
*/
#include <common.h>
+#include <init.h>
#include <io.h>
#include <net.h>
+#include <driver.h>
#include <mach/am33xx-silicon.h>
#include <mach/am33xx-clock.h>
#include <mach/sys_info.h>
@@ -122,3 +124,29 @@ int am33xx_register_ethaddr(int eth_id, int mac_id)
return -ENODEV;
}
+
+static int am33xx_gpio_init(void)
+{
+ /* GPIO 1-3 */
+#define PRCM_MOD_EN 0x2
+ __raw_writel(PRCM_MOD_EN, CM_PER_GPIO1_CLKCTRL);
+ while (__raw_readl(CM_PER_GPIO1_CLKCTRL) != PRCM_MOD_EN);
+
+ __raw_writel(PRCM_MOD_EN, CM_PER_GPIO2_CLKCTRL);
+ while (__raw_readl(CM_PER_GPIO2_CLKCTRL) != PRCM_MOD_EN);
+
+ __raw_writel(PRCM_MOD_EN, CM_PER_GPIO3_CLKCTRL);
+ while (__raw_readl(CM_PER_GPIO3_CLKCTRL) != PRCM_MOD_EN);
+
+ add_generic_device("omap-gpio", 0, NULL, AM33XX_GPIO0_BASE,
+ 0xf00, IORESOURCE_MEM, NULL);
+ add_generic_device("omap-gpio", 1, NULL, AM33XX_GPIO1_BASE,
+ 0xf00, IORESOURCE_MEM, NULL);
+ add_generic_device("omap-gpio", 2, NULL, AM33XX_GPIO2_BASE,
+ 0xf00, IORESOURCE_MEM, NULL);
+ add_generic_device("omap-gpio", 3, NULL, AM33XX_GPIO3_BASE,
+ 0xf00, IORESOURCE_MEM, NULL);
+
+ return 0;
+}
+coredevice_initcall(am33xx_gpio_init);
diff --git a/arch/arm/mach-omap/am33xx_mux.c b/arch/arm/mach-omap/am33xx_mux.c
index 3d7f245..e3a700d 100644
--- a/arch/arm/mach-omap/am33xx_mux.c
+++ b/arch/arm/mach-omap/am33xx_mux.c
@@ -291,6 +291,12 @@ static const __maybe_unused struct module_pin_mux i2c0_pin_mux[] = {
{-1},
};
+static const __maybe_unused struct module_pin_mux i2c0_pin_mux_gpio[] = {
+ {OFFSET(i2c0_sda), (MODE(7) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_DATA */
+ {OFFSET(i2c0_scl), (MODE(7) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */
+ {-1},
+};
+
static const __maybe_unused struct module_pin_mux i2c1_pin_mux[] = {
{OFFSET(spi0_d1), (MODE(2) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_DATA */
{OFFSET(spi0_cs0), (MODE(2) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */
@@ -490,6 +496,11 @@ void enable_i2c0_pin_mux(void)
configure_module_pin_mux(i2c0_pin_mux);
}
+void enable_i2c0_pin_mux_gpio(void)
+{
+ configure_module_pin_mux(i2c0_pin_mux_gpio);
+}
+
void enable_i2c1_pin_mux(void)
{
configure_module_pin_mux(i2c1_pin_mux);
diff --git a/arch/arm/mach-omap/include/mach/am33xx-mux.h b/arch/arm/mach-omap/include/mach/am33xx-mux.h
index 6078b3a..f4318c2 100644
--- a/arch/arm/mach-omap/include/mach/am33xx-mux.h
+++ b/arch/arm/mach-omap/include/mach/am33xx-mux.h
@@ -15,6 +15,7 @@
extern void enable_mii1_pin_mux(void);
extern void enable_i2c0_pin_mux(void);
+extern void enable_i2c0_pin_mux_gpio(void);
extern void enable_i2c1_pin_mux(void);
extern void enable_i2c2_pin_mux(void);
extern void enable_uart0_pin_mux(void);
--
1.8.2.rc2
|