423
446
.pointer = snd_intelmad_pcm_pointer,
449
int intelmad_get_mic_bias(void)
451
struct snd_pmic_ops *pmic_ops;
453
if (!intelmad_drv || !intelmad_drv->sstdrv_ops)
455
pmic_ops = intelmad_drv->sstdrv_ops->scard_ops;
456
if (pmic_ops && pmic_ops->pmic_get_mic_bias)
457
return pmic_ops->pmic_get_mic_bias(intelmad_drv);
461
EXPORT_SYMBOL_GPL(intelmad_get_mic_bias);
463
int intelmad_set_headset_state(int state)
465
struct snd_pmic_ops *pmic_ops;
467
if (!intelmad_drv || !intelmad_drv->sstdrv_ops)
469
pmic_ops = intelmad_drv->sstdrv_ops->scard_ops;
470
if (pmic_ops && pmic_ops->pmic_set_headset_state)
471
return pmic_ops->pmic_set_headset_state(state);
475
EXPORT_SYMBOL_GPL(intelmad_set_headset_state);
477
void sst_process_mad_jack_detection(struct work_struct *work)
480
struct mad_jack_msg_wq *mad_jack_detect =
481
container_of(work, struct mad_jack_msg_wq, wq);
483
struct snd_intelmad *intelmaddata =
484
mad_jack_detect->intelmaddata;
489
interrupt_status = mad_jack_detect->intsts;
490
if (intelmaddata->sstdrv_ops && intelmaddata->sstdrv_ops->scard_ops
491
&& intelmaddata->sstdrv_ops->scard_ops->pmic_irq_cb) {
492
intelmaddata->sstdrv_ops->scard_ops->pmic_irq_cb(
493
(void *)intelmaddata, interrupt_status);
494
intelmaddata->sstdrv_ops->scard_ops->pmic_jack_enable();
496
kfree(mad_jack_detect);
428
499
* snd_intelmad_intr_handler- interrupt handler
457
530
pr_debug("MAD error jack empty\n");
460
pr_debug("MAD send jack report for = %d!!!\n", status);
461
pr_debug("MAD send jack report %d\n", jack->type);
462
533
snd_jack_report(jack, status);
464
/*button pressed and released */
534
/* button pressed and released */
465
535
if (buttonpressevent)
466
536
snd_jack_report(jack, 0);
467
537
pr_debug("MAD sending jack report Done !!!\n");
474
void sst_mad_jackdetection_fs(u8 intsts , struct snd_intelmad *intelmaddata)
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},
484
struct sc_reg_access sc_access_write[] = {
490
if (!(intelmid_audio_interrupt_enable)) {
491
pr_debug("Audio interrupt enable\n");
492
sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 3);
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;
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;
510
/* send short push */
511
pr_debug("MAD short push %d\n", intsts & 0x2);
512
jack = &intelmaddata->jack[2].jack;
519
pr_debug("MAD long push %d\n", intsts & 0x1);
520
jack = &intelmaddata->jack[3].jack;
526
if (!(intelmid_audio_interrupt_enable)) {
527
pr_debug("Audio interrupt enable\n");
528
sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 3);
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;
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;
544
sst_mad_send_jack_report(jack, buttonpressflag, present);
548
void sst_mad_jackdetection_mx(u8 intsts, struct snd_intelmad *intelmaddata)
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;
554
struct sc_reg_access sc_access_read = {0,};
555
struct snd_pmic_ops *scard_ops;
557
scard_ops = intelmaddata->sstdrv_ops->scard_ops;
559
pr_debug("previous value: %x\n", intelmaddata->jack_prev_state);
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;
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);
576
if (jack_prev_state == 0xc0 && value == 0x40) {
577
/*headset detected. */
578
pr_debug("MAD headset inserted\n");
579
jack = &intelmaddata->jack[1].jack;
582
intelmaddata->jack[1].jack_status = 1;
586
if (jack_prev_state == 0xc0 && value == 0x00) {
587
/* headphone detected. */
588
pr_debug("MAD headphone inserted\n");
589
jack = &intelmaddata->jack[0].jack;
595
if (jack_prev_state == 0x40 && value == 0xc0) {
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;
603
intelmaddata->jack[1].jack_status = 0;
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;
616
if (jack_prev_state == 0x40 && value == 0x00) {
618
do_gettimeofday(&intelmaddata->jack[1].buttonpressed);
619
pr_debug("MAD button press detected\n");
623
if (jack_prev_state == 0x00 && value == 0x40) {
624
if (intelmaddata->jack[1].jack_status) {
627
&intelmaddata->jack[1].buttonreleased);
629
pr_debug("Button Released detected\n");
630
timediff = intelmaddata->jack[1].
631
buttonreleased.tv_sec - intelmaddata->
632
jack[1].buttonpressed.tv_sec;
635
pr_debug("long press detected\n");
636
/* send headphone detect/undetect */
637
jack = &intelmaddata->jack[3].jack;
641
pr_debug("short press detected\n");
642
/* send headphone detect/undetect */
643
jack = &intelmaddata->jack[2].jack;
650
intelmaddata->jack_prev_state = value;
653
sst_mad_send_jack_report(jack, buttonpressflag, present);
657
void sst_mad_jackdetection_nec(u8 intsts, struct snd_intelmad *intelmaddata)
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,};
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);
671
pr_debug("headset detected\n");
672
/* send headset detect/undetect */
673
jack = &intelmaddata->jack[1].jack;
674
present = (value == 0x1) ? 1 : 0;
678
pr_debug("headphone detected\n");
679
/* send headphone detect/undetect */
680
jack = &intelmaddata->jack[0].jack;
681
present = (value == 0x2) ? 1 : 0;
685
pr_debug("short push detected\n");
686
/* send short push */
687
jack = &intelmaddata->jack[2].jack;
693
pr_debug("long push detected\n");
695
jack = &intelmaddata->jack[3].jack;
702
sst_mad_send_jack_report(jack, buttonpressflag, present);
707
void sst_process_mad_jack_detection(struct work_struct *work)
710
struct mad_jack_msg_wq *mad_jack_detect =
711
container_of(work, struct mad_jack_msg_wq, wq);
713
struct snd_intelmad *intelmaddata =
714
mad_jack_detect->intelmaddata;
716
intsts = mad_jack_detect->intsts;
718
switch (intelmaddata->sstdrv_ops->vendor_id) {
720
sst_mad_jackdetection_fs(intsts , intelmaddata);
723
sst_mad_jackdetection_mx(intsts , intelmaddata);
726
sst_mad_jackdetection_nec(intsts , intelmaddata);
732
541
static int __devinit snd_intelmad_register_irq(
733
struct snd_intelmad *intelmaddata)
542
struct snd_intelmad *intelmaddata, unsigned int regbase,
543
unsigned int regsize)
736
u32 regbase = AUDINT_BASE, regsize = 8;
739
pr_debug("irq reg done, regbase 0x%x, regsize 0x%x\n",
548
pr_debug("irq reg regbase 0x%x, regsize 0x%x\n",
740
549
regbase, regsize);
741
550
intelmaddata->int_base = ioremap_nocache(regbase, regsize);
742
551
if (!intelmaddata->int_base)