/*
 * Copyright (c) 2020 Nuvoton Technology Corporation.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/*
 *                Nuvoton NPCX7 eSPI Virtual Wires Mapping Table
 * |--------------------------------------------------------------------------|
 * | VW idx | SLV reg | Wire Bit 3   | Wire Bit 2   | Wire Bit 1| Wire Bit 0  |
 * |--------------------------------------------------------------------------|
 * |                 Input (Master-to-Slave) Virtual Wires                    |
 * |--------------------------------------------------------------------------|
 * | 02h[S] | VWEVMS0 | Reserved     | SLP_S5#      | SLP_S4#   | SLP_S3#     |
 * | 03h[S] | VWEVMS1 | Reserved     | OOB_RST_WARN | PLTRST#   | SUS_STAT#   |
 * | 07h[S] | VWEVMS2 | Reserved     | Reserved     | Reserved  | HOS_RST_WARN|
 * | 41h[P] | VWEVMS3 | SLP_A#       | Reserved     | SUS_PDNACK| SUS_WARN#   |
 * | 42h[P] | VWEVMS4 | Reserved     | Reserved     | SLP_WLAN# | SLP_LAN#    |
 * |--------------------------------------------------------------------------|
 * |                Output (Slave-to-Master) Virtual Wires                    |
 * |--------------------------------------------------------------------------|
 * | 04h[S] | VWEVSM0 | PME#         | WAKE#        | Reserved  | OOB_RST_ACK |
 * | 05h[S] | VWEVSM1 | SLV_BOOT_STS | ERR_NONFATAL | ERR_FATAL | SLV_BT_DONE |
 * | 06h[S] | VWEVSM2 | HOST_RST_ACK | Reserved     | SMI#      | SCI#        |
 * | 40h[P] | VWEVSM3 | Reserved     | Reserved     | Reserved  | SUS_ACK#    |
 * |--------------------------------------------------------------------------|
 *  [S] System-/[P] Platform-Specific Virtual Wires
 */

/ {
	npcx7-espi-vws-map {
		compatible = "nuvoton,npcx-espi-vw-conf";

		/* eSPI Virtual Vire (VW) input configuration */
		/* index 02h (In) */
		vw-slp-s3 {
			vw-reg = <NPCX_VWEVMS0 0x01>;
			vw-wui = <&wui_vw_slp_s3>;
		};
		vw-slp-s4 {
			vw-reg = <NPCX_VWEVMS0 0x02>;
			vw-wui = <&wui_vw_slp_s4>;
		};
		vw-slp-s5 {
			vw-reg = <NPCX_VWEVMS0 0x04>;
			vw-wui = <&wui_vw_slp_s5>;
		};

		/* index 03h (In) */
		vw-sus-stat {
			vw-reg = <NPCX_VWEVMS1 0x01>;
			vw-wui = <&wui_vw_sus_stat>;
		};
		vw-plt-rst {
			vw-reg = <NPCX_VWEVMS1 0x02>;
			vw-wui = <&wui_vw_plt_rst>;
		};
		vw-oob-rst-warn {
			vw-reg = <NPCX_VWEVMS1 0x04>;
			vw-wui = <&wui_vw_oob_rst_warn>;
		};

		/* index 07h (In) */
		vw-host-rst-warn {
			vw-reg = <NPCX_VWEVMS2 0x01>;
			vw-wui = <&wui_vw_host_rst_warn>;
		};

		/* index 41h (In) */
		vw-sus-warn {
			vw-reg = <NPCX_VWEVMS3 0x01>;
			vw-wui = <&wui_vw_sus_warn>;
		};
		vw-sus-pwrdn-ack {
			vw-reg = <NPCX_VWEVMS3 0x02>;
			vw-wui = <&wui_vw_sus_pwrdn_ack>;
		};
		vw-slp-a {
			vw-reg = <NPCX_VWEVMS3 0x08>;
			vw-wui = <&wui_vw_slp_a>;
		};

		/* index 42h (In) */
		vw-slp-lan {
			vw-reg = <NPCX_VWEVMS4 0x01>;
			vw-wui = <&wui_vw_slp_lan>;
		};
		vw-slp-wlan {
			vw-reg = <NPCX_VWEVMS4 0x02>;
			vw-wui = <&wui_vw_slp_wlan>;
		};

		/* eSPI Virtual Vire (VW) output configuration */
		/* index 04h (Out) */
		vw-oob-rst-ack {
			vw-reg = <NPCX_VWEVSM0 0x01>;
		};
		vw-wake {
			vw-reg = <NPCX_VWEVSM0 0x04>;
		};
		vw-pme {
			vw-reg = <NPCX_VWEVSM0 0x08>;
		};

		/* index 05h (Out) */
		vw-slv-boot-done {
			vw-reg = <NPCX_VWEVSM1 0x01>;
		};
		vw-err-fatal {
			vw-reg = <NPCX_VWEVSM1 0x02>;
		};
		vw-err-non-fatal {
			vw-reg = <NPCX_VWEVSM1 0x04>;
		};
		vw-slv-boot-sts-with-done {
			/*
			 * SLAVE_BOOT_DONE & SLAVE_LOAD_STS bits (bit 0 & bit 3)
			 * have to be sent together. Hence its bitmask is 0x09.
			 */
			vw-reg = <NPCX_VWEVSM1 0x09>;
		};

		/* index 06h (Out) */
		vw-sci {
			vw-reg = <NPCX_VWEVSM2 0x01>;
		};
		vw-smi {
			vw-reg = <NPCX_VWEVSM2 0x02>;
		};
		vw-host-rst-ack {
			vw-reg = <NPCX_VWEVSM2 0x08>;
		};

		/* index 40h (Out) */
		vw-sus-ack {
			vw-reg = <NPCX_VWEVSM3 0x01>;
		};
	};
};
