blob: 14a7ba078b7c9f447b56042a3a996f33a0d7858f [file] [log] [blame]
/*
* intelmid.h - Intel Sound card driver for MID
*
* Copyright (C) 2008-10 Intel Corp
* Authors: Harsha Priya <priya.harsha@intel.com>
* Vinod Koul <vinod.koul@intel.com>
* Dharageswari R <dharageswari.r@intel.com>
* KP Jeeja <jeeja.kp@intel.com>
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* ALSA driver header for Intel MAD chipset
*/
#ifndef __INTELMID_H
#define __INTELMID_H
#include <linux/time.h>
#include <sound/jack.h>
#define DRIVER_NAME_MFLD "msic_audio"
#define DRIVER_NAME_MRST "pmic_audio"
#define DRIVER_NAME "intelmid_audio"
#define PMIC_SOUND_IRQ_TYPE_MASK (1 << 15)
#define AUDINT_BASE (0xFFFFEFF8 + (6 * sizeof(u8)))
#define REG_IRQ
/* values #defined */
/* will differ for different hw - to be taken from config */
#define MAX_DEVICES 1
#define MIN_RATE 8000
#define MAX_RATE 48000
#define MAX_BUFFER (800*1024) /* for PCM */
#define MIN_BUFFER (800*1024)
#define MAX_PERIODS (1024*2)
#define MIN_PERIODS 2
#define MAX_PERIOD_BYTES MAX_BUFFER
#define MIN_PERIOD_BYTES 32
/*#define MIN_PERIOD_BYTES 160*/
#define MAX_MUTE 1
#define MIN_MUTE 0
#define MONO_CNTL 1
#define STEREO_CNTL 2
#define MIN_CHANNEL 1
#define MAX_CHANNEL_AMIC 2
#define MAX_CHANNEL_DMIC 5
#define FIFO_SIZE 0 /* fifo not being used */
#define INTEL_MAD "Intel MAD"
#define MAX_CTRL_MRST 8
#define MAX_CTRL_MFLD 7
#define MAX_CTRL 8
#define MAX_VENDORS 4
/* TODO +6 db */
#define MAX_VOL 64
/* TODO -57 db */
#define MIN_VOL 0
#define PLAYBACK_COUNT 1
#define CAPTURE_COUNT 1
#define ADC_ONE_LSB_MULTIPLIER 2346
#define MID_JACK_HS_LONG_PRESS SND_JACK_BTN_0
#define MID_JACK_HS_SHORT_PRESS SND_JACK_BTN_1
extern int sst_card_vendor_id;
struct mad_jack {
struct snd_jack jack;
int jack_status;
int jack_dev_state;
struct timeval buttonpressed;
struct timeval buttonreleased;
};
struct mad_jack_msg_wq {
u8 intsts;
struct snd_intelmad *intelmaddata;
struct work_struct wq;
};
struct snd_intelmad_probe_info {
unsigned int cpu_id;
unsigned int irq_cache;
unsigned int size;
};
/**
* struct snd_intelmad - intelmad driver structure
*
* @card: ptr to the card details
* @card_index: sound card index
* @card_id: sound card id detected
* @sstdrv_ops: ptr to sst driver ops
* @pdev: ptr to platform device
* @irq: interrupt number detected
* @pmic_status: Device status of sound card
* @int_base: ptr to MMIO interrupt region
* @output_sel: device selected as o/p
* @input_sel: device selected as i/p
* @master_mute: master mute status
* @jack: jack status
* @playback_cnt: active pb streams
* @capture_cnt: active cp streams
* @mad_jack_msg: wq struct for jack interrupt processing
* @mad_jack_wq: wq for jack interrupt processing
* @jack_prev_state: Previos state of jack detected
* @cpu_id: current cpu id loaded for
*/
struct snd_intelmad {
struct snd_card *card; /* ptr to the card details */
int card_index;/* card index */
char *card_id; /* card id */
struct intel_sst_card_ops *sstdrv_ops;/* ptr to sst driver ops */
struct platform_device *pdev;
int irq;
int pmic_status;
void __iomem *int_base;
int output_sel;
int input_sel;
int lineout_sel;
int master_mute;
struct mad_jack jack[4];
int playback_cnt;
int capture_cnt;
u16 adc_address;
struct mad_jack_msg_wq mad_jack_msg;
struct workqueue_struct *mad_jack_wq;
u8 jack_prev_state;
unsigned int cpu_id;
};
struct snd_control_val {
int playback_vol_max;
int playback_vol_min;
int capture_vol_max;
int capture_vol_min;
int master_vol_max;
int master_vol_min;
};
struct mad_stream_pvt {
int stream_status;
int stream_ops;
struct snd_pcm_substream *substream;
struct pcm_stream_info stream_info;
ssize_t dbg_cum_bytes;
enum snd_sst_device_type device;
};
enum mad_drv_status {
INIT = 1,
STARTED,
RUNNING,
PAUSED,
DROPPED,
};
enum mad_pmic_status {
PMIC_UNINIT = 1,
PMIC_INIT,
};
enum _widget_ctrl {
OUTPUT_SEL = 1,
INPUT_SEL,
PLAYBACK_VOL,
PLAYBACK_MUTE,
CAPTURE_VOL,
CAPTURE_MUTE,
MASTER_VOL,
MASTER_MUTE
};
enum _widget_ctrl_mfld {
LINEOUT_SEL_MFLD = 3,
};
enum hw_chs {
HW_CH0 = 0,
HW_CH1,
HW_CH2,
HW_CH3
};
void period_elapsed(void *mad_substream);
int snd_intelmad_alloc_stream(struct snd_pcm_substream *substream);
int snd_intelmad_init_stream(struct snd_pcm_substream *substream);
int sst_sc_reg_access(struct sc_reg_access *sc_access,
int type, int num_val);
#define CPU_CHIP_LINCROFT 1 /* System running lincroft */
#define CPU_CHIP_PENWELL 2 /* System running penwell */
extern struct snd_control_val intelmad_ctrl_val[];
extern struct snd_kcontrol_new snd_intelmad_controls_mrst[];
extern struct snd_kcontrol_new snd_intelmad_controls_mfld[];
extern struct snd_pmic_ops *intelmad_vendor_ops[];
void sst_mad_send_jack_report(struct snd_jack *jack,
int buttonpressevent , int status);
#endif /* __INTELMID_H */