/*  Copyright (c) 2014-2017, 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_EXT_DISPLAY_H_
#define _MSM_EXT_DISPLAY_H_

#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/extcon.h>

#define AUDIO_ACK_SET_ENABLE BIT(5)
#define AUDIO_ACK_ENABLE BIT(4)
#define AUDIO_ACK_CONNECT BIT(0)

/*
 *   Flags to be used with the HPD operation of the external display
 *   interface:
 *   MSM_EXT_DISP_HPD_AUDIO: audio will be routed to external display
 *   MSM_EXT_DISP_HPD_VIDEO: video will be routed to external display
 */
#define MSM_EXT_DISP_HPD_AUDIO BIT(0)
#define MSM_EXT_DISP_HPD_VIDEO BIT(1)

/**
 *  struct ext_disp_cable_notify - cable notify handler structure
 *  @link: a link for the linked list
 *  @status: current status of HDMI/DP cable connection
 *  @hpd_notify: callback function to provide cable status
 */
struct ext_disp_cable_notify {
	struct list_head link;
	int status;
	void (*hpd_notify)(struct ext_disp_cable_notify *h);
};

struct msm_ext_disp_audio_edid_blk {
	u8 *audio_data_blk;
	unsigned int audio_data_blk_size; /* in bytes */
	u8 *spk_alloc_data_blk;
	unsigned int spk_alloc_data_blk_size; /* in bytes */
};

struct msm_ext_disp_audio_setup_params {
	u32 sample_rate_hz;
	u32 num_of_channels;
	u32 channel_allocation;
	u32 level_shift;
	bool down_mix;
	u32 sample_present;
};

/*
 *  External Display identifier for use to determine which interface
 *  the audio driver is interacting with.
 */
enum msm_ext_disp_type {
	EXT_DISPLAY_TYPE_HDMI = EXTCON_DISP_HDMI,
	EXT_DISPLAY_TYPE_DP = EXTCON_DISP_DP,
	EXT_DISPLAY_TYPE_MAX = 0xFFFFFFFF
};

/*
 *  External Display cable state used by display interface to indicate
 *  connect/disconnect of interface.
 */
enum msm_ext_disp_cable_state {
	EXT_DISPLAY_CABLE_DISCONNECT,
	EXT_DISPLAY_CABLE_CONNECT,
	EXT_DISPLAY_CABLE_STATE_MAX
};

/**
 *  External Display power state used by display interface to indicate
 *  power on/off of the interface.
 */
enum msm_ext_disp_power_state {
	EXT_DISPLAY_POWER_OFF,
	EXT_DISPLAY_POWER_ON,
	EXT_DISPLAY_POWER_MAX
};

/**
 *  struct msm_ext_disp_intf_ops - operations exposed to display interface
 *  @audio_config: configures the audio operations exposed to codec driver
 *  @audio_notify: notifies the audio connection state to user modules.
 *  @video_notify: notifies the video connection state to user modules.
 */
struct msm_ext_disp_intf_ops {
	int (*audio_config)(struct platform_device *pdev,
			enum msm_ext_disp_type type,
			enum msm_ext_disp_cable_state state);

	int (*audio_notify)(struct platform_device *pdev,
			enum msm_ext_disp_type type,
			enum msm_ext_disp_cable_state state);


	int (*video_notify)(struct platform_device *pdev,
			enum msm_ext_disp_type type,
			enum msm_ext_disp_cable_state state);
};

/**
 *  struct msm_ext_disp_audio_codec_ops - operations exposed to audio codec
 *  @audio_info_setup: configure audio on interface
 *  @get_audio_edid_blk: retrieve audio edid block
 *  @cable_status: cable connected/disconnected
 *  @get_intf_id: id of connected interface
 *  @teardown_done: audio session teardown done by qdsp
 *  @acknowledge: acknowledge audio status received by user modules
 *  @ready: notify audio when codec driver is ready.
 */
struct msm_ext_disp_audio_codec_ops {
	int (*audio_info_setup)(struct platform_device *pdev,
			struct msm_ext_disp_audio_setup_params *params);
	int (*get_audio_edid_blk)(struct platform_device *pdev,
			struct msm_ext_disp_audio_edid_blk *blk);
	int (*cable_status)(struct platform_device *pdev, u32 vote);
	int (*get_intf_id)(struct platform_device *pdev);
	void (*teardown_done)(struct platform_device *pdev);
	int (*acknowledge)(struct platform_device *pdev, u32 ack);
	int (*ready)(struct platform_device *pdev);
};

/**
 *  struct msm_ext_disp_init_data - data needed to register a display interface
 *  @type: external display type
 *  @intf_ops: external display interface operations
 *  @codec_ops: audio codec operations
 *  @pdev: platform device instance of the interface driver
 *  @intf_data: interface specific data
 */
struct msm_ext_disp_init_data {
	enum msm_ext_disp_type type;
	struct msm_ext_disp_intf_ops intf_ops;
	struct msm_ext_disp_audio_codec_ops codec_ops;
	struct platform_device *pdev;
	void *intf_data;
};

/**
 * struct msm_ext_disp_data - data needed by interface modules
 * @intf_pdev: platform device instance of the interface
 * @intf_data: data related to interface module
 */
struct msm_ext_disp_data {
	struct platform_device *intf_pdev;
	void *intf_data;
};

/**
 *  msm_ext_disp_register_audio_codec() - audio codec registration
 *  @pdev: platform device pointer
 *  @codec_ops: audio codec operations
 */
int msm_ext_disp_register_audio_codec(struct platform_device *pdev,
		struct msm_ext_disp_audio_codec_ops *ops);

/**
 *  msm_hdmi_register_audio_codec() - wrapper for hdmi audio codec
 * registration
 *  @pdev: platform device pointer
 *  @codec_ops: audio codec operations
 */
int msm_hdmi_register_audio_codec(struct platform_device *pdev,
		struct msm_ext_disp_audio_codec_ops *ops);

/**
 *  msm_ext_disp_register_intf() - display interface registration
 *  @init_data: data needed to register the display interface
 */
int msm_ext_disp_register_intf(struct platform_device *pdev,
		struct msm_ext_disp_init_data *init_data);

#endif /*_MSM_EXT_DISPLAY_H_*/
