162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci#ifndef __SOUND_AK4113_H 362306a36Sopenharmony_ci#define __SOUND_AK4113_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci/* 662306a36Sopenharmony_ci * Routines for Asahi Kasei AK4113 762306a36Sopenharmony_ci * Copyright (c) by Jaroslav Kysela <perex@perex.cz>, 862306a36Sopenharmony_ci * Copyright (c) by Pavel Hofman <pavel.hofman@ivitera.com>, 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/* AK4113 registers */ 1262306a36Sopenharmony_ci/* power down */ 1362306a36Sopenharmony_ci#define AK4113_REG_PWRDN 0x00 1462306a36Sopenharmony_ci/* format control */ 1562306a36Sopenharmony_ci#define AK4113_REG_FORMAT 0x01 1662306a36Sopenharmony_ci/* input/output control */ 1762306a36Sopenharmony_ci#define AK4113_REG_IO0 0x02 1862306a36Sopenharmony_ci/* input/output control */ 1962306a36Sopenharmony_ci#define AK4113_REG_IO1 0x03 2062306a36Sopenharmony_ci/* interrupt0 mask */ 2162306a36Sopenharmony_ci#define AK4113_REG_INT0_MASK 0x04 2262306a36Sopenharmony_ci/* interrupt1 mask */ 2362306a36Sopenharmony_ci#define AK4113_REG_INT1_MASK 0x05 2462306a36Sopenharmony_ci/* DAT mask & DTS select */ 2562306a36Sopenharmony_ci#define AK4113_REG_DATDTS 0x06 2662306a36Sopenharmony_ci/* receiver status 0 */ 2762306a36Sopenharmony_ci#define AK4113_REG_RCS0 0x07 2862306a36Sopenharmony_ci/* receiver status 1 */ 2962306a36Sopenharmony_ci#define AK4113_REG_RCS1 0x08 3062306a36Sopenharmony_ci/* receiver status 2 */ 3162306a36Sopenharmony_ci#define AK4113_REG_RCS2 0x09 3262306a36Sopenharmony_ci/* RX channel status byte 0 */ 3362306a36Sopenharmony_ci#define AK4113_REG_RXCSB0 0x0a 3462306a36Sopenharmony_ci/* RX channel status byte 1 */ 3562306a36Sopenharmony_ci#define AK4113_REG_RXCSB1 0x0b 3662306a36Sopenharmony_ci/* RX channel status byte 2 */ 3762306a36Sopenharmony_ci#define AK4113_REG_RXCSB2 0x0c 3862306a36Sopenharmony_ci/* RX channel status byte 3 */ 3962306a36Sopenharmony_ci#define AK4113_REG_RXCSB3 0x0d 4062306a36Sopenharmony_ci/* RX channel status byte 4 */ 4162306a36Sopenharmony_ci#define AK4113_REG_RXCSB4 0x0e 4262306a36Sopenharmony_ci/* burst preamble Pc byte 0 */ 4362306a36Sopenharmony_ci#define AK4113_REG_Pc0 0x0f 4462306a36Sopenharmony_ci/* burst preamble Pc byte 1 */ 4562306a36Sopenharmony_ci#define AK4113_REG_Pc1 0x10 4662306a36Sopenharmony_ci/* burst preamble Pd byte 0 */ 4762306a36Sopenharmony_ci#define AK4113_REG_Pd0 0x11 4862306a36Sopenharmony_ci/* burst preamble Pd byte 1 */ 4962306a36Sopenharmony_ci#define AK4113_REG_Pd1 0x12 5062306a36Sopenharmony_ci/* Q-subcode address + control */ 5162306a36Sopenharmony_ci#define AK4113_REG_QSUB_ADDR 0x13 5262306a36Sopenharmony_ci/* Q-subcode track */ 5362306a36Sopenharmony_ci#define AK4113_REG_QSUB_TRACK 0x14 5462306a36Sopenharmony_ci/* Q-subcode index */ 5562306a36Sopenharmony_ci#define AK4113_REG_QSUB_INDEX 0x15 5662306a36Sopenharmony_ci/* Q-subcode minute */ 5762306a36Sopenharmony_ci#define AK4113_REG_QSUB_MINUTE 0x16 5862306a36Sopenharmony_ci/* Q-subcode second */ 5962306a36Sopenharmony_ci#define AK4113_REG_QSUB_SECOND 0x17 6062306a36Sopenharmony_ci/* Q-subcode frame */ 6162306a36Sopenharmony_ci#define AK4113_REG_QSUB_FRAME 0x18 6262306a36Sopenharmony_ci/* Q-subcode zero */ 6362306a36Sopenharmony_ci#define AK4113_REG_QSUB_ZERO 0x19 6462306a36Sopenharmony_ci/* Q-subcode absolute minute */ 6562306a36Sopenharmony_ci#define AK4113_REG_QSUB_ABSMIN 0x1a 6662306a36Sopenharmony_ci/* Q-subcode absolute second */ 6762306a36Sopenharmony_ci#define AK4113_REG_QSUB_ABSSEC 0x1b 6862306a36Sopenharmony_ci/* Q-subcode absolute frame */ 6962306a36Sopenharmony_ci#define AK4113_REG_QSUB_ABSFRM 0x1c 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* sizes */ 7262306a36Sopenharmony_ci#define AK4113_REG_RXCSB_SIZE ((AK4113_REG_RXCSB4-AK4113_REG_RXCSB0)+1) 7362306a36Sopenharmony_ci#define AK4113_REG_QSUB_SIZE ((AK4113_REG_QSUB_ABSFRM-AK4113_REG_QSUB_ADDR)\ 7462306a36Sopenharmony_ci +1) 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci#define AK4113_WRITABLE_REGS (AK4113_REG_DATDTS + 1) 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci/* AK4113_REG_PWRDN bits */ 7962306a36Sopenharmony_ci/* Channel Status Select */ 8062306a36Sopenharmony_ci#define AK4113_CS12 (1<<7) 8162306a36Sopenharmony_ci/* Block Start & C/U Output Mode */ 8262306a36Sopenharmony_ci#define AK4113_BCU (1<<6) 8362306a36Sopenharmony_ci/* Master Clock Operation Select */ 8462306a36Sopenharmony_ci#define AK4113_CM1 (1<<5) 8562306a36Sopenharmony_ci/* Master Clock Operation Select */ 8662306a36Sopenharmony_ci#define AK4113_CM0 (1<<4) 8762306a36Sopenharmony_ci/* Master Clock Frequency Select */ 8862306a36Sopenharmony_ci#define AK4113_OCKS1 (1<<3) 8962306a36Sopenharmony_ci/* Master Clock Frequency Select */ 9062306a36Sopenharmony_ci#define AK4113_OCKS0 (1<<2) 9162306a36Sopenharmony_ci/* 0 = power down, 1 = normal operation */ 9262306a36Sopenharmony_ci#define AK4113_PWN (1<<1) 9362306a36Sopenharmony_ci/* 0 = reset & initialize (except thisregister), 1 = normal operation */ 9462306a36Sopenharmony_ci#define AK4113_RST (1<<0) 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci/* AK4113_REQ_FORMAT bits */ 9762306a36Sopenharmony_ci/* V/TX Output select: 0 = Validity Flag Output, 1 = TX */ 9862306a36Sopenharmony_ci#define AK4113_VTX (1<<7) 9962306a36Sopenharmony_ci/* Audio Data Control */ 10062306a36Sopenharmony_ci#define AK4113_DIF2 (1<<6) 10162306a36Sopenharmony_ci/* Audio Data Control */ 10262306a36Sopenharmony_ci#define AK4113_DIF1 (1<<5) 10362306a36Sopenharmony_ci/* Audio Data Control */ 10462306a36Sopenharmony_ci#define AK4113_DIF0 (1<<4) 10562306a36Sopenharmony_ci/* Deemphasis Autodetect Enable (1 = enable) */ 10662306a36Sopenharmony_ci#define AK4113_DEAU (1<<3) 10762306a36Sopenharmony_ci/* 32kHz-48kHz Deemphasis Control */ 10862306a36Sopenharmony_ci#define AK4113_DEM1 (1<<2) 10962306a36Sopenharmony_ci/* 32kHz-48kHz Deemphasis Control */ 11062306a36Sopenharmony_ci#define AK4113_DEM0 (1<<1) 11162306a36Sopenharmony_ci#define AK4113_DEM_OFF (AK4113_DEM0) 11262306a36Sopenharmony_ci#define AK4113_DEM_44KHZ (0) 11362306a36Sopenharmony_ci#define AK4113_DEM_48KHZ (AK4113_DEM1) 11462306a36Sopenharmony_ci#define AK4113_DEM_32KHZ (AK4113_DEM0|AK4113_DEM1) 11562306a36Sopenharmony_ci/* STDO: 16-bit, right justified */ 11662306a36Sopenharmony_ci#define AK4113_DIF_16R (0) 11762306a36Sopenharmony_ci/* STDO: 18-bit, right justified */ 11862306a36Sopenharmony_ci#define AK4113_DIF_18R (AK4113_DIF0) 11962306a36Sopenharmony_ci/* STDO: 20-bit, right justified */ 12062306a36Sopenharmony_ci#define AK4113_DIF_20R (AK4113_DIF1) 12162306a36Sopenharmony_ci/* STDO: 24-bit, right justified */ 12262306a36Sopenharmony_ci#define AK4113_DIF_24R (AK4113_DIF1|AK4113_DIF0) 12362306a36Sopenharmony_ci/* STDO: 24-bit, left justified */ 12462306a36Sopenharmony_ci#define AK4113_DIF_24L (AK4113_DIF2) 12562306a36Sopenharmony_ci/* STDO: I2S */ 12662306a36Sopenharmony_ci#define AK4113_DIF_24I2S (AK4113_DIF2|AK4113_DIF0) 12762306a36Sopenharmony_ci/* STDO: 24-bit, left justified; LRCLK, BICK = Input */ 12862306a36Sopenharmony_ci#define AK4113_DIF_I24L (AK4113_DIF2|AK4113_DIF1) 12962306a36Sopenharmony_ci/* STDO: I2S; LRCLK, BICK = Input */ 13062306a36Sopenharmony_ci#define AK4113_DIF_I24I2S (AK4113_DIF2|AK4113_DIF1|AK4113_DIF0) 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci/* AK4113_REG_IO0 */ 13362306a36Sopenharmony_ci/* XTL1=0,XTL0=0 -> 11.2896Mhz; XTL1=0,XTL0=1 -> 12.288Mhz */ 13462306a36Sopenharmony_ci#define AK4113_XTL1 (1<<6) 13562306a36Sopenharmony_ci/* XTL1=1,XTL0=0 -> 24.576Mhz; XTL1=1,XTL0=1 -> use channel status */ 13662306a36Sopenharmony_ci#define AK4113_XTL0 (1<<5) 13762306a36Sopenharmony_ci/* Block Start Signal Output: 0 = U-bit, 1 = C-bit (req. BCU = 1) */ 13862306a36Sopenharmony_ci#define AK4113_UCE (1<<4) 13962306a36Sopenharmony_ci/* TX Output Enable (1 = enable) */ 14062306a36Sopenharmony_ci#define AK4113_TXE (1<<3) 14162306a36Sopenharmony_ci/* Output Through Data Selector for TX pin */ 14262306a36Sopenharmony_ci#define AK4113_OPS2 (1<<2) 14362306a36Sopenharmony_ci/* Output Through Data Selector for TX pin */ 14462306a36Sopenharmony_ci#define AK4113_OPS1 (1<<1) 14562306a36Sopenharmony_ci/* Output Through Data Selector for TX pin */ 14662306a36Sopenharmony_ci#define AK4113_OPS0 (1<<0) 14762306a36Sopenharmony_ci/* 11.2896 MHz ref. Xtal freq. */ 14862306a36Sopenharmony_ci#define AK4113_XTL_11_2896M (0) 14962306a36Sopenharmony_ci/* 12.288 MHz ref. Xtal freq. */ 15062306a36Sopenharmony_ci#define AK4113_XTL_12_288M (AK4113_XTL0) 15162306a36Sopenharmony_ci/* 24.576 MHz ref. Xtal freq. */ 15262306a36Sopenharmony_ci#define AK4113_XTL_24_576M (AK4113_XTL1) 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci/* AK4113_REG_IO1 */ 15562306a36Sopenharmony_ci/* Interrupt 0 pin Hold */ 15662306a36Sopenharmony_ci#define AK4113_EFH1 (1<<7) 15762306a36Sopenharmony_ci/* Interrupt 0 pin Hold */ 15862306a36Sopenharmony_ci#define AK4113_EFH0 (1<<6) 15962306a36Sopenharmony_ci#define AK4113_EFH_512LRCLK (0) 16062306a36Sopenharmony_ci#define AK4113_EFH_1024LRCLK (AK4113_EFH0) 16162306a36Sopenharmony_ci#define AK4113_EFH_2048LRCLK (AK4113_EFH1) 16262306a36Sopenharmony_ci#define AK4113_EFH_4096LRCLK (AK4113_EFH1|AK4113_EFH0) 16362306a36Sopenharmony_ci/* PLL Lock Time: 0 = 384/fs, 1 = 1/fs */ 16462306a36Sopenharmony_ci#define AK4113_FAST (1<<5) 16562306a36Sopenharmony_ci/* MCKO2 Output Select: 0 = CMx/OCKSx, 1 = Xtal */ 16662306a36Sopenharmony_ci#define AK4113_XMCK (1<<4) 16762306a36Sopenharmony_ci/* MCKO2 Output Freq. Select: 0 = x1, 1 = x0.5 (req. XMCK = 1) */ 16862306a36Sopenharmony_ci#define AK4113_DIV (1<<3) 16962306a36Sopenharmony_ci/* Input Recovery Data Select */ 17062306a36Sopenharmony_ci#define AK4113_IPS2 (1<<2) 17162306a36Sopenharmony_ci/* Input Recovery Data Select */ 17262306a36Sopenharmony_ci#define AK4113_IPS1 (1<<1) 17362306a36Sopenharmony_ci/* Input Recovery Data Select */ 17462306a36Sopenharmony_ci#define AK4113_IPS0 (1<<0) 17562306a36Sopenharmony_ci#define AK4113_IPS(x) ((x)&7) 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci/* AK4113_REG_INT0_MASK && AK4113_REG_INT1_MASK*/ 17862306a36Sopenharmony_ci/* mask enable for QINT bit */ 17962306a36Sopenharmony_ci#define AK4113_MQI (1<<7) 18062306a36Sopenharmony_ci/* mask enable for AUTO bit */ 18162306a36Sopenharmony_ci#define AK4113_MAUT (1<<6) 18262306a36Sopenharmony_ci/* mask enable for CINT bit */ 18362306a36Sopenharmony_ci#define AK4113_MCIT (1<<5) 18462306a36Sopenharmony_ci/* mask enable for UNLOCK bit */ 18562306a36Sopenharmony_ci#define AK4113_MULK (1<<4) 18662306a36Sopenharmony_ci/* mask enable for V bit */ 18762306a36Sopenharmony_ci#define AK4113_V (1<<3) 18862306a36Sopenharmony_ci/* mask enable for STC bit */ 18962306a36Sopenharmony_ci#define AK4113_STC (1<<2) 19062306a36Sopenharmony_ci/* mask enable for AUDN bit */ 19162306a36Sopenharmony_ci#define AK4113_MAN (1<<1) 19262306a36Sopenharmony_ci/* mask enable for PAR bit */ 19362306a36Sopenharmony_ci#define AK4113_MPR (1<<0) 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci/* AK4113_REG_DATDTS */ 19662306a36Sopenharmony_ci/* DAT Start ID Counter */ 19762306a36Sopenharmony_ci#define AK4113_DCNT (1<<4) 19862306a36Sopenharmony_ci/* DTS-CD 16-bit Sync Word Detect */ 19962306a36Sopenharmony_ci#define AK4113_DTS16 (1<<3) 20062306a36Sopenharmony_ci/* DTS-CD 14-bit Sync Word Detect */ 20162306a36Sopenharmony_ci#define AK4113_DTS14 (1<<2) 20262306a36Sopenharmony_ci/* mask enable for DAT bit (if 1, no INT1 effect */ 20362306a36Sopenharmony_ci#define AK4113_MDAT1 (1<<1) 20462306a36Sopenharmony_ci/* mask enable for DAT bit (if 1, no INT0 effect */ 20562306a36Sopenharmony_ci#define AK4113_MDAT0 (1<<0) 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci/* AK4113_REG_RCS0 */ 20862306a36Sopenharmony_ci/* Q-subcode buffer interrupt, 0 = no change, 1 = changed */ 20962306a36Sopenharmony_ci#define AK4113_QINT (1<<7) 21062306a36Sopenharmony_ci/* Non-PCM or DTS stream auto detection, 0 = no detect, 1 = detect */ 21162306a36Sopenharmony_ci#define AK4113_AUTO (1<<6) 21262306a36Sopenharmony_ci/* channel status buffer interrupt, 0 = no change, 1 = change */ 21362306a36Sopenharmony_ci#define AK4113_CINT (1<<5) 21462306a36Sopenharmony_ci/* PLL lock status, 0 = lock, 1 = unlock */ 21562306a36Sopenharmony_ci#define AK4113_UNLCK (1<<4) 21662306a36Sopenharmony_ci/* Validity bit, 0 = valid, 1 = invalid */ 21762306a36Sopenharmony_ci#define AK4113_V (1<<3) 21862306a36Sopenharmony_ci/* sampling frequency or Pre-emphasis change, 0 = no detect, 1 = detect */ 21962306a36Sopenharmony_ci#define AK4113_STC (1<<2) 22062306a36Sopenharmony_ci/* audio bit output, 0 = audio, 1 = non-audio */ 22162306a36Sopenharmony_ci#define AK4113_AUDION (1<<1) 22262306a36Sopenharmony_ci/* parity error or biphase error status, 0 = no error, 1 = error */ 22362306a36Sopenharmony_ci#define AK4113_PAR (1<<0) 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci/* AK4113_REG_RCS1 */ 22662306a36Sopenharmony_ci/* sampling frequency detection */ 22762306a36Sopenharmony_ci#define AK4113_FS3 (1<<7) 22862306a36Sopenharmony_ci#define AK4113_FS2 (1<<6) 22962306a36Sopenharmony_ci#define AK4113_FS1 (1<<5) 23062306a36Sopenharmony_ci#define AK4113_FS0 (1<<4) 23162306a36Sopenharmony_ci/* Pre-emphasis detect, 0 = OFF, 1 = ON */ 23262306a36Sopenharmony_ci#define AK4113_PEM (1<<3) 23362306a36Sopenharmony_ci/* DAT Start ID Detect, 0 = no detect, 1 = detect */ 23462306a36Sopenharmony_ci#define AK4113_DAT (1<<2) 23562306a36Sopenharmony_ci/* DTS-CD bit audio stream detect, 0 = no detect, 1 = detect */ 23662306a36Sopenharmony_ci#define AK4113_DTSCD (1<<1) 23762306a36Sopenharmony_ci/* Non-PCM bit stream detection, 0 = no detect, 1 = detect */ 23862306a36Sopenharmony_ci#define AK4113_NPCM (1<<0) 23962306a36Sopenharmony_ci#define AK4113_FS_8000HZ (AK4113_FS3|AK4113_FS0) 24062306a36Sopenharmony_ci#define AK4113_FS_11025HZ (AK4113_FS2|AK4113_FS0) 24162306a36Sopenharmony_ci#define AK4113_FS_16000HZ (AK4113_FS2|AK4113_FS1|AK4113_FS0) 24262306a36Sopenharmony_ci#define AK4113_FS_22050HZ (AK4113_FS2) 24362306a36Sopenharmony_ci#define AK4113_FS_24000HZ (AK4113_FS2|AK4113_FS1) 24462306a36Sopenharmony_ci#define AK4113_FS_32000HZ (AK4113_FS1|AK4113_FS0) 24562306a36Sopenharmony_ci#define AK4113_FS_44100HZ (0) 24662306a36Sopenharmony_ci#define AK4113_FS_48000HZ (AK4113_FS1) 24762306a36Sopenharmony_ci#define AK4113_FS_64000HZ (AK4113_FS3|AK4113_FS1|AK4113_FS0) 24862306a36Sopenharmony_ci#define AK4113_FS_88200HZ (AK4113_FS3) 24962306a36Sopenharmony_ci#define AK4113_FS_96000HZ (AK4113_FS3|AK4113_FS1) 25062306a36Sopenharmony_ci#define AK4113_FS_176400HZ (AK4113_FS3|AK4113_FS2) 25162306a36Sopenharmony_ci#define AK4113_FS_192000HZ (AK4113_FS3|AK4113_FS2|AK4113_FS1) 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci/* AK4113_REG_RCS2 */ 25462306a36Sopenharmony_ci/* CRC for Q-subcode, 0 = no error, 1 = error */ 25562306a36Sopenharmony_ci#define AK4113_QCRC (1<<1) 25662306a36Sopenharmony_ci/* CRC for channel status, 0 = no error, 1 = error */ 25762306a36Sopenharmony_ci#define AK4113_CCRC (1<<0) 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci/* flags for snd_ak4113_check_rate_and_errors() */ 26062306a36Sopenharmony_ci#define AK4113_CHECK_NO_STAT (1<<0) /* no statistics */ 26162306a36Sopenharmony_ci#define AK4113_CHECK_NO_RATE (1<<1) /* no rate check */ 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci#define AK4113_CONTROLS 13 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_citypedef void (ak4113_write_t)(void *private_data, unsigned char addr, 26662306a36Sopenharmony_ci unsigned char data); 26762306a36Sopenharmony_citypedef unsigned char (ak4113_read_t)(void *private_data, unsigned char addr); 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_cienum { 27062306a36Sopenharmony_ci AK4113_PARITY_ERRORS, 27162306a36Sopenharmony_ci AK4113_V_BIT_ERRORS, 27262306a36Sopenharmony_ci AK4113_QCRC_ERRORS, 27362306a36Sopenharmony_ci AK4113_CCRC_ERRORS, 27462306a36Sopenharmony_ci AK4113_NUM_ERRORS 27562306a36Sopenharmony_ci}; 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_cistruct ak4113 { 27862306a36Sopenharmony_ci struct snd_card *card; 27962306a36Sopenharmony_ci ak4113_write_t *write; 28062306a36Sopenharmony_ci ak4113_read_t *read; 28162306a36Sopenharmony_ci void *private_data; 28262306a36Sopenharmony_ci atomic_t wq_processing; 28362306a36Sopenharmony_ci struct mutex reinit_mutex; 28462306a36Sopenharmony_ci spinlock_t lock; 28562306a36Sopenharmony_ci unsigned char regmap[AK4113_WRITABLE_REGS]; 28662306a36Sopenharmony_ci struct snd_kcontrol *kctls[AK4113_CONTROLS]; 28762306a36Sopenharmony_ci struct snd_pcm_substream *substream; 28862306a36Sopenharmony_ci unsigned long errors[AK4113_NUM_ERRORS]; 28962306a36Sopenharmony_ci unsigned char rcs0; 29062306a36Sopenharmony_ci unsigned char rcs1; 29162306a36Sopenharmony_ci unsigned char rcs2; 29262306a36Sopenharmony_ci struct delayed_work work; 29362306a36Sopenharmony_ci unsigned int check_flags; 29462306a36Sopenharmony_ci void *change_callback_private; 29562306a36Sopenharmony_ci void (*change_callback)(struct ak4113 *ak4113, unsigned char c0, 29662306a36Sopenharmony_ci unsigned char c1); 29762306a36Sopenharmony_ci}; 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ciint snd_ak4113_create(struct snd_card *card, ak4113_read_t *read, 30062306a36Sopenharmony_ci ak4113_write_t *write, 30162306a36Sopenharmony_ci const unsigned char *pgm, 30262306a36Sopenharmony_ci void *private_data, struct ak4113 **r_ak4113); 30362306a36Sopenharmony_civoid snd_ak4113_reg_write(struct ak4113 *ak4113, unsigned char reg, 30462306a36Sopenharmony_ci unsigned char mask, unsigned char val); 30562306a36Sopenharmony_civoid snd_ak4113_reinit(struct ak4113 *ak4113); 30662306a36Sopenharmony_ciint snd_ak4113_build(struct ak4113 *ak4113, 30762306a36Sopenharmony_ci struct snd_pcm_substream *capture_substream); 30862306a36Sopenharmony_ciint snd_ak4113_external_rate(struct ak4113 *ak4113); 30962306a36Sopenharmony_ciint snd_ak4113_check_rate_and_errors(struct ak4113 *ak4113, unsigned int flags); 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci#ifdef CONFIG_PM 31262306a36Sopenharmony_civoid snd_ak4113_suspend(struct ak4113 *chip); 31362306a36Sopenharmony_civoid snd_ak4113_resume(struct ak4113 *chip); 31462306a36Sopenharmony_ci#else 31562306a36Sopenharmony_cistatic inline void snd_ak4113_suspend(struct ak4113 *chip) {} 31662306a36Sopenharmony_cistatic inline void snd_ak4113_resume(struct ak4113 *chip) {} 31762306a36Sopenharmony_ci#endif 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci#endif /* __SOUND_AK4113_H */ 32062306a36Sopenharmony_ci 321