5ff1808f20
Sounds like we prefer to have this under drivers/ instead of device/. Also move all MIPI-related headers out from device/ into their own directory. Signed-off-by: Julius Werner <jwerner@chromium.org> Change-Id: Ib3e66954b8f0cf85b28d8d186b09d7846707559d Reviewed-on: https://review.coreboot.org/c/coreboot/+/57128 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Hung-Te Lin <hungte@chromium.org> Reviewed-by: Yu-Ping Wu <yupingso@google.com> Reviewed-by: Nico Huber <nico.h@gmx.de>
428 lines
18 KiB
C
428 lines
18 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
/*
|
|
* This header implements structures to describe the properties defined in the
|
|
* SoundWire Discovery and Configuration (DisCo) Specification Version 1.0.
|
|
*
|
|
* This is available for non-members after providing a name and email address at
|
|
* https://resources.mipi.org/disco_soundwire
|
|
*
|
|
* The structure members mirror the property names defined in the specification,
|
|
* with the exception that '-' is transformed into '_' for compatible naming.
|
|
*
|
|
* See Documentation/drivers/soundwire.md for more information.
|
|
*/
|
|
|
|
#ifndef __DEVICE_SOUNDWIRE_H__
|
|
#define __DEVICE_SOUNDWIRE_H__
|
|
|
|
#include <types.h>
|
|
|
|
/**
|
|
* enum soundwire_limits - Limits on number of SoundWire devices in topology.
|
|
* @SOUNDWIRE_MAX: Maximum value for lists of configuration values in SoundWire devices.
|
|
* @SOUNDWIRE_MIN_DPN: Data Port minimum value. DPn range is 1-14.
|
|
* @SOUNDWIRE_MAX_DPN: Data Port maximum value. DPn range is 1-14.
|
|
* @SOUNDWIRE_MAX_SLAVE: Maximum number of slave devices that can be attached to one master.
|
|
* @SOUNDWIRE_MAX_LINK: Maximum number of master link devices that can be on one controller.
|
|
* @SOUNDWIRE_MAX_LANE: Maximum number of lanes in a multi-lane slave device.
|
|
* @SOUNDWIRE_MAX_MODE: Maximum number of Audio or Bulk Register Access modes.
|
|
*/
|
|
enum soundwire_limits {
|
|
SOUNDWIRE_MAX = 32,
|
|
SOUNDWIRE_MIN_DPN = 1,
|
|
SOUNDWIRE_MAX_DPN = 14,
|
|
SOUNDWIRE_MAX_SLAVE = 11,
|
|
SOUNDWIRE_MAX_LINK = 8,
|
|
SOUNDWIRE_MAX_LANE = 8,
|
|
SOUNDWIRE_MAX_MODE = 4
|
|
};
|
|
|
|
/**
|
|
* enum soundwire_sw_version - Versions of SoundWire Discovery and Configuration Specification.
|
|
* @SOUNDWIRE_SW_VERSION_1_0: DisCo Specification Version 1.0 released November 2016.
|
|
*/
|
|
enum soundwire_sw_version {
|
|
SOUNDWIRE_SW_VERSION_1_0 = 0x00010000
|
|
};
|
|
|
|
/**
|
|
* enum soundwire_version - Versions of SoundWire Specification supported by a device.
|
|
* @SOUNDWIRE_VERSION_1_0: SoundWire Specification Version 1.0 released January 2015.
|
|
* @SOUNDWIRE_VERSION_1_1: SoundWire Specification Version 1.1 released June 2016.
|
|
* @SOUNDWIRE_VERSION_1_2: SoundWire Specification Version 1.2 released April 2019.
|
|
*/
|
|
enum soundwire_version {
|
|
SOUNDWIRE_VERSION_1_0 = 1,
|
|
SOUNDWIRE_VERSION_1_1,
|
|
SOUNDWIRE_VERSION_1_2
|
|
};
|
|
|
|
/**
|
|
* enum mipi_class - MIPI class encoding.
|
|
* @MIPI_CLASS_NONE: No further class decoding.
|
|
* @MIPI_CLASS_SDCA: Device implements SoundWire Device Class for Audio (SDCA).
|
|
*
|
|
* 0x02-0x7F: Reserved
|
|
* 0x80-0xFF: MIPI Alliance extended device class
|
|
*/
|
|
enum mipi_class {
|
|
MIPI_CLASS_NONE,
|
|
MIPI_CLASS_SDCA
|
|
};
|
|
|
|
/**
|
|
* struct soundwire_address - SoundWire Device Address Encoding.
|
|
* @version: SoundWire specification version from &enum soundwire_version.
|
|
* @link_id: Zero-based SoundWire master link id.
|
|
* @unique_id: Unique ID for multiple slave devices on the same bus.
|
|
* @manufacturer_id: Manufacturer ID from include/mipi/ids.h.
|
|
* @part_id: Vendor defined part ID.
|
|
* @class: MIPI class encoding in &enum mipi_class.
|
|
*/
|
|
struct soundwire_address {
|
|
enum soundwire_version version;
|
|
uint8_t link_id;
|
|
uint8_t unique_id;
|
|
uint16_t manufacturer_id;
|
|
uint16_t part_id;
|
|
enum mipi_class class;
|
|
};
|
|
|
|
/**
|
|
* struct soundwire_link - SoundWire master device properties.
|
|
* @clock_stop_mode0_supported: %true if clock stop mode0 is supported by this device.
|
|
* @clock_stop_mode1_supported: %true if clock stop mode1 is supported by this device.
|
|
* @max_clock_frequency: Maximum bus clock for this device in Hz.
|
|
* @supported_clock_gears_count: Number of entries in supported_clock_gears.
|
|
* @supported_clock_gears: One entry for each supported clock gear.
|
|
* @clock_frequencies_supported_count: Number of entries in clock_frequencies_supported.
|
|
* @clock_frequencies_supported: One entry for each clock frequency supported in Hz.
|
|
* @default_frame_rate: Controller default frame rate in Hz.
|
|
* @default_frame_row_size: Number of rows between 48-256.
|
|
* @default_frame_col_size: Number of columns: 2, 4, 8, 16.
|
|
* @dynamic_frame_shape: %true if bus driver may change frame shape dynamically.
|
|
* @command_error_threshold: Number of times that software may retry sending a command.
|
|
*/
|
|
struct soundwire_link {
|
|
bool clock_stop_mode0_supported;
|
|
bool clock_stop_mode1_supported;
|
|
unsigned int max_clock_frequency;
|
|
size_t supported_clock_gears_count;
|
|
unsigned int supported_clock_gears[SOUNDWIRE_MAX];
|
|
size_t clock_frequencies_supported_count;
|
|
uint64_t clock_frequencies_supported[SOUNDWIRE_MAX];
|
|
unsigned int default_frame_rate;
|
|
unsigned int default_frame_row_size;
|
|
unsigned int default_frame_col_size;
|
|
bool dynamic_frame_shape;
|
|
unsigned int command_error_threshold;
|
|
};
|
|
|
|
/**
|
|
* struct soundwire_controller - SoundWire controller properties.
|
|
* @master_count: Number of masters present on this device.
|
|
* @master_list: One entry for each master device.
|
|
*/
|
|
struct soundwire_controller {
|
|
unsigned int master_list_count;
|
|
struct soundwire_link master_list[SOUNDWIRE_MAX_LINK];
|
|
};
|
|
|
|
/* SoundWire port bitmask, used for slave source/sink port list property. */
|
|
#define SOUNDWIRE_PORT(port) BIT(port)
|
|
|
|
/**
|
|
* struct soundwire_slave - SoundWire slave device properties.
|
|
* @wake_up_unavailable: Wake from this device is not supported or allowed.
|
|
* @test_mode_supported: %true if test mode is supported by this device.
|
|
* @clock_stop_mode1_supported: %true if clock stop mode1 is supported by this device.
|
|
* @simplified_clockstopprepare_sm_supported: %true if slave only supports the simplified
|
|
* clock stop prepare state machine and will
|
|
* always be ready for a stop clock transition.
|
|
* @clockstopprepare_timeout: Slave-specific timeout in milliseconds.
|
|
* @clockstopprepare_hard_reset_behavior: %true when slave keeps the status of the
|
|
* StopClockPrepare state machine after exit from
|
|
* mode1 and must be de-prepared by software.
|
|
* @slave_channelprepare_timeout: Slave-specific timeout in milliseconds.
|
|
* @highPHY_capable: %true if device is HighPHY capable.
|
|
* @paging_supported: %true if device implements paging registers.
|
|
* @bank_delay_supported: %true if device implements bank delay/bridge registers.
|
|
* @port15_read_behavior: %true if device supports read to Port15 alias.
|
|
* @master_count: Number of master links present on this slave.
|
|
* @source_port_list: Bitmap identifying supported source ports, starting at bit 1.
|
|
* @sink_port_list: Bitmap identifying supported sink ports, starting at bit 1.
|
|
*/
|
|
struct soundwire_slave {
|
|
bool wake_up_unavailable;
|
|
bool test_mode_supported;
|
|
bool clock_stop_mode1_supported;
|
|
bool simplified_clockstopprepare_sm_supported;
|
|
unsigned int clockstopprepare_timeout;
|
|
bool clockstopprepare_hard_reset_behavior;
|
|
unsigned int slave_channelprepare_timeout;
|
|
bool highPHY_capable;
|
|
bool paging_supported;
|
|
bool bank_delay_supported;
|
|
bool port15_read_behavior;
|
|
size_t master_count;
|
|
uint32_t source_port_list;
|
|
uint32_t sink_port_list;
|
|
};
|
|
|
|
/**
|
|
* enum soundwire_multilane_dir - Direction of lane in slave multilane device.
|
|
* @MASTER_LANE: Lane is connected to a master device.
|
|
* @SLAVE_LINK: Lane is connected to a slave device.
|
|
*/
|
|
enum soundwire_multilane_dir {
|
|
MASTER_LANE,
|
|
SLAVE_LINK,
|
|
};
|
|
|
|
/**
|
|
* struct soundwire_multilane_map - Pair a soundwire lane with direction.
|
|
* @lane: Slave device lane number.
|
|
* @direction: Direction of the slave lane.
|
|
* @connection: The connection that this lane makes.
|
|
*/
|
|
struct soundwire_multilane_map {
|
|
unsigned int lane;
|
|
enum soundwire_multilane_dir direction;
|
|
union lane_type {
|
|
unsigned int master_lane;
|
|
unsigned int slave_link;
|
|
} connection;
|
|
};
|
|
|
|
/**
|
|
* struct soundwire_multilane - Multi-Lane SoundWire slave device.
|
|
* @lane_mapping_count: Number of entries in lane_mapping.
|
|
* @lane_mapping: One entry for each lane that is connected to lanes on a master device or
|
|
* slave devices via a slave link. Lane 0 is always connected to the master
|
|
* and entry 0 in this array is ignored.
|
|
* @lane_bus_holder_count: Number of entries in lane_bus_holder.
|
|
* @lane_bus_holder: One entry for each lane, %true if the device behaves as a bus holder.
|
|
*/
|
|
struct soundwire_multilane {
|
|
size_t lane_mapping_count;
|
|
struct soundwire_multilane_map lane_mapping[SOUNDWIRE_MAX_LANE];
|
|
size_t lane_bus_holder_count;
|
|
bool lane_bus_holder[SOUNDWIRE_MAX_LANE];
|
|
};
|
|
|
|
/**
|
|
* enum soundwire_prepare_channel_behavior - Specifies the dependencies between the
|
|
* Channel Prepare sequence and bus clock config.
|
|
* @CHANNEL_PREPARE_ANY_FREQUENCY: Channel Prepare can happen at any bus clock rate.
|
|
* @CHANNEL_PREPARE_SUPPORTED_FREQUENCY: Channel Prepare sequence shall happen only after
|
|
* the bus clock is changed to a supported frequency.
|
|
*/
|
|
enum soundwire_prepare_channel_behavior {
|
|
CHANNEL_PREPARE_ANY_FREQUENCY,
|
|
CHANNEL_PREPARE_SUPPORTED_FREQUENCY
|
|
};
|
|
|
|
/**
|
|
* struct soundwire_audio_mode - Properties for each supported Audio Mode.
|
|
* @sdw_name: SoundWire device name for this audio mode device instance.
|
|
* @max_bus_frequency: Maximum bus frequency of this mode in Hz.
|
|
* @min_bus_frequency: Minimum bus frequency of this mode in Hz.
|
|
* @bus_frequency_configs_count: Number of entries in bus_frequency_configs.
|
|
* @bus_frequency_configs: One entry for each supported bus frequency,
|
|
* if not all values in min to max range are valid.
|
|
* @max_sampling_frequency: Maximum sampling frequency of this mode in Hz.
|
|
* @min_sampling_frequency: Minimum sampling frequency of this mode in Hz.
|
|
* @sampling_frequency_configs_count: Number of entries in sampling_frequency_configs.
|
|
* @sampling_frequency_configs: One entry for each supported sampling frequency,
|
|
* if not all values in min to max range are valid.
|
|
* @prepare_channel_behavior: Dependencies between Channel Prepare and bus clock.
|
|
* @glitchless_transitions: Bitmap describing possible glitchless transitions from this audio
|
|
* mode to another audio mode. Not used for only one mode.
|
|
*/
|
|
struct soundwire_audio_mode {
|
|
unsigned int max_bus_frequency;
|
|
unsigned int min_bus_frequency;
|
|
size_t bus_frequency_configs_count;
|
|
uint64_t bus_frequency_configs[SOUNDWIRE_MAX];
|
|
unsigned int max_sampling_frequency;
|
|
unsigned int min_sampling_frequency;
|
|
size_t sampling_frequency_configs_count;
|
|
uint64_t sampling_frequency_configs[SOUNDWIRE_MAX];
|
|
enum soundwire_prepare_channel_behavior prepare_channel_behavior;
|
|
uint32_t glitchless_transitions;
|
|
};
|
|
|
|
/* Type of SoundWire Data Port supported for this device. */
|
|
enum soundwire_data_port_type {
|
|
FULL_DATA_PORT,
|
|
SIMPLIFIED_DATA_PORT,
|
|
REDUCED_DATA_PORT
|
|
};
|
|
|
|
/* Number of samples that can be grouped together (0-based count). */
|
|
enum soundwire_block_group_count {
|
|
BLOCK_GROUP_COUNT_1,
|
|
BLOCK_GROUP_COUNT_2,
|
|
BLOCK_GROUP_COUNT_3,
|
|
BLOCK_GROUP_COUNT_4
|
|
};
|
|
|
|
/* Bitmap identifying the types of modes supported. */
|
|
enum soundwire_mode_bitmap {
|
|
MODE_ISOCHRONOUS = BIT(0),
|
|
MODE_TX_CONTROLLED = BIT(1),
|
|
MODE_RX_CONTROLLED = BIT(2),
|
|
MODE_FULL_ASYNCHRONOUS = BIT(3)
|
|
};
|
|
|
|
/* Bitmap identifying the encoding schemes supported. */
|
|
enum soundwire_port_encoding_bitmap {
|
|
ENCODE_TWOS_COMPLEMENT = BIT(0),
|
|
ENCODE_SIGN_MAGNITUDE = BIT(1),
|
|
ENCODE_IEEE_32BIT_FP = BIT(2)
|
|
};
|
|
|
|
/**
|
|
* struct soundwire_dpn - Configuration properties for SoundWire DPn Data Ports.
|
|
* @port_max_wordlength: Maximum number of bits in a Payload Channel Sample. (1-64)
|
|
* @port_min_wordlength: Minimum number of bits in a Payload Channel Sample. (1-64)
|
|
* @port_wordlength_configs_count: Number of entries in port_wordlength_configs.
|
|
* @port_wordlength_configs: One entry for each supported wordlength.
|
|
* Used if only specific wordlength values are allowed.
|
|
* @data_port_type: Type of data port from &enum soundwire_data_port_type.
|
|
* @max_grouping_supported: 0-based maximum number of samples that can be grouped for
|
|
* %FULL_DATA_PORT. The %SIMPLIFIED_DATA_PORT and %REDUCED_DATA_PORT
|
|
* require 4 samples in a group.
|
|
* @simplified_channelprepare_sm: %true if the channel prepare sequence is not required,
|
|
* and the Port Ready interrupt is not supported.
|
|
* @port_channelprepare_timeout: Port-specific timeout value in milliseconds.
|
|
* @imp_def_dpn_interrupts_supported: Bitmap for support of implementation-defined interrupts.
|
|
* @min_channel_number: Minimum channel number supported.
|
|
* @max_channel_number: Maximum channel number supported.
|
|
* @channel_number_list_count: Number of entries in channel_number_list.
|
|
* @channel_number_list: One entry for each available channel number.
|
|
* Used if only specific channels are available.
|
|
* @channel_combination_list_count: Number of entries in channel_combination_list.
|
|
* @channel_combination_list: One bitmap entry for each valid channel combination.
|
|
* @modes_supported: Bitmap identifying the types of modes supported by the device.
|
|
* @max_async_buffer: Number of samples that this port can buffer in asynchronous modes.
|
|
* Only required if the slave implements buffer larger than required.
|
|
* @block_packing_mode: %true if BlockPackingMode may be configured as BlockPerPort or
|
|
* BlocKPerChannel. %false if BlockPackingMode must be BlockPerPort.
|
|
* @port_encoding_type: Bitmap describing the types of Payload Channel Sample encoding
|
|
* schemes implemented by this port.
|
|
* @port_audio_mode_count: Number of entries in audio_mode_list.
|
|
* @port_audio_mode_list: One entry for each supported audio mode id.
|
|
*/
|
|
struct soundwire_dpn {
|
|
unsigned int port_max_wordlength;
|
|
unsigned int port_min_wordlength;
|
|
size_t port_wordlength_configs_count;
|
|
uint64_t port_wordlength_configs[SOUNDWIRE_MAX];
|
|
enum soundwire_data_port_type data_port_type;
|
|
enum soundwire_block_group_count max_grouping_supported;
|
|
bool simplified_channelprepare_sm;
|
|
unsigned int port_channelprepare_timeout;
|
|
uint32_t imp_def_dpn_interrupts_supported;
|
|
unsigned int min_channel_number;
|
|
unsigned int max_channel_number;
|
|
size_t channel_number_list_count;
|
|
uint64_t channel_number_list[SOUNDWIRE_MAX];
|
|
size_t channel_combination_list_count;
|
|
uint64_t channel_combination_list[SOUNDWIRE_MAX];
|
|
enum soundwire_mode_bitmap modes_supported;
|
|
unsigned int max_async_buffer;
|
|
bool block_packing_mode;
|
|
uint32_t port_encoding_type;
|
|
size_t port_audio_mode_count;
|
|
unsigned int port_audio_mode_list[SOUNDWIRE_MAX_MODE];
|
|
};
|
|
|
|
/**
|
|
* struct soundwire_bra_mode - Bulk Register Access mode properties.
|
|
* @max_bus_frequency: Maximum bus frequency of this mode in Hz.
|
|
* @min_bus_frequency: Minimum bus frequency of this mode in Hz.
|
|
* @bus_frequency_configs_count: Number of entries in bus_frequency_configs.
|
|
* @bus_frequency_configs: One entry for each supported bus frequency,
|
|
* Used if not all values in min to max range are valid.
|
|
* @max_data_per_frame: Maximum data bytes per frame, excluding header, CRC, and footer.
|
|
* @min_us_between_transactions: Amount of delay in uS required between transactions.
|
|
* @max_bandwidth: Maximum bandwidth in bytes per second that can be written/read.
|
|
* @block_alignment: Size of basic block in bytes.
|
|
*/
|
|
struct soundwire_bra_mode {
|
|
unsigned int max_bus_frequency;
|
|
unsigned int min_bus_frequency;
|
|
size_t bus_frequency_configs_count;
|
|
uint64_t bus_frequency_configs[SOUNDWIRE_MAX];
|
|
unsigned int max_data_per_frame;
|
|
unsigned int min_us_between_transactions;
|
|
unsigned int max_bandwidth;
|
|
unsigned int block_alignment;
|
|
};
|
|
|
|
/**
|
|
* struct soundwire_dp0 - Configuration properties for SoundWire DP0 Data Port.
|
|
* @port_max_wordlength: Maximum number of bits in a Payload Channel Sample. (1-64)
|
|
* @port_min_wordlength: Minimum number of bits in a Payload Channel Sample. (1-64)
|
|
* @port_wordlength_configs_count: Number of entries in port_wordlength_configs.
|
|
* @port_wordlength_configs: One entry for each supported wordlength.
|
|
* Used if only specific wordlength values are allowed.
|
|
* @bra_flow_controlled: Used if the slave can result in an OK_NotReady response.
|
|
* @bra_imp_def_response_supported: %true if implementation defined response is supported.
|
|
* @bra_role_supported: %true if the slave supports initiating BRA transactions.
|
|
* @simplified_channel_prepare_sm: %true if the channel prepare sequence is not required,
|
|
* and the Port Ready interrupt is not supported.
|
|
* @imp_def_dp0_interrupts_supported: If set, each bit corresponds to support for
|
|
* implementation-defined interrupts ImpDef.
|
|
* @imp_def_bpt_supported: %true if implementation defined Payload Type is supported.
|
|
* @bra_mode_count: Number of entries in bra_mode_list.
|
|
* @bra_mode_list: One entry for each supported Bulk Register Access mode id.
|
|
*/
|
|
struct soundwire_dp0 {
|
|
unsigned int port_max_wordlength;
|
|
unsigned int port_min_wordlength;
|
|
size_t port_wordlength_configs_count;
|
|
uint64_t port_wordlength_configs[SOUNDWIRE_MAX];
|
|
bool bra_flow_controlled;
|
|
bool bra_imp_def_response_supported;
|
|
bool bra_role_supported;
|
|
bool simplified_channel_prepare_sm;
|
|
unsigned int imp_def_dp0_interrupts_supported;
|
|
bool imp_def_bpt_supported;
|
|
size_t bra_mode_count;
|
|
unsigned int bra_mode_list[SOUNDWIRE_MAX_MODE];
|
|
};
|
|
|
|
/**
|
|
* struct soundwire_dpn_entry - Full duplex data port properties for DPn 1-14.
|
|
* @port: DPn data port number, starting at 1.
|
|
* @source: Source data port properties. (optional)
|
|
* @sink: Sink data port properties. (optional)
|
|
*/
|
|
struct soundwire_dpn_entry {
|
|
size_t port;
|
|
struct soundwire_dpn *source;
|
|
struct soundwire_dpn *sink;
|
|
};
|
|
|
|
/**
|
|
* struct soundwire_codec - Contains all configuration for a SoundWire codec slave device.
|
|
* @slave: Properties for slave device.
|
|
* @audio_mode: Properties for audio modes used by DPn data ports 1-14.
|
|
* @dpn: Properties for DPn data ports 1-14.
|
|
* @dp0_bra_mode: Properties for Bulk Register Access mode for data port 0. (optional)
|
|
* @dp0: Properties for data port 0. (optional)
|
|
* @multilane: Properties for slave multilane device. (optional)
|
|
*/
|
|
struct soundwire_codec {
|
|
struct soundwire_slave *slave;
|
|
struct soundwire_audio_mode *audio_mode[SOUNDWIRE_MAX_MODE];
|
|
struct soundwire_dpn_entry dpn[SOUNDWIRE_MAX_DPN - SOUNDWIRE_MIN_DPN];
|
|
struct soundwire_bra_mode *dp0_bra_mode[SOUNDWIRE_MAX_MODE];
|
|
struct soundwire_dp0 *dp0;
|
|
struct soundwire_multilane *multilane;
|
|
};
|
|
|
|
#endif /* __DEVICE_SOUNDWIRE_H__ */
|