1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
---|---|
2 | /* |
3 | * tegra_cif.h - TEGRA Audio CIF Programming |
4 | * |
5 | * Copyright (c) 2020 NVIDIA CORPORATION. All rights reserved. |
6 | * |
7 | */ |
8 | |
9 | #ifndef __TEGRA_CIF_H__ |
10 | #define __TEGRA_CIF_H__ |
11 | |
12 | #include <linux/regmap.h> |
13 | |
14 | #define TEGRA_ACIF_CTRL_FIFO_TH_SHIFT 24 |
15 | #define TEGRA_ACIF_CTRL_AUDIO_CH_SHIFT 20 |
16 | #define TEGRA_ACIF_CTRL_CLIENT_CH_SHIFT 16 |
17 | #define TEGRA_ACIF_CTRL_AUDIO_BITS_SHIFT 12 |
18 | #define TEGRA_ACIF_CTRL_CLIENT_BITS_SHIFT 8 |
19 | #define TEGRA_ACIF_CTRL_EXPAND_SHIFT 6 |
20 | #define TEGRA_ACIF_CTRL_STEREO_CONV_SHIFT 4 |
21 | #define TEGRA_ACIF_CTRL_REPLICATE_SHIFT 3 |
22 | #define TEGRA_ACIF_CTRL_TRUNCATE_SHIFT 1 |
23 | #define TEGRA_ACIF_CTRL_MONO_CONV_SHIFT 0 |
24 | |
25 | /* AUDIO/CLIENT_BITS values */ |
26 | #define TEGRA_ACIF_BITS_8 1 |
27 | #define TEGRA_ACIF_BITS_16 3 |
28 | #define TEGRA_ACIF_BITS_24 5 |
29 | #define TEGRA_ACIF_BITS_32 7 |
30 | |
31 | #define TEGRA_ACIF_UPDATE_MASK 0x3ffffffb |
32 | |
33 | struct tegra_cif_conf { |
34 | unsigned int threshold; |
35 | unsigned int audio_ch; |
36 | unsigned int client_ch; |
37 | unsigned int audio_bits; |
38 | unsigned int client_bits; |
39 | unsigned int expand; |
40 | unsigned int stereo_conv; |
41 | unsigned int replicate; |
42 | unsigned int truncate; |
43 | unsigned int mono_conv; |
44 | }; |
45 | |
46 | static inline void tegra_set_cif(struct regmap *regmap, unsigned int reg, |
47 | struct tegra_cif_conf *conf) |
48 | { |
49 | unsigned int value; |
50 | |
51 | value = (conf->threshold << TEGRA_ACIF_CTRL_FIFO_TH_SHIFT) | |
52 | ((conf->audio_ch - 1) << TEGRA_ACIF_CTRL_AUDIO_CH_SHIFT) | |
53 | ((conf->client_ch - 1) << TEGRA_ACIF_CTRL_CLIENT_CH_SHIFT) | |
54 | (conf->audio_bits << TEGRA_ACIF_CTRL_AUDIO_BITS_SHIFT) | |
55 | (conf->client_bits << TEGRA_ACIF_CTRL_CLIENT_BITS_SHIFT) | |
56 | (conf->expand << TEGRA_ACIF_CTRL_EXPAND_SHIFT) | |
57 | (conf->stereo_conv << TEGRA_ACIF_CTRL_STEREO_CONV_SHIFT) | |
58 | (conf->replicate << TEGRA_ACIF_CTRL_REPLICATE_SHIFT) | |
59 | (conf->truncate << TEGRA_ACIF_CTRL_TRUNCATE_SHIFT) | |
60 | (conf->mono_conv << TEGRA_ACIF_CTRL_MONO_CONV_SHIFT); |
61 | |
62 | regmap_update_bits(map: regmap, reg, TEGRA_ACIF_UPDATE_MASK, val: value); |
63 | } |
64 | |
65 | #endif |
66 |