hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * tegra210_i2s.h - Definitions for Tegra210 I2S driver
 *
 * Copyright (c) 2020 NVIDIA CORPORATION. All rights reserved.
 *
 */
 
#ifndef __TEGRA210_I2S_H__
#define __TEGRA210_I2S_H__
 
/* Register offsets from I2S*_BASE */
#define TEGRA210_I2S_RX_ENABLE            0x0
#define TEGRA210_I2S_RX_SOFT_RESET        0x4
#define TEGRA210_I2S_RX_STATUS            0x0c
#define TEGRA210_I2S_RX_INT_STATUS        0x10
#define TEGRA210_I2S_RX_INT_MASK        0x14
#define TEGRA210_I2S_RX_INT_SET            0x18
#define TEGRA210_I2S_RX_INT_CLEAR        0x1c
#define TEGRA210_I2S_RX_CIF_CTRL        0x20
#define TEGRA210_I2S_RX_CTRL            0x24
#define TEGRA210_I2S_RX_SLOT_CTRL        0x28
#define TEGRA210_I2S_RX_CLK_TRIM        0x2c
#define TEGRA210_I2S_RX_CYA            0x30
#define TEGRA210_I2S_RX_CIF_FIFO_STATUS        0x34
#define TEGRA210_I2S_TX_ENABLE            0x40
#define TEGRA210_I2S_TX_SOFT_RESET        0x44
#define TEGRA210_I2S_TX_STATUS            0x4c
#define TEGRA210_I2S_TX_INT_STATUS        0x50
#define TEGRA210_I2S_TX_INT_MASK        0x54
#define TEGRA210_I2S_TX_INT_SET            0x58
#define TEGRA210_I2S_TX_INT_CLEAR        0x5c
#define TEGRA210_I2S_TX_CIF_CTRL        0x60
#define TEGRA210_I2S_TX_CTRL            0x64
#define TEGRA210_I2S_TX_SLOT_CTRL        0x68
#define TEGRA210_I2S_TX_CLK_TRIM        0x6c
#define TEGRA210_I2S_TX_CYA            0x70
#define TEGRA210_I2S_TX_CIF_FIFO_STATUS        0x74
#define TEGRA210_I2S_ENABLE            0x80
#define TEGRA210_I2S_SOFT_RESET            0x84
#define TEGRA210_I2S_CG                0x88
#define TEGRA210_I2S_STATUS            0x8c
#define TEGRA210_I2S_INT_STATUS            0x90
#define TEGRA210_I2S_CTRL            0xa0
#define TEGRA210_I2S_TIMING            0xa4
#define TEGRA210_I2S_SLOT_CTRL            0xa8
#define TEGRA210_I2S_CLK_TRIM            0xac
#define TEGRA210_I2S_CYA            0xb0
 
/* Bit fields, shifts and masks */
#define I2S_DATA_SHIFT                8
#define I2S_CTRL_DATA_OFFSET_MASK        (0x7ff << I2S_DATA_SHIFT)
 
#define I2S_EN_SHIFT                0
#define I2S_EN_MASK                BIT(I2S_EN_SHIFT)
#define I2S_EN                    BIT(I2S_EN_SHIFT)
 
#define I2S_FSYNC_WIDTH_SHIFT            24
#define I2S_CTRL_FSYNC_WIDTH_MASK        (0xff << I2S_FSYNC_WIDTH_SHIFT)
 
#define I2S_POS_EDGE                0
#define I2S_NEG_EDGE                1
#define I2S_EDGE_SHIFT                20
#define I2S_CTRL_EDGE_CTRL_MASK            BIT(I2S_EDGE_SHIFT)
#define I2S_CTRL_EDGE_CTRL_POS_EDGE        (I2S_POS_EDGE << I2S_EDGE_SHIFT)
#define I2S_CTRL_EDGE_CTRL_NEG_EDGE        (I2S_NEG_EDGE << I2S_EDGE_SHIFT)
 
#define I2S_FMT_LRCK                0
#define I2S_FMT_FSYNC                1
#define I2S_FMT_SHIFT                12
#define I2S_CTRL_FRAME_FMT_MASK            (7 << I2S_FMT_SHIFT)
#define I2S_CTRL_FRAME_FMT_LRCK_MODE        (I2S_FMT_LRCK << I2S_FMT_SHIFT)
#define I2S_CTRL_FRAME_FMT_FSYNC_MODE        (I2S_FMT_FSYNC << I2S_FMT_SHIFT)
 
#define I2S_CTRL_MASTER_EN_SHIFT        10
#define I2S_CTRL_MASTER_EN_MASK            BIT(I2S_CTRL_MASTER_EN_SHIFT)
#define I2S_CTRL_MASTER_EN            BIT(I2S_CTRL_MASTER_EN_SHIFT)
 
#define I2S_CTRL_LRCK_POL_SHIFT            9
#define I2S_CTRL_LRCK_POL_MASK            BIT(I2S_CTRL_LRCK_POL_SHIFT)
#define I2S_CTRL_LRCK_POL_LOW            (0 << I2S_CTRL_LRCK_POL_SHIFT)
#define I2S_CTRL_LRCK_POL_HIGH            BIT(I2S_CTRL_LRCK_POL_SHIFT)
 
#define I2S_CTRL_LPBK_SHIFT            8
#define I2S_CTRL_LPBK_MASK            BIT(I2S_CTRL_LPBK_SHIFT)
#define I2S_CTRL_LPBK_EN            BIT(I2S_CTRL_LPBK_SHIFT)
 
#define I2S_BITS_8                1
#define I2S_BITS_16                3
#define I2S_BITS_32                7
#define I2S_CTRL_BIT_SIZE_MASK            0x7
 
#define I2S_TIMING_CH_BIT_CNT_MASK        0x7ff
#define I2S_TIMING_CH_BIT_CNT_SHIFT        0
 
#define I2S_SOFT_RESET_SHIFT            0
#define I2S_SOFT_RESET_MASK            BIT(I2S_SOFT_RESET_SHIFT)
#define I2S_SOFT_RESET_EN            BIT(I2S_SOFT_RESET_SHIFT)
 
#define I2S_RX_FIFO_DEPTH            64
#define DEFAULT_I2S_RX_FIFO_THRESHOLD        3
 
#define DEFAULT_I2S_SLOT_MASK            0xffff
 
enum tegra210_i2s_path {
   I2S_RX_PATH,
   I2S_TX_PATH,
   I2S_PATHS,
};
 
struct tegra210_i2s {
   struct clk *clk_i2s;
   struct clk *clk_sync_input;
   struct regmap *regmap;
   unsigned int stereo_to_mono[I2S_PATHS];
   unsigned int mono_to_stereo[I2S_PATHS];
   unsigned int dai_fmt;
   unsigned int fsync_width;
   unsigned int bclk_ratio;
   unsigned int tx_mask;
   unsigned int rx_mask;
   unsigned int rx_fifo_th;
   bool loopback;
};
 
#endif