include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / drivers / media / video / wm8739.c
1 /*
2  * wm8739
3  *
4  * Copyright (C) 2005 T. Adachi <tadachi@tadachi-net.com>
5  *
6  * Copyright (C) 2005 Hans Verkuil <hverkuil@xs4all.nl>
7  * - Cleanup
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22  */
23
24 #include <linux/module.h>
25 #include <linux/types.h>
26 #include <linux/slab.h>
27 #include <linux/ioctl.h>
28 #include <asm/uaccess.h>
29 #include <linux/i2c.h>
30 #include <linux/i2c-id.h>
31 #include <linux/videodev2.h>
32 #include <media/v4l2-device.h>
33 #include <media/v4l2-chip-ident.h>
34 #include <media/v4l2-i2c-drv.h>
35
36 MODULE_DESCRIPTION("wm8739 driver");
37 MODULE_AUTHOR("T. Adachi, Hans Verkuil");
38 MODULE_LICENSE("GPL");
39
40 static int debug;
41
42 module_param(debug, int, 0644);
43
44 MODULE_PARM_DESC(debug, "Debug level (0-1)");
45
46
47 /* ------------------------------------------------------------------------ */
48
49 enum {
50         R0 = 0, R1,
51         R5 = 5, R6, R7, R8, R9, R15 = 15,
52         TOT_REGS
53 };
54
55 struct wm8739_state {
56         struct v4l2_subdev sd;
57         u32 clock_freq;
58         u8 muted;
59         u16 volume;
60         u16 balance;
61         u8 vol_l;               /* +12dB to -34.5dB 1.5dB step (5bit) def:0dB */
62         u8 vol_r;               /* +12dB to -34.5dB 1.5dB step (5bit) def:0dB */
63 };
64
65 static inline struct wm8739_state *to_state(struct v4l2_subdev *sd)
66 {
67         return container_of(sd, struct wm8739_state, sd);
68 }
69
70 /* ------------------------------------------------------------------------ */
71
72 static int wm8739_write(struct v4l2_subdev *sd, int reg, u16 val)
73 {
74         struct i2c_client *client = v4l2_get_subdevdata(sd);
75         int i;
76
77         if (reg < 0 || reg >= TOT_REGS) {
78                 v4l2_err(sd, "Invalid register R%d\n", reg);
79                 return -1;
80         }
81
82         v4l2_dbg(1, debug, sd, "write: %02x %02x\n", reg, val);
83
84         for (i = 0; i < 3; i++)
85                 if (i2c_smbus_write_byte_data(client,
86                                 (reg << 1) | (val >> 8), val & 0xff) == 0)
87                         return 0;
88         v4l2_err(sd, "I2C: cannot write %03x to register R%d\n", val, reg);
89         return -1;
90 }
91
92 /* write regs to set audio volume etc */
93 static void wm8739_set_audio(struct v4l2_subdev *sd)
94 {
95         struct wm8739_state *state = to_state(sd);
96         u16 mute = state->muted ? 0x80 : 0;
97
98         /* Volume setting: bits 0-4, 0x1f = 12 dB, 0x00 = -34.5 dB
99          * Default setting: 0x17 = 0 dB
100          */
101         wm8739_write(sd, R0, (state->vol_l & 0x1f) | mute);
102         wm8739_write(sd, R1, (state->vol_r & 0x1f) | mute);
103 }
104
105 static int wm8739_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
106 {
107         struct wm8739_state *state = to_state(sd);
108
109         switch (ctrl->id) {
110         case V4L2_CID_AUDIO_MUTE:
111                 ctrl->value = state->muted;
112                 break;
113
114         case V4L2_CID_AUDIO_VOLUME:
115                 ctrl->value = state->volume;
116                 break;
117
118         case V4L2_CID_AUDIO_BALANCE:
119                 ctrl->value = state->balance;
120                 break;
121
122         default:
123                 return -EINVAL;
124         }
125         return 0;
126 }
127
128 static int wm8739_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
129 {
130         struct wm8739_state *state = to_state(sd);
131         unsigned int work_l, work_r;
132
133         switch (ctrl->id) {
134         case V4L2_CID_AUDIO_MUTE:
135                 state->muted = ctrl->value;
136                 break;
137
138         case V4L2_CID_AUDIO_VOLUME:
139                 state->volume = ctrl->value;
140                 break;
141
142         case V4L2_CID_AUDIO_BALANCE:
143                 state->balance = ctrl->value;
144                 break;
145
146         default:
147                 return -EINVAL;
148         }
149
150         /* normalize ( 65535 to 0 -> 31 to 0 (12dB to -34.5dB) ) */
151         work_l = (min(65536 - state->balance, 32768) * state->volume) / 32768;
152         work_r = (min(state->balance, (u16)32768) * state->volume) / 32768;
153
154         state->vol_l = (long)work_l * 31 / 65535;
155         state->vol_r = (long)work_r * 31 / 65535;
156
157         /* set audio volume etc. */
158         wm8739_set_audio(sd);
159         return 0;
160 }
161
162 /* ------------------------------------------------------------------------ */
163
164 static struct v4l2_queryctrl wm8739_qctrl[] = {
165         {
166                 .id            = V4L2_CID_AUDIO_VOLUME,
167                 .name          = "Volume",
168                 .minimum       = 0,
169                 .maximum       = 65535,
170                 .step          = 65535/100,
171                 .default_value = 58880,
172                 .flags         = 0,
173                 .type          = V4L2_CTRL_TYPE_INTEGER,
174         }, {
175                 .id            = V4L2_CID_AUDIO_MUTE,
176                 .name          = "Mute",
177                 .minimum       = 0,
178                 .maximum       = 1,
179                 .step          = 1,
180                 .default_value = 1,
181                 .flags         = 0,
182                 .type          = V4L2_CTRL_TYPE_BOOLEAN,
183         }, {
184                 .id            = V4L2_CID_AUDIO_BALANCE,
185                 .name          = "Balance",
186                 .minimum       = 0,
187                 .maximum       = 65535,
188                 .step          = 65535/100,
189                 .default_value = 32768,
190                 .flags         = 0,
191                 .type          = V4L2_CTRL_TYPE_INTEGER,
192         }
193 };
194
195 /* ------------------------------------------------------------------------ */
196
197 static int wm8739_s_clock_freq(struct v4l2_subdev *sd, u32 audiofreq)
198 {
199         struct wm8739_state *state = to_state(sd);
200
201         state->clock_freq = audiofreq;
202         /* de-activate */
203         wm8739_write(sd, R9, 0x000);
204         switch (audiofreq) {
205         case 44100:
206                 /* 256fps, fs=44.1k */
207                 wm8739_write(sd, R8, 0x020);
208                 break;
209         case 48000:
210                 /* 256fps, fs=48k */
211                 wm8739_write(sd, R8, 0x000);
212                 break;
213         case 32000:
214                 /* 256fps, fs=32k */
215                 wm8739_write(sd, R8, 0x018);
216                 break;
217         default:
218                 break;
219         }
220         /* activate */
221         wm8739_write(sd, R9, 0x001);
222         return 0;
223 }
224
225 static int wm8739_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
226 {
227         int i;
228
229         for (i = 0; i < ARRAY_SIZE(wm8739_qctrl); i++)
230                 if (qc->id && qc->id == wm8739_qctrl[i].id) {
231                         memcpy(qc, &wm8739_qctrl[i], sizeof(*qc));
232                         return 0;
233                 }
234         return -EINVAL;
235 }
236
237 static int wm8739_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip)
238 {
239         struct i2c_client *client = v4l2_get_subdevdata(sd);
240
241         return v4l2_chip_ident_i2c_client(client, chip, V4L2_IDENT_WM8739, 0);
242 }
243
244 static int wm8739_log_status(struct v4l2_subdev *sd)
245 {
246         struct wm8739_state *state = to_state(sd);
247
248         v4l2_info(sd, "Frequency: %u Hz\n", state->clock_freq);
249         v4l2_info(sd, "Volume L:  %02x%s\n", state->vol_l & 0x1f,
250                         state->muted ? " (muted)" : "");
251         v4l2_info(sd, "Volume R:  %02x%s\n", state->vol_r & 0x1f,
252                         state->muted ? " (muted)" : "");
253         return 0;
254 }
255
256 /* ----------------------------------------------------------------------- */
257
258 static const struct v4l2_subdev_core_ops wm8739_core_ops = {
259         .log_status = wm8739_log_status,
260         .g_chip_ident = wm8739_g_chip_ident,
261         .queryctrl = wm8739_queryctrl,
262         .g_ctrl = wm8739_g_ctrl,
263         .s_ctrl = wm8739_s_ctrl,
264 };
265
266 static const struct v4l2_subdev_audio_ops wm8739_audio_ops = {
267         .s_clock_freq = wm8739_s_clock_freq,
268 };
269
270 static const struct v4l2_subdev_ops wm8739_ops = {
271         .core = &wm8739_core_ops,
272         .audio = &wm8739_audio_ops,
273 };
274
275 /* ------------------------------------------------------------------------ */
276
277 /* i2c implementation */
278
279 static int wm8739_probe(struct i2c_client *client,
280                         const struct i2c_device_id *id)
281 {
282         struct wm8739_state *state;
283         struct v4l2_subdev *sd;
284
285         /* Check if the adapter supports the needed features */
286         if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
287                 return -EIO;
288
289         v4l_info(client, "chip found @ 0x%x (%s)\n",
290                         client->addr << 1, client->adapter->name);
291
292         state = kmalloc(sizeof(struct wm8739_state), GFP_KERNEL);
293         if (state == NULL)
294                 return -ENOMEM;
295         sd = &state->sd;
296         v4l2_i2c_subdev_init(sd, client, &wm8739_ops);
297         state->vol_l = 0x17; /* 0dB */
298         state->vol_r = 0x17; /* 0dB */
299         state->muted = 0;
300         state->balance = 32768;
301         /* normalize (12dB(31) to -34.5dB(0) [0dB(23)] -> 65535 to 0) */
302         state->volume = ((long)state->vol_l + 1) * 65535 / 31;
303         state->clock_freq = 48000;
304
305         /* Initialize wm8739 */
306
307         /* reset */
308         wm8739_write(sd, R15, 0x00);
309         /* filter setting, high path, offet clear */
310         wm8739_write(sd, R5, 0x000);
311         /* ADC, OSC, Power Off mode Disable */
312         wm8739_write(sd, R6, 0x000);
313         /* Digital Audio interface format:
314            Enable Master mode, 24 bit, MSB first/left justified */
315         wm8739_write(sd, R7, 0x049);
316         /* sampling control: normal, 256fs, 48KHz sampling rate */
317         wm8739_write(sd, R8, 0x000);
318         /* activate */
319         wm8739_write(sd, R9, 0x001);
320         /* set volume/mute */
321         wm8739_set_audio(sd);
322         return 0;
323 }
324
325 static int wm8739_remove(struct i2c_client *client)
326 {
327         struct v4l2_subdev *sd = i2c_get_clientdata(client);
328
329         v4l2_device_unregister_subdev(sd);
330         kfree(to_state(sd));
331         return 0;
332 }
333
334 static const struct i2c_device_id wm8739_id[] = {
335         { "wm8739", 0 },
336         { }
337 };
338 MODULE_DEVICE_TABLE(i2c, wm8739_id);
339
340 static struct v4l2_i2c_driver_data v4l2_i2c_data = {
341         .name = "wm8739",
342         .probe = wm8739_probe,
343         .remove = wm8739_remove,
344         .id_table = wm8739_id,
345 };