0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef __TEGRA_CIF_H__
0010 #define __TEGRA_CIF_H__
0011
0012 #include <linux/regmap.h>
0013
0014 #define TEGRA_ACIF_CTRL_FIFO_TH_SHIFT 24
0015 #define TEGRA_ACIF_CTRL_AUDIO_CH_SHIFT 20
0016 #define TEGRA_ACIF_CTRL_CLIENT_CH_SHIFT 16
0017 #define TEGRA_ACIF_CTRL_AUDIO_BITS_SHIFT 12
0018 #define TEGRA_ACIF_CTRL_CLIENT_BITS_SHIFT 8
0019 #define TEGRA_ACIF_CTRL_EXPAND_SHIFT 6
0020 #define TEGRA_ACIF_CTRL_STEREO_CONV_SHIFT 4
0021 #define TEGRA_ACIF_CTRL_REPLICATE_SHIFT 3
0022 #define TEGRA_ACIF_CTRL_TRUNCATE_SHIFT 1
0023 #define TEGRA_ACIF_CTRL_MONO_CONV_SHIFT 0
0024
0025
0026 #define TEGRA_ACIF_BITS_8 1
0027 #define TEGRA_ACIF_BITS_16 3
0028 #define TEGRA_ACIF_BITS_24 5
0029 #define TEGRA_ACIF_BITS_32 7
0030
0031 #define TEGRA_ACIF_UPDATE_MASK 0x3ffffffb
0032
0033 struct tegra_cif_conf {
0034 unsigned int threshold;
0035 unsigned int audio_ch;
0036 unsigned int client_ch;
0037 unsigned int audio_bits;
0038 unsigned int client_bits;
0039 unsigned int expand;
0040 unsigned int stereo_conv;
0041 unsigned int replicate;
0042 unsigned int truncate;
0043 unsigned int mono_conv;
0044 };
0045
0046 static inline void tegra_set_cif(struct regmap *regmap, unsigned int reg,
0047 struct tegra_cif_conf *conf)
0048 {
0049 unsigned int value;
0050
0051 value = (conf->threshold << TEGRA_ACIF_CTRL_FIFO_TH_SHIFT) |
0052 ((conf->audio_ch - 1) << TEGRA_ACIF_CTRL_AUDIO_CH_SHIFT) |
0053 ((conf->client_ch - 1) << TEGRA_ACIF_CTRL_CLIENT_CH_SHIFT) |
0054 (conf->audio_bits << TEGRA_ACIF_CTRL_AUDIO_BITS_SHIFT) |
0055 (conf->client_bits << TEGRA_ACIF_CTRL_CLIENT_BITS_SHIFT) |
0056 (conf->expand << TEGRA_ACIF_CTRL_EXPAND_SHIFT) |
0057 (conf->stereo_conv << TEGRA_ACIF_CTRL_STEREO_CONV_SHIFT) |
0058 (conf->replicate << TEGRA_ACIF_CTRL_REPLICATE_SHIFT) |
0059 (conf->truncate << TEGRA_ACIF_CTRL_TRUNCATE_SHIFT) |
0060 (conf->mono_conv << TEGRA_ACIF_CTRL_MONO_CONV_SHIFT);
0061
0062 regmap_update_bits(regmap, reg, TEGRA_ACIF_UPDATE_MASK, value);
0063 }
0064
0065 #endif