/*
 * dbmdx-interface.h  --  DBMDX interface definitions
 *
 * Copyright (C) 2014 DSP Group
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#ifndef _DBMDX_H
#define _DBMDX_H

#include <linux/device.h>
#include <sound/soc.h>

#define MAX_NUM_OF_INTERFACES 4

enum dbmdx_va_speeds {
	DBMDX_VA_SPEED_NORMAL = 0,
	DBMDX_VA_SPEED_BUFFERING,
	DBMDX_VA_SPEED_MAX,
	DBMDX_VA_NR_OF_SPEEDS,
};

struct va_speed {
	u32	cfg;
	u32	uart_baud;
	u32	i2c_rate;
	u32	spi_rate;
};

enum dbmdx_clocks {
	DBMDX_CLK_CONSTANT = 0,
	DBMDX_CLK_MASTER,
	DBMDX_NR_OF_CLKS,
};

enum dbmdx_interface_type {
	DBMDX_PREBOOT_INTERFACE = 0,
	DBMDX_BOOT_INTERFACE,
	DBMDX_CMD_INTERFACE,
	DBMDX_DEBUG_INTERFACE,
	DBMDX_MAX_INTERFACES,
};

struct dbmdx_platform_data {
	int				gpio_wakeup;
	int				gpio_reset;
	int				gpio_sv;
	int				gpio_d2strap1;
	int				gpio_d2strap1_rst_val;
	int				wakeup_disabled;
	int				wakeup_set_value;
	int				send_wakeup_seq;
	int				use_gpio_for_wakeup;

	const char			*cd_interfaces[MAX_NUM_OF_INTERFACES];
	const char			*va_firmware_name;
	const char			*va_preboot_firmware_name;
	const char			*vqe_firmware_name;
	const char			*vqe_non_overlay_firmware_name;
#ifdef DBMDX_VA_NS_SUPPORT
	const char			*va_asrp_params_firmware_name;
#endif
	int				firmware_id;

	int				clock_rates[DBMDX_NR_OF_CLKS];

	int				feature_va;
	int				feature_vqe;
	int				feature_fw_overlay;

	unsigned int			va_cfg_values;
	u32				*va_cfg_value;

#ifdef DBMDX_VA_NS_SUPPORT
	unsigned int			va_ns_supported;
	unsigned int			mic_config_source;
	unsigned int			va_ns_cfg_values;
	unsigned int			va_ns_num_of_configs;
	u32				*va_ns_cfg_value;
#endif

	unsigned int			vqe_cfg_values;
	u32				*vqe_cfg_value;
	unsigned int			vqe_modes_values;
	u32				*vqe_modes_value;

	int				auto_buffering;
	int				auto_detection;
	int				detection_after_buffering;
	int				send_uevent_on_detection;
	int				send_uevent_after_buffering;
	int				uart_low_speed_enabled;
	u32				va_backlog_length;
	u32				va_backlog_length_okg;

	int				max_detection_buffer_size;

	int				detection_buffer_channels;
	u32				min_samples_chunk_size;
	u32				pcm_streaming_mode;
	int				buffering_timeout;
	u32				retrigger_interval_sec;

	struct va_speed	va_speed_cfg[DBMDX_VA_NR_OF_SPEEDS];
	u32				va_mic_config[5];
	u32				va_initial_mic_config;
	u32				va_mic_gain_config[3];
	int				va_audio_channels;
	u32				vqe_tdm_bypass_config;
	unsigned int			va_buffering_pcm_rate;

	unsigned int			va_recovery_disabled;
	u32				multi_interface_support;
	u32				boot_options;
	u32				amodel_options;

	int	va_interfaces[DBMDX_MAX_INTERFACES];
	int	vqe_interfaces[DBMDX_MAX_INTERFACES];

};

int dbmdx_get_samples(struct snd_soc_component *component,
	char *buffer, unsigned int samples);
int dbmdx_component_lock(struct snd_soc_component *component);
int dbmdx_start_pcm_streaming(struct snd_soc_component *component,
	struct snd_pcm_substream *substream);
int dbmdx_stop_pcm_streaming(struct snd_soc_component *component);
int dbmdx_component_unlock(struct snd_soc_component *component);

#endif