1d6871a73SCharles Keepax /* SPDX-License-Identifier: GPL-2.0-only */ 216b27467SRichard Fitzgerald /* 316b27467SRichard Fitzgerald * MFD internals for Cirrus Logic Madera codecs 416b27467SRichard Fitzgerald * 516b27467SRichard Fitzgerald * Copyright (C) 2015-2018 Cirrus Logic 616b27467SRichard Fitzgerald */ 716b27467SRichard Fitzgerald 816b27467SRichard Fitzgerald #ifndef MADERA_CORE_H 916b27467SRichard Fitzgerald #define MADERA_CORE_H 1016b27467SRichard Fitzgerald 111e624fceSCharles Keepax #include <linux/clk.h> 1216b27467SRichard Fitzgerald #include <linux/gpio/consumer.h> 1316b27467SRichard Fitzgerald #include <linux/interrupt.h> 1416b27467SRichard Fitzgerald #include <linux/mfd/madera/pdata.h> 157f947213SRichard Fitzgerald #include <linux/mutex.h> 1616b27467SRichard Fitzgerald #include <linux/notifier.h> 1716b27467SRichard Fitzgerald #include <linux/regmap.h> 1816b27467SRichard Fitzgerald #include <linux/regulator/consumer.h> 1916b27467SRichard Fitzgerald 2016b27467SRichard Fitzgerald enum madera_type { 2116b27467SRichard Fitzgerald /* 0 is reserved for indicating failure to identify */ 2216b27467SRichard Fitzgerald CS47L35 = 1, 2316b27467SRichard Fitzgerald CS47L85 = 2, 2416b27467SRichard Fitzgerald CS47L90 = 3, 2516b27467SRichard Fitzgerald CS47L91 = 4, 2629793990SRichard Fitzgerald CS47L92 = 5, 2729793990SRichard Fitzgerald CS47L93 = 6, 2816b27467SRichard Fitzgerald WM1840 = 7, 291ef921b6SRichard Fitzgerald CS47L15 = 8, 3029793990SRichard Fitzgerald CS42L92 = 9, 3116b27467SRichard Fitzgerald }; 3216b27467SRichard Fitzgerald 331e624fceSCharles Keepax enum { 341e624fceSCharles Keepax MADERA_MCLK1, 351e624fceSCharles Keepax MADERA_MCLK2, 361e624fceSCharles Keepax MADERA_MCLK3, 371e624fceSCharles Keepax MADERA_NUM_MCLK 381e624fceSCharles Keepax }; 391e624fceSCharles Keepax 4016b27467SRichard Fitzgerald #define MADERA_MAX_CORE_SUPPLIES 2 4116b27467SRichard Fitzgerald #define MADERA_MAX_GPIOS 40 4216b27467SRichard Fitzgerald 431ef921b6SRichard Fitzgerald #define CS47L15_NUM_GPIOS 15 4416b27467SRichard Fitzgerald #define CS47L35_NUM_GPIOS 16 4516b27467SRichard Fitzgerald #define CS47L85_NUM_GPIOS 40 4616b27467SRichard Fitzgerald #define CS47L90_NUM_GPIOS 38 4729793990SRichard Fitzgerald #define CS47L92_NUM_GPIOS 16 4816b27467SRichard Fitzgerald 4916b27467SRichard Fitzgerald #define MADERA_MAX_MICBIAS 4 5016b27467SRichard Fitzgerald 517f947213SRichard Fitzgerald #define MADERA_MAX_HP_OUTPUT 3 527f947213SRichard Fitzgerald 5316b27467SRichard Fitzgerald /* Notifier events */ 5416b27467SRichard Fitzgerald #define MADERA_NOTIFY_VOICE_TRIGGER 0x1 5516b27467SRichard Fitzgerald #define MADERA_NOTIFY_HPDET 0x2 5616b27467SRichard Fitzgerald #define MADERA_NOTIFY_MICDET 0x4 5716b27467SRichard Fitzgerald 5816b27467SRichard Fitzgerald /* GPIO Function Definitions */ 5916b27467SRichard Fitzgerald #define MADERA_GP_FN_ALTERNATE 0x00 6016b27467SRichard Fitzgerald #define MADERA_GP_FN_GPIO 0x01 6116b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_GPIO 0x02 6216b27467SRichard Fitzgerald #define MADERA_GP_FN_IRQ1 0x03 6316b27467SRichard Fitzgerald #define MADERA_GP_FN_IRQ2 0x04 6416b27467SRichard Fitzgerald #define MADERA_GP_FN_FLL1_CLOCK 0x10 6516b27467SRichard Fitzgerald #define MADERA_GP_FN_FLL2_CLOCK 0x11 6616b27467SRichard Fitzgerald #define MADERA_GP_FN_FLL3_CLOCK 0x12 6716b27467SRichard Fitzgerald #define MADERA_GP_FN_FLLAO_CLOCK 0x13 6816b27467SRichard Fitzgerald #define MADERA_GP_FN_FLL1_LOCK 0x18 6916b27467SRichard Fitzgerald #define MADERA_GP_FN_FLL2_LOCK 0x19 7016b27467SRichard Fitzgerald #define MADERA_GP_FN_FLL3_LOCK 0x1A 7116b27467SRichard Fitzgerald #define MADERA_GP_FN_FLLAO_LOCK 0x1B 7216b27467SRichard Fitzgerald #define MADERA_GP_FN_OPCLK_OUT 0x40 7316b27467SRichard Fitzgerald #define MADERA_GP_FN_OPCLK_ASYNC_OUT 0x41 7416b27467SRichard Fitzgerald #define MADERA_GP_FN_PWM1 0x48 7516b27467SRichard Fitzgerald #define MADERA_GP_FN_PWM2 0x49 7616b27467SRichard Fitzgerald #define MADERA_GP_FN_SPDIF_OUT 0x4C 7716b27467SRichard Fitzgerald #define MADERA_GP_FN_HEADPHONE_DET 0x50 7816b27467SRichard Fitzgerald #define MADERA_GP_FN_MIC_DET 0x58 7916b27467SRichard Fitzgerald #define MADERA_GP_FN_DRC1_SIGNAL_DETECT 0x80 8016b27467SRichard Fitzgerald #define MADERA_GP_FN_DRC2_SIGNAL_DETECT 0x81 8116b27467SRichard Fitzgerald #define MADERA_GP_FN_ASRC1_IN1_LOCK 0x88 8216b27467SRichard Fitzgerald #define MADERA_GP_FN_ASRC1_IN2_LOCK 0x89 8316b27467SRichard Fitzgerald #define MADERA_GP_FN_ASRC2_IN1_LOCK 0x8A 8416b27467SRichard Fitzgerald #define MADERA_GP_FN_ASRC2_IN2_LOCK 0x8B 8516b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ1 0xA0 8616b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ2 0xA1 8716b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ3 0xA2 8816b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ4 0xA3 8916b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ5 0xA4 9016b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ6 0xA5 9116b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ7 0xA6 9216b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ8 0xA7 9316b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ9 0xA8 9416b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ10 0xA9 9516b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ11 0xAA 9616b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ12 0xAB 9716b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ13 0xAC 9816b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ14 0xAD 9916b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ15 0xAE 10016b27467SRichard Fitzgerald #define MADERA_GP_FN_DSP_IRQ16 0xAF 10116b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT1L_SC 0xB0 10216b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT1R_SC 0xB1 10316b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT2L_SC 0xB2 10416b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT2R_SC 0xB3 10516b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT3L_SC 0xB4 10616b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT4R_SC 0xB5 10716b27467SRichard Fitzgerald #define MADERA_GP_FN_SPKOUTL_SC 0xB6 10816b27467SRichard Fitzgerald #define MADERA_GP_FN_SPKOUTR_SC 0xB7 10916b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT1L_ENA 0xC0 11016b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT1R_ENA 0xC1 11116b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT2L_ENA 0xC2 11216b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT2R_ENA 0xC3 11316b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT3L_ENA 0xC4 11416b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT4R_ENA 0xC5 11516b27467SRichard Fitzgerald #define MADERA_GP_FN_SPKOUTL_ENA 0xC6 11616b27467SRichard Fitzgerald #define MADERA_GP_FN_SPKOUTR_ENA 0xC7 11716b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT1L_DIS 0xD0 11816b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT1R_DIS 0xD1 11916b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT2L_DIS 0xD2 12016b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT2R_DIS 0xD3 12116b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT3L_DIS 0xD4 12216b27467SRichard Fitzgerald #define MADERA_GP_FN_HPOUT4R_DIS 0xD5 12316b27467SRichard Fitzgerald #define MADERA_GP_FN_SPKOUTL_DIS 0xD6 12416b27467SRichard Fitzgerald #define MADERA_GP_FN_SPKOUTR_DIS 0xD7 12516b27467SRichard Fitzgerald #define MADERA_GP_FN_SPK_SHUTDOWN 0xE0 12616b27467SRichard Fitzgerald #define MADERA_GP_FN_SPK_OVH_SHUTDOWN 0xE1 12716b27467SRichard Fitzgerald #define MADERA_GP_FN_SPK_OVH_WARN 0xE2 12816b27467SRichard Fitzgerald #define MADERA_GP_FN_TIMER1_STATUS 0x140 12916b27467SRichard Fitzgerald #define MADERA_GP_FN_TIMER2_STATUS 0x141 13016b27467SRichard Fitzgerald #define MADERA_GP_FN_TIMER3_STATUS 0x142 13116b27467SRichard Fitzgerald #define MADERA_GP_FN_TIMER4_STATUS 0x143 13216b27467SRichard Fitzgerald #define MADERA_GP_FN_TIMER5_STATUS 0x144 13316b27467SRichard Fitzgerald #define MADERA_GP_FN_TIMER6_STATUS 0x145 13416b27467SRichard Fitzgerald #define MADERA_GP_FN_TIMER7_STATUS 0x146 13516b27467SRichard Fitzgerald #define MADERA_GP_FN_TIMER8_STATUS 0x147 13616b27467SRichard Fitzgerald #define MADERA_GP_FN_EVENTLOG1_FIFO_STS 0x150 13716b27467SRichard Fitzgerald #define MADERA_GP_FN_EVENTLOG2_FIFO_STS 0x151 13816b27467SRichard Fitzgerald #define MADERA_GP_FN_EVENTLOG3_FIFO_STS 0x152 13916b27467SRichard Fitzgerald #define MADERA_GP_FN_EVENTLOG4_FIFO_STS 0x153 14016b27467SRichard Fitzgerald #define MADERA_GP_FN_EVENTLOG5_FIFO_STS 0x154 14116b27467SRichard Fitzgerald #define MADERA_GP_FN_EVENTLOG6_FIFO_STS 0x155 14216b27467SRichard Fitzgerald #define MADERA_GP_FN_EVENTLOG7_FIFO_STS 0x156 14316b27467SRichard Fitzgerald #define MADERA_GP_FN_EVENTLOG8_FIFO_STS 0x157 14416b27467SRichard Fitzgerald 14516b27467SRichard Fitzgerald struct snd_soc_dapm_context; 14616b27467SRichard Fitzgerald 14716b27467SRichard Fitzgerald /* 14816b27467SRichard Fitzgerald * struct madera - internal data shared by the set of Madera drivers 14916b27467SRichard Fitzgerald * 15016b27467SRichard Fitzgerald * This should not be used by anything except child drivers of the Madera MFD 15116b27467SRichard Fitzgerald * 15216b27467SRichard Fitzgerald * @regmap: pointer to the regmap instance for 16-bit registers 15316b27467SRichard Fitzgerald * @regmap_32bit: pointer to the regmap instance for 32-bit registers 15416b27467SRichard Fitzgerald * @dev: pointer to the MFD device 15516b27467SRichard Fitzgerald * @type: type of codec 15616b27467SRichard Fitzgerald * @rev: silicon revision 15716b27467SRichard Fitzgerald * @type_name: display name of this codec 15816b27467SRichard Fitzgerald * @num_core_supplies: number of core supply regulators 15916b27467SRichard Fitzgerald * @core_supplies: list of core supplies that are always required 16016b27467SRichard Fitzgerald * @dcvdd: pointer to DCVDD regulator 16116b27467SRichard Fitzgerald * @internal_dcvdd: true if DCVDD is supplied from the internal LDO1 16216b27467SRichard Fitzgerald * @pdata: our pdata 16316b27467SRichard Fitzgerald * @irq_dev: the irqchip child driver device 164d31ca7e5SRichard Fitzgerald * @irq_data: pointer to irqchip data for the child irqchip driver 16516b27467SRichard Fitzgerald * @irq: host irq number from SPI or I2C configuration 1661e624fceSCharles Keepax * @mclk: Structure holding clock supplies 16716b27467SRichard Fitzgerald * @out_clamp: indicates output clamp state for each analogue output 16816b27467SRichard Fitzgerald * @out_shorted: indicates short circuit state for each analogue output 16916b27467SRichard Fitzgerald * @hp_ena: bitflags of enable state for the headphone outputs 17016b27467SRichard Fitzgerald * @num_micbias: number of MICBIAS outputs 17116b27467SRichard Fitzgerald * @num_childbias: number of child biases for each MICBIAS 17216b27467SRichard Fitzgerald * @dapm: pointer to codec driver DAPM context 17316b27467SRichard Fitzgerald * @notifier: notifier for signalling events to ASoC machine driver 17416b27467SRichard Fitzgerald */ 17516b27467SRichard Fitzgerald struct madera { 17616b27467SRichard Fitzgerald struct regmap *regmap; 17716b27467SRichard Fitzgerald struct regmap *regmap_32bit; 17816b27467SRichard Fitzgerald 17916b27467SRichard Fitzgerald struct device *dev; 18016b27467SRichard Fitzgerald 18116b27467SRichard Fitzgerald enum madera_type type; 18216b27467SRichard Fitzgerald unsigned int rev; 18316b27467SRichard Fitzgerald const char *type_name; 18416b27467SRichard Fitzgerald 18516b27467SRichard Fitzgerald int num_core_supplies; 18616b27467SRichard Fitzgerald struct regulator_bulk_data core_supplies[MADERA_MAX_CORE_SUPPLIES]; 18716b27467SRichard Fitzgerald struct regulator *dcvdd; 18816b27467SRichard Fitzgerald bool internal_dcvdd; 189*f594d01bSCharles Keepax bool reset_errata; 19016b27467SRichard Fitzgerald 19116b27467SRichard Fitzgerald struct madera_pdata pdata; 19216b27467SRichard Fitzgerald 19316b27467SRichard Fitzgerald struct device *irq_dev; 194d31ca7e5SRichard Fitzgerald struct regmap_irq_chip_data *irq_data; 19516b27467SRichard Fitzgerald int irq; 19616b27467SRichard Fitzgerald 1971e624fceSCharles Keepax struct clk_bulk_data mclk[MADERA_NUM_MCLK]; 1981e624fceSCharles Keepax 19916b27467SRichard Fitzgerald unsigned int num_micbias; 20016b27467SRichard Fitzgerald unsigned int num_childbias[MADERA_MAX_MICBIAS]; 20116b27467SRichard Fitzgerald 20216b27467SRichard Fitzgerald struct snd_soc_dapm_context *dapm; 2037f947213SRichard Fitzgerald struct mutex dapm_ptr_lock; 2047f947213SRichard Fitzgerald unsigned int hp_ena; 2057f947213SRichard Fitzgerald bool out_clamp[MADERA_MAX_HP_OUTPUT]; 2067f947213SRichard Fitzgerald bool out_shorted[MADERA_MAX_HP_OUTPUT]; 20716b27467SRichard Fitzgerald 20816b27467SRichard Fitzgerald struct blocking_notifier_head notifier; 20916b27467SRichard Fitzgerald }; 21016b27467SRichard Fitzgerald #endif 211