~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to drivers/staging/intel_sst/intelmid_v0_control.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
 
31
31
#include <linux/pci.h>
32
32
#include <linux/file.h>
 
33
#include <sound/control.h>
33
34
#include "intel_sst.h"
34
35
#include "intelmid_snd_control.h"
35
 
 
 
36
#include "intelmid.h"
36
37
 
37
38
enum _reg_v1 {
38
39
        VOICEPORT1 = 0x180,
64
65
};
65
66
 
66
67
int rev_id = 0x20;
 
68
static bool jack_det_enabled;
67
69
 
68
70
/****
69
71
 * fs_init_card - initialize the sound card
70
72
 *
71
 
 * This initilizes the audio paths to know values in case of this sound card
 
73
 * This initializes the audio paths to know values in case of this sound card
72
74
 */
73
75
static int fs_init_card(void)
74
76
{
157
159
        return fs_enable_audiodac(UNMUTE);
158
160
}
159
161
 
160
 
static int fs_power_down_pb(void)
 
162
static int fs_power_down_pb(unsigned int device)
161
163
{
162
164
        struct sc_reg_access sc_access[] = {
163
165
                {POWERCTRL1, 0x00, 0xC6},
195
197
        return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 2);
196
198
}
197
199
 
198
 
static int fs_power_down_cp(void)
 
200
static int fs_power_down_cp(unsigned int device)
199
201
{
200
202
        struct sc_reg_access sc_access[] = {
201
203
                {POWERCTRL2, 0x00, 0x03},
753
755
        return retval;
754
756
}
755
757
 
 
758
static void fs_pmic_irq_enable(void *data)
 
759
{
 
760
        struct snd_intelmad *intelmaddata = data;
 
761
        struct sc_reg_access sc_access[] = {
 
762
                                {0x187, 0x00, MASK7},
 
763
                                {0x188, 0x10, MASK4},
 
764
                                {0x18b, 0x10, MASK4},
 
765
        };
 
766
 
 
767
        struct sc_reg_access sc_access_write[] = {
 
768
                                {0x198, 0x00, 0x0},
 
769
        };
 
770
        pr_debug("Audio interrupt enable\n");
 
771
        sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 3);
 
772
        sst_sc_reg_access(sc_access_write, PMIC_WRITE, 1);
 
773
 
 
774
        intelmaddata->jack[0].jack_status = 0;
 
775
        /*intelmaddata->jack[1].jack_status = 0;*/
 
776
 
 
777
        jack_det_enabled = true;
 
778
        return;
 
779
}
 
780
 
 
781
static void fs_pmic_irq_cb(void *cb_data, u8 value)
 
782
{
 
783
        struct mad_jack *mjack = NULL;
 
784
        struct snd_intelmad *intelmaddata = cb_data;
 
785
        unsigned int present = 0, jack_event_flag = 0, buttonpressflag = 0;
 
786
 
 
787
        mjack = &intelmaddata->jack[0];
 
788
 
 
789
        if (value & 0x4) {
 
790
                if (!jack_det_enabled)
 
791
                        fs_pmic_irq_enable(intelmaddata);
 
792
 
 
793
                /* send headphone detect */
 
794
                pr_debug(":MAD headphone %d\n", value & 0x4);
 
795
                present = !(mjack->jack_status);
 
796
                mjack->jack_status = present;
 
797
                jack_event_flag = 1;
 
798
                mjack->jack.type = SND_JACK_HEADPHONE;
 
799
        }
 
800
 
 
801
        if (value & 0x2) {
 
802
                /* send short push */
 
803
                pr_debug(":MAD short push %d\n", value & 0x2);
 
804
                present = 1;
 
805
                jack_event_flag = 1;
 
806
                buttonpressflag = 1;
 
807
                mjack->jack.type = MID_JACK_HS_SHORT_PRESS;
 
808
        }
 
809
 
 
810
        if (value & 0x1) {
 
811
                /* send long push */
 
812
                pr_debug(":MAD long push %d\n", value & 0x1);
 
813
                present = 1;
 
814
                jack_event_flag = 1;
 
815
                buttonpressflag = 1;
 
816
                mjack->jack.type = MID_JACK_HS_LONG_PRESS;
 
817
        }
 
818
 
 
819
        if (value & 0x8) {
 
820
                if (!jack_det_enabled)
 
821
                        fs_pmic_irq_enable(intelmaddata);
 
822
                /* send headset detect */
 
823
                pr_debug(":MAD headset = %d\n", value & 0x8);
 
824
                present = !(mjack->jack_status);
 
825
                mjack->jack_status = present;
 
826
                jack_event_flag = 1;
 
827
                mjack->jack.type = SND_JACK_HEADSET;
 
828
        }
 
829
 
 
830
 
 
831
        if (jack_event_flag)
 
832
                sst_mad_send_jack_report(&mjack->jack,
 
833
                                                buttonpressflag, present);
 
834
 
 
835
        return;
 
836
}
 
837
static int fs_jack_enable(void)
 
838
{
 
839
        return 0;
 
840
}
 
841
 
756
842
struct snd_pmic_ops snd_pmic_ops_fs = {
757
843
        .set_input_dev = fs_set_selected_input_dev,
758
844
        .set_output_dev = fs_set_selected_output_dev,
765
851
        .set_pcm_voice_params = fs_set_pcm_voice_params,
766
852
        .set_voice_port = fs_set_voice_port,
767
853
        .set_audio_port = fs_set_audio_port,
768
 
        .power_up_pmic_pb = fs_power_up_pb,
769
 
        .power_up_pmic_cp = fs_power_up_cp,
770
 
        .power_down_pmic_pb = fs_power_down_pb,
771
 
        .power_down_pmic_cp = fs_power_down_cp,
772
 
        .power_down_pmic = fs_power_down,
 
854
        .power_up_pmic_pb =     fs_power_up_pb,
 
855
        .power_up_pmic_cp =     fs_power_up_cp,
 
856
        .power_down_pmic_pb =   fs_power_down_pb,
 
857
        .power_down_pmic_cp =   fs_power_down_cp,
 
858
        .power_down_pmic        =       fs_power_down,
 
859
        .pmic_irq_cb    =       fs_pmic_irq_cb,
 
860
        /*
 
861
         * Jack detection enabling
 
862
         * need be delayed till first IRQ happen.
 
863
         */
 
864
        .pmic_irq_enable =      NULL,
 
865
        .pmic_jack_enable = fs_jack_enable,
773
866
};