19e50108668a70a9927257298bd4e679300124420Mark Brown/*
29e50108668a70a9927257298bd4e679300124420Mark Brown * include/linux/mfd/wm8994/pdata.h -- Platform data for WM8994
39e50108668a70a9927257298bd4e679300124420Mark Brown *
49e50108668a70a9927257298bd4e679300124420Mark Brown * Copyright 2009 Wolfson Microelectronics PLC.
59e50108668a70a9927257298bd4e679300124420Mark Brown *
69e50108668a70a9927257298bd4e679300124420Mark Brown * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
79e50108668a70a9927257298bd4e679300124420Mark Brown *
89e50108668a70a9927257298bd4e679300124420Mark Brown *  This program is free software; you can redistribute  it and/or modify it
99e50108668a70a9927257298bd4e679300124420Mark Brown *  under  the terms of  the GNU General  Public License as published by the
109e50108668a70a9927257298bd4e679300124420Mark Brown *  Free Software Foundation;  either version 2 of the  License, or (at your
119e50108668a70a9927257298bd4e679300124420Mark Brown *  option) any later version.
129e50108668a70a9927257298bd4e679300124420Mark Brown *
139e50108668a70a9927257298bd4e679300124420Mark Brown */
149e50108668a70a9927257298bd4e679300124420Mark Brown
159e50108668a70a9927257298bd4e679300124420Mark Brown#ifndef __MFD_WM8994_PDATA_H__
169e50108668a70a9927257298bd4e679300124420Mark Brown#define __MFD_WM8994_PDATA_H__
179e50108668a70a9927257298bd4e679300124420Mark Brown
189e50108668a70a9927257298bd4e679300124420Mark Brown#define WM8994_NUM_LDO   2
199e50108668a70a9927257298bd4e679300124420Mark Brown#define WM8994_NUM_GPIO 11
203cf956eebe54cdb7cf1701642085507f0354e56aMark Brown#define WM8994_NUM_AIF   3
219e50108668a70a9927257298bd4e679300124420Mark Brown
229e50108668a70a9927257298bd4e679300124420Mark Brownstruct wm8994_ldo_pdata {
239e50108668a70a9927257298bd4e679300124420Mark Brown	/** GPIOs to enable regulator, 0 or less if not available */
249e50108668a70a9927257298bd4e679300124420Mark Brown	int enable;
259e50108668a70a9927257298bd4e679300124420Mark Brown
2643913e5ef9e9e05141418577523456e6b23777ebMark Brown	const struct regulator_init_data *init_data;
279e50108668a70a9927257298bd4e679300124420Mark Brown};
289e50108668a70a9927257298bd4e679300124420Mark Brown
298efcc57dedfebc99c3cd39564e3fc47cd1a24b75Mark Brown#define WM8994_CONFIGURE_GPIO 0x10000
309e50108668a70a9927257298bd4e679300124420Mark Brown
319e50108668a70a9927257298bd4e679300124420Mark Brown#define WM8994_DRC_REGS 5
323fcc0afbb9c93f3599ba03273e59915670b6c2c2Uk Kim#define WM8994_EQ_REGS  20
33131d81061eba5ffd436b5d132530ac5205b16892Mark Brown#define WM8958_MBC_CUTOFF_REGS 20
34131d81061eba5ffd436b5d132530ac5205b16892Mark Brown#define WM8958_MBC_COEFF_REGS  48
3509e10d7fe509408d15818db6a0299f563668a7baMark Brown#define WM8958_MBC_COMBINED_REGS 56
3609e10d7fe509408d15818db6a0299f563668a7baMark Brown#define WM8958_VSS_HPF_REGS 2
3709e10d7fe509408d15818db6a0299f563668a7baMark Brown#define WM8958_VSS_REGS 148
38312158718fe2056703b2744801165a9574560495Mark Brown#define WM8958_ENH_EQ_REGS 32
399e50108668a70a9927257298bd4e679300124420Mark Brown
409e50108668a70a9927257298bd4e679300124420Mark Brown/**
419e50108668a70a9927257298bd4e679300124420Mark Brown * DRC configurations are specified with a label and a set of register
429e50108668a70a9927257298bd4e679300124420Mark Brown * values to write (the enable bits will be ignored).  At runtime an
439e50108668a70a9927257298bd4e679300124420Mark Brown * enumerated control will be presented for each DRC block allowing
449e50108668a70a9927257298bd4e679300124420Mark Brown * the user to choose the configration to use.
459e50108668a70a9927257298bd4e679300124420Mark Brown *
469e50108668a70a9927257298bd4e679300124420Mark Brown * Configurations may be generated by hand or by using the DRC control
479e50108668a70a9927257298bd4e679300124420Mark Brown * panel provided by the WISCE - see  http://www.wolfsonmicro.com/wisce/
489e50108668a70a9927257298bd4e679300124420Mark Brown * for details.
499e50108668a70a9927257298bd4e679300124420Mark Brown */
509e50108668a70a9927257298bd4e679300124420Mark Brownstruct wm8994_drc_cfg {
519e50108668a70a9927257298bd4e679300124420Mark Brown        const char *name;
529e50108668a70a9927257298bd4e679300124420Mark Brown        u16 regs[WM8994_DRC_REGS];
539e50108668a70a9927257298bd4e679300124420Mark Brown};
549e50108668a70a9927257298bd4e679300124420Mark Brown
559e50108668a70a9927257298bd4e679300124420Mark Brown/**
569e50108668a70a9927257298bd4e679300124420Mark Brown * ReTune Mobile configurations are specified with a label, sample
579e50108668a70a9927257298bd4e679300124420Mark Brown * rate and set of values to write (the enable bits will be ignored).
589e50108668a70a9927257298bd4e679300124420Mark Brown *
599e50108668a70a9927257298bd4e679300124420Mark Brown * Configurations are expected to be generated using the ReTune Mobile
609e50108668a70a9927257298bd4e679300124420Mark Brown * control panel in WISCE - see http://www.wolfsonmicro.com/wisce/
619e50108668a70a9927257298bd4e679300124420Mark Brown */
629e50108668a70a9927257298bd4e679300124420Mark Brownstruct wm8994_retune_mobile_cfg {
639e50108668a70a9927257298bd4e679300124420Mark Brown        const char *name;
649e50108668a70a9927257298bd4e679300124420Mark Brown        unsigned int rate;
659e50108668a70a9927257298bd4e679300124420Mark Brown        u16 regs[WM8994_EQ_REGS];
669e50108668a70a9927257298bd4e679300124420Mark Brown};
679e50108668a70a9927257298bd4e679300124420Mark Brown
68131d81061eba5ffd436b5d132530ac5205b16892Mark Brown/**
69131d81061eba5ffd436b5d132530ac5205b16892Mark Brown * Multiband compressor configurations are specified with a label and
70131d81061eba5ffd436b5d132530ac5205b16892Mark Brown * two sets of values to write.  Configurations are expected to be
71131d81061eba5ffd436b5d132530ac5205b16892Mark Brown * generated using the multiband compressor configuration panel in
72131d81061eba5ffd436b5d132530ac5205b16892Mark Brown * WISCE - see http://www.wolfsonmicro.com/wisce/
73131d81061eba5ffd436b5d132530ac5205b16892Mark Brown */
74131d81061eba5ffd436b5d132530ac5205b16892Mark Brownstruct wm8958_mbc_cfg {
75131d81061eba5ffd436b5d132530ac5205b16892Mark Brown	const char *name;
76131d81061eba5ffd436b5d132530ac5205b16892Mark Brown	u16 cutoff_regs[WM8958_MBC_CUTOFF_REGS];
77131d81061eba5ffd436b5d132530ac5205b16892Mark Brown	u16 coeff_regs[WM8958_MBC_COEFF_REGS];
7809e10d7fe509408d15818db6a0299f563668a7baMark Brown
7909e10d7fe509408d15818db6a0299f563668a7baMark Brown	/* Coefficient layout when using MBC+VSS firmware */
8009e10d7fe509408d15818db6a0299f563668a7baMark Brown	u16 combined_regs[WM8958_MBC_COMBINED_REGS];
8109e10d7fe509408d15818db6a0299f563668a7baMark Brown};
8209e10d7fe509408d15818db6a0299f563668a7baMark Brown
8309e10d7fe509408d15818db6a0299f563668a7baMark Brown/**
8409e10d7fe509408d15818db6a0299f563668a7baMark Brown * VSS HPF configurations are specified with a label and two values to
8509e10d7fe509408d15818db6a0299f563668a7baMark Brown * write.  Configurations are expected to be generated using the
8609e10d7fe509408d15818db6a0299f563668a7baMark Brown * multiband compressor configuration panel in WISCE - see
8709e10d7fe509408d15818db6a0299f563668a7baMark Brown * http://www.wolfsonmicro.com/wisce/
8809e10d7fe509408d15818db6a0299f563668a7baMark Brown */
8909e10d7fe509408d15818db6a0299f563668a7baMark Brownstruct wm8958_vss_hpf_cfg {
9009e10d7fe509408d15818db6a0299f563668a7baMark Brown	const char *name;
9109e10d7fe509408d15818db6a0299f563668a7baMark Brown	u16 regs[WM8958_VSS_HPF_REGS];
9209e10d7fe509408d15818db6a0299f563668a7baMark Brown};
9309e10d7fe509408d15818db6a0299f563668a7baMark Brown
9409e10d7fe509408d15818db6a0299f563668a7baMark Brown/**
9509e10d7fe509408d15818db6a0299f563668a7baMark Brown * VSS configurations are specified with a label and array of values
9609e10d7fe509408d15818db6a0299f563668a7baMark Brown * to write.  Configurations are expected to be generated using the
9709e10d7fe509408d15818db6a0299f563668a7baMark Brown * multiband compressor configuration panel in WISCE - see
9809e10d7fe509408d15818db6a0299f563668a7baMark Brown * http://www.wolfsonmicro.com/wisce/
9909e10d7fe509408d15818db6a0299f563668a7baMark Brown */
10009e10d7fe509408d15818db6a0299f563668a7baMark Brownstruct wm8958_vss_cfg {
10109e10d7fe509408d15818db6a0299f563668a7baMark Brown	const char *name;
10209e10d7fe509408d15818db6a0299f563668a7baMark Brown	u16 regs[WM8958_VSS_REGS];
103131d81061eba5ffd436b5d132530ac5205b16892Mark Brown};
104131d81061eba5ffd436b5d132530ac5205b16892Mark Brown
105312158718fe2056703b2744801165a9574560495Mark Brown/**
106312158718fe2056703b2744801165a9574560495Mark Brown * Enhanced EQ configurations are specified with a label and array of
107312158718fe2056703b2744801165a9574560495Mark Brown * values to write.  Configurations are expected to be generated using
108312158718fe2056703b2744801165a9574560495Mark Brown * the multiband compressor configuration panel in WISCE - see
109312158718fe2056703b2744801165a9574560495Mark Brown * http://www.wolfsonmicro.com/wisce/
110312158718fe2056703b2744801165a9574560495Mark Brown */
111312158718fe2056703b2744801165a9574560495Mark Brownstruct wm8958_enh_eq_cfg {
112312158718fe2056703b2744801165a9574560495Mark Brown	const char *name;
113312158718fe2056703b2744801165a9574560495Mark Brown	u16 regs[WM8958_ENH_EQ_REGS];
114312158718fe2056703b2744801165a9574560495Mark Brown};
115312158718fe2056703b2744801165a9574560495Mark Brown
116cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown/**
117cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown * Microphone detection rates, used to tune response rates and power
118cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown * consumption for WM8958/WM1811 microphone detection.
119cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown *
120cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown * @sysclk: System clock rate to use this configuration for.
121cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown * @idle: True if this configuration should use when no accessory is detected,
122cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown *        false otherwise.
123cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown * @start: Value for MICD_BIAS_START_TIME register field (not shifted).
124cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown * @rate: Value for MICD_RATE register field (not shifted).
125cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown */
126cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brownstruct wm8958_micd_rate {
127cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown	int sysclk;
128cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown	bool idle;
129cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown	int start;
130cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown	int rate;
131cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown};
132cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown
1339e50108668a70a9927257298bd4e679300124420Mark Brownstruct wm8994_pdata {
1349e50108668a70a9927257298bd4e679300124420Mark Brown	int gpio_base;
1359e50108668a70a9927257298bd4e679300124420Mark Brown
1369e50108668a70a9927257298bd4e679300124420Mark Brown	/**
1379e50108668a70a9927257298bd4e679300124420Mark Brown	 * Default values for GPIOs if non-zero, WM8994_CONFIGURE_GPIO
1389e50108668a70a9927257298bd4e679300124420Mark Brown	 * can be used for all zero values.
1399e50108668a70a9927257298bd4e679300124420Mark Brown	 */
1409e50108668a70a9927257298bd4e679300124420Mark Brown	int gpio_defaults[WM8994_NUM_GPIO];
1419e50108668a70a9927257298bd4e679300124420Mark Brown
1429e50108668a70a9927257298bd4e679300124420Mark Brown	struct wm8994_ldo_pdata ldo[WM8994_NUM_LDO];
1439e50108668a70a9927257298bd4e679300124420Mark Brown
144c9fbf7e070bbf9cc7adc1420df87706c62cb04edMark Brown	int irq_base;  /** Base IRQ number for WM8994, required for IRQs */
145b0ab907d325f99054eb2700a8f8c50776ebfeaf9Mark Brown	unsigned long irq_flags; /** user irq flags */
1469e50108668a70a9927257298bd4e679300124420Mark Brown
1479e50108668a70a9927257298bd4e679300124420Mark Brown        int num_drc_cfgs;
1489e50108668a70a9927257298bd4e679300124420Mark Brown        struct wm8994_drc_cfg *drc_cfgs;
1499e50108668a70a9927257298bd4e679300124420Mark Brown
1509e50108668a70a9927257298bd4e679300124420Mark Brown        int num_retune_mobile_cfgs;
1519e50108668a70a9927257298bd4e679300124420Mark Brown        struct wm8994_retune_mobile_cfg *retune_mobile_cfgs;
1529e50108668a70a9927257298bd4e679300124420Mark Brown
153131d81061eba5ffd436b5d132530ac5205b16892Mark Brown	int num_mbc_cfgs;
154131d81061eba5ffd436b5d132530ac5205b16892Mark Brown	struct wm8958_mbc_cfg *mbc_cfgs;
155131d81061eba5ffd436b5d132530ac5205b16892Mark Brown
15609e10d7fe509408d15818db6a0299f563668a7baMark Brown	int num_vss_cfgs;
15709e10d7fe509408d15818db6a0299f563668a7baMark Brown	struct wm8958_vss_cfg *vss_cfgs;
15809e10d7fe509408d15818db6a0299f563668a7baMark Brown
15909e10d7fe509408d15818db6a0299f563668a7baMark Brown	int num_vss_hpf_cfgs;
16009e10d7fe509408d15818db6a0299f563668a7baMark Brown	struct wm8958_vss_hpf_cfg *vss_hpf_cfgs;
16109e10d7fe509408d15818db6a0299f563668a7baMark Brown
162312158718fe2056703b2744801165a9574560495Mark Brown	int num_enh_eq_cfgs;
163312158718fe2056703b2744801165a9574560495Mark Brown	struct wm8958_enh_eq_cfg *enh_eq_cfgs;
164312158718fe2056703b2744801165a9574560495Mark Brown
165cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown	int num_micd_rates;
166cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown	struct wm8958_micd_rate *micd_rates;
167cd1707a99a2cb43cd8ab0c1952b455b218f15884Mark Brown
16802e79476998ba7e62842d20dca898c403ad55c7eMark Brown	/* Power up delays to add after microphone bias power up (ms) */
16902e79476998ba7e62842d20dca898c403ad55c7eMark Brown	int micb1_delay;
17002e79476998ba7e62842d20dca898c403ad55c7eMark Brown	int micb2_delay;
17102e79476998ba7e62842d20dca898c403ad55c7eMark Brown
1729e50108668a70a9927257298bd4e679300124420Mark Brown        /* LINEOUT can be differential or single ended */
1739e50108668a70a9927257298bd4e679300124420Mark Brown        unsigned int lineout1_diff:1;
1749e50108668a70a9927257298bd4e679300124420Mark Brown        unsigned int lineout2_diff:1;
1759e50108668a70a9927257298bd4e679300124420Mark Brown
1769e50108668a70a9927257298bd4e679300124420Mark Brown        /* Common mode feedback */
1779e50108668a70a9927257298bd4e679300124420Mark Brown        unsigned int lineout1fb:1;
1789e50108668a70a9927257298bd4e679300124420Mark Brown        unsigned int lineout2fb:1;
1799e50108668a70a9927257298bd4e679300124420Mark Brown
180c0cc3f1665256b7cfdc1d581f997dcea1af71405Mark Brown	/* Delay between detecting a jack and starting microphone
181c0cc3f1665256b7cfdc1d581f997dcea1af71405Mark Brown	 * detect (specified in ms)
182c0cc3f1665256b7cfdc1d581f997dcea1af71405Mark Brown	 */
183c0cc3f1665256b7cfdc1d581f997dcea1af71405Mark Brown	int micdet_delay;
184c0cc3f1665256b7cfdc1d581f997dcea1af71405Mark Brown
1852da1c4bf765cb32024e5db6fa75dab92916fa3b1Mark Brown	/* Delay between microphone detect completing and reporting on
1862da1c4bf765cb32024e5db6fa75dab92916fa3b1Mark Brown	 * insert (specified in ms)
1872da1c4bf765cb32024e5db6fa75dab92916fa3b1Mark Brown	 */
1882da1c4bf765cb32024e5db6fa75dab92916fa3b1Mark Brown	int mic_id_delay;
1892da1c4bf765cb32024e5db6fa75dab92916fa3b1Mark Brown
1909b7c525dfaa9a1b5f01db1f3a1edc50bbb6eb739Mark Brown	/* IRQ for microphone detection if brought out directly as a
1919b7c525dfaa9a1b5f01db1f3a1edc50bbb6eb739Mark Brown	 * signal.
1929b7c525dfaa9a1b5f01db1f3a1edc50bbb6eb739Mark Brown	 */
1939b7c525dfaa9a1b5f01db1f3a1edc50bbb6eb739Mark Brown	int micdet_irq;
1949b7c525dfaa9a1b5f01db1f3a1edc50bbb6eb739Mark Brown
19548e028eccabc9c246bfad175262582a1ce34a316Mark Brown        /* WM8994 microphone biases: 0=0.9*AVDD1 1=0.65*AVVD1 */
1969e50108668a70a9927257298bd4e679300124420Mark Brown        unsigned int micbias1_lvl:1;
1979e50108668a70a9927257298bd4e679300124420Mark Brown        unsigned int micbias2_lvl:1;
1989e50108668a70a9927257298bd4e679300124420Mark Brown
19948e028eccabc9c246bfad175262582a1ce34a316Mark Brown        /* WM8994 jack detect threashold levels, see datasheet for values */
2009e50108668a70a9927257298bd4e679300124420Mark Brown        unsigned int jd_scthr:2;
2019e50108668a70a9927257298bd4e679300124420Mark Brown        unsigned int jd_thr:2;
20248e028eccabc9c246bfad175262582a1ce34a316Mark Brown
20307fb9d9e935a07aaed557c58d795c18fcd99aab4Mark Brown	/* Configure WM1811 jack detection for use with external capacitor */
20407fb9d9e935a07aaed557c58d795c18fcd99aab4Mark Brown	unsigned int jd_ext_cap:1;
20507fb9d9e935a07aaed557c58d795c18fcd99aab4Mark Brown
20648e028eccabc9c246bfad175262582a1ce34a316Mark Brown	/* WM8958 microphone bias configuration */
20748e028eccabc9c246bfad175262582a1ce34a316Mark Brown	int micbias[2];
208881de67046f424fc3a6e05b1c681c12afd94e802Mark Brown
2094585790d1cde32a5719c24412e9845e031358e08Mark Brown	/* WM8958 microphone detection ranges */
2104585790d1cde32a5719c24412e9845e031358e08Mark Brown	u16 micd_lvl_sel;
2114585790d1cde32a5719c24412e9845e031358e08Mark Brown
212881de67046f424fc3a6e05b1c681c12afd94e802Mark Brown	/* Disable the internal pull downs on the LDOs if they are
213881de67046f424fc3a6e05b1c681c12afd94e802Mark Brown	 * always driven (eg, connected to an always on supply or
214881de67046f424fc3a6e05b1c681c12afd94e802Mark Brown	 * GPIO that always drives an output.  If they float power
215881de67046f424fc3a6e05b1c681c12afd94e802Mark Brown	 * consumption will rise.
216881de67046f424fc3a6e05b1c681c12afd94e802Mark Brown	 */
217881de67046f424fc3a6e05b1c681c12afd94e802Mark Brown	bool ldo_ena_always_driven;
21826c34c25e54b4a352596d88c6e44a239dab8e1c5Mark Brown
21926c34c25e54b4a352596d88c6e44a239dab8e1c5Mark Brown	/*
22026c34c25e54b4a352596d88c6e44a239dab8e1c5Mark Brown	 * SPKMODE must be pulled internally by the device on this
22126c34c25e54b4a352596d88c6e44a239dab8e1c5Mark Brown	 * system.
22226c34c25e54b4a352596d88c6e44a239dab8e1c5Mark Brown	 */
22326c34c25e54b4a352596d88c6e44a239dab8e1c5Mark Brown	bool spkmode_pu;
2243cf956eebe54cdb7cf1701642085507f0354e56aMark Brown
2253cf956eebe54cdb7cf1701642085507f0354e56aMark Brown	/**
2263cf956eebe54cdb7cf1701642085507f0354e56aMark Brown	 * Maximum number of channels clocks will be generated for,
2273cf956eebe54cdb7cf1701642085507f0354e56aMark Brown	 * useful for systems where and I2S bus with multiple data
2283cf956eebe54cdb7cf1701642085507f0354e56aMark Brown	 * lines is mastered.
2293cf956eebe54cdb7cf1701642085507f0354e56aMark Brown	 */
2303cf956eebe54cdb7cf1701642085507f0354e56aMark Brown	int max_channels_clocked[WM8994_NUM_AIF];
2317c8844481a1c16c10fa9be4ce95be5725aed6ce3Mark Brown
2327c8844481a1c16c10fa9be4ce95be5725aed6ce3Mark Brown	/**
2337c8844481a1c16c10fa9be4ce95be5725aed6ce3Mark Brown	 * GPIO for the IRQ pin if host only supports edge triggering
2347c8844481a1c16c10fa9be4ce95be5725aed6ce3Mark Brown	 */
2357c8844481a1c16c10fa9be4ce95be5725aed6ce3Mark Brown	int irq_gpio;
2369e50108668a70a9927257298bd4e679300124420Mark Brown};
2379e50108668a70a9927257298bd4e679300124420Mark Brown
2389e50108668a70a9927257298bd4e679300124420Mark Brown#endif
239