Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[pandora-kernel.git] / drivers / staging / intel_sst / intelmid.h
1 /*
2  *  intelmid.h - 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 header for Intel MAD chipset
26  */
27 #ifndef __INTELMID_H
28 #define __INTELMID_H
29
30 #include <linux/time.h>
31
32 #define DRIVER_NAME_MFLD "msic_audio"
33 #define DRIVER_NAME_MRST "pmic_audio"
34 #define DRIVER_NAME "intelmid_audio"
35 #define PMIC_SOUND_IRQ_TYPE_MASK (1 << 15)
36 #define AUDINT_BASE (0xFFFFEFF8 + (6 * sizeof(u8)))
37 #define REG_IRQ
38 /* values #defined   */
39 /* will differ for different hw - to be taken from config  */
40 #define MAX_DEVICES             1
41 #define MIN_RATE                8000
42 #define MAX_RATE                48000
43 #define MAX_BUFFER              (800*1024) /* for PCM */
44 #define MIN_BUFFER              (800*1024)
45 #define MAX_PERIODS             (1024*2)
46 #define MIN_PERIODS             1
47 #define MAX_PERIOD_BYTES MAX_BUFFER
48 #define MIN_PERIOD_BYTES 32
49 /*#define MIN_PERIOD_BYTES 160*/
50 #define MAX_MUTE                1
51 #define MIN_MUTE                0
52 #define MONO_CNTL               1
53 #define STEREO_CNTL             2
54 #define MIN_CHANNEL             1
55 #define MAX_CHANNEL_AMIC        2
56 #define MAX_CHANNEL_DMIC        4
57 #define FIFO_SIZE               0 /* fifo not being used */
58 #define INTEL_MAD               "Intel MAD"
59 #define MAX_CTRL_MRST           7
60 #define MAX_CTRL_MFLD           2
61 #define MAX_CTRL                7
62 #define MAX_VENDORS             4
63 /* TODO +6 db */
64 #define MAX_VOL         64
65 /* TODO -57 db */
66 #define MIN_VOL         0
67 #define PLAYBACK_COUNT  1
68 #define CAPTURE_COUNT   1
69
70 extern int      sst_card_vendor_id;
71
72 struct mad_jack {
73         struct snd_jack jack;
74         int jack_status;
75         struct timeval buttonpressed;
76         struct timeval  buttonreleased;
77 };
78
79 struct mad_jack_msg_wq {
80         u8 intsts;
81         struct snd_intelmad *intelmaddata;
82         struct work_struct      wq;
83
84 };
85
86 /**
87  * struct snd_intelmad - intelmad driver structure
88  *
89  * @card: ptr to the card details
90  * @card_index: sound card index
91  * @card_id: sound card id detected
92  * @sstdrv_ops: ptr to sst driver ops
93  * @pdev: ptr to platfrom device
94  * @irq: interrupt number detected
95  * @pmic_status: Device status of sound card
96  * @int_base: ptr to MMIO interrupt region
97  * @output_sel: device slected as o/p
98  * @input_sel: device slected as i/p
99  * @master_mute: master mute status
100  * @jack: jack status
101  * @playback_cnt: active pb streams
102  * @capture_cnt: active cp streams
103  * @mad_jack_msg: wq struct for jack interrupt processing
104  * @mad_jack_wq: wq for jack interrupt processing
105  * @jack_prev_state: Previos state of jack detected
106  * @cpu_id: current cpu id loaded for
107  */
108 struct snd_intelmad {
109         struct snd_card *card; /* ptr to the card details */
110         int             card_index;/*  card index  */
111         char            *card_id; /* card id */
112         struct intel_sst_card_ops *sstdrv_ops;/* ptr to sst driver ops */
113         struct platform_device *pdev;
114         int irq;
115         int pmic_status;
116         void __iomem *int_base;
117         int output_sel;
118         int input_sel;
119         int master_mute;
120         struct mad_jack jack[4];
121         int playback_cnt;
122         int capture_cnt;
123         struct mad_jack_msg_wq  mad_jack_msg;
124         struct workqueue_struct *mad_jack_wq;
125         u8 jack_prev_state;
126         unsigned int cpu_id;
127 };
128
129 struct snd_control_val {
130         int     playback_vol_max;
131         int     playback_vol_min;
132         int     capture_vol_max;
133         int     capture_vol_min;
134 };
135
136 struct mad_stream_pvt {
137         int                     stream_status;
138         int                     stream_ops;
139         struct snd_pcm_substream *substream;
140         struct pcm_stream_info stream_info;
141         ssize_t         dbg_cum_bytes;
142         enum snd_sst_device_type device;
143 };
144
145 enum mad_drv_status {
146     INIT = 1,
147     STARTED,
148     RUNNING,
149     PAUSED,
150     DROPPED,
151 };
152
153 enum mad_pmic_status {
154         PMIC_UNINIT = 1,
155         PMIC_INIT,
156 };
157 enum _widget_ctrl {
158         OUTPUT_SEL = 1,
159         INPUT_SEL,
160         PLAYBACK_VOL,
161         PLAYBACK_MUTE,
162         CAPTURE_VOL,
163         CAPTURE_MUTE,
164         MASTER_MUTE
165 };
166
167 void period_elapsed(void *mad_substream);
168 int snd_intelmad_alloc_stream(struct snd_pcm_substream *substream);
169 int snd_intelmad_init_stream(struct snd_pcm_substream *substream);
170
171 int sst_sc_reg_access(struct sc_reg_access *sc_access,
172                                         int type, int num_val);
173 #define CPU_CHIP_LINCROFT       1 /* System running lincroft */
174 #define CPU_CHIP_PENWELL        2 /* System running penwell */
175
176 extern struct snd_control_val intelmad_ctrl_val[];
177 extern struct snd_kcontrol_new snd_intelmad_controls_mrst[];
178 extern struct snd_kcontrol_new snd_intelmad_controls_mfld[];
179 extern struct snd_pmic_ops *intelmad_vendor_ops[];
180
181 #endif /* __INTELMID_H */