cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

axg-tdm.h (1969B)


      1/* SPDX-License-Identifier: (GPL-2.0 OR MIT)
      2 *
      3 * Copyright (c) 2018 Baylibre SAS.
      4 * Author: Jerome Brunet <jbrunet@baylibre.com>
      5 */
      6
      7#ifndef _MESON_AXG_TDM_H
      8#define _MESON_AXG_TDM_H
      9
     10#include <linux/clk.h>
     11#include <linux/regmap.h>
     12#include <sound/pcm.h>
     13#include <sound/soc.h>
     14#include <sound/soc-dai.h>
     15
     16#define AXG_TDM_NUM_LANES	4
     17#define AXG_TDM_CHANNEL_MAX	128
     18#define AXG_TDM_RATES		(SNDRV_PCM_RATE_5512 |		\
     19				 SNDRV_PCM_RATE_8000_192000)
     20#define AXG_TDM_FORMATS		(SNDRV_PCM_FMTBIT_S8 |		\
     21				 SNDRV_PCM_FMTBIT_S16_LE |	\
     22				 SNDRV_PCM_FMTBIT_S20_LE |	\
     23				 SNDRV_PCM_FMTBIT_S24_LE |	\
     24				 SNDRV_PCM_FMTBIT_S32_LE)
     25
     26struct axg_tdm_iface {
     27	struct clk *sclk;
     28	struct clk *lrclk;
     29	struct clk *mclk;
     30	unsigned long mclk_rate;
     31
     32	/* format is common to all the DAIs of the iface */
     33	unsigned int fmt;
     34	unsigned int slots;
     35	unsigned int slot_width;
     36
     37	/* For component wide symmetry */
     38	int rate;
     39};
     40
     41static inline bool axg_tdm_lrclk_invert(unsigned int fmt)
     42{
     43	return ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S) ^
     44		!!(fmt & (SND_SOC_DAIFMT_IB_IF | SND_SOC_DAIFMT_NB_IF));
     45}
     46
     47static inline bool axg_tdm_sclk_invert(unsigned int fmt)
     48{
     49	return fmt & (SND_SOC_DAIFMT_IB_IF | SND_SOC_DAIFMT_IB_NF);
     50}
     51
     52struct axg_tdm_stream {
     53	struct axg_tdm_iface *iface;
     54	struct list_head formatter_list;
     55	struct mutex lock;
     56	unsigned int channels;
     57	unsigned int width;
     58	unsigned int physical_width;
     59	u32 *mask;
     60	bool ready;
     61};
     62
     63struct axg_tdm_stream *axg_tdm_stream_alloc(struct axg_tdm_iface *iface);
     64void axg_tdm_stream_free(struct axg_tdm_stream *ts);
     65int axg_tdm_stream_start(struct axg_tdm_stream *ts);
     66void axg_tdm_stream_stop(struct axg_tdm_stream *ts);
     67
     68static inline int axg_tdm_stream_reset(struct axg_tdm_stream *ts)
     69{
     70	axg_tdm_stream_stop(ts);
     71	return axg_tdm_stream_start(ts);
     72}
     73
     74int axg_tdm_set_tdm_slots(struct snd_soc_dai *dai, u32 *tx_mask,
     75			  u32 *rx_mask, unsigned int slots,
     76			  unsigned int slot_width);
     77
     78#endif /* _MESON_AXG_TDM_H */