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
mips
bcm63xx
dev-spi.c
Go to the documentation of this file.
1
/*
2
* This file is subject to the terms and conditions of the GNU General Public
3
* License. See the file "COPYING" in the main directory of this archive
4
* for more details.
5
*
6
* Copyright (C) 2009-2011 Florian Fainelli <
[email protected]
>
7
* Copyright (C) 2010 Tanguy Bouzeloc <
[email protected]
>
8
*/
9
10
#include <
linux/init.h
>
11
#include <linux/kernel.h>
12
#include <linux/export.h>
13
#include <
linux/platform_device.h
>
14
#include <
linux/err.h
>
15
#include <
linux/clk.h
>
16
17
#include <
bcm63xx_cpu.h
>
18
#include <
bcm63xx_dev_spi.h
>
19
#include <
bcm63xx_regs.h
>
20
21
#ifdef BCMCPU_RUNTIME_DETECT
22
/*
23
* register offsets
24
*/
25
static
const
unsigned
long
bcm6338_regs_spi[] = {
26
__GEN_SPI_REGS_TABLE
(6338)
27
};
28
29
static
const
unsigned
long
bcm6348_regs_spi[] = {
30
__GEN_SPI_REGS_TABLE
(6348)
31
};
32
33
static
const
unsigned
long
bcm6358_regs_spi[] = {
34
__GEN_SPI_REGS_TABLE
(6358)
35
};
36
37
static
const
unsigned
long
bcm6368_regs_spi[] = {
38
__GEN_SPI_REGS_TABLE
(6368)
39
};
40
41
const
unsigned
long
*
bcm63xx_regs_spi
;
42
EXPORT_SYMBOL
(
bcm63xx_regs_spi
);
43
44
static
__init
void
bcm63xx_spi_regs_init(
void
)
45
{
46
if
(
BCMCPU_IS_6338
())
47
bcm63xx_regs_spi
= bcm6338_regs_spi;
48
if
(
BCMCPU_IS_6348
())
49
bcm63xx_regs_spi
= bcm6348_regs_spi;
50
if
(
BCMCPU_IS_6358
())
51
bcm63xx_regs_spi
= bcm6358_regs_spi;
52
if
(
BCMCPU_IS_6368
())
53
bcm63xx_regs_spi
= bcm6368_regs_spi;
54
}
55
#else
56
static
__init
void
bcm63xx_spi_regs_init(
void
) { }
57
#endif
58
59
static
struct
resource
spi_resources[] = {
60
{
61
.start = -1,
/* filled at runtime */
62
.end = -1,
/* filled at runtime */
63
.flags =
IORESOURCE_MEM
,
64
},
65
{
66
.start = -1,
/* filled at runtime */
67
.flags =
IORESOURCE_IRQ
,
68
},
69
};
70
71
static
struct
bcm63xx_spi_pdata
spi_pdata = {
72
.bus_num = 0,
73
.num_chipselect = 8,
74
};
75
76
static
struct
platform_device
bcm63xx_spi_device = {
77
.name =
"bcm63xx-spi"
,
78
.id = -1,
79
.num_resources =
ARRAY_SIZE
(spi_resources),
80
.resource = spi_resources,
81
.dev = {
82
.platform_data = &spi_pdata,
83
},
84
};
85
86
int
__init
bcm63xx_spi_register
(
void
)
87
{
88
struct
clk
*periph_clk;
89
90
if
(
BCMCPU_IS_6328
() ||
BCMCPU_IS_6345
())
91
return
-
ENODEV
;
92
93
periph_clk =
clk_get
(
NULL
,
"periph"
);
94
if
(IS_ERR(periph_clk)) {
95
pr_err
(
"unable to get periph clock\n"
);
96
return
-
ENODEV
;
97
}
98
99
/* Set bus frequency */
100
spi_pdata.
speed_hz
=
clk_get_rate
(periph_clk);
101
102
spi_resources[0].
start
= bcm63xx_regset_address(
RSET_SPI
);
103
spi_resources[0].
end
= spi_resources[0].
start
;
104
spi_resources[1].
start
= bcm63xx_get_irq_number(
IRQ_SPI
);
105
106
if
(
BCMCPU_IS_6338
() ||
BCMCPU_IS_6348
()) {
107
spi_resources[0].
end
+=
BCM_6338_RSET_SPI_SIZE
- 1;
108
spi_pdata.
fifo_size
=
SPI_6338_MSG_DATA_SIZE
;
109
spi_pdata.
msg_type_shift
=
SPI_6338_MSG_TYPE_SHIFT
;
110
spi_pdata.
msg_ctl_width
=
SPI_6338_MSG_CTL_WIDTH
;
111
}
112
113
if
(
BCMCPU_IS_6358
() ||
BCMCPU_IS_6368
()) {
114
spi_resources[0].
end
+=
BCM_6358_RSET_SPI_SIZE
- 1;
115
spi_pdata.
fifo_size
=
SPI_6358_MSG_DATA_SIZE
;
116
spi_pdata.
msg_type_shift
=
SPI_6358_MSG_TYPE_SHIFT
;
117
spi_pdata.
msg_ctl_width
=
SPI_6358_MSG_CTL_WIDTH
;
118
}
119
120
bcm63xx_spi_regs_init();
121
122
return
platform_device_register
(&bcm63xx_spi_device);
123
}
Generated on Thu Jan 10 2013 13:08:53 for Linux Kernel by
1.8.2