1 /*
2 * intelmid.c - Intel Sound card driver for MID
3 *
4 * Copyright (C) 2008-10 Intel Corp
5 * Authors: Harsha Priya <priya.harsha@intel.com>
6 * Vinod Koul <vinod.koul@intel.com>
7 * Dharageswari R <dharageswari.r@intel.com>
8 * KP Jeeja <jeeja.kp@intel.com>
9 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; version 2 of the License.
14 *
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License along
21 * with this program; if not, write to the Free Software Foundation, Inc.,
22 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
23 *
24 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25 * ALSA driver for Intel MID sound card chipset
26 */
27
28 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
29
30 #include <linux/slab.h>
31 #include <linux/io.h>
32 #include <linux/platform_device.h>
33 #include <linux/interrupt.h>
34 #include <linux/sched.h>
35 #include <sound/control.h>
36 #include <asm/mrst.h>
37 #include <sound/pcm.h>
38 #include "jack.h"
39 #include <sound/pcm_params.h>
40 #include <sound/initval.h>
41 #include "intel_sst.h"
42 #include "intel_sst_ioctl.h"
43 #include "intelmid_snd_control.h"
44 #include "intelmid.h"
45
46 MODULE_AUTHOR("Vinod Koul <vinod.koul@intel.com>");
47 MODULE_AUTHOR("Harsha Priya <priya.harsha@intel.com>");
48 MODULE_AUTHOR("Dharageswari R <dharageswari.r@intel.com>");
49 MODULE_AUTHOR("KP Jeeja <jeeja.kp@intel.com>");
50 MODULE_DESCRIPTION("Intel MAD Sound card driver");
51 MODULE_LICENSE("GPL v2");
52 MODULE_SUPPORTED_DEVICE("{Intel,Intel_MAD}");
53
54
55 static int card_index = SNDRV_DEFAULT_IDX1;/* Index 0-MAX */
56 static char *card_id = SNDRV_DEFAULT_STR1; /* ID for this card */
57
58 module_param(card_index, int, 0444);
59 MODULE_PARM_DESC(card_index, "Index value for INTELMAD soundcard.");
60 module_param(card_id, charp, 0444);
61 MODULE_PARM_DESC(card_id, "ID string for INTELMAD soundcard.");
62
63 int sst_card_vendor_id;
64 int intelmid_audio_interrupt_enable;/*checkpatch fix*/
65
66 /* Data path functionalities */
67 static struct snd_pcm_hardware snd_intelmad_stream = {
68 .info = (SNDRV_PCM_INFO_INTERLEAVED |
69 SNDRV_PCM_INFO_DOUBLE |
70 SNDRV_PCM_INFO_PAUSE |
71 SNDRV_PCM_INFO_RESUME |
72 SNDRV_PCM_INFO_MMAP|
73 SNDRV_PCM_INFO_MMAP_VALID |
74 SNDRV_PCM_INFO_BLOCK_TRANSFER |
75 SNDRV_PCM_INFO_SYNC_START),
76 .formats = (SNDRV_PCM_FMTBIT_S16 | SNDRV_PCM_FMTBIT_U16 |
77 SNDRV_PCM_FMTBIT_S24 | SNDRV_PCM_FMTBIT_U24 |
78 SNDRV_PCM_FMTBIT_S32 | SNDRV_PCM_FMTBIT_U32),
79 .rates = (SNDRV_PCM_RATE_8000|
80 SNDRV_PCM_RATE_44100 |
81 SNDRV_PCM_RATE_48000),
82 .rate_min = MIN_RATE,
83
84 .rate_max = MAX_RATE,
85 .channels_min = MIN_CHANNEL,
86 .channels_max = MAX_CHANNEL_AMIC,
87 .buffer_bytes_max = MAX_BUFFER,
88 .period_bytes_min = MIN_PERIOD_BYTES,
89 .period_bytes_max = MAX_PERIOD_BYTES,
90 .periods_min = MIN_PERIODS,
91 .periods_max = MAX_PERIODS,
92 .fifo_size = FIFO_SIZE,
93 };
94
95
96 /**
97 * snd_intelmad_pcm_trigger - stream activities are handled here
98 *
99 * @substream:substream for which the stream function is called
100 * @cmd:the stream commamd that requested from upper layer
101 *
102 * This function is called whenever an a stream activity is invoked
103 */
snd_intelmad_pcm_trigger(struct snd_pcm_substream * substream,int cmd)104 static int snd_intelmad_pcm_trigger(struct snd_pcm_substream *substream,
105 int cmd)
106 {
107 int ret_val = 0, str_id;
108 struct snd_intelmad *intelmaddata;
109 struct mad_stream_pvt *stream;
110 struct intel_sst_pcm_control *sst_ops;
111
112 WARN_ON(!substream);
113
114 intelmaddata = snd_pcm_substream_chip(substream);
115 stream = substream->runtime->private_data;
116
117 WARN_ON(!intelmaddata->sstdrv_ops);
118 WARN_ON(!intelmaddata->sstdrv_ops->scard_ops);
119 sst_ops = intelmaddata->sstdrv_ops->pcm_control;
120 str_id = stream->stream_info.str_id;
121
122 switch (cmd) {
123 case SNDRV_PCM_TRIGGER_START:
124 pr_debug("Trigger Start\n");
125 ret_val = sst_ops->device_control(SST_SND_START, &str_id);
126 if (ret_val)
127 return ret_val;
128 stream->stream_status = RUNNING;
129 stream->substream = substream;
130 break;
131 case SNDRV_PCM_TRIGGER_STOP:
132 pr_debug("in stop\n");
133 ret_val = sst_ops->device_control(SST_SND_DROP, &str_id);
134 if (ret_val)
135 return ret_val;
136 stream->stream_status = DROPPED;
137 break;
138 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
139 pr_debug("in pause\n");
140 ret_val = sst_ops->device_control(SST_SND_PAUSE, &str_id);
141 if (ret_val)
142 return ret_val;
143 stream->stream_status = PAUSED;
144 break;
145 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
146 pr_debug("in pause release\n");
147 ret_val = sst_ops->device_control(SST_SND_RESUME, &str_id);
148 if (ret_val)
149 return ret_val;
150 stream->stream_status = RUNNING;
151 break;
152 default:
153 return -EINVAL;
154 }
155 return ret_val;
156 }
157
158 /**
159 * snd_intelmad_pcm_prepare- internal preparation before starting a stream
160 *
161 * @substream: substream for which the function is called
162 *
163 * This function is called when a stream is started for internal preparation.
164 */
snd_intelmad_pcm_prepare(struct snd_pcm_substream * substream)165 static int snd_intelmad_pcm_prepare(struct snd_pcm_substream *substream)
166 {
167 struct mad_stream_pvt *stream;
168 int ret_val = 0;
169 struct snd_intelmad *intelmaddata;
170
171 pr_debug("pcm_prepare called\n");
172
173 WARN_ON(!substream);
174 stream = substream->runtime->private_data;
175 intelmaddata = snd_pcm_substream_chip(substream);
176 pr_debug("pb cnt = %d cap cnt = %d\n",\
177 intelmaddata->playback_cnt,
178 intelmaddata->capture_cnt);
179
180 if (stream->stream_info.str_id) {
181 pr_debug("Prepare called for already set stream\n");
182 ret_val = intelmaddata->sstdrv_ops->pcm_control->device_control(
183 SST_SND_DROP, &stream->stream_info.str_id);
184 return ret_val;
185 }
186
187 ret_val = snd_intelmad_alloc_stream(substream);
188 if (ret_val < 0)
189 return ret_val;
190 stream->dbg_cum_bytes = 0;
191 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
192 intelmaddata->playback_cnt++;
193 else
194 intelmaddata->capture_cnt++;
195 /* return back the stream id */
196 snprintf(substream->pcm->id, sizeof(substream->pcm->id),
197 "%d", stream->stream_info.str_id);
198 pr_debug("stream id to user = %s\n",
199 substream->pcm->id);
200
201 ret_val = snd_intelmad_init_stream(substream);
202 if (ret_val)
203 return ret_val;
204 substream->runtime->hw.info = SNDRV_PCM_INFO_BLOCK_TRANSFER;
205 return ret_val;
206 }
207
snd_intelmad_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * hw_params)208 static int snd_intelmad_hw_params(struct snd_pcm_substream *substream,
209 struct snd_pcm_hw_params *hw_params)
210 {
211 int ret_val;
212
213 pr_debug("snd_intelmad_hw_params called\n");
214 ret_val = snd_pcm_lib_malloc_pages(substream,
215 params_buffer_bytes(hw_params));
216 memset(substream->runtime->dma_area, 0,
217 params_buffer_bytes(hw_params));
218
219 return ret_val;
220 }
221
snd_intelmad_hw_free(struct snd_pcm_substream * substream)222 static int snd_intelmad_hw_free(struct snd_pcm_substream *substream)
223 {
224 pr_debug("snd_intelmad_hw_free called\n");
225 return snd_pcm_lib_free_pages(substream);
226 }
227
228 /**
229 * snd_intelmad_pcm_pointer- to send the current buffer pointer processed by hw
230 *
231 * @substream: substream for which the function is called
232 *
233 * This function is called by ALSA framework to get the current hw buffer ptr
234 * when a period is elapsed
235 */
snd_intelmad_pcm_pointer(struct snd_pcm_substream * substream)236 static snd_pcm_uframes_t snd_intelmad_pcm_pointer
237 (struct snd_pcm_substream *substream)
238 {
239 /* struct snd_pcm_runtime *runtime = substream->runtime; */
240 struct mad_stream_pvt *stream;
241 struct snd_intelmad *intelmaddata;
242 int ret_val;
243
244 WARN_ON(!substream);
245
246 intelmaddata = snd_pcm_substream_chip(substream);
247 stream = substream->runtime->private_data;
248 if (stream->stream_status == INIT)
249 return 0;
250
251 ret_val = intelmaddata->sstdrv_ops->pcm_control->device_control(
252 SST_SND_BUFFER_POINTER, &stream->stream_info);
253 if (ret_val) {
254 pr_err("error code = 0x%x\n", ret_val);
255 return ret_val;
256 }
257 pr_debug("samples reported out 0x%llx\n",
258 stream->stream_info.buffer_ptr);
259 pr_debug("Frame bits:: %d period_count :: %d\n",
260 (int)substream->runtime->frame_bits,
261 (int)substream->runtime->period_size);
262
263 return stream->stream_info.buffer_ptr;
264
265 }
266
267 /**
268 * snd_intelmad_close- to free parameteres when stream is stopped
269 *
270 * @substream: substream for which the function is called
271 *
272 * This function is called by ALSA framework when stream is stopped
273 */
snd_intelmad_close(struct snd_pcm_substream * substream)274 static int snd_intelmad_close(struct snd_pcm_substream *substream)
275 {
276 struct snd_intelmad *intelmaddata;
277 struct mad_stream_pvt *stream;
278 int ret_val = 0, str_id;
279
280 WARN_ON(!substream);
281
282 stream = substream->runtime->private_data;
283 str_id = stream->stream_info.str_id;
284
285 pr_debug("sst: snd_intelmad_close called for %d\n", str_id);
286 intelmaddata = snd_pcm_substream_chip(substream);
287
288 pr_debug("str id = %d\n", stream->stream_info.str_id);
289 if (stream->stream_info.str_id) {
290 /* SST API to actually stop/free the stream */
291 ret_val = intelmaddata->sstdrv_ops->pcm_control->close(str_id);
292 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
293 intelmaddata->playback_cnt--;
294 else
295 intelmaddata->capture_cnt--;
296 }
297 pr_debug("snd_intelmad_close : pb cnt = %d cap cnt = %d\n",
298 intelmaddata->playback_cnt, intelmaddata->capture_cnt);
299 kfree(substream->runtime->private_data);
300 return ret_val;
301 }
302
303 /**
304 * snd_intelmad_open- to set runtime parameters during stream start
305 *
306 * @substream: substream for which the function is called
307 * @type: audio device type
308 *
309 * This function is called by ALSA framework when stream is started
310 */
snd_intelmad_open(struct snd_pcm_substream * substream,enum snd_sst_audio_device_type type)311 static int snd_intelmad_open(struct snd_pcm_substream *substream,
312 enum snd_sst_audio_device_type type)
313 {
314 struct snd_intelmad *intelmaddata;
315 struct snd_pcm_runtime *runtime;
316 struct mad_stream_pvt *stream;
317
318 WARN_ON(!substream);
319
320 pr_debug("snd_intelmad_open called\n");
321
322 intelmaddata = snd_pcm_substream_chip(substream);
323 runtime = substream->runtime;
324 /* set the runtime hw parameter with local snd_pcm_hardware struct */
325 runtime->hw = snd_intelmad_stream;
326 if (intelmaddata->cpu_id == CPU_CHIP_PENWELL) {
327 runtime->hw = snd_intelmad_stream;
328 runtime->hw.rates = SNDRV_PCM_RATE_48000;
329 runtime->hw.rate_min = MAX_RATE;
330 runtime->hw.formats = (SNDRV_PCM_FMTBIT_S24 |
331 SNDRV_PCM_FMTBIT_U24);
332 if (intelmaddata->sstdrv_ops->scard_ops->input_dev_id == AMIC)
333 runtime->hw.channels_max = MAX_CHANNEL_AMIC;
334 else
335 runtime->hw.channels_max = MAX_CHANNEL_DMIC;
336
337 }
338 /* setup the internal datastruture stream pointers based on it being
339 playback or capture stream */
340 stream = kzalloc(sizeof(*stream), GFP_KERNEL);
341 if (!stream)
342 return -ENOMEM;
343 stream->stream_info.str_id = 0;
344 stream->device = type;
345 stream->stream_status = INIT;
346 runtime->private_data = stream;
347 return snd_pcm_hw_constraint_integer(runtime,
348 SNDRV_PCM_HW_PARAM_PERIODS);
349 }
350
snd_intelmad_headset_open(struct snd_pcm_substream * substream)351 static int snd_intelmad_headset_open(struct snd_pcm_substream *substream)
352 {
353 return snd_intelmad_open(substream, SND_SST_DEVICE_HEADSET);
354 }
355
snd_intelmad_ihf_open(struct snd_pcm_substream * substream)356 static int snd_intelmad_ihf_open(struct snd_pcm_substream *substream)
357 {
358 return snd_intelmad_open(substream, SND_SST_DEVICE_IHF);
359 }
360
snd_intelmad_vibra_open(struct snd_pcm_substream * substream)361 static int snd_intelmad_vibra_open(struct snd_pcm_substream *substream)
362 {
363 return snd_intelmad_open(substream, SND_SST_DEVICE_VIBRA);
364 }
365
snd_intelmad_haptic_open(struct snd_pcm_substream * substream)366 static int snd_intelmad_haptic_open(struct snd_pcm_substream *substream)
367 {
368 return snd_intelmad_open(substream, SND_SST_DEVICE_HAPTIC);
369 }
370
371 static struct snd_pcm_ops snd_intelmad_headset_ops = {
372 .open = snd_intelmad_headset_open,
373 .close = snd_intelmad_close,
374 .ioctl = snd_pcm_lib_ioctl,
375 .hw_params = snd_intelmad_hw_params,
376 .hw_free = snd_intelmad_hw_free,
377 .prepare = snd_intelmad_pcm_prepare,
378 .trigger = snd_intelmad_pcm_trigger,
379 .pointer = snd_intelmad_pcm_pointer,
380 };
381
382 static struct snd_pcm_ops snd_intelmad_ihf_ops = {
383 .open = snd_intelmad_ihf_open,
384 .close = snd_intelmad_close,
385 .ioctl = snd_pcm_lib_ioctl,
386 .hw_params = snd_intelmad_hw_params,
387 .hw_free = snd_intelmad_hw_free,
388 .prepare = snd_intelmad_pcm_prepare,
389 .trigger = snd_intelmad_pcm_trigger,
390 .pointer = snd_intelmad_pcm_pointer,
391 };
392
393 static struct snd_pcm_ops snd_intelmad_vibra_ops = {
394 .open = snd_intelmad_vibra_open,
395 .close = snd_intelmad_close,
396 .ioctl = snd_pcm_lib_ioctl,
397 .hw_params = snd_intelmad_hw_params,
398 .hw_free = snd_intelmad_hw_free,
399 .prepare = snd_intelmad_pcm_prepare,
400 .trigger = snd_intelmad_pcm_trigger,
401 .pointer = snd_intelmad_pcm_pointer,
402 };
403
404 static struct snd_pcm_ops snd_intelmad_haptic_ops = {
405 .open = snd_intelmad_haptic_open,
406 .close = snd_intelmad_close,
407 .ioctl = snd_pcm_lib_ioctl,
408 .hw_params = snd_intelmad_hw_params,
409 .hw_free = snd_intelmad_hw_free,
410 .prepare = snd_intelmad_pcm_prepare,
411 .trigger = snd_intelmad_pcm_trigger,
412 .pointer = snd_intelmad_pcm_pointer,
413 };
414
415 static struct snd_pcm_ops snd_intelmad_capture_ops = {
416 .open = snd_intelmad_headset_open,
417 .close = snd_intelmad_close,
418 .ioctl = snd_pcm_lib_ioctl,
419 .hw_params = snd_intelmad_hw_params,
420 .hw_free = snd_intelmad_hw_free,
421 .prepare = snd_intelmad_pcm_prepare,
422 .trigger = snd_intelmad_pcm_trigger,
423 .pointer = snd_intelmad_pcm_pointer,
424 };
425
426
427 /**
428 * snd_intelmad_intr_handler- interrupt handler
429 *
430 * @irq : irq number of the interrupt received
431 * @dev: device context
432 *
433 * This function is called when an interrupt is raised at the sound card
434 */
snd_intelmad_intr_handler(int irq,void * dev)435 static irqreturn_t snd_intelmad_intr_handler(int irq, void *dev)
436 {
437 struct snd_intelmad *intelmaddata =
438 (struct snd_intelmad *)dev;
439 u8 intsts;
440
441 memcpy_fromio(&intsts,
442 ((void *)(intelmaddata->int_base)),
443 sizeof(u8));
444 intelmaddata->mad_jack_msg.intsts = intsts;
445 intelmaddata->mad_jack_msg.intelmaddata = intelmaddata;
446
447 queue_work(intelmaddata->mad_jack_wq, &intelmaddata->mad_jack_msg.wq);
448
449 return IRQ_HANDLED;
450 }
451
sst_mad_send_jack_report(struct snd_jack * jack,int buttonpressevent,int status)452 void sst_mad_send_jack_report(struct snd_jack *jack,
453 int buttonpressevent , int status)
454 {
455
456 if (!jack) {
457 pr_debug("MAD error jack empty\n");
458
459 } else {
460 pr_debug("MAD send jack report for = %d!!!\n", status);
461 pr_debug("MAD send jack report %d\n", jack->type);
462 snd_jack_report(jack, status);
463
464 /*button pressed and released */
465 if (buttonpressevent)
466 snd_jack_report(jack, 0);
467 pr_debug("MAD sending jack report Done !!!\n");
468 }
469
470
471
472 }
473
sst_mad_jackdetection_fs(u8 intsts,struct snd_intelmad * intelmaddata)474 void sst_mad_jackdetection_fs(u8 intsts , struct snd_intelmad *intelmaddata)
475 {
476 struct snd_jack *jack = NULL;
477 unsigned int present = 0, jack_event_flag = 0, buttonpressflag = 0;
478 struct sc_reg_access sc_access[] = {
479 {0x187, 0x00, MASK7},
480 {0x188, 0x10, MASK4},
481 {0x18b, 0x10, MASK4},
482 };
483
484 struct sc_reg_access sc_access_write[] = {
485 {0x198, 0x00, 0x0},
486 };
487
488 if (intsts & 0x4) {
489
490 if (!(intelmid_audio_interrupt_enable)) {
491 pr_debug("Audio interrupt enable\n");
492 sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 3);
493
494 sst_sc_reg_access(sc_access_write, PMIC_WRITE, 1);
495 intelmid_audio_interrupt_enable = 1;
496 intelmaddata->jack[0].jack_status = 0;
497 intelmaddata->jack[1].jack_status = 0;
498
499 }
500 /* send headphone detect */
501 pr_debug("MAD headphone %d\n", intsts & 0x4);
502 jack = &intelmaddata->jack[0].jack;
503 present = !(intelmaddata->jack[0].jack_status);
504 intelmaddata->jack[0].jack_status = present;
505 jack_event_flag = 1;
506
507 }
508
509 if (intsts & 0x2) {
510 /* send short push */
511 pr_debug("MAD short push %d\n", intsts & 0x2);
512 jack = &intelmaddata->jack[2].jack;
513 present = 1;
514 jack_event_flag = 1;
515 buttonpressflag = 1;
516 }
517 if (intsts & 0x1) {
518 /* send long push */
519 pr_debug("MAD long push %d\n", intsts & 0x1);
520 jack = &intelmaddata->jack[3].jack;
521 present = 1;
522 jack_event_flag = 1;
523 buttonpressflag = 1;
524 }
525 if (intsts & 0x8) {
526 if (!(intelmid_audio_interrupt_enable)) {
527 pr_debug("Audio interrupt enable\n");
528 sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 3);
529
530 sst_sc_reg_access(sc_access_write, PMIC_WRITE, 1);
531 intelmid_audio_interrupt_enable = 1;
532 intelmaddata->jack[0].jack_status = 0;
533 intelmaddata->jack[1].jack_status = 0;
534 }
535 /* send headset detect */
536 pr_debug("MAD headset = %d\n", intsts & 0x8);
537 jack = &intelmaddata->jack[1].jack;
538 present = !(intelmaddata->jack[1].jack_status);
539 intelmaddata->jack[1].jack_status = present;
540 jack_event_flag = 1;
541 }
542
543 if (jack_event_flag)
544 sst_mad_send_jack_report(jack, buttonpressflag, present);
545 }
546
547
sst_mad_jackdetection_mx(u8 intsts,struct snd_intelmad * intelmaddata)548 void sst_mad_jackdetection_mx(u8 intsts, struct snd_intelmad *intelmaddata)
549 {
550 u8 value = 0, jack_prev_state = 0;
551 struct snd_jack *jack = NULL;
552 unsigned int present = 0, jack_event_flag = 0, buttonpressflag = 0;
553 time_t timediff;
554 struct sc_reg_access sc_access_read = {0,};
555 struct snd_pmic_ops *scard_ops;
556
557 scard_ops = intelmaddata->sstdrv_ops->scard_ops;
558
559 pr_debug("previous value: %x\n", intelmaddata->jack_prev_state);
560
561 if (!(intelmid_audio_interrupt_enable)) {
562 pr_debug("Audio interrupt enable\n");
563 intelmaddata->jack_prev_state = 0xC0;
564 intelmid_audio_interrupt_enable = 1;
565 }
566
567 if (intsts & 0x2) {
568 jack_prev_state = intelmaddata->jack_prev_state;
569 if (intelmaddata->pmic_status == PMIC_INIT) {
570 sc_access_read.reg_addr = 0x201;
571 sst_sc_reg_access(&sc_access_read, PMIC_READ, 1);
572 value = (sc_access_read.value);
573 pr_debug("value returned = 0x%x\n", value);
574 }
575
576 if (jack_prev_state == 0xc0 && value == 0x40) {
577 /*headset detected. */
578 pr_debug("MAD headset inserted\n");
579 jack = &intelmaddata->jack[1].jack;
580 present = 1;
581 jack_event_flag = 1;
582 intelmaddata->jack[1].jack_status = 1;
583
584 }
585
586 if (jack_prev_state == 0xc0 && value == 0x00) {
587 /* headphone detected. */
588 pr_debug("MAD headphone inserted\n");
589 jack = &intelmaddata->jack[0].jack;
590 present = 1;
591 jack_event_flag = 1;
592
593 }
594
595 if (jack_prev_state == 0x40 && value == 0xc0) {
596 /*headset removed*/
597 pr_debug("Jack headset status %d\n",
598 intelmaddata->jack[1].jack_status);
599 pr_debug("MAD headset removed\n");
600 jack = &intelmaddata->jack[1].jack;
601 present = 0;
602 jack_event_flag = 1;
603 intelmaddata->jack[1].jack_status = 0;
604 }
605
606 if (jack_prev_state == 0x00 && value == 0xc0) {
607 /* headphone detected. */
608 pr_debug("Jack headphone status %d\n",
609 intelmaddata->jack[0].jack_status);
610 pr_debug("headphone removed\n");
611 jack = &intelmaddata->jack[0].jack;
612 present = 0;
613 jack_event_flag = 1;
614 }
615
616 if (jack_prev_state == 0x40 && value == 0x00) {
617 /*button pressed*/
618 do_gettimeofday(&intelmaddata->jack[1].buttonpressed);
619 pr_debug("MAD button press detected\n");
620 }
621
622
623 if (jack_prev_state == 0x00 && value == 0x40) {
624 if (intelmaddata->jack[1].jack_status) {
625 /*button pressed*/
626 do_gettimeofday(
627 &intelmaddata->jack[1].buttonreleased);
628 /*button pressed */
629 pr_debug("Button Released detected\n");
630 timediff = intelmaddata->jack[1].
631 buttonreleased.tv_sec - intelmaddata->
632 jack[1].buttonpressed.tv_sec;
633 buttonpressflag = 1;
634 if (timediff > 1) {
635 pr_debug("long press detected\n");
636 /* send headphone detect/undetect */
637 jack = &intelmaddata->jack[3].jack;
638 present = 1;
639 jack_event_flag = 1;
640 } else {
641 pr_debug("short press detected\n");
642 /* send headphone detect/undetect */
643 jack = &intelmaddata->jack[2].jack;
644 present = 1;
645 jack_event_flag = 1;
646 }
647 }
648
649 }
650 intelmaddata->jack_prev_state = value;
651 }
652 if (jack_event_flag)
653 sst_mad_send_jack_report(jack, buttonpressflag, present);
654 }
655
656
sst_mad_jackdetection_nec(u8 intsts,struct snd_intelmad * intelmaddata)657 void sst_mad_jackdetection_nec(u8 intsts, struct snd_intelmad *intelmaddata)
658 {
659 u8 value = 0;
660 struct snd_jack *jack = NULL;
661 unsigned int present = 0, jack_event_flag = 0, buttonpressflag = 0;
662 struct sc_reg_access sc_access_read = {0,};
663
664 if (intelmaddata->pmic_status == PMIC_INIT) {
665 sc_access_read.reg_addr = 0x132;
666 sst_sc_reg_access(&sc_access_read, PMIC_READ, 1);
667 value = (sc_access_read.value);
668 pr_debug("value returned = 0x%x\n", value);
669 }
670 if (intsts & 0x1) {
671 pr_debug("headset detected\n");
672 /* send headset detect/undetect */
673 jack = &intelmaddata->jack[1].jack;
674 present = (value == 0x1) ? 1 : 0;
675 jack_event_flag = 1;
676 }
677 if (intsts & 0x2) {
678 pr_debug("headphone detected\n");
679 /* send headphone detect/undetect */
680 jack = &intelmaddata->jack[0].jack;
681 present = (value == 0x2) ? 1 : 0;
682 jack_event_flag = 1;
683 }
684 if (intsts & 0x4) {
685 pr_debug("short push detected\n");
686 /* send short push */
687 jack = &intelmaddata->jack[2].jack;
688 present = 1;
689 jack_event_flag = 1;
690 buttonpressflag = 1;
691 }
692 if (intsts & 0x8) {
693 pr_debug("long push detected\n");
694 /* send long push */
695 jack = &intelmaddata->jack[3].jack;
696 present = 1;
697 jack_event_flag = 1;
698 buttonpressflag = 1;
699 }
700
701 if (jack_event_flag)
702 sst_mad_send_jack_report(jack, buttonpressflag, present);
703
704
705 }
706
sst_process_mad_jack_detection(struct work_struct * work)707 void sst_process_mad_jack_detection(struct work_struct *work)
708 {
709 u8 intsts;
710 struct mad_jack_msg_wq *mad_jack_detect =
711 container_of(work, struct mad_jack_msg_wq, wq);
712
713 struct snd_intelmad *intelmaddata =
714 mad_jack_detect->intelmaddata;
715
716 intsts = mad_jack_detect->intsts;
717
718 switch (intelmaddata->sstdrv_ops->vendor_id) {
719 case SND_FS:
720 sst_mad_jackdetection_fs(intsts , intelmaddata);
721 break;
722 case SND_MX:
723 sst_mad_jackdetection_mx(intsts , intelmaddata);
724 break;
725 case SND_NC:
726 sst_mad_jackdetection_nec(intsts , intelmaddata);
727 break;
728 }
729 }
730
731
snd_intelmad_register_irq(struct snd_intelmad * intelmaddata)732 static int __devinit snd_intelmad_register_irq(
733 struct snd_intelmad *intelmaddata)
734 {
735 int ret_val;
736 u32 regbase = AUDINT_BASE, regsize = 8;
737 char *drv_name;
738
739 pr_debug("irq reg done, regbase 0x%x, regsize 0x%x\n",
740 regbase, regsize);
741 intelmaddata->int_base = ioremap_nocache(regbase, regsize);
742 if (!intelmaddata->int_base)
743 pr_err("Mapping of cache failed\n");
744 pr_debug("irq = 0x%x\n", intelmaddata->irq);
745 if (intelmaddata->cpu_id == CPU_CHIP_PENWELL)
746 drv_name = DRIVER_NAME_MFLD;
747 else
748 drv_name = DRIVER_NAME_MRST;
749 ret_val = request_irq(intelmaddata->irq,
750 snd_intelmad_intr_handler,
751 IRQF_SHARED, drv_name,
752 intelmaddata);
753 if (ret_val)
754 pr_err("cannot register IRQ\n");
755 return ret_val;
756 }
757
snd_intelmad_sst_register(struct snd_intelmad * intelmaddata)758 static int __devinit snd_intelmad_sst_register(
759 struct snd_intelmad *intelmaddata)
760 {
761 int ret_val = 0;
762 struct snd_pmic_ops *intelmad_vendor_ops[MAX_VENDORS] = {
763 &snd_pmic_ops_fs,
764 &snd_pmic_ops_mx,
765 &snd_pmic_ops_nc,
766 &snd_msic_ops
767 };
768
769 struct sc_reg_access vendor_addr = {0x00, 0x00, 0x00};
770
771 if (intelmaddata->cpu_id == CPU_CHIP_LINCROFT) {
772 ret_val = sst_sc_reg_access(&vendor_addr, PMIC_READ, 1);
773 if (ret_val)
774 return ret_val;
775 sst_card_vendor_id = (vendor_addr.value & (MASK2|MASK1|MASK0));
776 pr_debug("original n extrated vendor id = 0x%x %d\n",
777 vendor_addr.value, sst_card_vendor_id);
778 if (sst_card_vendor_id < 0 || sst_card_vendor_id > 2) {
779 pr_err("vendor card not supported!!\n");
780 return -EIO;
781 }
782 } else
783 sst_card_vendor_id = 0x3;
784
785 intelmaddata->sstdrv_ops->module_name = SST_CARD_NAMES;
786 intelmaddata->sstdrv_ops->vendor_id = sst_card_vendor_id;
787 BUG_ON(!intelmad_vendor_ops[sst_card_vendor_id]);
788 intelmaddata->sstdrv_ops->scard_ops =
789 intelmad_vendor_ops[sst_card_vendor_id];
790
791 if (intelmaddata->cpu_id == CPU_CHIP_PENWELL) {
792 intelmaddata->sstdrv_ops->scard_ops->pb_on = 0;
793 intelmaddata->sstdrv_ops->scard_ops->cap_on = 0;
794 intelmaddata->sstdrv_ops->scard_ops->input_dev_id = DMIC;
795 intelmaddata->sstdrv_ops->scard_ops->output_dev_id =
796 STEREO_HEADPHONE;
797 }
798
799 /* registering with SST driver to get access to SST APIs to use */
800 ret_val = register_sst_card(intelmaddata->sstdrv_ops);
801 if (ret_val) {
802 pr_err("sst card registration failed\n");
803 return ret_val;
804 }
805
806 sst_card_vendor_id = intelmaddata->sstdrv_ops->vendor_id;
807 intelmaddata->pmic_status = PMIC_UNINIT;
808 return ret_val;
809 }
810
811 /* Driver Init/exit functionalities */
812 /**
813 * snd_intelmad_pcm_new - to setup pcm for the card
814 *
815 * @card: pointer to the sound card structure
816 * @intelmaddata: pointer to internal context
817 * @pb: playback count for this card
818 * @cap: capture count for this card
819 * @index: device index
820 *
821 * This function is called from probe function to set up pcm params
822 * and functions
823 */
snd_intelmad_pcm_new(struct snd_card * card,struct snd_intelmad * intelmaddata,unsigned int pb,unsigned int cap,unsigned int index)824 static int __devinit snd_intelmad_pcm_new(struct snd_card *card,
825 struct snd_intelmad *intelmaddata,
826 unsigned int pb, unsigned int cap, unsigned int index)
827 {
828 int ret_val = 0;
829 struct snd_pcm *pcm;
830 char name[32] = INTEL_MAD;
831 struct snd_pcm_ops *pb_ops = NULL, *cap_ops = NULL;
832
833 pr_debug("called for pb %d, cp %d, idx %d\n", pb, cap, index);
834 ret_val = snd_pcm_new(card, name, index, pb, cap, &pcm);
835 if (ret_val)
836 return ret_val;
837 /* setup the ops for playback and capture streams */
838 switch (index) {
839 case 0:
840 pb_ops = &snd_intelmad_headset_ops;
841 cap_ops = &snd_intelmad_capture_ops;
842 break;
843 case 1:
844 pb_ops = &snd_intelmad_ihf_ops;
845 cap_ops = &snd_intelmad_capture_ops;
846 break;
847 case 2:
848 pb_ops = &snd_intelmad_vibra_ops;
849 cap_ops = &snd_intelmad_capture_ops;
850 break;
851 case 3:
852 pb_ops = &snd_intelmad_haptic_ops;
853 cap_ops = &snd_intelmad_capture_ops;
854 break;
855 }
856 if (pb)
857 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, pb_ops);
858 if (cap)
859 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, cap_ops);
860 /* setup private data which can be retrieved when required */
861 pcm->private_data = intelmaddata;
862 pcm->info_flags = 0;
863 strncpy(pcm->name, card->shortname, strlen(card->shortname));
864 /* allocate dma pages for ALSA stream operations */
865 snd_pcm_lib_preallocate_pages_for_all(pcm,
866 SNDRV_DMA_TYPE_CONTINUOUS,
867 snd_dma_continuous_data(GFP_KERNEL),
868 MIN_BUFFER, MAX_BUFFER);
869 return ret_val;
870 }
871
snd_intelmad_pcm(struct snd_card * card,struct snd_intelmad * intelmaddata)872 static int __devinit snd_intelmad_pcm(struct snd_card *card,
873 struct snd_intelmad *intelmaddata)
874 {
875 int ret_val = 0;
876
877 WARN_ON(!card);
878 WARN_ON(!intelmaddata);
879 pr_debug("snd_intelmad_pcm called\n");
880 ret_val = snd_intelmad_pcm_new(card, intelmaddata, 1, 1, 0);
881 if (intelmaddata->cpu_id == CPU_CHIP_LINCROFT)
882 return ret_val;
883 ret_val = snd_intelmad_pcm_new(card, intelmaddata, 1, 0, 1);
884 if (ret_val)
885 return ret_val;
886 ret_val = snd_intelmad_pcm_new(card, intelmaddata, 1, 0, 2);
887 if (ret_val)
888 return ret_val;
889 return snd_intelmad_pcm_new(card, intelmaddata, 1, 0, 3);
890 }
891
892 /**
893 * snd_intelmad_jack- to setup jack settings of the card
894 *
895 * @intelmaddata: pointer to internal context
896 *
897 * This function is called send jack events
898 */
snd_intelmad_jack(struct snd_intelmad * intelmaddata)899 static int snd_intelmad_jack(struct snd_intelmad *intelmaddata)
900 {
901 struct snd_jack *jack;
902 int retval;
903
904 pr_debug("snd_intelmad_jack called\n");
905 jack = &intelmaddata->jack[0].jack;
906 retval = snd_jack_new(intelmaddata->card, "Headphone",
907 SND_JACK_HEADPHONE, &jack);
908 if (retval < 0)
909 return retval;
910 snd_jack_report(jack, 0);
911
912 jack->private_data = jack;
913 intelmaddata->jack[0].jack = *jack;
914
915
916 jack = &intelmaddata->jack[1].jack;
917 retval = snd_jack_new(intelmaddata->card, "Headset",
918 SND_JACK_HEADSET, &jack);
919 if (retval < 0)
920 return retval;
921
922
923
924 jack->private_data = jack;
925 intelmaddata->jack[1].jack = *jack;
926
927
928 jack = &intelmaddata->jack[2].jack;
929 retval = snd_jack_new(intelmaddata->card, "Short Press",
930 SND_JACK_HS_SHORT_PRESS, &jack);
931 if (retval < 0)
932 return retval;
933
934
935 jack->private_data = jack;
936 intelmaddata->jack[2].jack = *jack;
937
938
939 jack = &intelmaddata->jack[3].jack;
940 retval = snd_jack_new(intelmaddata->card, "Long Press",
941 SND_JACK_HS_LONG_PRESS, &jack);
942 if (retval < 0)
943 return retval;
944
945
946 jack->private_data = jack;
947 intelmaddata->jack[3].jack = *jack;
948
949 return retval;
950 }
951
952 /**
953 * snd_intelmad_mixer- to setup mixer settings of the card
954 *
955 * @intelmaddata: pointer to internal context
956 *
957 * This function is called from probe function to set up mixer controls
958 */
snd_intelmad_mixer(struct snd_intelmad * intelmaddata)959 static int __devinit snd_intelmad_mixer(struct snd_intelmad *intelmaddata)
960 {
961 struct snd_card *card;
962 unsigned int idx;
963 int ret_val = 0, max_controls = 0;
964 char *mixername = "IntelMAD Controls";
965 struct snd_kcontrol_new *controls;
966
967 WARN_ON(!intelmaddata);
968
969 card = intelmaddata->card;
970 strncpy(card->mixername, mixername, sizeof(card->mixername)-1);
971 /* add all widget controls and expose the same */
972 if (intelmaddata->cpu_id == CPU_CHIP_PENWELL) {
973 max_controls = MAX_CTRL_MFLD;
974 controls = snd_intelmad_controls_mfld;
975 } else {
976 max_controls = MAX_CTRL_MRST;
977 controls = snd_intelmad_controls_mrst;
978 }
979 for (idx = 0; idx < max_controls; idx++) {
980 ret_val = snd_ctl_add(card,
981 snd_ctl_new1(&controls[idx],
982 intelmaddata));
983 pr_debug("mixer[idx]=%d added\n", idx);
984 if (ret_val) {
985 pr_err("in adding of control index = %d\n", idx);
986 break;
987 }
988 }
989 return ret_val;
990 }
991
snd_intelmad_dev_free(struct snd_device * device)992 static int snd_intelmad_dev_free(struct snd_device *device)
993 {
994 struct snd_intelmad *intelmaddata;
995
996 WARN_ON(!device);
997
998 intelmaddata = device->device_data;
999
1000 pr_debug("snd_intelmad_dev_free called\n");
1001 snd_card_free(intelmaddata->card);
1002 /*genl_unregister_family(&audio_event_genl_family);*/
1003 unregister_sst_card(intelmaddata->sstdrv_ops);
1004
1005 /* free allocated memory for internal context */
1006 destroy_workqueue(intelmaddata->mad_jack_wq);
1007 kfree(intelmaddata->sstdrv_ops);
1008 kfree(intelmaddata);
1009 return 0;
1010 }
1011
snd_intelmad_create(struct snd_intelmad * intelmaddata,struct snd_card * card)1012 static int __devinit snd_intelmad_create(
1013 struct snd_intelmad *intelmaddata,
1014 struct snd_card *card)
1015 {
1016 int ret_val;
1017 static struct snd_device_ops ops = {
1018 .dev_free = snd_intelmad_dev_free,
1019 };
1020
1021 WARN_ON(!intelmaddata);
1022 WARN_ON(!card);
1023 /* ALSA api to register for the device */
1024 ret_val = snd_device_new(card, SNDRV_DEV_LOWLEVEL, intelmaddata, &ops);
1025 return ret_val;
1026 }
1027
1028 /**
1029 * snd_intelmad_probe- function registred for init
1030 * @pdev : pointer to the device struture
1031 * This function is called when the device is initialized
1032 */
snd_intelmad_probe(struct platform_device * pdev)1033 int __devinit snd_intelmad_probe(struct platform_device *pdev)
1034 {
1035 struct snd_card *card;
1036 int ret_val;
1037 struct snd_intelmad *intelmaddata;
1038 const struct platform_device_id *id = platform_get_device_id(pdev);
1039 unsigned int cpu_id = (unsigned int)id->driver_data;
1040
1041 pr_debug("probe for %s cpu_id %d\n", pdev->name, cpu_id);
1042 if (!strcmp(pdev->name, DRIVER_NAME_MRST))
1043 pr_debug("detected MRST\n");
1044 else if (!strcmp(pdev->name, DRIVER_NAME_MFLD))
1045 pr_debug("detected MFLD\n");
1046 else {
1047 pr_err("detected unknown device abort!!\n");
1048 return -EIO;
1049 }
1050 if ((cpu_id < CPU_CHIP_LINCROFT) || (cpu_id > CPU_CHIP_PENWELL)) {
1051 pr_err("detected unknown cpu_id abort!!\n");
1052 return -EIO;
1053 }
1054 /* allocate memory for saving internal context and working */
1055 intelmaddata = kzalloc(sizeof(*intelmaddata), GFP_KERNEL);
1056 if (!intelmaddata) {
1057 pr_debug("mem alloctn fail\n");
1058 return -ENOMEM;
1059 }
1060
1061 /* allocate memory for LPE API set */
1062 intelmaddata->sstdrv_ops = kzalloc(sizeof(struct intel_sst_card_ops),
1063 GFP_KERNEL);
1064 if (!intelmaddata->sstdrv_ops) {
1065 pr_err("mem allocation for ops fail\n");
1066 kfree(intelmaddata);
1067 return -ENOMEM;
1068 }
1069
1070 intelmaddata->cpu_id = cpu_id;
1071 /* create a card instance with ALSA framework */
1072 ret_val = snd_card_create(card_index, card_id, THIS_MODULE, 0, &card);
1073 if (ret_val) {
1074 pr_err("snd_card_create fail\n");
1075 goto free_allocs;
1076 }
1077
1078 intelmaddata->pdev = pdev;
1079 intelmaddata->irq = platform_get_irq(pdev, 0);
1080 platform_set_drvdata(pdev, intelmaddata);
1081 intelmaddata->card = card;
1082 intelmaddata->card_id = card_id;
1083 intelmaddata->card_index = card_index;
1084 intelmaddata->master_mute = UNMUTE;
1085 intelmaddata->playback_cnt = intelmaddata->capture_cnt = 0;
1086 strncpy(card->driver, INTEL_MAD, strlen(INTEL_MAD));
1087 strncpy(card->shortname, INTEL_MAD, strlen(INTEL_MAD));
1088
1089 intelmaddata->sstdrv_ops->module_name = SST_CARD_NAMES;
1090 /* registering with LPE driver to get access to SST APIs to use */
1091 ret_val = snd_intelmad_sst_register(intelmaddata);
1092 if (ret_val) {
1093 pr_err("snd_intelmad_sst_register failed\n");
1094 goto free_allocs;
1095 }
1096
1097 intelmaddata->pmic_status = PMIC_INIT;
1098
1099 ret_val = snd_intelmad_pcm(card, intelmaddata);
1100 if (ret_val) {
1101 pr_err("snd_intelmad_pcm failed\n");
1102 goto free_allocs;
1103 }
1104
1105 ret_val = snd_intelmad_mixer(intelmaddata);
1106 if (ret_val) {
1107 pr_err("snd_intelmad_mixer failed\n");
1108 goto free_allocs;
1109 }
1110
1111 ret_val = snd_intelmad_jack(intelmaddata);
1112 if (ret_val) {
1113 pr_err("snd_intelmad_jack failed\n");
1114 goto free_allocs;
1115 }
1116
1117 /*create work queue for jack interrupt*/
1118 INIT_WORK(&intelmaddata->mad_jack_msg.wq,
1119 sst_process_mad_jack_detection);
1120
1121 intelmaddata->mad_jack_wq = create_workqueue("sst_mad_jack_wq");
1122 if (!intelmaddata->mad_jack_wq)
1123 goto free_mad_jack_wq;
1124
1125 ret_val = snd_intelmad_register_irq(intelmaddata);
1126 if (ret_val) {
1127 pr_err("snd_intelmad_register_irq fail\n");
1128 goto free_allocs;
1129 }
1130
1131 /* internal function call to register device with ALSA */
1132 ret_val = snd_intelmad_create(intelmaddata, card);
1133 if (ret_val) {
1134 pr_err("snd_intelmad_create failed\n");
1135 goto free_allocs;
1136 }
1137 card->private_data = &intelmaddata;
1138 snd_card_set_dev(card, &pdev->dev);
1139 ret_val = snd_card_register(card);
1140 if (ret_val) {
1141 pr_err("snd_card_register failed\n");
1142 goto free_allocs;
1143 }
1144
1145 pr_debug("snd_intelmad_probe complete\n");
1146 return ret_val;
1147
1148 free_mad_jack_wq:
1149 destroy_workqueue(intelmaddata->mad_jack_wq);
1150 free_allocs:
1151 pr_err("probe failed\n");
1152 snd_card_free(card);
1153 kfree(intelmaddata->sstdrv_ops);
1154 kfree(intelmaddata);
1155 return ret_val;
1156 }
1157
1158
snd_intelmad_remove(struct platform_device * pdev)1159 static int snd_intelmad_remove(struct platform_device *pdev)
1160 {
1161 struct snd_intelmad *intelmaddata = platform_get_drvdata(pdev);
1162
1163 if (intelmaddata) {
1164 snd_card_free(intelmaddata->card);
1165 unregister_sst_card(intelmaddata->sstdrv_ops);
1166 /* free allocated memory for internal context */
1167 destroy_workqueue(intelmaddata->mad_jack_wq);
1168 kfree(intelmaddata->sstdrv_ops);
1169 kfree(intelmaddata);
1170 }
1171 return 0;
1172 }
1173
1174 /*********************************************************************
1175 * Driver initialization and exit
1176 *********************************************************************/
1177 static const struct platform_device_id snd_intelmad_ids[] = {
1178 {DRIVER_NAME_MRST, CPU_CHIP_LINCROFT},
1179 {DRIVER_NAME_MFLD, CPU_CHIP_PENWELL},
1180 {"", 0},
1181
1182 };
1183
1184 static struct platform_driver snd_intelmad_driver = {
1185 .driver = {
1186 .owner = THIS_MODULE,
1187 .name = "intel_mid_sound_card",
1188 },
1189 .id_table = snd_intelmad_ids,
1190 .probe = snd_intelmad_probe,
1191 .remove = __devexit_p(snd_intelmad_remove),
1192 };
1193
1194 /*
1195 * alsa_card_intelmad_init- driver init function
1196 *
1197 * This function is called when driver module is inserted
1198 */
alsa_card_intelmad_init(void)1199 static int __init alsa_card_intelmad_init(void)
1200 {
1201 pr_debug("mad_init called\n");
1202 return platform_driver_register(&snd_intelmad_driver);
1203 }
1204
1205 /**
1206 * alsa_card_intelmad_exit- driver exit function
1207 *
1208 * This function is called when driver module is removed
1209 */
alsa_card_intelmad_exit(void)1210 static void __exit alsa_card_intelmad_exit(void)
1211 {
1212 pr_debug("mad_exit called\n");
1213 return platform_driver_unregister(&snd_intelmad_driver);
1214 }
1215
1216 module_init(alsa_card_intelmad_init)
1217 module_exit(alsa_card_intelmad_exit)
1218
1219