/*
 * Copyright (c) 2015-2018, The Linux Foundation. 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 version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * 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 _MSM_DBA_H
#define _MSM_DBA_H

#include <linux/types.h>
#include <linux/bitops.h>

#define MSM_DBA_CHIP_NAME_MAX_LEN 20
#define MSM_DBA_CLIENT_NAME_LEN   20

#define MSM_DBA_DEFER_PROPERTY_FLAG 0x1
#define MSM_DBA_ASYNC_FLAG          0x2

/**
 * enum msm_dba_callback_event - event types for callback notification
 * @MSM_DBA_CB_REMOTE_INT: Event associated with remote devices on an interface
 *			   that supports a bi-directional control channel.
 * @MSM_DBA_CB_HDCP_LINK_AUTHENTICATED: Authentication session is successful.
 *					The link is authenticated and encryption
 *					can be enabled if not enabled already.
 * @MSM_DBA_CB_HDCP_LINK_UNAUTHENTICATED: A previously authenticated link has
 *					  failed. The content on the interface
 *					  is no longer secure.
 * @MSM_DBA_CB_HPD_CONNECT: Detected a cable connect event.
 * @MSM_DBA_CB_HPD_DISCONNECT: Detected a cable disconnect event.
 * @MSM_DBA_CB_VIDEO_FAILURE: Detected a failure with respect to video data on
 *			      the interface. This is a generic failure and
 *			      client should request a debug dump to debug the
 *			      issue. Client can also attempt a reset to recover
 *			      the device.
 * @MSM_DBA_CB_AUDIO_FAILURE: Detected a failure with respect to audio data on
 *			      the interface. This is a generic failure and
 *			      client should request a debug dump. Client can
 *			      also attempt a reset to recover the device.
 * @MSM_DBA_CB_CEC_WRITE_SUCCESS: The asynchronous CEC write request is
 *				  successful.
 * @MSM_DBA_CB_CEC_WRITE_FAIL: The asynchronous CEC write request failed.
 * @MSM_DBA_CB_CEC_READ_PENDING: There is a pending CEC read message.
 * @MSM_DBA_CB_PRE_RESET: This callback is called just before the device is
 *			  being reset.
 * @MSM_DBA_CB_POST_RESET: This callback is called after device reset is
 *			   complete and the driver has applied back all the
 *			   properties.
 *
 * Clients for this driver can register for receiving callbacks for specific
 * events. This enum defines the type of events supported by the driver. An
 * event mask is typically used to denote multiple events.
 */
enum msm_dba_callback_event {
	MSM_DBA_CB_REMOTE_INT = BIT(0),
	MSM_DBA_CB_HDCP_LINK_AUTHENTICATED = BIT(1),
	MSM_DBA_CB_HDCP_LINK_UNAUTHENTICATED = BIT(2),
	MSM_DBA_CB_HPD_CONNECT = BIT(3),
	MSM_DBA_CB_HPD_DISCONNECT = BIT(4),
	MSM_DBA_CB_VIDEO_FAILURE = BIT(5),
	MSM_DBA_CB_AUDIO_FAILURE = BIT(6),
	MSM_DBA_CB_CEC_WRITE_SUCCESS = BIT(7),
	MSM_DBA_CB_CEC_WRITE_FAIL = BIT(8),
	MSM_DBA_CB_CEC_READ_PENDING = BIT(9),
	MSM_DBA_CB_PRE_RESET = BIT(10),
	MSM_DBA_CB_POST_RESET = BIT(11),
};

/**
 * enum msm_dba_audio_interface_type - audio interface type
 * @MSM_DBA_AUDIO_I2S_INTERFACE: I2S interface for audio
 * @MSM_DBA_AUDIO_SPDIF_INTERFACE: SPDIF interface for audio
 */
enum msm_dba_audio_interface_type {
	MSM_DBA_AUDIO_I2S_INTERFACE = BIT(0),
	MSM_DBA_AUDIO_SPDIF_INTERFACE = BIT(1),
};

/**
 * enum msm_dba_audio_format_type - audio format type
 * @MSM_DBA_AUDIO_FMT_UNCOMPRESSED_LPCM: uncompressed format
 * @MSM_DBA_AUDIO_FMT_COMPRESSED: compressed formats
 */
enum msm_dba_audio_format_type {
	MSM_DBA_AUDIO_FMT_UNCOMPRESSED_LPCM = BIT(0),
	MSM_DBA_AUDIO_FMT_COMPRESSED = BIT(1),
};

/**
 * enum msm_dba_audio_copyright_type - audio copyright
 * @MSM_DBA_AUDIO_COPYRIGHT_PROTECTED: copy right protected
 * @MSM_DBA_AUDIO_COPYRIGHT_NOT_PROTECTED: not copy right protected
 */
enum msm_dba_audio_copyright_type {
	MSM_DBA_AUDIO_COPYRIGHT_PROTECTED = BIT(0),
	MSM_DBA_AUDIO_COPYRIGHT_NOT_PROTECTED = BIT(1),
};

/**
 * enum msm_dba_audio_pre_emphasis_type - pre-emphasis
 * @MSM_DBA_AUDIO_NO_PRE_EMPHASIS: 2 audio channels w/o pre-emphasis
 * @MSM_DBA_AUDIO_PRE_EMPHASIS_50_15us: 2 audio channels with 50/15uS
 */
enum msm_dba_audio_pre_emphasis_type {
	MSM_DBA_AUDIO_NO_PRE_EMPHASIS = BIT(0),
	MSM_DBA_AUDIO_PRE_EMPHASIS_50_15us = BIT(1),
};

/**
 * enum msm_dba_audio_clock_accuracy - Audio Clock Accuracy
 * @MSM_DBA_AUDIO_CLOCK_ACCURACY_LVL1: normal accuracy +/-1000 x 10^-6
 * @MSM_DBA_AUDIO_CLOCK_ACCURACY_LVL2: high accuracy +/- 50 x 10^-6
 * @MSM_DBA_AUDIO_CLOCK_ACCURACY_LVL3: variable pitch shifted clock
 */
enum msm_dba_audio_clock_accuracy {
	MSM_DBA_AUDIO_CLOCK_ACCURACY_LVL1 = BIT(1),
	MSM_DBA_AUDIO_CLOCK_ACCURACY_LVL2 = BIT(0),
	MSM_DBA_AUDIO_CLOCK_ACCURACY_LVL3 = BIT(2),
};

/**
 * enum msm_dba_channel_status_source - CS override
 * @MSM_DBA_AUDIO_CS_SOURCE_I2S_STREAM: use channel status bits from I2S stream
 * @MSM_DBA_AUDIO_CS_SOURCE_REGISTERS: use channel status bits from registers
 */
enum msm_dba_channel_status_source {
	MSM_DBA_AUDIO_CS_SOURCE_I2S_STREAM,
	MSM_DBA_AUDIO_CS_SOURCE_REGISTERS
};

/**
 * enum msm_dba_audio_sampling_rates_type - audio sampling rates
 * @MSM_DBA_AUDIO_32KHZ: 32KHz sampling rate
 * @MSM_DBA_AUDIO_44P1KHZ: 44.1KHz sampling rate
 * @MSM_DBA_AUDIO_48KHZ: 48KHz sampling rate
 * @MSM_DBA_AUDIO_96KHZ: 96KHz sampling rate
 * @MSM_DBA_AUDIO_192KHZ: 192KHz sampling rate
 */
enum msm_dba_audio_sampling_rates_type {
	MSM_DBA_AUDIO_32KHZ = BIT(0),
	MSM_DBA_AUDIO_44P1KHZ = BIT(1),
	MSM_DBA_AUDIO_48KHZ = BIT(2),
	MSM_DBA_AUDIO_88P2KHZ = BIT(1),
	MSM_DBA_AUDIO_96KHZ = BIT(3),
	MSM_DBA_AUDIO_176P4KHZ = BIT(1),
	MSM_DBA_AUDIO_192KHZ = BIT(4),
};

/**
 * enum msm_dba_audio_word_bit_depth - audio word size
 * @MSM_DBA_AUDIO_WORD_16BIT: 16 bits per word
 * @MSM_DBA_AUDIO_WORD_24BIT: 24 bits per word
 * @MSM_DBA_AUDIO_WORD_32BIT: 32 bits per word
 */
enum msm_dba_audio_word_bit_depth {
	MSM_DBA_AUDIO_WORD_16BIT = BIT(1),
	MSM_DBA_AUDIO_WORD_24BIT = BIT(2),
	MSM_DBA_AUDIO_WORD_32BIT = BIT(3),
};

/**
 * enum msm_dba_audio_channel_count - audio channel count
 * @MSM_DBA_AUDIO_CHANNEL_2: 2 channel audio
 * @MSM_DBA_AUDIO_CHANNEL_4: 4 channel audio
 * @MSM_DBA_AUDIO_CHANNEL_8: 8 channel audio
 */
enum msm_dba_audio_channel_count {
	MSM_DBA_AUDIO_CHANNEL_2 = BIT(0),
	MSM_DBA_AUDIO_CHANNEL_4 = BIT(1),
	MSM_DBA_AUDIO_CHANNEL_8 = BIT(2),
};

/**
 * enum msm_dba_audio_i2s_format - i2s audio data format
 * @MSM_DBA_AUDIO_I2S_FMT_STANDARD: Standard format
 * @MSM_DBA_AUDIO_I2S_FMT_RIGHT_JUSTIFIED: i2s data is right justified
 * @MSM_DBA_AUDIO_I2S_FMT_LEFT_JUSTIFIED: i2s data is left justified
 * @MSM_DBA_AUDIO_I2S_FMT_AES3_DIRECT: AES signal format
 */
enum msm_dba_audio_i2s_format {
	MSM_DBA_AUDIO_I2S_FMT_STANDARD = 0,
	MSM_DBA_AUDIO_I2S_FMT_RIGHT_JUSTIFIED,
	MSM_DBA_AUDIO_I2S_FMT_LEFT_JUSTIFIED,
	MSM_DBA_AUDIO_I2S_FMT_AES3_DIRECT,
	MSM_DBA_AUDIO_I2S_FMT_MAX,
};

enum msm_dba_video_aspect_ratio {
	MSM_DBA_AR_UNKNOWN = 0,
	MSM_DBA_AR_4_3,
	MSM_DBA_AR_5_4,
	MSM_DBA_AR_16_9,
	MSM_DBA_AR_16_10,
	MSM_DBA_AR_64_27,
	MSM_DBA_AR_256_135,
	MSM_DBA_AR_MAX
};

enum msm_dba_audio_word_endian_type {
	MSM_DBA_AUDIO_WORD_LITTLE_ENDIAN = 0,
	MSM_DBA_AUDIO_WORD_BIG_ENDIAN,
	MSM_DBA_AUDIO_WORD_ENDIAN_MAX
};

/**
 * msm_dba_audio_op_mode - i2s audio operation mode
 * @MSM_DBA_AUDIO_MODE_MANUAL: Manual mode
 * @MSM_DBA_AUDIO_MODE_AUTOMATIC: Automatic mode
 */
enum msm_dba_audio_op_mode {
	MSM_DBA_AUDIO_MODE_MANUAL,
	MSM_DBA_AUDIO_MODE_AUTOMATIC,
};

/**
 * typedef *msm_dba_cb() - Prototype for callback function
 * @data: Pointer to user data provided with register API
 * @event: Event type associated with callback. This can be a bitmask.
 */
typedef void (*msm_dba_cb)(void *data, enum msm_dba_callback_event event);

/**
 * struct msm_dba_reg_info - Client information used with register API
 * @client_name: Name of the client for debug purposes
 * @chip_name: Bridge chip ID
 * @instance_id: Instance ID of the bridge chip in case of multiple instances
 * @cb: callback function called in case of events.
 * @cb_data: pointer to a data structure that will be returned with callback
 *
 * msm_dba_reg_info structure will be used to provide information during
 * registering with driver. This structure will contain the information required
 * to identify the specific bridge chip the client wants to use.
 *
 * Client should also specify the callback function which needs to be called in
 * case of events. There is an optional data field which is a pointer that will
 * be returned as one of arguments in the callback function. This data field can
 * be NULL if client does not wish to use it.
 */
struct msm_dba_reg_info {
	char client_name[MSM_DBA_CLIENT_NAME_LEN];
	char chip_name[MSM_DBA_CHIP_NAME_MAX_LEN];
	u32 instance_id;
	msm_dba_cb cb;
	void *cb_data;
};

/**
 * struct msm_dba_video_caps_info - video capabilities of the bridge chip
 * @hdcp_support: if hdcp is supported
 * @edid_support: if reading edid from sink is supported
 * @data_lanes_lp_support: if low power mode is supported on data lanes
 * @clock_lanes_lp_support: If low power mode is supported on clock lanes
 * @max_pclk_khz: maximum pixel clock supported
 * @num_of_input_lanes: Number of input data lanes supported by the bridge chip
 */
struct msm_dba_video_caps_info {
	bool hdcp_support;
	bool edid_support;
	bool data_lanes_lp_support;
	bool clock_lanes_lp_support;
	u32 max_pclk_khz;
	u32 num_of_input_lanes;
};

/**
 * struct msm_dba_audio_caps_info - audio capabilities of the bridge chip
 * @audio_support: if audio is supported
 * @audio_rates: audio sampling rates supported
 * @audio_fmts: audio formats supported
 */
struct msm_dba_audio_caps_info {
	u32 audio_support;
	u32 audio_rates;
	u32 audio_fmts;
};

/**
 * struct msm_dba_capabilities - general capabilities of the bridge chip
 * @vid_caps: video capabilities
 * @aud_caps: audio capabilities
 * @av_mute_support: av mute support in bridge chip
 * @deferred_commit_support: support for deferred commit
 */
struct msm_dba_capabilities {
	struct msm_dba_video_caps_info vid_caps;
	struct msm_dba_audio_caps_info aud_caps;
	bool av_mute_support;
	bool deferred_commit_support;
};

/**
 * struct msm_dba_audio_cfg - Structure for audio configuration
 * @interface: Specifies audio interface type. Client should check the
 *	       capabilities for the interfaces supported by the bridge.
 * @format: Compressed vs Uncompressed formats.
 * @channels: Number of channels.
 * @i2s_fmt: I2S data packing format. This is valid only if interface is I2S.
 * @sampling_rate: sampling rate of audio data
 * @word_size: word size
 * @word_endianness: little or big endian words
 */
struct msm_dba_audio_cfg {
	enum msm_dba_audio_interface_type interface;
	enum msm_dba_audio_format_type format;
	enum msm_dba_audio_channel_count channels;
	enum msm_dba_audio_i2s_format i2s_fmt;
	enum msm_dba_audio_sampling_rates_type sampling_rate;
	enum msm_dba_audio_word_bit_depth word_size;
	enum msm_dba_audio_word_endian_type word_endianness;
	enum msm_dba_audio_copyright_type copyright;
	enum msm_dba_audio_pre_emphasis_type pre_emphasis;
	enum msm_dba_audio_clock_accuracy clock_accuracy;
	enum msm_dba_channel_status_source channel_status_source;
	enum msm_dba_audio_op_mode mode;

	u32 channel_status_category_code;
	u32 channel_status_source_number;
	u32 channel_status_v_bit;
	u32 channel_allocation;
	u32 channel_status_word_length;

	u32 n;
	u32 cts;
};

/**
 * struct msm_dba_video_cfg - video configuration data
 * @h_active: active width of the video signal
 * @h_front_porch: horizontal front porch in pixels
 * @h_pulse_width: pulse width of hsync in pixels
 * @h_back_porch: horizontal back porch in pixels
 * @h_polarity: polarity of hsync signal
 * @v_active: active height of the video signal
 * @v_front_porch: vertical front porch in lines
 * @v_pulse_width: pulse width of vsync in lines
 * @v_back_porch: vertical back porch in lines
 * @v_polarity: polarity of vsync signal
 * @pclk_khz: pixel clock in KHz
 * @interlaced: if video is interlaced
 * @vic: video indetification code
 * @hdmi_mode: hdmi or dvi mode for the sink
 * @ar: aspect ratio of the signal
 * @num_of_input_lanes: number of input lanes in case of DSI/LVDS
 */
struct msm_dba_video_cfg {
	u32  h_active;
	u32  h_front_porch;
	u32  h_pulse_width;
	u32  h_back_porch;
	bool h_polarity;
	u32  v_active;
	u32  v_front_porch;
	u32  v_pulse_width;
	u32  v_back_porch;
	bool v_polarity;
	u32  pclk_khz;
	bool interlaced;
	u32  vic;
	bool hdmi_mode;
	enum msm_dba_video_aspect_ratio ar;
	u32  num_of_input_lanes;
	u8 scaninfo;
};

struct mdss_dba_timing_info {
	u16 xres;
	u16 yres;
	u8 bpp;
	u8 fps;
	u8 lanes;
};

/**
 * struct msm_dba_ops- operation supported by bridge chip
 * @get_caps: returns the bridge chip capabilities
 *	      DEFER and ASYNC flags are not supported.
 * @power_on: powers on/off the bridge chip. This usually involves turning on
 *	      the power regulators and bringing the chip out of reset. Chip
 *	      should be capable of raising interrupts at this point.
 *	      DEFER and ASYNC flags are supported.
 * @video_on: turn on/off video stream. This function also requires the video
 *	      timing information that might be needed for programming the bridge
 *	      chip.
 *	      DEFER flag is supported.
 *	      ASYNC flag is not supported.
 * @audio_on: turn on/off audio stream.
 *	      DEFER flag is supported.
 *	      ASYNC flag is not supported.
 * @configure_audio: setup audio configuration
 *		     DEFER flag is supported.
 *		     ASYNC flag is not supported.
 * @av_mute: controls av mute functionalities if supported. AV mute is different
 *	     from audio_on and video_on where in even though the actual data is
 *	     sent, mute is specified through control packets.
 *	     DEFER flag is supported.
 *	     ASYNC flag is not supported.
 * @interupts_enable: enables interrupts to get event callbacks. Clients need
 *		      to specify an event mask of the events they are
 *		      interested in. If a client provides an event as part of
 *		      the mask, it will receive the interrupt regardless of the
 *		      client modifying the property.
 *		      DEFER flag is supported.
 *		      ASYNC flag is not supported.
 * @hdcp_enable: enable/disable hdcp. If HDCP is enabled, this function will
 *		 start a new authentication session. There is a separate
 *		 argument for enabling encryption. Encryption can be enabled any
 *		 time after HDCP has been fully authenticated. This function
 *		 will support an asynchronous mode where calling this function
 *		 will kick off HDCP and return to the caller. Caller has to wait
 *		 for MSM_DBA_CB_HDCP_SUCCESS callback to ensure link is
 *		 authenticated.
 *		 DEFER flag is not supported.
 *		 ASYNC flag is supported.
 * @hdcp_get_ksv_list_size: returns the KSV list size. In case of a simple sink
 *			    the size will be 1. In case of a repeater, this can
 *			    be more than one.
 *			    DEFER and ASYNC flags are not supported.
 * @hdcp_get_ksv_list: return the KSV list. Client can query the KSV information
 *		       from the bridge. Client should call
 *		       hdcp_get_ksv_list_size first and then allocate 40*size
 *		       bytes to hold all the KSVs.
 *		       DEFER and ASYNC flags are not supported.
 * @hdmi_cec_on: enable or disable cec module. Clients need to enable CEC
 *		 feature before they do read or write CEC messages.
 * @hdmi_cec_write: perform a CEC write. For bridges with HDMI as output
 *		    interface, this function allows clients to send a CEC
 *		    message. Client should pack the data according to the CEC
 *		    specification and provide the final buffer. Since CEC writes
 *		    can take longer time to ascertaining if they are successful,
 *		    this function supports the ASYNC flag. Driver will return
 *		    either MSM_DBA_CB_CEC_WRITE_SUCCESS or
 *		    MSM_DBA_CB_CEC_WRITE_FAIL callbacks.
 *		    DEFER is not supported.
 *		    ASYNC flag is supported.
 * @hdmi_cec_read: get a pending CEC read message. In case of an incoming CEC
 *		   message, driver will return MSM_DBA_CB_CEC_READ_PENDING
 *		   callback. On getting this event callback, client should call
 *		   hdmi_cec_read to get the message. The buffer should at least
 *		   be 15 bytes or more. Client should read the CEC message from
 *		   a thread different from the callback.
 *		   DEFER and ASYNC flags are not supported.
 * @get_edid_size: returns size of the edid.
 *		   DEFER and ASYNC flags are not supported.
 * @get_raw_edid: returns raw edid data.
 *		   DEFER and ASYNC flags are not supported.
 * @enable_remote_comm: enable/disable remote communication. Some interfaces
 *		        like FPDLINK III support a bi-directional control
 *		        channel that could be used to send control data using an
 *		        I2C or SPI protocol. This Function will enable this
 *		        control channel if supported.
 *		        DEFER and ASYNC flags are not supported.
 * @add_remote_device: add slaves on remote side for enabling communication. For
 *		       interfaces that support bi directional control channel,
 *		       this function allows clients to specify slave IDs of
 *		       devices on remote bus. Messages addressed to these IDs
 *		       will be trapped by the bridge chip and put on the remote
 *		       bus.
 *		       DEFER and ASYNC flags are not supported.
 * @commit_deferred_props: commits deferred properties
 *			   DEFER and ASYNC flags are not supported.
 * @force_reset: reset the device forcefully. In case the device goes into a bad
 *		 state, a client can force reset to try and recover the device.
 *		 The reset will be applied in spite of different configurations
 *		 from other clients. Driver will apply all the properties that
 *		 have been applied so far after the reset is complete. In case
 *		 of multiple clients, driver will issue a reset callback.
 * @dump_debug_info: dumps debug information to dmesg.
 * @check_hpd: Check if cable is connected or not. if cable is connected we
 *		send notification to display framework.
 * @set_audio_block: This function will populate the raw audio speaker block
 *		     data along with size of each block in bridgechip buffer.
 * @get_audio_block: This function will return the raw audio speaker block
 *		     along with size of each block.
 *
 * The msm_dba_ops structure represents a set of operations that can be
 * supported by each bridge chip. Depending on the functionality supported by a
 * specific bridge chip, some of the operations need not be supported. For
 * example if a bridge chip does not support reading EDID from a sink device,
 * get_edid_size and get_raw_edid can be NULL.
 *
 * Deferring properties: The deferred flag allows us to address any quirks with
 * respect to specific bridge chips. If there is a need for some properties to
 * be committed together, turning on video and audio at the same time, the
 * deferred flag can be used. Properties that are set using a DEFER flag will
 * not be committed to hardware until commit_deferred_props() function is
 * called.
 *
 */
struct msm_dba_ops {
	int (*get_caps)(void *client,
			struct msm_dba_capabilities *caps);

	int (*power_on)(void *client,
			bool on,
			u32 flags);

	int (*video_on)(void *client,
			bool on,
			struct msm_dba_video_cfg *cfg,
			u32 flags);

	int (*audio_on)(void *client,
			bool on,
			u32 flags);

	int (*configure_audio)(void *client,
			       struct msm_dba_audio_cfg *cfg,
			       u32 flags);

	int (*av_mute)(void *client,
		       bool video_mute,
		       bool audio_mute,
		       u32 flags);

	int (*interrupts_enable)(void *client,
				bool on,
				u32 event_mask,
				u32 flags);

	int (*hdcp_enable)(void *client,
			   bool hdcp_on,
			   bool enc_on,
			   u32 flags);

	int (*hdcp_get_ksv_list_size)(void *client,
				      u32 *count,
				      u32 flags);

	int (*hdcp_get_ksv_list)(void *client,
				 u32 count,
				 char *buf,
				 u32 flags);

	int (*hdmi_cec_on)(void *client,
			      bool enable,
			      u32 flags);

	int (*hdmi_cec_write)(void *client,
			      u32 size,
			      char *buf,
			      u32 flags);

	int (*hdmi_cec_read)(void *client,
			     u32 *size,
			     char *buf,
			     u32 flags);

	int (*get_edid_size)(void *client,
			     u32 *size,
			     u32 flags);

	int (*get_raw_edid)(void *client,
			    u32 size,
			    char *buf,
			    u32 flags);

	int (*enable_remote_comm)(void *client,
				  bool on,
				  u32 flags);

	int (*add_remote_device)(void *client,
				 u32 *slave_ids,
				 u32 count,
				 u32 flags);

	int (*commit_deferred_props)(void *client,
				    u32 flags);

	int (*force_reset)(void *client, u32 flags);
	int (*dump_debug_info)(void *client, u32 flags);
	int (*check_hpd)(void *client, u32 flags);
	void (*set_audio_block)(void *client, u32 size, void *buf);
	void (*get_audio_block)(void *client, u32 size, void *buf);
	void* (*get_supp_timing_info)(void);
};

/**
 * msm_dba_register_client() - Allows a client to register with the driver.
 * @info: Client information along with the bridge chip id the client wishes to
 *	  program.
 * @ops: Function pointers to bridge chip operations. Some function pointers can
 *	 be NULL depending on the functionalities supported by bridge chip.
 *
 * The register API supports multiple clients to register for the same bridge
 * chip. If Successful, this will return a pointer that should be used as a
 * handle for all subsequent function calls.
 */
void *msm_dba_register_client(struct msm_dba_reg_info *info,
			      struct msm_dba_ops *ops);

/**
 * msm_dba_deregister_client() - Allows client to de-register with the driver.
 * @client: client handle returned by register API.
 *
 * This function will release all the resources used by a particular client. If
 * it is the only client using the bridge chip, the bridge chip will be powered
 * down and put into reset.
 */
int msm_dba_deregister_client(void *client);

#endif /* _MSM_DBA_H */
