| /* 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 |
| */ |
| 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); |
| }; |
| |
| /** |
| * 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_*/ |