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
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * tegra_cif.h - TEGRA Audio CIF Programming
 *
 * Copyright (c) 2020 NVIDIA CORPORATION.  All rights reserved.
 *
 */
 
#ifndef __TEGRA_CIF_H__
#define __TEGRA_CIF_H__
 
#include <linux/regmap.h>
 
#define TEGRA_ACIF_CTRL_FIFO_TH_SHIFT        24
#define TEGRA_ACIF_CTRL_AUDIO_CH_SHIFT        20
#define TEGRA_ACIF_CTRL_CLIENT_CH_SHIFT        16
#define TEGRA_ACIF_CTRL_AUDIO_BITS_SHIFT    12
#define TEGRA_ACIF_CTRL_CLIENT_BITS_SHIFT    8
#define TEGRA_ACIF_CTRL_EXPAND_SHIFT        6
#define TEGRA_ACIF_CTRL_STEREO_CONV_SHIFT    4
#define TEGRA_ACIF_CTRL_REPLICATE_SHIFT        3
#define TEGRA_ACIF_CTRL_TRUNCATE_SHIFT        1
#define TEGRA_ACIF_CTRL_MONO_CONV_SHIFT        0
 
/* AUDIO/CLIENT_BITS values */
#define TEGRA_ACIF_BITS_8            1
#define TEGRA_ACIF_BITS_16            3
#define TEGRA_ACIF_BITS_24            5
#define TEGRA_ACIF_BITS_32            7
 
#define TEGRA_ACIF_UPDATE_MASK            0x3ffffffb
 
struct tegra_cif_conf {
   unsigned int threshold;
   unsigned int audio_ch;
   unsigned int client_ch;
   unsigned int audio_bits;
   unsigned int client_bits;
   unsigned int expand;
   unsigned int stereo_conv;
   unsigned int replicate;
   unsigned int truncate;
   unsigned int mono_conv;
};
 
static inline void tegra_set_cif(struct regmap *regmap, unsigned int reg,
                struct tegra_cif_conf *conf)
{
   unsigned int value;
 
   value = (conf->threshold << TEGRA_ACIF_CTRL_FIFO_TH_SHIFT) |
       ((conf->audio_ch - 1) << TEGRA_ACIF_CTRL_AUDIO_CH_SHIFT) |
       ((conf->client_ch - 1) << TEGRA_ACIF_CTRL_CLIENT_CH_SHIFT) |
       (conf->audio_bits << TEGRA_ACIF_CTRL_AUDIO_BITS_SHIFT) |
       (conf->client_bits << TEGRA_ACIF_CTRL_CLIENT_BITS_SHIFT) |
       (conf->expand << TEGRA_ACIF_CTRL_EXPAND_SHIFT) |
       (conf->stereo_conv << TEGRA_ACIF_CTRL_STEREO_CONV_SHIFT) |
       (conf->replicate << TEGRA_ACIF_CTRL_REPLICATE_SHIFT) |
       (conf->truncate << TEGRA_ACIF_CTRL_TRUNCATE_SHIFT) |
       (conf->mono_conv << TEGRA_ACIF_CTRL_MONO_CONV_SHIFT);
 
   regmap_update_bits(regmap, reg, TEGRA_ACIF_UPDATE_MASK, value);
}
 
#endif