/*
 * sound/soc/amlogic/auge/pdm_hw.h
 *
 * Copyright (C) 2017 Amlogic, Inc. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 */

#ifndef __AML_PDM_HW_H__
#define __AML_PDM_HW_H__
#include "audio_io.h"

#define PDM_CHANNELS_MAX		8 /* 8ch pdm in */
#define PDM_LANE_MAX            4 /* 4 data pins, for 8ch maxs*/

struct pdm_info {
	int bitdepth;
	int channels;
	int lane_masks;

	int dclk_idx;  /* mapping for dclk value */
	int bypass;    /* bypass all filter, capture raw data */
};

extern void aml_pdm_ctrl(struct pdm_info *info);

extern void aml_pdm_arb_config(struct aml_audio_controller *actrl);

extern int aml_pmd_set_HPF_filter_parameters(void *array);

extern void aml_pdm_filter_ctrl(int osr, int set);

extern void pdm_enable(int is_enable);

extern void pdm_fifo_reset(void);

extern int pdm_get_mute_value(void);
extern void pdm_set_mute_value(int val);
extern int pdm_get_mute_channel(void);
extern void pdm_set_mute_channel(int mute_chmask);

extern void pdm_init_truncate_data(int freq);

extern void pdm_train_en(bool en);
extern void pdm_train_clr(void);
extern int pdm_train_sts(void);

extern int pdm_hcic_shift_gain;
extern int pdm_dclk;

#endif /*__AML_PDM_HW_H__*/
