1993a3450SAndreas Dannenberg // SPDX-License-Identifier: GPL-2.0 2993a3450SAndreas Dannenberg /* 3993a3450SAndreas Dannenberg * Texas Instruments PCM186x Universal Audio ADC 4993a3450SAndreas Dannenberg * 5*5856d8bdSAlexander A. Klimov * Copyright (C) 2015-2017 Texas Instruments Incorporated - https://www.ti.com 6993a3450SAndreas Dannenberg * Andreas Dannenberg <dannenberg@ti.com> 7993a3450SAndreas Dannenberg * Andrew F. Davis <afd@ti.com> 8993a3450SAndreas Dannenberg */ 9993a3450SAndreas Dannenberg 10993a3450SAndreas Dannenberg #ifndef _PCM186X_H_ 11993a3450SAndreas Dannenberg #define _PCM186X_H_ 12993a3450SAndreas Dannenberg 13993a3450SAndreas Dannenberg #include <linux/pm.h> 14993a3450SAndreas Dannenberg #include <linux/regmap.h> 15993a3450SAndreas Dannenberg 16993a3450SAndreas Dannenberg enum pcm186x_type { 17993a3450SAndreas Dannenberg PCM1862, 18993a3450SAndreas Dannenberg PCM1863, 19993a3450SAndreas Dannenberg PCM1864, 20993a3450SAndreas Dannenberg PCM1865, 21993a3450SAndreas Dannenberg }; 22993a3450SAndreas Dannenberg 23993a3450SAndreas Dannenberg #define PCM186X_RATES SNDRV_PCM_RATE_8000_192000 24993a3450SAndreas Dannenberg #define PCM186X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ 25993a3450SAndreas Dannenberg SNDRV_PCM_FMTBIT_S20_3LE |\ 26993a3450SAndreas Dannenberg SNDRV_PCM_FMTBIT_S24_LE | \ 27993a3450SAndreas Dannenberg SNDRV_PCM_FMTBIT_S32_LE) 28993a3450SAndreas Dannenberg 29993a3450SAndreas Dannenberg #define PCM186X_PAGE_LEN 0x0100 30993a3450SAndreas Dannenberg #define PCM186X_PAGE_BASE(n) (PCM186X_PAGE_LEN * n) 31993a3450SAndreas Dannenberg 32993a3450SAndreas Dannenberg /* The page selection register address is the same on all pages */ 33993a3450SAndreas Dannenberg #define PCM186X_PAGE 0 34993a3450SAndreas Dannenberg 35993a3450SAndreas Dannenberg /* Register Definitions - Page 0 */ 36993a3450SAndreas Dannenberg #define PCM186X_PGA_VAL_CH1_L (PCM186X_PAGE_BASE(0) + 1) 37993a3450SAndreas Dannenberg #define PCM186X_PGA_VAL_CH1_R (PCM186X_PAGE_BASE(0) + 2) 38993a3450SAndreas Dannenberg #define PCM186X_PGA_VAL_CH2_L (PCM186X_PAGE_BASE(0) + 3) 39993a3450SAndreas Dannenberg #define PCM186X_PGA_VAL_CH2_R (PCM186X_PAGE_BASE(0) + 4) 40993a3450SAndreas Dannenberg #define PCM186X_PGA_CTRL (PCM186X_PAGE_BASE(0) + 5) 41993a3450SAndreas Dannenberg #define PCM186X_ADC1_INPUT_SEL_L (PCM186X_PAGE_BASE(0) + 6) 42993a3450SAndreas Dannenberg #define PCM186X_ADC1_INPUT_SEL_R (PCM186X_PAGE_BASE(0) + 7) 43993a3450SAndreas Dannenberg #define PCM186X_ADC2_INPUT_SEL_L (PCM186X_PAGE_BASE(0) + 8) 44993a3450SAndreas Dannenberg #define PCM186X_ADC2_INPUT_SEL_R (PCM186X_PAGE_BASE(0) + 9) 45993a3450SAndreas Dannenberg #define PCM186X_AUXADC_INPUT_SEL (PCM186X_PAGE_BASE(0) + 10) 46993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG (PCM186X_PAGE_BASE(0) + 11) 47993a3450SAndreas Dannenberg #define PCM186X_TDM_TX_SEL (PCM186X_PAGE_BASE(0) + 12) 48993a3450SAndreas Dannenberg #define PCM186X_TDM_TX_OFFSET (PCM186X_PAGE_BASE(0) + 13) 49993a3450SAndreas Dannenberg #define PCM186X_TDM_RX_OFFSET (PCM186X_PAGE_BASE(0) + 14) 50993a3450SAndreas Dannenberg #define PCM186X_DPGA_VAL_CH1_L (PCM186X_PAGE_BASE(0) + 15) 51993a3450SAndreas Dannenberg #define PCM186X_GPIO1_0_CTRL (PCM186X_PAGE_BASE(0) + 16) 52993a3450SAndreas Dannenberg #define PCM186X_GPIO3_2_CTRL (PCM186X_PAGE_BASE(0) + 17) 53993a3450SAndreas Dannenberg #define PCM186X_GPIO1_0_DIR_CTRL (PCM186X_PAGE_BASE(0) + 18) 54993a3450SAndreas Dannenberg #define PCM186X_GPIO3_2_DIR_CTRL (PCM186X_PAGE_BASE(0) + 19) 55993a3450SAndreas Dannenberg #define PCM186X_GPIO_IN_OUT (PCM186X_PAGE_BASE(0) + 20) 56993a3450SAndreas Dannenberg #define PCM186X_GPIO_PULL_CTRL (PCM186X_PAGE_BASE(0) + 21) 57993a3450SAndreas Dannenberg #define PCM186X_DPGA_VAL_CH1_R (PCM186X_PAGE_BASE(0) + 22) 58993a3450SAndreas Dannenberg #define PCM186X_DPGA_VAL_CH2_L (PCM186X_PAGE_BASE(0) + 23) 59993a3450SAndreas Dannenberg #define PCM186X_DPGA_VAL_CH2_R (PCM186X_PAGE_BASE(0) + 24) 60993a3450SAndreas Dannenberg #define PCM186X_DPGA_GAIN_CTRL (PCM186X_PAGE_BASE(0) + 25) 61993a3450SAndreas Dannenberg #define PCM186X_DPGA_MIC_CTRL (PCM186X_PAGE_BASE(0) + 26) 62993a3450SAndreas Dannenberg #define PCM186X_DIN_RESAMP_CTRL (PCM186X_PAGE_BASE(0) + 27) 63993a3450SAndreas Dannenberg #define PCM186X_CLK_CTRL (PCM186X_PAGE_BASE(0) + 32) 64993a3450SAndreas Dannenberg #define PCM186X_DSP1_CLK_DIV (PCM186X_PAGE_BASE(0) + 33) 65993a3450SAndreas Dannenberg #define PCM186X_DSP2_CLK_DIV (PCM186X_PAGE_BASE(0) + 34) 66993a3450SAndreas Dannenberg #define PCM186X_ADC_CLK_DIV (PCM186X_PAGE_BASE(0) + 35) 67993a3450SAndreas Dannenberg #define PCM186X_PLL_SCK_DIV (PCM186X_PAGE_BASE(0) + 37) 68993a3450SAndreas Dannenberg #define PCM186X_BCK_DIV (PCM186X_PAGE_BASE(0) + 38) 69993a3450SAndreas Dannenberg #define PCM186X_LRK_DIV (PCM186X_PAGE_BASE(0) + 39) 70993a3450SAndreas Dannenberg #define PCM186X_PLL_CTRL (PCM186X_PAGE_BASE(0) + 40) 71993a3450SAndreas Dannenberg #define PCM186X_PLL_P_DIV (PCM186X_PAGE_BASE(0) + 41) 72993a3450SAndreas Dannenberg #define PCM186X_PLL_R_DIV (PCM186X_PAGE_BASE(0) + 42) 73993a3450SAndreas Dannenberg #define PCM186X_PLL_J_DIV (PCM186X_PAGE_BASE(0) + 43) 74993a3450SAndreas Dannenberg #define PCM186X_PLL_D_DIV_LSB (PCM186X_PAGE_BASE(0) + 44) 75993a3450SAndreas Dannenberg #define PCM186X_PLL_D_DIV_MSB (PCM186X_PAGE_BASE(0) + 45) 76993a3450SAndreas Dannenberg #define PCM186X_SIGDET_MODE (PCM186X_PAGE_BASE(0) + 48) 77993a3450SAndreas Dannenberg #define PCM186X_SIGDET_MASK (PCM186X_PAGE_BASE(0) + 49) 78993a3450SAndreas Dannenberg #define PCM186X_SIGDET_STAT (PCM186X_PAGE_BASE(0) + 50) 79993a3450SAndreas Dannenberg #define PCM186X_SIGDET_LOSS_TIME (PCM186X_PAGE_BASE(0) + 52) 80993a3450SAndreas Dannenberg #define PCM186X_SIGDET_SCAN_TIME (PCM186X_PAGE_BASE(0) + 53) 81993a3450SAndreas Dannenberg #define PCM186X_SIGDET_INT_INTVL (PCM186X_PAGE_BASE(0) + 54) 82993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_REF_CH1_L (PCM186X_PAGE_BASE(0) + 64) 83993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_DIFF_CH1_L (PCM186X_PAGE_BASE(0) + 65) 84993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_LEV_CH1_L (PCM186X_PAGE_BASE(0) + 66) 85993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_REF_CH1_R (PCM186X_PAGE_BASE(0) + 67) 86993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_DIFF_CH1_R (PCM186X_PAGE_BASE(0) + 68) 87993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_LEV_CH1_R (PCM186X_PAGE_BASE(0) + 69) 88993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_REF_CH2_L (PCM186X_PAGE_BASE(0) + 70) 89993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_DIFF_CH2_L (PCM186X_PAGE_BASE(0) + 71) 90993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_LEV_CH2_L (PCM186X_PAGE_BASE(0) + 72) 91993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_REF_CH2_R (PCM186X_PAGE_BASE(0) + 73) 92993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_DIFF_CH2_R (PCM186X_PAGE_BASE(0) + 74) 93993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_LEV_CH2_R (PCM186X_PAGE_BASE(0) + 75) 94993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_REF_CH3_L (PCM186X_PAGE_BASE(0) + 76) 95993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_DIFF_CH3_L (PCM186X_PAGE_BASE(0) + 77) 96993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_LEV_CH3_L (PCM186X_PAGE_BASE(0) + 78) 97993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_REF_CH3_R (PCM186X_PAGE_BASE(0) + 79) 98993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_DIFF_CH3_R (PCM186X_PAGE_BASE(0) + 80) 99993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_LEV_CH3_R (PCM186X_PAGE_BASE(0) + 81) 100993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_REF_CH4_L (PCM186X_PAGE_BASE(0) + 82) 101993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_DIFF_CH4_L (PCM186X_PAGE_BASE(0) + 83) 102993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_LEV_CH4_L (PCM186X_PAGE_BASE(0) + 84) 103993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_REF_CH4_R (PCM186X_PAGE_BASE(0) + 85) 104993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_DIFF_CH4_R (PCM186X_PAGE_BASE(0) + 86) 105993a3450SAndreas Dannenberg #define PCM186X_SIGDET_DC_LEV_CH4_R (PCM186X_PAGE_BASE(0) + 87) 106993a3450SAndreas Dannenberg #define PCM186X_AUXADC_DATA_CTRL (PCM186X_PAGE_BASE(0) + 88) 107993a3450SAndreas Dannenberg #define PCM186X_AUXADC_DATA_LSB (PCM186X_PAGE_BASE(0) + 89) 108993a3450SAndreas Dannenberg #define PCM186X_AUXADC_DATA_MSB (PCM186X_PAGE_BASE(0) + 90) 109993a3450SAndreas Dannenberg #define PCM186X_INT_ENABLE (PCM186X_PAGE_BASE(0) + 96) 110993a3450SAndreas Dannenberg #define PCM186X_INT_FLAG (PCM186X_PAGE_BASE(0) + 97) 111993a3450SAndreas Dannenberg #define PCM186X_INT_POL_WIDTH (PCM186X_PAGE_BASE(0) + 98) 112993a3450SAndreas Dannenberg #define PCM186X_POWER_CTRL (PCM186X_PAGE_BASE(0) + 112) 113993a3450SAndreas Dannenberg #define PCM186X_FILTER_MUTE_CTRL (PCM186X_PAGE_BASE(0) + 113) 114993a3450SAndreas Dannenberg #define PCM186X_DEVICE_STATUS (PCM186X_PAGE_BASE(0) + 114) 115993a3450SAndreas Dannenberg #define PCM186X_FSAMPLE_STATUS (PCM186X_PAGE_BASE(0) + 115) 116993a3450SAndreas Dannenberg #define PCM186X_DIV_STATUS (PCM186X_PAGE_BASE(0) + 116) 117993a3450SAndreas Dannenberg #define PCM186X_CLK_STATUS (PCM186X_PAGE_BASE(0) + 117) 118993a3450SAndreas Dannenberg #define PCM186X_SUPPLY_STATUS (PCM186X_PAGE_BASE(0) + 120) 119993a3450SAndreas Dannenberg 120993a3450SAndreas Dannenberg /* Register Definitions - Page 1 */ 121993a3450SAndreas Dannenberg #define PCM186X_MMAP_STAT_CTRL (PCM186X_PAGE_BASE(1) + 1) 122993a3450SAndreas Dannenberg #define PCM186X_MMAP_ADDRESS (PCM186X_PAGE_BASE(1) + 2) 123993a3450SAndreas Dannenberg #define PCM186X_MEM_WDATA0 (PCM186X_PAGE_BASE(1) + 4) 124993a3450SAndreas Dannenberg #define PCM186X_MEM_WDATA1 (PCM186X_PAGE_BASE(1) + 5) 125993a3450SAndreas Dannenberg #define PCM186X_MEM_WDATA2 (PCM186X_PAGE_BASE(1) + 6) 126993a3450SAndreas Dannenberg #define PCM186X_MEM_WDATA3 (PCM186X_PAGE_BASE(1) + 7) 127993a3450SAndreas Dannenberg #define PCM186X_MEM_RDATA0 (PCM186X_PAGE_BASE(1) + 8) 128993a3450SAndreas Dannenberg #define PCM186X_MEM_RDATA1 (PCM186X_PAGE_BASE(1) + 9) 129993a3450SAndreas Dannenberg #define PCM186X_MEM_RDATA2 (PCM186X_PAGE_BASE(1) + 10) 130993a3450SAndreas Dannenberg #define PCM186X_MEM_RDATA3 (PCM186X_PAGE_BASE(1) + 11) 131993a3450SAndreas Dannenberg 132993a3450SAndreas Dannenberg /* Register Definitions - Page 3 */ 133993a3450SAndreas Dannenberg #define PCM186X_OSC_PWR_DOWN_CTRL (PCM186X_PAGE_BASE(3) + 18) 134993a3450SAndreas Dannenberg #define PCM186X_MIC_BIAS_CTRL (PCM186X_PAGE_BASE(3) + 21) 135993a3450SAndreas Dannenberg 136993a3450SAndreas Dannenberg /* Register Definitions - Page 253 */ 137993a3450SAndreas Dannenberg #define PCM186X_CURR_TRIM_CTRL (PCM186X_PAGE_BASE(253) + 20) 138993a3450SAndreas Dannenberg 139993a3450SAndreas Dannenberg #define PCM186X_MAX_REGISTER PCM186X_CURR_TRIM_CTRL 140993a3450SAndreas Dannenberg 141993a3450SAndreas Dannenberg /* PCM186X_PAGE */ 14252777156SAndreas Dannenberg #define PCM186X_RESET 0xfe 143993a3450SAndreas Dannenberg 144993a3450SAndreas Dannenberg /* PCM186X_ADCX_INPUT_SEL_X */ 145993a3450SAndreas Dannenberg #define PCM186X_ADC_INPUT_SEL_POL BIT(7) 146993a3450SAndreas Dannenberg #define PCM186X_ADC_INPUT_SEL_MASK GENMASK(5, 0) 147993a3450SAndreas Dannenberg 148993a3450SAndreas Dannenberg /* PCM186X_PCM_CFG */ 149993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_RX_WLEN_MASK GENMASK(7, 6) 150993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_RX_WLEN_SHIFT 6 151993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_RX_WLEN_32 0x00 152993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_RX_WLEN_24 0x01 153993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_RX_WLEN_20 0x02 154993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_RX_WLEN_16 0x03 155993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_TDM_LRCK_MODE BIT(4) 156993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_TX_WLEN_MASK GENMASK(3, 2) 157993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_TX_WLEN_SHIFT 2 158993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_TX_WLEN_32 0x00 159993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_TX_WLEN_24 0x01 160993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_TX_WLEN_20 0x02 161993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_TX_WLEN_16 0x03 162993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_FMT_MASK GENMASK(1, 0) 163993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_FMT_SHIFT 0 164993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_FMT_I2S 0x00 165993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_FMT_LEFTJ 0x01 166993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_FMT_RIGHTJ 0x02 167993a3450SAndreas Dannenberg #define PCM186X_PCM_CFG_FMT_TDM 0x03 168993a3450SAndreas Dannenberg 169993a3450SAndreas Dannenberg /* PCM186X_TDM_TX_SEL */ 170993a3450SAndreas Dannenberg #define PCM186X_TDM_TX_SEL_2CH 0x00 171993a3450SAndreas Dannenberg #define PCM186X_TDM_TX_SEL_4CH 0x01 172993a3450SAndreas Dannenberg #define PCM186X_TDM_TX_SEL_6CH 0x02 173993a3450SAndreas Dannenberg #define PCM186X_TDM_TX_SEL_MASK 0x03 174993a3450SAndreas Dannenberg 175993a3450SAndreas Dannenberg /* PCM186X_CLK_CTRL */ 176993a3450SAndreas Dannenberg #define PCM186X_CLK_CTRL_SCK_XI_SEL1 BIT(7) 177993a3450SAndreas Dannenberg #define PCM186X_CLK_CTRL_SCK_XI_SEL0 BIT(6) 178993a3450SAndreas Dannenberg #define PCM186X_CLK_CTRL_SCK_SRC_PLL BIT(5) 179993a3450SAndreas Dannenberg #define PCM186X_CLK_CTRL_MST_MODE BIT(4) 180993a3450SAndreas Dannenberg #define PCM186X_CLK_CTRL_ADC_SRC_PLL BIT(3) 181993a3450SAndreas Dannenberg #define PCM186X_CLK_CTRL_DSP2_SRC_PLL BIT(2) 182993a3450SAndreas Dannenberg #define PCM186X_CLK_CTRL_DSP1_SRC_PLL BIT(1) 183993a3450SAndreas Dannenberg #define PCM186X_CLK_CTRL_CLKDET_EN BIT(0) 184993a3450SAndreas Dannenberg 185993a3450SAndreas Dannenberg /* PCM186X_PLL_CTRL */ 186993a3450SAndreas Dannenberg #define PCM186X_PLL_CTRL_LOCK BIT(4) 187993a3450SAndreas Dannenberg #define PCM186X_PLL_CTRL_REF_SEL BIT(1) 188993a3450SAndreas Dannenberg #define PCM186X_PLL_CTRL_EN BIT(0) 189993a3450SAndreas Dannenberg 190993a3450SAndreas Dannenberg /* PCM186X_POWER_CTRL */ 191993a3450SAndreas Dannenberg #define PCM186X_PWR_CTRL_PWRDN BIT(2) 192993a3450SAndreas Dannenberg #define PCM186X_PWR_CTRL_SLEEP BIT(1) 193993a3450SAndreas Dannenberg #define PCM186X_PWR_CTRL_STBY BIT(0) 194993a3450SAndreas Dannenberg 195993a3450SAndreas Dannenberg /* PCM186X_CLK_STATUS */ 196993a3450SAndreas Dannenberg #define PCM186X_CLK_STATUS_LRCKHLT BIT(6) 197993a3450SAndreas Dannenberg #define PCM186X_CLK_STATUS_BCKHLT BIT(5) 198993a3450SAndreas Dannenberg #define PCM186X_CLK_STATUS_SCKHLT BIT(4) 199993a3450SAndreas Dannenberg #define PCM186X_CLK_STATUS_LRCKERR BIT(2) 200993a3450SAndreas Dannenberg #define PCM186X_CLK_STATUS_BCKERR BIT(1) 201993a3450SAndreas Dannenberg #define PCM186X_CLK_STATUS_SCKERR BIT(0) 202993a3450SAndreas Dannenberg 203993a3450SAndreas Dannenberg /* PCM186X_SUPPLY_STATUS */ 204993a3450SAndreas Dannenberg #define PCM186X_SUPPLY_STATUS_DVDD BIT(2) 205993a3450SAndreas Dannenberg #define PCM186X_SUPPLY_STATUS_AVDD BIT(1) 206993a3450SAndreas Dannenberg #define PCM186X_SUPPLY_STATUS_LDO BIT(0) 207993a3450SAndreas Dannenberg 208993a3450SAndreas Dannenberg /* PCM186X_MMAP_STAT_CTRL */ 209993a3450SAndreas Dannenberg #define PCM186X_MMAP_STAT_DONE BIT(4) 210993a3450SAndreas Dannenberg #define PCM186X_MMAP_STAT_BUSY BIT(2) 211993a3450SAndreas Dannenberg #define PCM186X_MMAP_STAT_R_REQ BIT(1) 212993a3450SAndreas Dannenberg #define PCM186X_MMAP_STAT_W_REQ BIT(0) 213993a3450SAndreas Dannenberg 214993a3450SAndreas Dannenberg extern const struct regmap_config pcm186x_regmap; 215993a3450SAndreas Dannenberg 216993a3450SAndreas Dannenberg int pcm186x_probe(struct device *dev, enum pcm186x_type type, int irq, 217993a3450SAndreas Dannenberg struct regmap *regmap); 218993a3450SAndreas Dannenberg 219993a3450SAndreas Dannenberg #endif /* _PCM186X_H_ */ 220