Commit 1b6a349a authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull soundwire updates from Vinod Koul:
 "This include bunch of Intel driver code reorganization and support for
  qcom v1.7.0 controller:

   - intel: reorganization of hw_ops callbacks, splitting files etc

   - qcom: support for v1.7.0 qcom controllers"

* tag 'soundwire-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire:
  soundwire: intel: split auxdevice to different file
  soundwire: intel: add in-band wake callbacks in hw_ops
  soundwire: intel: add link power management callbacks in hw_ops
  soundwire: intel: add bus management callbacks in hw_ops
  soundwire: intel: add register_dai callback in hw_ops
  soundwire: intel: add debugfs callbacks in hw_ops
  soundwire: intel: start using hw_ops
  dt-bindings: soundwire: Convert text bindings to DT Schema
  soundwire: cadence: use dai_runtime_array instead of dma_data
  soundwire: cadence: rename sdw_cdns_dai_dma_data as sdw_cdns_dai_runtime
  soundwire: qcom: add support for v1.7 Soundwire Controller
  dt-bindings: soundwire: qcom: add v1.7.0 support
  soundwire: qcom: make reset optional for v1.6 controller
  soundwire: qcom: remove unused SWRM_SPECIAL_CMD_ID
  soundwire: dmi-quirks: add quirk variant for LAPBC710 NUC15
parents e7904111 7cbf00bd
Loading
Loading
Loading
Loading
+0 −214
Original line number Diff line number Diff line
Qualcomm SoundWire Controller Bindings


This binding describes the Qualcomm SoundWire Controller along with its
board specific bus parameters.

- compatible:
	Usage: required
	Value type: <stringlist>
	Definition: must be "qcom,soundwire-v<MAJOR>.<MINOR>.<STEP>",
		    Example:
			"qcom,soundwire-v1.3.0"
			"qcom,soundwire-v1.5.0"
			"qcom,soundwire-v1.5.1"
			"qcom,soundwire-v1.6.0"
- reg:
	Usage: required
	Value type: <prop-encoded-array>
	Definition: the base address and size of SoundWire controller
		    address space.

- interrupts:
	Usage: required
	Value type: <prop-encoded-array>
	Definition: should specify the SoundWire Controller core and optional
		    wake IRQ

- interrupt-names:
	Usage: Optional
	Value type: boolean
	Value type: <stringlist>
	Definition: should be "core" for core and "wakeup" for wake interrupt.

- wakeup-source:
	Usage: Optional
	Value type: boolean
	Definition: should specify if SoundWire Controller is wake up capable.

- clock-names:
	Usage: required
	Value type: <stringlist>
	Definition: should be "iface" for SoundWire Controller interface clock

- clocks:
	Usage: required
	Value type: <prop-encoded-array>
	Definition: should specify the SoundWire Controller interface clock

- #sound-dai-cells:
	Usage: required
	Value type: <u32>
	Definition: must be 1 for digital audio interfaces on the controller.

- qcom,dout-ports:
	Usage: required
	Value type: <u32>
	Definition: must be count of data out ports

- qcom,din-ports:
	Usage: required
	Value type: <u32>
	Definition: must be count of data in ports

- qcom,ports-offset1:
	Usage: required
	Value type: <prop-encoded-array>
	Definition: should specify payload transport window offset1 of each
		    data port. Out ports followed by In ports.
		    Value of 0xFF indicates that this option is not implemented
		    or applicable for the respective data port.
		    More info in MIPI Alliance SoundWire 1.0 Specifications.

- qcom,ports-offset2:
	Usage: required
	Value type: <prop-encoded-array>
	Definition: should specify payload transport window offset2 of each
		    data port. Out ports followed by In ports.
		    Value of 0xFF indicates that this option is not implemented
		    or applicable for the respective data port.
		    More info in MIPI Alliance SoundWire 1.0 Specifications.

- qcom,ports-sinterval-low:
	Usage: required
	Value type: <prop-encoded-array>
	Definition: should be sample interval low of each data port.
		    Out ports followed by In ports. Used for Sample Interval
		    calculation.
		    Value of 0xFF indicates that this option is not implemented
		    or applicable for the respective data port.
		    More info in MIPI Alliance SoundWire 1.0 Specifications.

- qcom,ports-word-length:
	Usage: optional
	Value type: <prop-encoded-array>
	Definition: should be size of payload channel sample.
		    Value of 0xFF indicates that this option is not implemented
		    or applicable for the respective data port.
		    More info in MIPI Alliance SoundWire 1.0 Specifications.

- qcom,ports-block-pack-mode:
	Usage: optional
	Value type: <prop-encoded-array>
	Definition: should be 0 or 1 to indicate the block packing mode.
		    0 to indicate Blocks are per Channel
		    1 to indicate Blocks are per Port.
		    Out ports followed by In ports.
		    Value of 0xFF indicates that this option is not implemented
		    or applicable for the respective data port.
		    More info in MIPI Alliance SoundWire 1.0 Specifications.

- qcom,ports-block-group-count:
	Usage: optional
	Value type: <prop-encoded-array>
	Definition: should be in range 1 to 4 to indicate how many sample
		    intervals are combined into a payload.
		    Out ports followed by In ports.
		    Value of 0xFF indicates that this option is not implemented
		    or applicable for the respective data port.
		    More info in MIPI Alliance SoundWire 1.0 Specifications.

- qcom,ports-lane-control:
	Usage: optional
	Value type: <prop-encoded-array>
	Definition: should be in range 0 to 7 to identify which	data lane
		    the data port uses.
		    Out ports followed by In ports.
		    Value of 0xFF indicates that this option is not implemented
		    or applicable for the respective data port.
		    More info in MIPI Alliance SoundWire 1.0 Specifications.

- qcom,ports-hstart:
	Usage: optional
	Value type: <prop-encoded-array>
	Definition: should be number identifying lowerst numbered coloum in
		    SoundWire Frame, i.e. left edge of the Transport sub-frame
		    for each port. Values between 0 and 15 are valid.
		    Out ports followed by In ports.
		    Value of 0xFF indicates that this option is not implemented
		    or applicable for the respective data port.
		    More info in MIPI Alliance SoundWire 1.0 Specifications.

- qcom,ports-hstop:
	Usage: optional
	Value type: <prop-encoded-array>
	Definition: should be number identifying highest numbered coloum in
		    SoundWire Frame, i.e. the right edge of the Transport
		    sub-frame for each port. Values between 0 and 15 are valid.
		    Out ports followed by In ports.
		    Value of 0xFF indicates that this option is not implemented
		    or applicable for the respective data port.
		    More info in MIPI Alliance SoundWire 1.0 Specifications.

- qcom,dports-type:
	Usage: optional
	Value type: <prop-encoded-array>
	Definition: should be one of the following types
		    0 for reduced port
		    1 for simple ports
		    2 for full port
		    Out ports followed by In ports.
		    Value of 0xFF indicates that this option is not implemented
		    or applicable for the respective data port.
		    More info in MIPI Alliance SoundWire 1.0 Specifications.

- reset:
	Usage: optional
	Value type: <prop-encoded-array>
	Definition: Should specify the SoundWire audio CSR reset controller interface,
		    which is required for SoundWire version 1.6.0 and above.

- reset-names:
	Usage: optional
	Value type: <stringlist>
	Definition: should be "swr_audio_cgcr" for SoundWire audio CSR reset
		    controller interface.

Note:
	More Information on detail of encoding of these fields can be
found in MIPI Alliance SoundWire 1.0 Specifications.

= SoundWire devices
Each subnode of the bus represents SoundWire device attached to it.
The properties of these nodes are defined by the individual bindings.

= EXAMPLE
The following example represents a SoundWire controller on DB845c board
which has controller integrated inside WCD934x codec on SDM845 SoC.

soundwire: soundwire@c85 {
	compatible = "qcom,soundwire-v1.3.0";
	reg = <0xc85 0x20>;
	interrupts = <20 IRQ_TYPE_EDGE_RISING>;
	clocks = <&wcc>;
	clock-names = "iface";
	resets = <&lpass_audiocc LPASS_AUDIO_SWR_TX_CGCR>;
	reset-names = "swr_audio_cgcr";
	#sound-dai-cells = <1>;
	qcom,dports-type = <0>;
	qcom,dout-ports	= <6>;
	qcom,din-ports	= <2>;
	qcom,ports-sinterval-low = /bits/ 8  <0x07 0x1F 0x3F 0x7 0x1F 0x3F 0x0F 0x0F>;
	qcom,ports-offset1 = /bits/ 8 <0x01 0x02 0x0C 0x6 0x12 0x0D 0x07 0x0A >;
	qcom,ports-offset2 = /bits/ 8 <0x00 0x00 0x1F 0x00 0x00 0x1F 0x00 0x00>;

	/* Left Speaker */
	left{
		....
	};

	/* Right Speaker */
	right{
		....
	};
};
+270 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/soundwire/qcom,soundwire.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Qualcomm SoundWire Controller

maintainers:
  - Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
  - Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>

description:
  The Qualcomm SoundWire controller along with its board specific bus parameters.

properties:
  compatible:
    enum:
      - qcom,soundwire-v1.3.0
      - qcom,soundwire-v1.5.0
      - qcom,soundwire-v1.5.1
      - qcom,soundwire-v1.6.0
      - qcom,soundwire-v1.7.0

  reg:
    maxItems: 1

  interrupts:
    minItems: 1
    items:
      - description: specify the SoundWire controller core.
      - description: specify the Soundwire controller wake IRQ.

  interrupt-names:
    minItems: 1
    items:
      - const: core
      - const: wakeup

  clocks:
    items:
      - description: iface clock

  clock-names:
    items:
      - const: iface

  resets:
    items:
      - description: SWR_AUDIO_CGCR RESET

  reset-names:
    items:
      - const: swr_audio_cgcr

  '#sound-dai-cells':
    const: 1

  '#address-cells':
    const: 2

  '#size-cells':
    const: 0

  wakeup-source: true

  qcom,din-ports:
    $ref: /schemas/types.yaml#/definitions/uint32
    description: count of data in ports

  qcom,dout-ports:
    $ref: /schemas/types.yaml#/definitions/uint32
    description: count of data out ports

  qcom,ports-word-length:
    $ref: /schemas/types.yaml#/definitions/uint8-array
    description:
      Size of payload channel sample.
      Value of 0xff indicates that this option is not implemented
      or applicable for the respective data port.
      More info in MIPI Alliance SoundWire 1.0 Specifications.
    minItems: 3
    maxItems: 5

  qcom,ports-sinterval-low:
    $ref: /schemas/types.yaml#/definitions/uint8-array
    description:
      Sample interval low of each data port.
      Out ports followed by In ports. Used for Sample Interval calculation.
      Value of 0xff indicates that this option is not implemented
      or applicable for the respective data port.
      More info in MIPI Alliance SoundWire 1.0 Specifications.
    minItems: 3
    maxItems: 8

  qcom,ports-offset1:
    $ref: /schemas/types.yaml#/definitions/uint8-array
    description:
      Payload transport window offset1 of each data port.
      Out ports followed by In ports.
      Value of 0xff indicates that this option is not implemented
      or applicable for the respective data port.
      More info in MIPI Alliance SoundWire 1.0 Specifications.
    minItems: 3
    maxItems: 8

  qcom,ports-offset2:
    $ref: /schemas/types.yaml#/definitions/uint8-array
    description:
      Payload transport window offset2 of each data port.
      Out ports followed by In ports.
      Value of 0xff indicates that this option is not implemented
      or applicable for the respective data port.
      More info in MIPI Alliance SoundWire 1.0 Specifications.
    minItems: 3
    maxItems: 8

  qcom,ports-lane-control:
    $ref: /schemas/types.yaml#/definitions/uint8-array
    description:
      Identify which data lane the data port uses.
      Out ports followed by In ports.
      Value of 0xff indicates that this option is not implemented
      or applicable for the respective data port.
      More info in MIPI Alliance SoundWire 1.0 Specifications.
    minItems: 3
    maxItems: 5

  qcom,ports-block-pack-mode:
    $ref: /schemas/types.yaml#/definitions/uint8-array
    description:
      Indicate the block packing mode.
      0 to indicate Blocks are per Channel
      1 to indicate Blocks are per Port.
      Out ports followed by In ports.
      Value of 0xff indicates that this option is not implemented
      or applicable for the respective data port.
      More info in MIPI Alliance SoundWire 1.0 Specifications.
    minItems: 3
    maxItems: 8
    items:
      oneOf:
        - minimum: 0
          maximum: 1
        - const: 0xff

  qcom,ports-hstart:
    $ref: /schemas/types.yaml#/definitions/uint8-array
    description:
      Identifying lowerst numbered coloum in SoundWire Frame,
      i.e. left edge of the Transport sub-frame for each port.
      Out ports followed by In ports.
      Value of 0xff indicates that this option is not implemented
      or applicable for the respective data port.
      More info in MIPI Alliance SoundWire 1.0 Specifications.
    minItems: 3
    maxItems: 5
    items:
      oneOf:
        - minimum: 0
          maximum: 15
        - const: 0xff

  qcom,ports-hstop:
    $ref: /schemas/types.yaml#/definitions/uint8-array
    description:
      Identifying highest numbered coloum in SoundWire Frame,
      i.e. the right edge of the Transport
      sub-frame for each port. Out ports followed by In ports.
      Value of 0xff indicates that this option is not implemented
      or applicable for the respective data port.
      More info in MIPI Alliance SoundWire 1.0 Specifications.
    minItems: 3
    maxItems: 5
    items:
      oneOf:
        - minimum: 0
          maximum: 15
        - const: 0xff

  qcom,ports-block-group-count:
    $ref: /schemas/types.yaml#/definitions/uint8-array
    description:
      In range 1 to 4 to indicate how many sample intervals are combined
      into a payload. Out ports followed by In ports.
      Value of 0xff indicates that this option is not implemented
      or applicable for the respective data port.
      More info in MIPI Alliance SoundWire 1.0 Specifications.
    minItems: 3
    maxItems: 5
    items:
      oneOf:
        - minimum: 0
          maximum: 4
        - const: 0xff

  label:
    maxItems: 1

patternProperties:
  "^.*@[0-9a-f],[0-9a-f]$":
    type: object
    description:
      Child nodes for a standalone audio codec or speaker amplifier IC.
      It has RX and TX Soundwire secondary devices.
    properties:
      compatible:
        pattern: "^sdw[0-9a-f]{1}[0-9a-f]{4}[0-9a-f]{4}[0-9a-f]{2}$"

required:
  - compatible
  - reg
  - interrupts
  - clocks
  - clock-names
  - '#sound-dai-cells'
  - '#address-cells'
  - '#size-cells'
  - qcom,dout-ports
  - qcom,din-ports
  - qcom,ports-sinterval-low
  - qcom,ports-offset1
  - qcom,ports-offset2

additionalProperties: false

examples:
  - |
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    #include <dt-bindings/interrupt-controller/irq.h>
    #include <dt-bindings/clock/qcom,lpassaudiocc-sc7280.h>

    soundwire@3210000 {
        compatible = "qcom,soundwire-v1.6.0";
        reg = <0x03210000 0x2000>;

        interrupts = <GIC_SPI 155 IRQ_TYPE_LEVEL_HIGH>,
                     <&pdc 130 IRQ_TYPE_LEVEL_HIGH>;

        interrupt-names = "core", "wakeup";

        clocks = <&lpass_rx_macro>;
        clock-names = "iface";

        qcom,din-ports = <0>;
        qcom,dout-ports = <5>;

        resets = <&lpass_audiocc LPASS_AUDIO_SWR_RX_CGCR>;
        reset-names = "swr_audio_cgcr";

        qcom,ports-word-length =        /bits/ 8 <0x01 0x07 0x04 0xff 0xff>;
        qcom,ports-sinterval-low =      /bits/ 8 <0x03 0x3f 0x1f 0x03 0x03>;
        qcom,ports-offset1 =            /bits/ 8 <0x00 0x00 0x0b 0x01 0x01>;
        qcom,ports-offset2 =            /bits/ 8 <0x00 0x00 0x0b 0x00 0x00>;
        qcom,ports-lane-control =       /bits/ 8 <0x01 0x00 0x00 0x00 0x00>;
        qcom,ports-block-pack-mode =    /bits/ 8 <0xff 0x00 0x01 0xff 0xff>;
        qcom,ports-hstart =             /bits/ 8 <0xff 0x03 0xff 0xff 0xff>;
        qcom,ports-hstop =              /bits/ 8 <0xff 0x06 0xff 0xff 0xff>;
        qcom,ports-block-group-count =  /bits/ 8 <0xff 0xff 0xff 0xff 0x00>;

        #sound-dai-cells = <1>;
        #address-cells = <2>;
        #size-cells = <0>;

        codec@0,4 {
            compatible = "sdw20217010d00";
            reg = <0 4>;
            qcom,rx-port-mapping = <1 2 3 4 5>;
        };
    };
+1 −1
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ soundwire-cadence-y := cadence_master.o
obj-$(CONFIG_SOUNDWIRE_CADENCE) += soundwire-cadence.o

#Intel driver
soundwire-intel-y :=	intel.o intel_init.o dmi-quirks.o
soundwire-intel-y :=	intel.o intel_auxdevice.o intel_init.o dmi-quirks.o
obj-$(CONFIG_SOUNDWIRE_INTEL) += soundwire-intel.o

#Qualcomm driver
+24 −26
Original line number Diff line number Diff line
@@ -1707,47 +1707,45 @@ int cdns_set_sdw_stream(struct snd_soc_dai *dai,
			void *stream, int direction)
{
	struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
	struct sdw_cdns_dma_data *dma;
	struct sdw_cdns_dai_runtime *dai_runtime;

	dai_runtime = cdns->dai_runtime_array[dai->id];

	if (stream) {
		/* first paranoia check */
		if (direction == SNDRV_PCM_STREAM_PLAYBACK)
			dma = dai->playback_dma_data;
		else
			dma = dai->capture_dma_data;

		if (dma) {
		if (dai_runtime) {
			dev_err(dai->dev,
				"dma_data already allocated for dai %s\n",
				"dai_runtime already allocated for dai %s\n",
				dai->name);
			return -EINVAL;
		}

		/* allocate and set dma info */
		dma = kzalloc(sizeof(*dma), GFP_KERNEL);
		if (!dma)
		/* allocate and set dai_runtime info */
		dai_runtime = kzalloc(sizeof(*dai_runtime), GFP_KERNEL);
		if (!dai_runtime)
			return -ENOMEM;

		dma->stream_type = SDW_STREAM_PCM;
		dai_runtime->stream_type = SDW_STREAM_PCM;

		dma->bus = &cdns->bus;
		dma->link_id = cdns->instance;
		dai_runtime->bus = &cdns->bus;
		dai_runtime->link_id = cdns->instance;

		dma->stream = stream;
		dai_runtime->stream = stream;
		dai_runtime->direction = direction;

		if (direction == SNDRV_PCM_STREAM_PLAYBACK)
			dai->playback_dma_data = dma;
		else
			dai->capture_dma_data = dma;
	} else {
		/* for NULL stream we release allocated dma_data */
		if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
			kfree(dai->playback_dma_data);
			dai->playback_dma_data = NULL;
		cdns->dai_runtime_array[dai->id] = dai_runtime;
	} else {
			kfree(dai->capture_dma_data);
			dai->capture_dma_data = NULL;
		/* second paranoia check */
		if (!dai_runtime) {
			dev_err(dai->dev,
				"dai_runtime not allocated for dai %s\n",
				dai->name);
			return -EINVAL;
		}

		/* for NULL stream we release allocated dai_runtime */
		kfree(dai_runtime);
		cdns->dai_runtime_array[dai->id] = NULL;
	}
	return 0;
}
+7 −2
Original line number Diff line number Diff line
@@ -70,7 +70,7 @@ struct sdw_cdns_stream_config {
};

/**
 * struct sdw_cdns_dma_data: Cadence DMA data
 * struct sdw_cdns_dai_runtime: Cadence DAI runtime data
 *
 * @name: SoundWire stream name
 * @stream: stream runtime
@@ -81,8 +81,9 @@ struct sdw_cdns_stream_config {
 * @hw_params: hw_params to be applied in .prepare step
 * @suspended: status set when suspended, to be used in .prepare
 * @paused: status set in .trigger, to be used in suspend
 * @direction: stream direction
 */
struct sdw_cdns_dma_data {
struct sdw_cdns_dai_runtime {
	char *name;
	struct sdw_stream_runtime *stream;
	struct sdw_cdns_pdi *pdi;
@@ -92,6 +93,7 @@ struct sdw_cdns_dma_data {
	struct snd_pcm_hw_params *hw_params;
	bool suspended;
	bool paused;
	int direction;
};

/**
@@ -108,6 +110,7 @@ struct sdw_cdns_dma_data {
 * @registers: Cadence registers
 * @link_up: Link status
 * @msg_count: Messages sent on bus
 * @dai_runtime_array: runtime context for each allocated DAI.
 */
struct sdw_cdns {
	struct device *dev;
@@ -135,6 +138,8 @@ struct sdw_cdns {
	struct work_struct work;

	struct list_head list;

	struct sdw_cdns_dai_runtime **dai_runtime_array;
};

#define bus_to_cdns(_bus) container_of(_bus, struct sdw_cdns, bus)
Loading