%YAML 1.2
---
$id: http://devicetree.org/schemas/bindings/soc/qcom/qcom,ipcc.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Qualcomm Technologies, Inc. Inter-Processor Communication Controller binding

maintainers:
  - Raghavendra Rao Ananta <rananta@quicinc.com>

description: |
  The Inter-Processor Communication Controller (IPCC) is a centralized hardware
  to route the interrupts across various subsystems. It involves a three-level
  addressing scheme: protocol, client and signal. For example, consider an entity
  on the Application Processor Subsystem (APSS) that wants to listen to Modem's
  interrupts via Shared Memory Point to Point (SMP2P) interface. In such a case,
  the client would be Modem (client-id: 2) and the signal would be SMP2P
  (signal-id: 2). The SMP2P itself falls under the Multiprocessor (MPROC) protocol
  (protocol-id: 0). Please visit include/dt-bindings/soc/qcom/qcom,ipcc.h for the
  list of IDs.

  Each protocol has a dedicated interrupt line, and as a result, each protocol is
  exposed as a separate interrupt controller. One of the duties of this interrupt
  controller driver would be to forward the interrupt to the correct entity
  on the APPS. The children inheriting the interrupt-controller would be
  mentioning the client-id and signal-id that it's interested in.

  On the other hand, sending an interrupt to a subsystem is done through the
  mailbox interface, which again requires client-id and signal-id.

properties:
  compatible:
    Usage: required
    Value type: <string>
    Definition: Must be "qcom,ipcc"

  reg:
    Usage: required
    Value type: <prop-encoded-array>
    Definition: One entry specifying the base address and size corresponding to
	      the protocol frame

  interrupts:
    Usage: required
    Value type: <prop-encoded-array>
    Definition: One entry specifying the protocol's interrupt

  interrupt-controller:
    Usage: required
    Value type: <empty>
    Definition: Specifies that the device acts as an interrupt controller

  #interrupt-cells:
    Usage: required
    Value type: <u32>
    Definition: must be 3 - denoting client-id, signal-id and interrupt type

  mbox-cells:
    Usage: required
    Value type: <u32>
    Definition: must be 2 - denoting client-id and signal-id

example:
  - |
    #include <dt-bindings/soc/qcom,ipcc.h>

    ipcc_mproc: qcom,ipcc@408000 {
	compatible = "qcom,ipcc";
	reg = <0x408000 0x1000>;
	interrupts = <GIC_SPI 229 IRQ_TYPE_LEVEL_HIGH>,
	interrupt-controller;
	#interrupt-cells = <3>;
	#mbox-cells = <2>;
    };

client-example:
  - |
    qcom,smp2p-modem@1799000c {
	compatible = "qcom,smp2p";
	interrupts-extended = <&ipcc_mproc IPCC_CLIENT_MPSS
			IPCC_MPROC_SIGNAL_SMP2P IRQ_TYPE_EDGE_RISING>;
	mboxes = <&ipcc_mproc IPCC_CLIENT_MPSS IPCC_MPROC_SIGNAL_SMP2P>;

	/* Other SMP2P fields */
    };

