# SPDX-License-Identifier: GPL-2.0
%YAML 1.2
---
$id: http://devicetree.org/schemas/net/can/bosch,m_can.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Bosch MCAN controller

description: Bosch MCAN controller for CAN bus

maintainers:
  - Chandrasekar Ramakrishnan <rcsekar@samsung.com>

allOf:
  - $ref: can-controller.yaml#

properties:
  compatible:
    const: bosch,m_can

  reg:
    items:
      - description: M_CAN registers map
      - description: message RAM

  reg-names:
    items:
      - const: m_can
      - const: message_ram

  interrupts:
    items:
      - description: interrupt line0
      - description: interrupt line1
    minItems: 1

  interrupt-names:
    items:
      - const: int0
      - const: int1
    minItems: 1

  clocks:
    items:
      - description: peripheral clock
      - description: bus clock

  clock-names:
    items:
      - const: hclk
      - const: cclk

  bosch,mram-cfg:
    description: |
      Message RAM configuration data.
      Multiple M_CAN instances can share the same Message RAM
      and each element(e.g Rx FIFO or Tx Buffer and etc) number
      in Message RAM is also configurable, so this property is
      telling driver how the shared or private Message RAM are
      used by this M_CAN controller.

      The format should be as follows:
      <offset sidf_elems xidf_elems rxf0_elems rxf1_elems rxb_elems txe_elems txb_elems>
      The 'offset' is an address offset of the Message RAM where
      the following elements start from. This is usually set to
      0x0 if you're using a private Message RAM. The remain cells
      are used to specify how many elements are used for each FIFO/Buffer.

      M_CAN includes the following elements according to user manual:
      11-bit Filter	0-128 elements / 0-128 words
      29-bit Filter	0-64 elements / 0-128 words
      Rx FIFO 0		0-64 elements / 0-1152 words
      Rx FIFO 1		0-64 elements / 0-1152 words
      Rx Buffers	0-64 elements / 0-1152 words
      Tx Event FIFO	0-32 elements / 0-64 words
      Tx Buffers	0-32 elements / 0-576 words

      Please refer to 2.4.1 Message RAM Configuration in Bosch
      M_CAN user manual for details.
    $ref: /schemas/types.yaml#/definitions/int32-array
    items:
      - description: The 'offset' is an address offset of the Message RAM where
          the following elements start from. This is usually set to 0x0 if
          you're using a private Message RAM.
        default: 0
      - description: 11-bit Filter 0-128 elements / 0-128 words
        minimum: 0
        maximum: 128
      - description: 29-bit Filter 0-64 elements / 0-128 words
        minimum: 0
        maximum: 64
      - description: Rx FIFO 0 0-64 elements / 0-1152 words
        minimum: 0
        maximum: 64
      - description: Rx FIFO 1 0-64 elements / 0-1152 words
        minimum: 0
        maximum: 64
      - description: Rx Buffers 0-64 elements / 0-1152 words
        minimum: 0
        maximum: 64
      - description: Tx Event FIFO 0-32 elements / 0-64 words
        minimum: 0
        maximum: 32
      - description: Tx Buffers 0-32 elements / 0-576 words
        minimum: 0
        maximum: 32
    minItems: 1

  power-domains:
    description:
      Power domain provider node and an args specifier containing
      the can device id value.
    maxItems: 1

  can-transceiver:
    $ref: can-transceiver.yaml#

  phys:
    maxItems: 1

required:
  - compatible
  - reg
  - reg-names
  - clocks
  - clock-names
  - bosch,mram-cfg

unevaluatedProperties: false

examples:
  - |
    // Example with interrupts
    #include <dt-bindings/clock/imx6sx-clock.h>
    can@20e8000 {
      compatible = "bosch,m_can";
      reg = <0x020e8000 0x4000>, <0x02298000 0x4000>;
      reg-names = "m_can", "message_ram";
      interrupts = <0 114 0x04>, <0 114 0x04>;
      interrupt-names = "int0", "int1";
      clocks = <&clks IMX6SX_CLK_CANFD>,
               <&clks IMX6SX_CLK_CANFD>;
      clock-names = "hclk", "cclk";
      bosch,mram-cfg = <0x0 0 0 32 0 0 0 1>;

      can-transceiver {
        max-bitrate = <5000000>;
      };
    };

  - |
    // Example with timer polling
    #include <dt-bindings/clock/imx6sx-clock.h>
    can@20e8000 {
      compatible = "bosch,m_can";
      reg = <0x020e8000 0x4000>, <0x02298000 0x4000>;
      reg-names = "m_can", "message_ram";
      clocks = <&clks IMX6SX_CLK_CANFD>,
               <&clks IMX6SX_CLK_CANFD>;
      clock-names = "hclk", "cclk";
      bosch,mram-cfg = <0x0 0 0 32 0 0 0 1>;

      can-transceiver {
        max-bitrate = <5000000>;
      };
    };

...