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