162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef _MXS_SAIF_H
862306a36Sopenharmony_ci#define _MXS_SAIF_H
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#define SAIF_CTRL	0x0
1162306a36Sopenharmony_ci#define SAIF_STAT	0x10
1262306a36Sopenharmony_ci#define SAIF_DATA	0x20
1362306a36Sopenharmony_ci#define SAIF_VERSION	0X30
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* SAIF_CTRL */
1662306a36Sopenharmony_ci#define BM_SAIF_CTRL_SFTRST		0x80000000
1762306a36Sopenharmony_ci#define BM_SAIF_CTRL_CLKGATE		0x40000000
1862306a36Sopenharmony_ci#define BP_SAIF_CTRL_BITCLK_MULT_RATE	27
1962306a36Sopenharmony_ci#define BM_SAIF_CTRL_BITCLK_MULT_RATE	0x38000000
2062306a36Sopenharmony_ci#define BF_SAIF_CTRL_BITCLK_MULT_RATE(v) \
2162306a36Sopenharmony_ci		(((v) << 27) & BM_SAIF_CTRL_BITCLK_MULT_RATE)
2262306a36Sopenharmony_ci#define BM_SAIF_CTRL_BITCLK_BASE_RATE	0x04000000
2362306a36Sopenharmony_ci#define BM_SAIF_CTRL_FIFO_ERROR_IRQ_EN	0x02000000
2462306a36Sopenharmony_ci#define BM_SAIF_CTRL_FIFO_SERVICE_IRQ_EN	0x01000000
2562306a36Sopenharmony_ci#define BP_SAIF_CTRL_RSRVD2		21
2662306a36Sopenharmony_ci#define BM_SAIF_CTRL_RSRVD2		0x00E00000
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define BP_SAIF_CTRL_DMAWAIT_COUNT	16
2962306a36Sopenharmony_ci#define BM_SAIF_CTRL_DMAWAIT_COUNT	0x001F0000
3062306a36Sopenharmony_ci#define BF_SAIF_CTRL_DMAWAIT_COUNT(v) \
3162306a36Sopenharmony_ci		(((v) << 16) & BM_SAIF_CTRL_DMAWAIT_COUNT)
3262306a36Sopenharmony_ci#define BP_SAIF_CTRL_CHANNEL_NUM_SELECT 14
3362306a36Sopenharmony_ci#define BM_SAIF_CTRL_CHANNEL_NUM_SELECT 0x0000C000
3462306a36Sopenharmony_ci#define BF_SAIF_CTRL_CHANNEL_NUM_SELECT(v) \
3562306a36Sopenharmony_ci		(((v) << 14) & BM_SAIF_CTRL_CHANNEL_NUM_SELECT)
3662306a36Sopenharmony_ci#define BM_SAIF_CTRL_LRCLK_PULSE	0x00002000
3762306a36Sopenharmony_ci#define BM_SAIF_CTRL_BIT_ORDER		0x00001000
3862306a36Sopenharmony_ci#define BM_SAIF_CTRL_DELAY		0x00000800
3962306a36Sopenharmony_ci#define BM_SAIF_CTRL_JUSTIFY		0x00000400
4062306a36Sopenharmony_ci#define BM_SAIF_CTRL_LRCLK_POLARITY	0x00000200
4162306a36Sopenharmony_ci#define BM_SAIF_CTRL_BITCLK_EDGE	0x00000100
4262306a36Sopenharmony_ci#define BP_SAIF_CTRL_WORD_LENGTH	4
4362306a36Sopenharmony_ci#define BM_SAIF_CTRL_WORD_LENGTH	0x000000F0
4462306a36Sopenharmony_ci#define BF_SAIF_CTRL_WORD_LENGTH(v) \
4562306a36Sopenharmony_ci		(((v) << 4) & BM_SAIF_CTRL_WORD_LENGTH)
4662306a36Sopenharmony_ci#define BM_SAIF_CTRL_BITCLK_48XFS_ENABLE	0x00000008
4762306a36Sopenharmony_ci#define BM_SAIF_CTRL_SLAVE_MODE		0x00000004
4862306a36Sopenharmony_ci#define BM_SAIF_CTRL_READ_MODE		0x00000002
4962306a36Sopenharmony_ci#define BM_SAIF_CTRL_RUN		0x00000001
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/* SAIF_STAT */
5262306a36Sopenharmony_ci#define BM_SAIF_STAT_PRESENT		0x80000000
5362306a36Sopenharmony_ci#define BP_SAIF_STAT_RSRVD2		17
5462306a36Sopenharmony_ci#define BM_SAIF_STAT_RSRVD2		0x7FFE0000
5562306a36Sopenharmony_ci#define BF_SAIF_STAT_RSRVD2(v) \
5662306a36Sopenharmony_ci		(((v) << 17) & BM_SAIF_STAT_RSRVD2)
5762306a36Sopenharmony_ci#define BM_SAIF_STAT_DMA_PREQ		0x00010000
5862306a36Sopenharmony_ci#define BP_SAIF_STAT_RSRVD1		7
5962306a36Sopenharmony_ci#define BM_SAIF_STAT_RSRVD1		0x0000FF80
6062306a36Sopenharmony_ci#define BF_SAIF_STAT_RSRVD1(v) \
6162306a36Sopenharmony_ci		(((v) << 7) & BM_SAIF_STAT_RSRVD1)
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci#define BM_SAIF_STAT_FIFO_UNDERFLOW_IRQ 0x00000040
6462306a36Sopenharmony_ci#define BM_SAIF_STAT_FIFO_OVERFLOW_IRQ	0x00000020
6562306a36Sopenharmony_ci#define BM_SAIF_STAT_FIFO_SERVICE_IRQ	0x00000010
6662306a36Sopenharmony_ci#define BP_SAIF_STAT_RSRVD0		1
6762306a36Sopenharmony_ci#define BM_SAIF_STAT_RSRVD0		0x0000000E
6862306a36Sopenharmony_ci#define BF_SAIF_STAT_RSRVD0(v) \
6962306a36Sopenharmony_ci		(((v) << 1) & BM_SAIF_STAT_RSRVD0)
7062306a36Sopenharmony_ci#define BM_SAIF_STAT_BUSY		0x00000001
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci/* SAFI_DATA */
7362306a36Sopenharmony_ci#define BP_SAIF_DATA_PCM_RIGHT		16
7462306a36Sopenharmony_ci#define BM_SAIF_DATA_PCM_RIGHT		0xFFFF0000
7562306a36Sopenharmony_ci#define BF_SAIF_DATA_PCM_RIGHT(v) \
7662306a36Sopenharmony_ci		(((v) << 16) & BM_SAIF_DATA_PCM_RIGHT)
7762306a36Sopenharmony_ci#define BP_SAIF_DATA_PCM_LEFT		0
7862306a36Sopenharmony_ci#define BM_SAIF_DATA_PCM_LEFT		0x0000FFFF
7962306a36Sopenharmony_ci#define BF_SAIF_DATA_PCM_LEFT(v)	\
8062306a36Sopenharmony_ci		(((v) << 0) & BM_SAIF_DATA_PCM_LEFT)
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci/* SAIF_VERSION */
8362306a36Sopenharmony_ci#define BP_SAIF_VERSION_MAJOR		24
8462306a36Sopenharmony_ci#define BM_SAIF_VERSION_MAJOR		0xFF000000
8562306a36Sopenharmony_ci#define BF_SAIF_VERSION_MAJOR(v) \
8662306a36Sopenharmony_ci		(((v) << 24) & BM_SAIF_VERSION_MAJOR)
8762306a36Sopenharmony_ci#define BP_SAIF_VERSION_MINOR		16
8862306a36Sopenharmony_ci#define BM_SAIF_VERSION_MINOR		0x00FF0000
8962306a36Sopenharmony_ci#define BF_SAIF_VERSION_MINOR(v) \
9062306a36Sopenharmony_ci		(((v) << 16) & BM_SAIF_VERSION_MINOR)
9162306a36Sopenharmony_ci#define BP_SAIF_VERSION_STEP		0
9262306a36Sopenharmony_ci#define BM_SAIF_VERSION_STEP		0x0000FFFF
9362306a36Sopenharmony_ci#define BF_SAIF_VERSION_STEP(v) \
9462306a36Sopenharmony_ci		(((v) << 0) & BM_SAIF_VERSION_STEP)
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci#define MXS_SAIF_MCLK		0
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci#include "mxs-pcm.h"
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_cistruct mxs_saif {
10162306a36Sopenharmony_ci	struct device *dev;
10262306a36Sopenharmony_ci	struct clk *clk;
10362306a36Sopenharmony_ci	unsigned int mclk;
10462306a36Sopenharmony_ci	unsigned int mclk_in_use;
10562306a36Sopenharmony_ci	void __iomem *base;
10662306a36Sopenharmony_ci	unsigned int id;
10762306a36Sopenharmony_ci	unsigned int master_id;
10862306a36Sopenharmony_ci	unsigned int cur_rate;
10962306a36Sopenharmony_ci	unsigned int ongoing;
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	u32 fifo_underrun;
11262306a36Sopenharmony_ci	u32 fifo_overrun;
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci	enum {
11562306a36Sopenharmony_ci		MXS_SAIF_STATE_STOPPED,
11662306a36Sopenharmony_ci		MXS_SAIF_STATE_RUNNING,
11762306a36Sopenharmony_ci	} state;
11862306a36Sopenharmony_ci};
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ciextern int mxs_saif_put_mclk(unsigned int saif_id);
12162306a36Sopenharmony_ciextern int mxs_saif_get_mclk(unsigned int saif_id, unsigned int mclk,
12262306a36Sopenharmony_ci					unsigned int rate);
12362306a36Sopenharmony_ci#endif
124