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

#include <zephyr/dt-bindings/espi/npcx_espi.h>

/*
 *                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
 */

/ {
	npcx-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>;
		};
	};
};
