Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
xtensa
platforms
s6105
device.c
Go to the documentation of this file.
1
/*
2
* s6105 platform devices
3
*
4
* Copyright (c) 2009 emlix GmbH
5
*/
6
7
#include <linux/kernel.h>
8
#include <
linux/gpio.h
>
9
#include <
linux/init.h
>
10
#include <
linux/irq.h
>
11
#include <
linux/phy.h
>
12
#include <
linux/platform_device.h
>
13
#include <linux/serial.h>
14
#include <
linux/serial_8250.h
>
15
16
#include <
variant/hardware.h
>
17
#include <
variant/dmac.h
>
18
19
#include <
platform/gpio.h
>
20
21
#define GPIO3_INTNUM 3
22
#define UART_INTNUM 4
23
#define GMAC_INTNUM 5
24
25
static
const
signed
char
gpio3_irq_mappings[] = {
26
S6_INTC_GPIO
(3),
27
-1
28
};
29
30
static
const
signed
char
uart_irq_mappings[] = {
31
S6_INTC_UART
(0),
32
S6_INTC_UART
(1),
33
-1,
34
};
35
36
static
const
signed
char
gmac_irq_mappings[] = {
37
S6_INTC_GMAC_STAT
,
38
S6_INTC_GMAC_ERR
,
39
S6_INTC_DMA_HOSTTERMCNT
(0),
40
S6_INTC_DMA_HOSTTERMCNT
(1),
41
-1
42
};
43
44
const
signed
char
*
platform_irq_mappings
[
NR_IRQS
] = {
45
[
GPIO3_INTNUM
] = gpio3_irq_mappings,
46
[
UART_INTNUM
] = uart_irq_mappings,
47
[
GMAC_INTNUM
] = gmac_irq_mappings,
48
};
49
50
static
struct
plat_serial8250_port
serial_platform_data[] = {
51
{
52
.membase = (
void
*)
S6_REG_UART
+ 0x0000,
53
.
mapbase
=
S6_REG_UART
+ 0x0000,
54
.
irq
=
UART_INTNUM
,
55
.
uartclk
=
S6_SCLK
,
56
.
regshift
= 2,
57
.
iotype
=
SERIAL_IO_MEM
,
58
.
flags
=
ASYNC_BOOT_AUTOCONF
|
ASYNC_SKIP_TEST
,
59
},
60
{
61
.membase = (
void
*)
S6_REG_UART
+ 0x1000,
62
.
mapbase
=
S6_REG_UART
+ 0x1000,
63
.
irq
=
UART_INTNUM
,
64
.
uartclk
=
S6_SCLK
,
65
.
regshift
= 2,
66
.
iotype
=
SERIAL_IO_MEM
,
67
.
flags
=
ASYNC_BOOT_AUTOCONF
|
ASYNC_SKIP_TEST
,
68
},
69
{ },
70
};
71
72
static
struct
resource
s6_gmac_resource[] = {
73
{
74
.name =
"mem"
,
75
.start = (
resource_size_t
)
S6_REG_GMAC
,
76
.
end
= (
resource_size_t
)
S6_REG_GMAC
+ 0x10000 - 1,
77
.flags =
IORESOURCE_MEM
,
78
},
79
{
80
.name =
"dma"
,
81
.start = (
resource_size_t
)
82
DMA_CHNL
(
S6_REG_HIFDMA
,
S6_HIFDMA_GMACTX
),
83
.end = (
resource_size_t
)
84
DMA_CHNL
(
S6_REG_HIFDMA
,
S6_HIFDMA_GMACTX
) + 0x100 - 1,
85
.flags =
IORESOURCE_DMA
,
86
},
87
{
88
.name =
"dma"
,
89
.start = (
resource_size_t
)
90
DMA_CHNL
(
S6_REG_HIFDMA
,
S6_HIFDMA_GMACRX
),
91
.end = (
resource_size_t
)
92
DMA_CHNL
(
S6_REG_HIFDMA
,
S6_HIFDMA_GMACRX
) + 0x100 - 1,
93
.flags =
IORESOURCE_DMA
,
94
},
95
{
96
.name =
"io"
,
97
.start = (
resource_size_t
)
S6_MEM_GMAC
,
98
.
end
= (
resource_size_t
)
S6_MEM_GMAC
+ 0x2000000 - 1,
99
.flags =
IORESOURCE_IO
,
100
},
101
{
102
.name =
"irq"
,
103
.start = (
resource_size_t
)
GMAC_INTNUM
,
104
.
flags
=
IORESOURCE_IRQ
,
105
},
106
{
107
.name =
"irq"
,
108
.start = (
resource_size_t
)
PHY_POLL
,
109
.
flags
=
IORESOURCE_IRQ
,
110
},
111
};
112
113
static
int
__init
prepare_phy_irq(
int
pin
)
114
{
115
int
irq
;
116
if
(
gpio_request
(pin,
"s6gmac_phy"
) < 0)
117
goto
fail;
118
if
(
gpio_direction_input
(pin) < 0)
119
goto
free
;
120
irq =
gpio_to_irq
(pin);
121
if
(irq < 0)
122
goto
free
;
123
if
(
irq_set_irq_type
(irq,
IRQ_TYPE_LEVEL_LOW
) < 0)
124
goto
free
;
125
return
irq;
126
free
:
127
gpio_free
(pin);
128
fail:
129
return
PHY_POLL
;
130
}
131
132
static
struct
platform_device
platform_devices[] = {
133
{
134
.name =
"serial8250"
,
135
.id =
PLAT8250_DEV_PLATFORM
,
136
.dev = {
137
.platform_data = serial_platform_data,
138
},
139
},
140
{
141
.name =
"s6gmac"
,
142
.id = 0,
143
.resource = s6_gmac_resource,
144
.num_resources =
ARRAY_SIZE
(s6_gmac_resource),
145
},
146
{
147
I2C_BOARD_INFO
(
"m41t62"
, S6I2C_ADDR_M41T62),
148
},
149
};
150
151
static
int
__init
device_init(
void
)
152
{
153
int
i
;
154
155
s6_gmac_resource[5].
start
= prepare_phy_irq(
GPIO_PHY_IRQ
);
156
157
for
(i = 0; i <
ARRAY_SIZE
(platform_devices); i++)
158
platform_device_register
(&platform_devices[i]);
159
return
0;
160
}
161
arch_initcall_sync
(device_init);
Generated on Thu Jan 10 2013 13:08:19 for Linux Kernel by
1.8.2