1/* SPDX-License-Identifier: GPL-2.0-only */ 2 3#ifndef SUPERIO_ACPI_PNP_DEFS_ASL 4#define SUPERIO_ACPI_PNP_DEFS_ASL 5 6#define _SUPERIO_ID(name, ldn) name ## ldn 7#define SUPERIO_ID(name, ldn) _SUPERIO_ID(name, ldn) 8 9#define STRINGIFY(x) #x 10#define EXPAND_AND_STRINGIFY(x) STRINGIFY(x) 11#define SUPERIO_UID(name, ldn) \ 12 EXPAND_AND_STRINGIFY(SUPERIO_CHIP_NAME-SUPERIO_ID(name, ldn)) 13#define SUPERIO_NAME(name) EXPAND_AND_STRINGIFY(SUPERIO_CHIP_NAME name) 14 15/* Some longer identifiers for readability */ 16#define PNP_ADDR_REG ADDR 17#define PNP_DATA_REG DATA 18#define PNP_LOGICAL_DEVICE LDN 19#define PNP_DEVICE_ACTIVE ACTR 20#define PNP_IO0_HIGH_BYTE IO0H 21#define PNP_IO0_LOW_BYTE IO0L 22#define PNP_IO1_HIGH_BYTE IO1H 23#define PNP_IO1_LOW_BYTE IO1L 24#define PNP_IO2_HIGH_BYTE IO2H 25#define PNP_IO2_LOW_BYTE IO2L 26#define PNP_IRQ0 IRQ0 27#define PNP_IRQ1 IRQ1 28#define PNP_DMA0 DMA0 29 30#define CONF_MODE_MUTEX CMMX 31#define ENTER_CONFIG_MODE ENCM 32#define EXIT_CONFIG_MODE EXCM 33#define SWITCH_LDN SWLD 34#define PNP_NO_LDN_CHANGE 0xff 35 36/* Values for ACPI's _STA method */ 37#define DEVICE_NOT_PRESENT 0x00 38#define DEVICE_PRESENT_ACTIVE 0x0f 39#define DEVICE_PRESENT_INACTIVE 0x0d 40 41 42/* ================== Generic Method bodies ================= */ 43 44#define PNP_GENERIC_STA(LDN) \ 45 ENTER_CONFIG_MODE (LDN)\ 46 If (PNP_DEVICE_ACTIVE) {\ 47 Local0 = DEVICE_PRESENT_ACTIVE \ 48 }\ 49 Else\ 50 {\ 51 Local0 = DEVICE_PRESENT_INACTIVE \ 52 }\ 53 EXIT_CONFIG_MODE ()\ 54 Return (Local0)\ 55 56#define PNP_GENERIC_DIS(LDN) \ 57 ENTER_CONFIG_MODE (LDN)\ 58 PNP_DEVICE_ACTIVE = 0 \ 59 EXIT_CONFIG_MODE ()\ 60 61 62/* 63 * Current power state (returns the chip's state) 64 */ 65#define PNP_DEFAULT_PSC \ 66 Local0 = ^^_PSC () \ 67 Return (Local0) 68 69/* 70 * Current power state (returns the chip's state, if it's in 71 * power saving mode, 3 if this LDN is in power saving mode, 72 * 0 else) 73 * 74 * PM_REG Identifier of a register which powers down the device 75 * PM_LDN The logical device number to access the PM_REG 76 * bit 77 */ 78#define PNP_GENERIC_PSC(PM_REG, PM_VAL, PM_LDN) \ 79 Local0 = ^^_PSC () \ 80 If (Local0) { Return (Local0) }\ 81 ENTER_CONFIG_MODE (PM_LDN)\ 82 Local0 = PM_REG \ 83 EXIT_CONFIG_MODE ()\ 84 If (Local0 == PM_VAL) { Return (3) }\ 85 Else { Return (0) }\ 86 87/* Disable power saving mode */ 88#define PNP_GENERIC_PS0(PM_REG, PM_VAL, PM_LDN) \ 89 ENTER_CONFIG_MODE (PM_LDN)\ 90 PM_REG = ~PM_VAL \ 91 EXIT_CONFIG_MODE () 92 93/* Enable power saving mode */ 94#define PNP_GENERIC_PS3(PM_REG, PM_VAL, PM_LDN) \ 95 ENTER_CONFIG_MODE (PM_LDN)\ 96 PM_REG = PM_VAL \ 97 EXIT_CONFIG_MODE () 98 99 100/* ==================== Resource helpers ==================== */ 101 102#define PNP_READ_IO(IO_FROM, RESOURCE_TEMPLATE, IO_TAG) \ 103 CreateWordField (RESOURCE_TEMPLATE, IO_TAG._MIN, IO_TAG##I)\ 104 CreateWordField (RESOURCE_TEMPLATE, IO_TAG._MAX, IO_TAG##A)\ 105 Local0 = (IO_FROM##_HIGH_BYTE << 8) | IO_FROM##_LOW_BYTE \ 106 IO_TAG##I = Local0 \ 107 IO_TAG##A = Local0 108 109#define PNP_READ_IRQ(IRQ_FROM, RESOURCE_TEMPLATE, IRQ_TAG) \ 110 CreateWordField (RESOURCE_TEMPLATE, IRQ_TAG._INT, IRQ_TAG##W)\ 111 IRQ_TAG##W = 1 << IRQ_FROM 112 113#define PNP_READ_DMA(DMA_FROM, RESOURCE_TEMPLATE, DMA_TAG) \ 114 CreateByteField (RESOURCE_TEMPLATE, DMA_TAG._DMA, DMA_TAG##W)\ 115 DMA_TAG##W = 1 << DMA_FROM 116 117#define PNP_WRITE_IO(IO_TO, RESOURCE, IO_TAG) \ 118 CreateWordField (RESOURCE, IO_TAG._MIN, IO_TAG##I)\ 119 IO_TO##_LOW_BYTE = IO_TAG##I & 0xff \ 120 IO_TO##_HIGH_BYTE = IO_TAG##I >> 8 121 122#define PNP_WRITE_IRQ(IRQ_TO, RESOURCE, IRQ_TAG) \ 123 CreateWordField (RESOURCE, IRQ_TAG._INT, IRQ_TAG##W)\ 124 IRQ_TO = FindSetLeftBit (IRQ_TAG##W) - 1 125 126#define PNP_WRITE_DMA(DMA_TO, RESOURCE, DMA_TAG) \ 127 CreateByteField (RESOURCE, DMA_TAG._DMA, DMA_TAG##W)\ 128 DMA_TO = FindSetLeftBit (DMA_TAG##W) - 1 129 130#endif 131