core.h (5789B)
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Arizona MFD internals 4 * 5 * Copyright 2012 Wolfson Microelectronics plc 6 * 7 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> 8 */ 9 10#ifndef _WM_ARIZONA_CORE_H 11#define _WM_ARIZONA_CORE_H 12 13#include <linux/clk.h> 14#include <linux/interrupt.h> 15#include <linux/notifier.h> 16#include <linux/regmap.h> 17#include <linux/regulator/consumer.h> 18#include <linux/mfd/arizona/pdata.h> 19 20#define ARIZONA_MAX_CORE_SUPPLIES 2 21 22enum { 23 ARIZONA_MCLK1, 24 ARIZONA_MCLK2, 25 ARIZONA_NUM_MCLK 26}; 27 28enum arizona_type { 29 WM5102 = 1, 30 WM5110 = 2, 31 WM8997 = 3, 32 WM8280 = 4, 33 WM8998 = 5, 34 WM1814 = 6, 35 WM1831 = 7, 36 CS47L24 = 8, 37}; 38 39#define ARIZONA_IRQ_GP1 0 40#define ARIZONA_IRQ_GP2 1 41#define ARIZONA_IRQ_GP3 2 42#define ARIZONA_IRQ_GP4 3 43#define ARIZONA_IRQ_GP5_FALL 4 44#define ARIZONA_IRQ_GP5_RISE 5 45#define ARIZONA_IRQ_JD_FALL 6 46#define ARIZONA_IRQ_JD_RISE 7 47#define ARIZONA_IRQ_DSP1_RAM_RDY 8 48#define ARIZONA_IRQ_DSP2_RAM_RDY 9 49#define ARIZONA_IRQ_DSP3_RAM_RDY 10 50#define ARIZONA_IRQ_DSP4_RAM_RDY 11 51#define ARIZONA_IRQ_DSP_IRQ1 12 52#define ARIZONA_IRQ_DSP_IRQ2 13 53#define ARIZONA_IRQ_DSP_IRQ3 14 54#define ARIZONA_IRQ_DSP_IRQ4 15 55#define ARIZONA_IRQ_DSP_IRQ5 16 56#define ARIZONA_IRQ_DSP_IRQ6 17 57#define ARIZONA_IRQ_DSP_IRQ7 18 58#define ARIZONA_IRQ_DSP_IRQ8 19 59#define ARIZONA_IRQ_SPK_OVERHEAT_WARN 20 60#define ARIZONA_IRQ_SPK_OVERHEAT 21 61#define ARIZONA_IRQ_MICDET 22 62#define ARIZONA_IRQ_HPDET 23 63#define ARIZONA_IRQ_WSEQ_DONE 24 64#define ARIZONA_IRQ_DRC2_SIG_DET 25 65#define ARIZONA_IRQ_DRC1_SIG_DET 26 66#define ARIZONA_IRQ_ASRC2_LOCK 27 67#define ARIZONA_IRQ_ASRC1_LOCK 28 68#define ARIZONA_IRQ_UNDERCLOCKED 29 69#define ARIZONA_IRQ_OVERCLOCKED 30 70#define ARIZONA_IRQ_FLL2_LOCK 31 71#define ARIZONA_IRQ_FLL1_LOCK 32 72#define ARIZONA_IRQ_CLKGEN_ERR 33 73#define ARIZONA_IRQ_CLKGEN_ERR_ASYNC 34 74#define ARIZONA_IRQ_ASRC_CFG_ERR 35 75#define ARIZONA_IRQ_AIF3_ERR 36 76#define ARIZONA_IRQ_AIF2_ERR 37 77#define ARIZONA_IRQ_AIF1_ERR 38 78#define ARIZONA_IRQ_CTRLIF_ERR 39 79#define ARIZONA_IRQ_MIXER_DROPPED_SAMPLES 40 80#define ARIZONA_IRQ_ASYNC_CLK_ENA_LOW 41 81#define ARIZONA_IRQ_SYSCLK_ENA_LOW 42 82#define ARIZONA_IRQ_ISRC1_CFG_ERR 43 83#define ARIZONA_IRQ_ISRC2_CFG_ERR 44 84#define ARIZONA_IRQ_BOOT_DONE 45 85#define ARIZONA_IRQ_DCS_DAC_DONE 46 86#define ARIZONA_IRQ_DCS_HP_DONE 47 87#define ARIZONA_IRQ_FLL2_CLOCK_OK 48 88#define ARIZONA_IRQ_FLL1_CLOCK_OK 49 89#define ARIZONA_IRQ_MICD_CLAMP_RISE 50 90#define ARIZONA_IRQ_MICD_CLAMP_FALL 51 91#define ARIZONA_IRQ_HP3R_DONE 52 92#define ARIZONA_IRQ_HP3L_DONE 53 93#define ARIZONA_IRQ_HP2R_DONE 54 94#define ARIZONA_IRQ_HP2L_DONE 55 95#define ARIZONA_IRQ_HP1R_DONE 56 96#define ARIZONA_IRQ_HP1L_DONE 57 97#define ARIZONA_IRQ_ISRC3_CFG_ERR 58 98#define ARIZONA_IRQ_DSP_SHARED_WR_COLL 59 99#define ARIZONA_IRQ_SPK_SHUTDOWN 60 100#define ARIZONA_IRQ_SPK1R_SHORT 61 101#define ARIZONA_IRQ_SPK1L_SHORT 62 102#define ARIZONA_IRQ_HP3R_SC_NEG 63 103#define ARIZONA_IRQ_HP3R_SC_POS 64 104#define ARIZONA_IRQ_HP3L_SC_NEG 65 105#define ARIZONA_IRQ_HP3L_SC_POS 66 106#define ARIZONA_IRQ_HP2R_SC_NEG 67 107#define ARIZONA_IRQ_HP2R_SC_POS 68 108#define ARIZONA_IRQ_HP2L_SC_NEG 69 109#define ARIZONA_IRQ_HP2L_SC_POS 70 110#define ARIZONA_IRQ_HP1R_SC_NEG 71 111#define ARIZONA_IRQ_HP1R_SC_POS 72 112#define ARIZONA_IRQ_HP1L_SC_NEG 73 113#define ARIZONA_IRQ_HP1L_SC_POS 74 114 115#define ARIZONA_NUM_IRQ 75 116 117struct snd_soc_dapm_context; 118 119struct arizona { 120 struct regmap *regmap; 121 struct device *dev; 122 123 enum arizona_type type; 124 unsigned int rev; 125 126 int num_core_supplies; 127 struct regulator_bulk_data core_supplies[ARIZONA_MAX_CORE_SUPPLIES]; 128 struct regulator *dcvdd; 129 bool has_fully_powered_off; 130 131 struct arizona_pdata pdata; 132 133 unsigned int external_dcvdd:1; 134 135 int irq; 136 struct irq_domain *virq; 137 struct regmap_irq_chip_data *aod_irq_chip; 138 struct regmap_irq_chip_data *irq_chip; 139 140 bool hpdet_clamp; 141 unsigned int hp_ena; 142 143 struct mutex clk_lock; 144 int clk32k_ref; 145 146 struct clk *mclk[ARIZONA_NUM_MCLK]; 147 148 bool ctrlif_error; 149 150 struct snd_soc_dapm_context *dapm; 151 152 int tdm_width[ARIZONA_MAX_AIF]; 153 int tdm_slots[ARIZONA_MAX_AIF]; 154 155 uint16_t dac_comp_coeff; 156 uint8_t dac_comp_enabled; 157 struct mutex dac_comp_lock; 158 159 struct blocking_notifier_head notifier; 160}; 161 162static inline int arizona_call_notifiers(struct arizona *arizona, 163 unsigned long event, 164 void *data) 165{ 166 return blocking_notifier_call_chain(&arizona->notifier, event, data); 167} 168 169int arizona_clk32k_enable(struct arizona *arizona); 170int arizona_clk32k_disable(struct arizona *arizona); 171 172int arizona_request_irq(struct arizona *arizona, int irq, char *name, 173 irq_handler_t handler, void *data); 174void arizona_free_irq(struct arizona *arizona, int irq, void *data); 175int arizona_set_irq_wake(struct arizona *arizona, int irq, int on); 176 177#ifdef CONFIG_MFD_WM5102 178int wm5102_patch(struct arizona *arizona); 179#else 180static inline int wm5102_patch(struct arizona *arizona) 181{ 182 return 0; 183} 184#endif 185 186int wm5110_patch(struct arizona *arizona); 187int cs47l24_patch(struct arizona *arizona); 188int wm8997_patch(struct arizona *arizona); 189int wm8998_patch(struct arizona *arizona); 190 191#endif