2023-03-21 08:08:55 +03:00
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Copyright ( C ) 2023 Advanced Micro Devices , Inc . All rights reserved .
*/
# ifndef __AMD_MANAGER_H
# define __AMD_MANAGER_H
# include <linux/soundwire/sdw_amd.h>
# define SDW_MANAGER_REG_OFFSET 0xc00
# define AMD_SDW_DEFAULT_ROWS 50
# define AMD_SDW_DEFAULT_COLUMNS 10
# define ACP_PAD_PULLDOWN_CTRL 0x0001448
# define ACP_SW_PAD_KEEPER_EN 0x0001454
# define ACP_SW0_WAKE_EN 0x0001458
# define ACP_EXTERNAL_INTR_CNTL0 0x0001a04
# define ACP_EXTERNAL_INTR_STAT0 0x0001a0c
# define ACP_EXTERNAL_INTR_CNTL(i) (ACP_EXTERNAL_INTR_CNTL0 + ((i) * 4))
# define ACP_EXTERNAL_INTR_STAT(i) (ACP_EXTERNAL_INTR_STAT0 + ((i) * 4))
# define ACP_SW_WAKE_EN(i) (ACP_SW0_WAKE_EN + ((i) * 8))
# define ACP_SW_EN 0x0003000
# define ACP_SW_EN_STATUS 0x0003004
# define ACP_SW_FRAMESIZE 0x0003008
# define ACP_SW_SSP_COUNTER 0x000300c
# define ACP_SW_AUDIO0_TX_EN 0x0003010
# define ACP_SW_AUDIO0_TX_EN_STATUS 0x0003014
# define ACP_SW_AUDIO0_TX_FRAME_FORMAT 0x0003018
# define ACP_SW_AUDIO0_TX_SAMPLEINTERVAL 0x000301c
# define ACP_SW_AUDIO0_TX_HCTRL_DP0 0x0003020
# define ACP_SW_AUDIO0_TX_HCTRL_DP1 0x0003024
# define ACP_SW_AUDIO0_TX_HCTRL_DP2 0x0003028
# define ACP_SW_AUDIO0_TX_HCTRL_DP3 0x000302c
# define ACP_SW_AUDIO0_TX_OFFSET_DP0 0x0003030
# define ACP_SW_AUDIO0_TX_OFFSET_DP1 0x0003034
# define ACP_SW_AUDIO0_TX_OFFSET_DP2 0x0003038
# define ACP_SW_AUDIO0_TX_OFFSET_DP3 0x000303c
# define ACP_SW_AUDIO0_TX_CHANNEL_ENABLE_DP0 0x0003040
# define ACP_SW_AUDIO0_TX_CHANNEL_ENABLE_DP1 0x0003044
# define ACP_SW_AUDIO0_TX_CHANNEL_ENABLE_DP2 0x0003048
# define ACP_SW_AUDIO0_TX_CHANNEL_ENABLE_DP3 0x000304c
# define ACP_SW_AUDIO1_TX_EN 0x0003050
# define ACP_SW_AUDIO1_TX_EN_STATUS 0x0003054
# define ACP_SW_AUDIO1_TX_FRAME_FORMAT 0x0003058
# define ACP_SW_AUDIO1_TX_SAMPLEINTERVAL 0x000305c
# define ACP_SW_AUDIO1_TX_HCTRL 0x0003060
# define ACP_SW_AUDIO1_TX_OFFSET 0x0003064
# define ACP_SW_AUDIO1_TX_CHANNEL_ENABLE_DP0 0x0003068
# define ACP_SW_AUDIO2_TX_EN 0x000306c
# define ACP_SW_AUDIO2_TX_EN_STATUS 0x0003070
# define ACP_SW_AUDIO2_TX_FRAME_FORMAT 0x0003074
# define ACP_SW_AUDIO2_TX_SAMPLEINTERVAL 0x0003078
# define ACP_SW_AUDIO2_TX_HCTRL 0x000307c
# define ACP_SW_AUDIO2_TX_OFFSET 0x0003080
# define ACP_SW_AUDIO2_TX_CHANNEL_ENABLE_DP0 0x0003084
# define ACP_SW_AUDIO0_RX_EN 0x0003088
# define ACP_SW_AUDIO0_RX_EN_STATUS 0x000308c
# define ACP_SW_AUDIO0_RX_FRAME_FORMAT 0x0003090
# define ACP_SW_AUDIO0_RX_SAMPLEINTERVAL 0x0003094
# define ACP_SW_AUDIO0_RX_HCTRL_DP0 0x0003098
# define ACP_SW_AUDIO0_RX_HCTRL_DP1 0x000309c
# define ACP_SW_AUDIO0_RX_HCTRL_DP2 0x0003100
# define ACP_SW_AUDIO0_RX_HCTRL_DP3 0x0003104
# define ACP_SW_AUDIO0_RX_OFFSET_DP0 0x0003108
# define ACP_SW_AUDIO0_RX_OFFSET_DP1 0x000310c
# define ACP_SW_AUDIO0_RX_OFFSET_DP2 0x0003110
# define ACP_SW_AUDIO0_RX_OFFSET_DP3 0x0003114
# define ACP_SW_AUDIO0_RX_CHANNEL_ENABLE_DP0 0x0003118
# define ACP_SW_AUDIO0_RX_CHANNEL_ENABLE_DP1 0x000311c
# define ACP_SW_AUDIO0_RX_CHANNEL_ENABLE_DP2 0x0003120
# define ACP_SW_AUDIO0_RX_CHANNEL_ENABLE_DP3 0x0003124
# define ACP_SW_AUDIO1_RX_EN 0x0003128
# define ACP_SW_AUDIO1_RX_EN_STATUS 0x000312c
# define ACP_SW_AUDIO1_RX_FRAME_FORMAT 0x0003130
# define ACP_SW_AUDIO1_RX_SAMPLEINTERVAL 0x0003134
# define ACP_SW_AUDIO1_RX_HCTRL 0x0003138
# define ACP_SW_AUDIO1_RX_OFFSET 0x000313c
# define ACP_SW_AUDIO1_RX_CHANNEL_ENABLE_DP0 0x0003140
# define ACP_SW_AUDIO2_RX_EN 0x0003144
# define ACP_SW_AUDIO2_RX_EN_STATUS 0x0003148
# define ACP_SW_AUDIO2_RX_FRAME_FORMAT 0x000314c
# define ACP_SW_AUDIO2_RX_SAMPLEINTERVAL 0x0003150
# define ACP_SW_AUDIO2_RX_HCTRL 0x0003154
# define ACP_SW_AUDIO2_RX_OFFSET 0x0003158
# define ACP_SW_AUDIO2_RX_CHANNEL_ENABLE_DP0 0x000315c
# define ACP_SW_BPT_PORT_EN 0x0003160
# define ACP_SW_BPT_PORT_EN_STATUS 0x0003164
# define ACP_SW_BPT_PORT_FRAME_FORMAT 0x0003168
# define ACP_SW_BPT_PORT_SAMPLEINTERVAL 0x000316c
# define ACP_SW_BPT_PORT_HCTRL 0x0003170
# define ACP_SW_BPT_PORT_OFFSET 0x0003174
# define ACP_SW_BPT_PORT_CHANNEL_ENABLE 0x0003178
# define ACP_SW_BPT_PORT_FIRST_BYTE_ADDR 0x000317c
# define ACP_SW_CLK_RESUME_CTRL 0x0003180
# define ACP_SW_CLK_RESUME_DELAY_CNTR 0x0003184
# define ACP_SW_BUS_RESET_CTRL 0x0003188
# define ACP_SW_PRBS_ERR_STATUS 0x000318c
# define ACP_SW_IMM_CMD_UPPER_WORD 0x0003230
# define ACP_SW_IMM_CMD_LOWER_QWORD 0x0003234
# define ACP_SW_IMM_RESP_UPPER_WORD 0x0003238
# define ACP_SW_IMM_RESP_LOWER_QWORD 0x000323c
# define ACP_SW_IMM_CMD_STS 0x0003240
# define ACP_SW_BRA_BASE_ADDRESS 0x0003244
# define ACP_SW_BRA_TRANSFER_SIZE 0x0003248
# define ACP_SW_BRA_DMA_BUSY 0x000324c
# define ACP_SW_BRA_RESP 0x0003250
# define ACP_SW_BRA_RESP_FRAME_ADDR 0x0003254
# define ACP_SW_BRA_CURRENT_TRANSFER_SIZE 0x0003258
# define ACP_SW_STATE_CHANGE_STATUS_0TO7 0x000325c
# define ACP_SW_STATE_CHANGE_STATUS_8TO11 0x0003260
# define ACP_SW_STATE_CHANGE_STATUS_MASK_0TO7 0x0003264
# define ACP_SW_STATE_CHANGE_STATUS_MASK_8TO11 0x0003268
# define ACP_SW_CLK_FREQUENCY_CTRL 0x000326c
# define ACP_SW_ERROR_INTR_MASK 0x0003270
# define ACP_SW_PHY_TEST_MODE_DATA_OFF 0x0003274
# define ACP_DELAY_US 10
# define AMD_SDW_TIMEOUT 1000
# define AMD_SDW_DEFAULT_CLK_FREQ 12000000
# define AMD_SDW_MCP_RESP_ACK BIT(0)
# define AMD_SDW_MCP_RESP_NACK BIT(1)
# define AMD_SDW_MCP_RESP_RDATA GENMASK(14, 7)
# define AMD_SDW_MCP_CMD_SSP_TAG BIT(31)
# define AMD_SDW_MCP_CMD_COMMAND GENMASK(14, 12)
# define AMD_SDW_MCP_CMD_DEV_ADDR GENMASK(11, 8)
# define AMD_SDW_MCP_CMD_REG_ADDR_HIGH GENMASK(7, 0)
# define AMD_SDW_MCP_CMD_REG_ADDR_LOW GENMASK(31, 24)
# define AMD_SDW_MCP_CMD_REG_DATA GENMASK(14, 7)
# define AMD_SDW_MCP_SLAVE_STAT_0_3 GENMASK(14, 7)
# define AMD_SDW_MCP_SLAVE_STAT_4_11 GENMASK_ULL(39, 24)
# define AMD_SDW_MCP_SLAVE_STATUS_MASK GENMASK(1, 0)
# define AMD_SDW_MCP_SLAVE_STATUS_BITS GENMASK(3, 2)
# define AMD_SDW_MCP_SLAVE_STATUS_8TO_11 GENMASK_ULL(15, 0)
# define AMD_SDW_MCP_SLAVE_STATUS_VALID_MASK(x) BIT(((x) * 4))
# define AMD_SDW_MCP_SLAVE_STAT_SHIFT_MASK(x) (((x) * 4) + 1)
# define AMD_SDW_MASTER_SUSPEND_DELAY_MS 2000
# define AMD_SDW_QUIRK_MASK_BUS_ENABLE BIT(0)
# define AMD_SDW_IMM_RES_VALID 1
# define AMD_SDW_IMM_CMD_BUSY 2
# define AMD_SDW_ENABLE 1
# define AMD_SDW_DISABLE 0
# define AMD_SDW_BUS_RESET_CLEAR_REQ 0
# define AMD_SDW_BUS_RESET_REQ 1
# define AMD_SDW_BUS_RESET_DONE 2
# define AMD_SDW_BUS_BASE_FREQ 24000000
# define AMD_SDW0_EXT_INTR_MASK 0x200000
# define AMD_SDW1_EXT_INTR_MASK 4
# define AMD_SDW_IRQ_MASK_0TO7 0x77777777
# define AMD_SDW_IRQ_MASK_8TO11 0x000d7777
# define AMD_SDW_IRQ_ERROR_MASK 0xff
# define AMD_SDW_MAX_FREQ_NUM 1
# define AMD_SDW0_MAX_TX_PORTS 3
# define AMD_SDW0_MAX_RX_PORTS 3
# define AMD_SDW1_MAX_TX_PORTS 1
# define AMD_SDW1_MAX_RX_PORTS 1
# define AMD_SDW0_MAX_DAI 6
# define AMD_SDW1_MAX_DAI 2
# define AMD_SDW_SLAVE_0_ATTACHED 5
# define AMD_SDW_SSP_COUNTER_VAL 3
# define AMD_DPN_FRAME_FMT_PFM GENMASK(1, 0)
# define AMD_DPN_FRAME_FMT_PDM GENMASK(3, 2)
# define AMD_DPN_FRAME_FMT_BLK_PKG_MODE BIT(4)
# define AMD_DPN_FRAME_FMT_BLK_GRP_CTRL GENMASK(6, 5)
# define AMD_DPN_FRAME_FMT_WORD_LEN GENMASK(12, 7)
# define AMD_DPN_FRAME_FMT_PCM_OR_PDM BIT(13)
# define AMD_DPN_HCTRL_HSTOP GENMASK(3, 0)
# define AMD_DPN_HCTRL_HSTART GENMASK(7, 4)
# define AMD_DPN_OFFSET_CTRL_1 GENMASK(7, 0)
# define AMD_DPN_OFFSET_CTRL_2 GENMASK(15, 8)
# define AMD_DPN_CH_EN_LCTRL GENMASK(2, 0)
# define AMD_DPN_CH_EN_CHMASK GENMASK(10, 3)
# define AMD_SDW_STAT_MAX_RETRY_COUNT 100
# define AMD_SDW0_PAD_PULLDOWN_CTRL_ENABLE_MASK 0x7f9f
# define AMD_SDW1_PAD_PULLDOWN_CTRL_ENABLE_MASK 0x7ffa
# define AMD_SDW0_PAD_PULLDOWN_CTRL_DISABLE_MASK 0x60
# define AMD_SDW1_PAD_PULLDOWN_CTRL_DISABLE_MASK 5
# define AMD_SDW0_PAD_KEEPER_EN_MASK 1
# define AMD_SDW1_PAD_KEEPER_EN_MASK 0x10
# define AMD_SDW0_PAD_KEEPER_DISABLE_MASK 0x1e
# define AMD_SDW1_PAD_KEEPER_DISABLE_MASK 0xf
2023-03-21 08:08:58 +03:00
# define AMD_SDW_PREQ_INTR_STAT BIT(19)
2023-03-21 08:08:59 +03:00
# define AMD_SDW_CLK_STOP_DONE 1
# define AMD_SDW_CLK_RESUME_REQ 2
# define AMD_SDW_CLK_RESUME_DONE 3
2023-03-21 08:09:00 +03:00
# define AMD_SDW_WAKE_STAT_MASK BIT(16)
2023-03-21 08:08:55 +03:00
static u32 amd_sdw_freq_tbl [ AMD_SDW_MAX_FREQ_NUM ] = {
AMD_SDW_DEFAULT_CLK_FREQ ,
} ;
struct sdw_manager_dp_reg {
u32 frame_fmt_reg ;
u32 sample_int_reg ;
u32 hctrl_dp0_reg ;
u32 offset_reg ;
u32 lane_ctrl_ch_en_reg ;
} ;
2023-03-21 08:08:56 +03:00
/*
* SDW0 Manager instance registers 6 CPU DAI ( 3 TX & 3 RX Ports )
* whereas SDW1 Manager Instance registers 2 CPU DAI ( one TX & one RX port )
* Below is the CPU DAI < - > Manager port number mapping
* i . e SDW0 Pin0 - > port number 0 - > AUDIO0 TX
* SDW0 Pin1 - > Port number 1 - > AUDIO1 TX
* SDW0 Pin2 - > Port number 2 - > AUDIO2 TX
* SDW0 Pin3 - > port number 3 - > AUDIO0 RX
* SDW0 Pin4 - > Port number 4 - > AUDIO1 RX
* SDW0 Pin5 - > Port number 5 - > AUDIO2 RX
* Whereas for SDW1 instance
* SDW1 Pin0 - > port number 0 - > AUDIO1 TX
* SDW1 Pin1 - > Port number 1 - > AUDIO1 RX
* Same mapping should be used for programming DMA controller registers in SoundWire DMA driver .
* i . e if AUDIO0 TX channel is selected then we need to use AUDIO0 TX registers for DMA programming
* in SoundWire DMA driver .
*/
2023-03-21 08:08:55 +03:00
static struct sdw_manager_dp_reg sdw0_manager_dp_reg [ AMD_SDW0_MAX_DAI ] = {
{ ACP_SW_AUDIO0_TX_FRAME_FORMAT , ACP_SW_AUDIO0_TX_SAMPLEINTERVAL , ACP_SW_AUDIO0_TX_HCTRL_DP0 ,
ACP_SW_AUDIO0_TX_OFFSET_DP0 , ACP_SW_AUDIO0_TX_CHANNEL_ENABLE_DP0 } ,
{ ACP_SW_AUDIO1_TX_FRAME_FORMAT , ACP_SW_AUDIO1_TX_SAMPLEINTERVAL , ACP_SW_AUDIO1_TX_HCTRL ,
ACP_SW_AUDIO1_TX_OFFSET , ACP_SW_AUDIO1_TX_CHANNEL_ENABLE_DP0 } ,
{ ACP_SW_AUDIO2_TX_FRAME_FORMAT , ACP_SW_AUDIO2_TX_SAMPLEINTERVAL , ACP_SW_AUDIO2_TX_HCTRL ,
ACP_SW_AUDIO2_TX_OFFSET , ACP_SW_AUDIO2_TX_CHANNEL_ENABLE_DP0 } ,
{ ACP_SW_AUDIO0_RX_FRAME_FORMAT , ACP_SW_AUDIO0_RX_SAMPLEINTERVAL , ACP_SW_AUDIO0_RX_HCTRL_DP0 ,
ACP_SW_AUDIO0_RX_OFFSET_DP0 , ACP_SW_AUDIO0_RX_CHANNEL_ENABLE_DP0 } ,
{ ACP_SW_AUDIO1_RX_FRAME_FORMAT , ACP_SW_AUDIO1_RX_SAMPLEINTERVAL , ACP_SW_AUDIO1_RX_HCTRL ,
ACP_SW_AUDIO1_RX_OFFSET , ACP_SW_AUDIO1_RX_CHANNEL_ENABLE_DP0 } ,
{ ACP_SW_AUDIO2_RX_FRAME_FORMAT , ACP_SW_AUDIO2_RX_SAMPLEINTERVAL , ACP_SW_AUDIO2_RX_HCTRL ,
ACP_SW_AUDIO2_RX_OFFSET , ACP_SW_AUDIO2_RX_CHANNEL_ENABLE_DP0 } ,
} ;
static struct sdw_manager_dp_reg sdw1_manager_dp_reg [ AMD_SDW1_MAX_DAI ] = {
{ ACP_SW_AUDIO1_TX_FRAME_FORMAT , ACP_SW_AUDIO1_TX_SAMPLEINTERVAL , ACP_SW_AUDIO1_TX_HCTRL ,
ACP_SW_AUDIO1_TX_OFFSET , ACP_SW_AUDIO1_TX_CHANNEL_ENABLE_DP0 } ,
{ ACP_SW_AUDIO1_RX_FRAME_FORMAT , ACP_SW_AUDIO1_RX_SAMPLEINTERVAL , ACP_SW_AUDIO1_RX_HCTRL ,
ACP_SW_AUDIO1_RX_OFFSET , ACP_SW_AUDIO1_RX_CHANNEL_ENABLE_DP0 }
} ;
static struct sdw_manager_reg_mask sdw_manager_reg_mask_array [ 2 ] = {
{
AMD_SDW0_PAD_KEEPER_EN_MASK ,
AMD_SDW0_PAD_PULLDOWN_CTRL_ENABLE_MASK ,
AMD_SDW0_EXT_INTR_MASK
} ,
{
AMD_SDW1_PAD_KEEPER_EN_MASK ,
AMD_SDW1_PAD_PULLDOWN_CTRL_ENABLE_MASK ,
AMD_SDW1_EXT_INTR_MASK
}
} ;
# endif