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
arm
mach-omap2
mcbsp.c
Go to the documentation of this file.
1
/*
2
* linux/arch/arm/mach-omap2/mcbsp.c
3
*
4
* Copyright (C) 2008 Instituto Nokia de Tecnologia
5
* Contact: Eduardo Valentin <
[email protected]
>
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
* Multichannel mode not supported.
12
*/
13
#include <linux/module.h>
14
#include <
linux/init.h
>
15
#include <
linux/clk.h
>
16
#include <
linux/err.h
>
17
#include <
linux/io.h
>
18
#include <
linux/of.h
>
19
#include <
linux/platform_device.h
>
20
#include <linux/slab.h>
21
#include <
linux/platform_data/asoc-ti-mcbsp.h
>
22
23
#include <plat/dma.h>
24
#include <
plat/omap_device.h
>
25
#include <
linux/pm_runtime.h
>
26
27
/*
28
* FIXME: Find a mechanism to enable/disable runtime the McBSP ICLK autoidle.
29
* Sidetone needs non-gated ICLK and sidetone autoidle is broken.
30
*/
31
#include "
cm2xxx_3xxx.h
"
32
#include "
cm-regbits-34xx.h
"
33
34
static
int
omap3_enable_st_clock(
unsigned
int
id
,
bool
enable
)
35
{
36
unsigned
int
w
;
37
38
/*
39
* Sidetone uses McBSP ICLK - which must not idle when sidetones
40
* are enabled or sidetones start sounding ugly.
41
*/
42
w =
omap2_cm_read_mod_reg
(
OMAP3430_PER_MOD
,
CM_AUTOIDLE
);
43
if
(enable)
44
w &= ~(1 << (
id
- 2));
45
else
46
w |= 1 << (
id
- 2);
47
omap2_cm_write_mod_reg
(w,
OMAP3430_PER_MOD
,
CM_AUTOIDLE
);
48
49
return
0;
50
}
51
52
static
int
__init
omap_init_mcbsp(
struct
omap_hwmod
*oh,
void
*
unused
)
53
{
54
int
id
,
count
= 1;
55
char
*
name
=
"omap-mcbsp"
;
56
struct
omap_hwmod
*oh_device[2];
57
struct
omap_mcbsp_platform_data
*
pdata
=
NULL
;
58
struct
platform_device
*
pdev
;
59
60
sscanf
(oh->
name
,
"mcbsp%d"
, &
id
);
61
62
pdata = kzalloc(
sizeof
(
struct
omap_mcbsp_platform_data
),
GFP_KERNEL
);
63
if
(!pdata) {
64
pr_err
(
"%s: No memory for mcbsp\n"
, __func__);
65
return
-
ENOMEM
;
66
}
67
68
pdata->
reg_step
= 4;
69
if
(oh->
class
->rev <
MCBSP_CONFIG_TYPE2
) {
70
pdata->
reg_size
= 2;
71
}
else
{
72
pdata->
reg_size
= 4;
73
pdata->
has_ccr
=
true
;
74
}
75
76
if
(oh->
class
->rev ==
MCBSP_CONFIG_TYPE2
) {
77
/* The FIFO has 128 locations */
78
pdata->
buffer_size
= 0x80;
79
}
else
if
(oh->
class
->rev ==
MCBSP_CONFIG_TYPE3
) {
80
if
(
id
== 2)
81
/* The FIFO has 1024 + 256 locations */
82
pdata->
buffer_size
= 0x500;
83
else
84
/* The FIFO has 128 locations */
85
pdata->
buffer_size
= 0x80;
86
}
else
if
(oh->
class
->rev ==
MCBSP_CONFIG_TYPE4
) {
87
/* The FIFO has 128 locations for all instances */
88
pdata->
buffer_size
= 0x80;
89
}
90
91
if
(oh->
class
->rev >=
MCBSP_CONFIG_TYPE3
)
92
pdata->
has_wakeup
=
true
;
93
94
oh_device[0] = oh;
95
96
if
(oh->
dev_attr
) {
97
oh_device[1] =
omap_hwmod_lookup
((
98
(
struct
omap_mcbsp_dev_attr
*)(oh->
dev_attr
))->sidetone);
99
pdata->
enable_st_clock
= omap3_enable_st_clock;
100
count++;
101
}
102
pdev =
omap_device_build_ss
(name,
id
, oh_device, count, pdata,
103
sizeof
(*pdata),
NULL
, 0,
false
);
104
kfree
(pdata);
105
if
(IS_ERR(pdev)) {
106
pr_err
(
"%s: Can't build omap_device for %s:%s.\n"
, __func__,
107
name, oh->
name
);
108
return
PTR_ERR(pdev);
109
}
110
return
0;
111
}
112
113
static
int
__init
omap2_mcbsp_init(
void
)
114
{
115
if
(!of_have_populated_dt())
116
omap_hwmod_for_each_by_class
(
"mcbsp"
, omap_init_mcbsp,
NULL
);
117
118
return
0;
119
}
120
arch_initcall
(omap2_mcbsp_init);
Generated on Thu Jan 10 2013 13:00:18 for Linux Kernel by
1.8.2