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
drivers
mfd
ucb1400_core.c
Go to the documentation of this file.
1
/*
2
* Core functions for:
3
* Philips UCB1400 multifunction chip
4
*
5
* Based on ucb1400_ts.c:
6
* Author: Nicolas Pitre
7
* Created: September 25, 2006
8
* Copyright: MontaVista Software, Inc.
9
*
10
* Spliting done by: Marek Vasut <
[email protected]
>
11
* If something doesn't work and it worked before spliting, e-mail me,
12
* dont bother Nicolas please ;-)
13
*
14
* This program is free software; you can redistribute it and/or modify
15
* it under the terms of the GNU General Public License version 2 as
16
* published by the Free Software Foundation.
17
*
18
* This code is heavily based on ucb1x00-*.c copyrighted by Russell King
19
* covering the UCB1100, UCB1200 and UCB1300.. Support for the UCB1400 has
20
* been made separate from ucb1x00-core/ucb1x00-ts on Russell's request.
21
*/
22
23
#include <linux/module.h>
24
#include <linux/sched.h>
25
#include <linux/slab.h>
26
#include <
linux/ucb1400.h
>
27
28
unsigned
int
ucb1400_adc_read
(
struct
snd_ac97
*ac97,
u16
adc_channel,
29
int
adcsync)
30
{
31
unsigned
int
val
;
32
33
if
(adcsync)
34
adc_channel |=
UCB_ADC_SYNC_ENA
;
35
36
ucb1400_reg_write(ac97,
UCB_ADC_CR
,
UCB_ADC_ENA
| adc_channel);
37
ucb1400_reg_write(ac97,
UCB_ADC_CR
,
UCB_ADC_ENA
| adc_channel |
38
UCB_ADC_START
);
39
40
while
(!((val = ucb1400_reg_read(ac97,
UCB_ADC_DATA
))
41
&
UCB_ADC_DAT_VALID
))
42
schedule_timeout_uninterruptible
(1);
43
44
return
val &
UCB_ADC_DAT_MASK
;
45
}
46
EXPORT_SYMBOL_GPL
(
ucb1400_adc_read
);
47
48
static
int
ucb1400_core_probe(
struct
device
*
dev
)
49
{
50
int
err
;
51
struct
ucb1400
*ucb;
52
struct
ucb1400_ts
ucb_ts;
53
struct
ucb1400_gpio
ucb_gpio;
54
struct
snd_ac97
*
ac97
;
55
struct
ucb1400_pdata
*
pdata
= dev->
platform_data
;
56
57
memset
(&ucb_ts, 0,
sizeof
(ucb_ts));
58
memset
(&ucb_gpio, 0,
sizeof
(ucb_gpio));
59
60
ucb = kzalloc(
sizeof
(
struct
ucb1400
),
GFP_KERNEL
);
61
if
(!ucb) {
62
err = -
ENOMEM
;
63
goto
err
;
64
}
65
66
dev_set_drvdata
(dev, ucb);
67
68
ac97 =
to_ac97_t
(dev);
69
70
ucb_ts.id = ucb1400_reg_read(ac97,
UCB_ID
);
71
if
(ucb_ts.id !=
UCB_ID_1400
) {
72
err = -
ENODEV
;
73
goto
err0;
74
}
75
76
/* GPIO */
77
ucb_gpio.ac97 = ac97;
78
ucb->
ucb1400_gpio
=
platform_device_alloc
(
"ucb1400_gpio"
, -1);
79
if
(!ucb->
ucb1400_gpio
) {
80
err = -
ENOMEM
;
81
goto
err0;
82
}
83
err =
platform_device_add_data
(ucb->
ucb1400_gpio
, &ucb_gpio,
84
sizeof
(ucb_gpio));
85
if
(err)
86
goto
err1;
87
err =
platform_device_add
(ucb->
ucb1400_gpio
);
88
if
(err)
89
goto
err1;
90
91
/* TOUCHSCREEN */
92
ucb_ts.ac97 = ac97;
93
94
if
(pdata !=
NULL
&& pdata->
irq
>= 0)
95
ucb_ts.irq = pdata->
irq
;
96
else
97
ucb_ts.irq = -1;
98
99
ucb->
ucb1400_ts
=
platform_device_alloc
(
"ucb1400_ts"
, -1);
100
if
(!ucb->
ucb1400_ts
) {
101
err = -
ENOMEM
;
102
goto
err2;
103
}
104
err =
platform_device_add_data
(ucb->
ucb1400_ts
, &ucb_ts,
105
sizeof
(ucb_ts));
106
if
(err)
107
goto
err3;
108
err =
platform_device_add
(ucb->
ucb1400_ts
);
109
if
(err)
110
goto
err3;
111
112
return
0;
113
114
err3:
115
platform_device_put
(ucb->
ucb1400_ts
);
116
err2:
117
platform_device_del
(ucb->
ucb1400_gpio
);
118
err1:
119
platform_device_put
(ucb->
ucb1400_gpio
);
120
err0:
121
kfree
(ucb);
122
err:
123
return
err
;
124
}
125
126
static
int
ucb1400_core_remove(
struct
device
*dev)
127
{
128
struct
ucb1400
*ucb =
dev_get_drvdata
(dev);
129
130
platform_device_unregister
(ucb->
ucb1400_ts
);
131
platform_device_unregister
(ucb->
ucb1400_gpio
);
132
133
kfree
(ucb);
134
return
0;
135
}
136
137
static
struct
device_driver
ucb1400_core_driver = {
138
.name =
"ucb1400_core"
,
139
.bus = &
ac97_bus_type
,
140
.probe = ucb1400_core_probe,
141
.remove = ucb1400_core_remove,
142
};
143
144
static
int
__init
ucb1400_core_init(
void
)
145
{
146
return
driver_register
(&ucb1400_core_driver);
147
}
148
149
static
void
__exit
ucb1400_core_exit(
void
)
150
{
151
driver_unregister
(&ucb1400_core_driver);
152
}
153
154
module_init
(ucb1400_core_init);
155
module_exit
(ucb1400_core_exit);
156
157
MODULE_DESCRIPTION
(
"Philips UCB1400 driver"
);
158
MODULE_LICENSE
(
"GPL"
);
Generated on Thu Jan 10 2013 13:54:23 for Linux Kernel by
1.8.2