/* * Copyright (c) 2015, 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 #include #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(0), MSM_DBA_AUDIO_WORD_24BIT = BIT(1), MSM_DBA_AUDIO_WORD_32BIT = BIT(2), }; /** * 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 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); }; /** * 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 */