18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef _MXS_SAIF_H 88c2ecf20Sopenharmony_ci#define _MXS_SAIF_H 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#define SAIF_CTRL 0x0 118c2ecf20Sopenharmony_ci#define SAIF_STAT 0x10 128c2ecf20Sopenharmony_ci#define SAIF_DATA 0x20 138c2ecf20Sopenharmony_ci#define SAIF_VERSION 0X30 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci/* SAIF_CTRL */ 168c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_SFTRST 0x80000000 178c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_CLKGATE 0x40000000 188c2ecf20Sopenharmony_ci#define BP_SAIF_CTRL_BITCLK_MULT_RATE 27 198c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_BITCLK_MULT_RATE 0x38000000 208c2ecf20Sopenharmony_ci#define BF_SAIF_CTRL_BITCLK_MULT_RATE(v) \ 218c2ecf20Sopenharmony_ci (((v) << 27) & BM_SAIF_CTRL_BITCLK_MULT_RATE) 228c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_BITCLK_BASE_RATE 0x04000000 238c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_FIFO_ERROR_IRQ_EN 0x02000000 248c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_FIFO_SERVICE_IRQ_EN 0x01000000 258c2ecf20Sopenharmony_ci#define BP_SAIF_CTRL_RSRVD2 21 268c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_RSRVD2 0x00E00000 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#define BP_SAIF_CTRL_DMAWAIT_COUNT 16 298c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_DMAWAIT_COUNT 0x001F0000 308c2ecf20Sopenharmony_ci#define BF_SAIF_CTRL_DMAWAIT_COUNT(v) \ 318c2ecf20Sopenharmony_ci (((v) << 16) & BM_SAIF_CTRL_DMAWAIT_COUNT) 328c2ecf20Sopenharmony_ci#define BP_SAIF_CTRL_CHANNEL_NUM_SELECT 14 338c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_CHANNEL_NUM_SELECT 0x0000C000 348c2ecf20Sopenharmony_ci#define BF_SAIF_CTRL_CHANNEL_NUM_SELECT(v) \ 358c2ecf20Sopenharmony_ci (((v) << 14) & BM_SAIF_CTRL_CHANNEL_NUM_SELECT) 368c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_LRCLK_PULSE 0x00002000 378c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_BIT_ORDER 0x00001000 388c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_DELAY 0x00000800 398c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_JUSTIFY 0x00000400 408c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_LRCLK_POLARITY 0x00000200 418c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_BITCLK_EDGE 0x00000100 428c2ecf20Sopenharmony_ci#define BP_SAIF_CTRL_WORD_LENGTH 4 438c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_WORD_LENGTH 0x000000F0 448c2ecf20Sopenharmony_ci#define BF_SAIF_CTRL_WORD_LENGTH(v) \ 458c2ecf20Sopenharmony_ci (((v) << 4) & BM_SAIF_CTRL_WORD_LENGTH) 468c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_BITCLK_48XFS_ENABLE 0x00000008 478c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_SLAVE_MODE 0x00000004 488c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_READ_MODE 0x00000002 498c2ecf20Sopenharmony_ci#define BM_SAIF_CTRL_RUN 0x00000001 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci/* SAIF_STAT */ 528c2ecf20Sopenharmony_ci#define BM_SAIF_STAT_PRESENT 0x80000000 538c2ecf20Sopenharmony_ci#define BP_SAIF_STAT_RSRVD2 17 548c2ecf20Sopenharmony_ci#define BM_SAIF_STAT_RSRVD2 0x7FFE0000 558c2ecf20Sopenharmony_ci#define BF_SAIF_STAT_RSRVD2(v) \ 568c2ecf20Sopenharmony_ci (((v) << 17) & BM_SAIF_STAT_RSRVD2) 578c2ecf20Sopenharmony_ci#define BM_SAIF_STAT_DMA_PREQ 0x00010000 588c2ecf20Sopenharmony_ci#define BP_SAIF_STAT_RSRVD1 7 598c2ecf20Sopenharmony_ci#define BM_SAIF_STAT_RSRVD1 0x0000FF80 608c2ecf20Sopenharmony_ci#define BF_SAIF_STAT_RSRVD1(v) \ 618c2ecf20Sopenharmony_ci (((v) << 7) & BM_SAIF_STAT_RSRVD1) 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci#define BM_SAIF_STAT_FIFO_UNDERFLOW_IRQ 0x00000040 648c2ecf20Sopenharmony_ci#define BM_SAIF_STAT_FIFO_OVERFLOW_IRQ 0x00000020 658c2ecf20Sopenharmony_ci#define BM_SAIF_STAT_FIFO_SERVICE_IRQ 0x00000010 668c2ecf20Sopenharmony_ci#define BP_SAIF_STAT_RSRVD0 1 678c2ecf20Sopenharmony_ci#define BM_SAIF_STAT_RSRVD0 0x0000000E 688c2ecf20Sopenharmony_ci#define BF_SAIF_STAT_RSRVD0(v) \ 698c2ecf20Sopenharmony_ci (((v) << 1) & BM_SAIF_STAT_RSRVD0) 708c2ecf20Sopenharmony_ci#define BM_SAIF_STAT_BUSY 0x00000001 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci/* SAFI_DATA */ 738c2ecf20Sopenharmony_ci#define BP_SAIF_DATA_PCM_RIGHT 16 748c2ecf20Sopenharmony_ci#define BM_SAIF_DATA_PCM_RIGHT 0xFFFF0000 758c2ecf20Sopenharmony_ci#define BF_SAIF_DATA_PCM_RIGHT(v) \ 768c2ecf20Sopenharmony_ci (((v) << 16) & BM_SAIF_DATA_PCM_RIGHT) 778c2ecf20Sopenharmony_ci#define BP_SAIF_DATA_PCM_LEFT 0 788c2ecf20Sopenharmony_ci#define BM_SAIF_DATA_PCM_LEFT 0x0000FFFF 798c2ecf20Sopenharmony_ci#define BF_SAIF_DATA_PCM_LEFT(v) \ 808c2ecf20Sopenharmony_ci (((v) << 0) & BM_SAIF_DATA_PCM_LEFT) 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci/* SAIF_VERSION */ 838c2ecf20Sopenharmony_ci#define BP_SAIF_VERSION_MAJOR 24 848c2ecf20Sopenharmony_ci#define BM_SAIF_VERSION_MAJOR 0xFF000000 858c2ecf20Sopenharmony_ci#define BF_SAIF_VERSION_MAJOR(v) \ 868c2ecf20Sopenharmony_ci (((v) << 24) & BM_SAIF_VERSION_MAJOR) 878c2ecf20Sopenharmony_ci#define BP_SAIF_VERSION_MINOR 16 888c2ecf20Sopenharmony_ci#define BM_SAIF_VERSION_MINOR 0x00FF0000 898c2ecf20Sopenharmony_ci#define BF_SAIF_VERSION_MINOR(v) \ 908c2ecf20Sopenharmony_ci (((v) << 16) & BM_SAIF_VERSION_MINOR) 918c2ecf20Sopenharmony_ci#define BP_SAIF_VERSION_STEP 0 928c2ecf20Sopenharmony_ci#define BM_SAIF_VERSION_STEP 0x0000FFFF 938c2ecf20Sopenharmony_ci#define BF_SAIF_VERSION_STEP(v) \ 948c2ecf20Sopenharmony_ci (((v) << 0) & BM_SAIF_VERSION_STEP) 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci#define MXS_SAIF_MCLK 0 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci#include "mxs-pcm.h" 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_cistruct mxs_saif { 1018c2ecf20Sopenharmony_ci struct device *dev; 1028c2ecf20Sopenharmony_ci struct clk *clk; 1038c2ecf20Sopenharmony_ci unsigned int mclk; 1048c2ecf20Sopenharmony_ci unsigned int mclk_in_use; 1058c2ecf20Sopenharmony_ci void __iomem *base; 1068c2ecf20Sopenharmony_ci unsigned int id; 1078c2ecf20Sopenharmony_ci unsigned int master_id; 1088c2ecf20Sopenharmony_ci unsigned int cur_rate; 1098c2ecf20Sopenharmony_ci unsigned int ongoing; 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci u32 fifo_underrun; 1128c2ecf20Sopenharmony_ci u32 fifo_overrun; 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci enum { 1158c2ecf20Sopenharmony_ci MXS_SAIF_STATE_STOPPED, 1168c2ecf20Sopenharmony_ci MXS_SAIF_STATE_RUNNING, 1178c2ecf20Sopenharmony_ci } state; 1188c2ecf20Sopenharmony_ci}; 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ciextern int mxs_saif_put_mclk(unsigned int saif_id); 1218c2ecf20Sopenharmony_ciextern int mxs_saif_get_mclk(unsigned int saif_id, unsigned int mclk, 1228c2ecf20Sopenharmony_ci unsigned int rate); 1238c2ecf20Sopenharmony_ci#endif 124