1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
/* SPDX-License-Identifier: GPL-2.0-only */
/* ======== General PnP configuration functions ======= */
/*
* Controlled by the following preprocessor defines:
* PNP_ENTER_MAGIC_1ST If defined, specifies the first magic byte
* used to enter config mode.
* PNP_ENTER_MAGIC_2ND If defined, specifies the second magic byte
* used to enter config mode.
* PNP_ENTER_MAGIC_3RD If defined, specifies the third magic byte
* used to enter config mode.
* PNP_ENTER_MAGIC_4TH If defined, specifies the fourth magic byte
* used to enter config mode.
* PNP_EXIT_MAGIC_1ST If defined, specifies the first magic byte
* used to exit config mode.
* PNP_EXIT_SPECIAL_REG If defined, specifies a special register plus
* PNP_EXIT_SPECIAL_VAL a value to be written there to exit config mode.
*/
/*
* Mutex for accesses to the configuration ports (prolog and
* epilog commands are used, so synchronization is useful)
*/
Mutex(CONF_MODE_MUTEX, 1)
/*
* Enter configuration mode (and aquire mutex)
* Method must be run before accesssing the configuration region.
* Parameter is the LDN which should be accessed. Values >= 0xFF mean
* no LDN switch should be done.
*/
Method (ENTER_CONFIG_MODE, 1)
{
Acquire (CONF_MODE_MUTEX, 0xFFFF)
#ifdef PNP_ENTER_MAGIC_1ST
Store (PNP_ENTER_MAGIC_1ST, PNP_ADDR_REG)
#ifdef PNP_ENTER_MAGIC_2ND
Store (PNP_ENTER_MAGIC_2ND, PNP_ADDR_REG)
#ifdef PNP_ENTER_MAGIC_3RD
Store (PNP_ENTER_MAGIC_3RD, PNP_ADDR_REG)
#ifdef PNP_ENTER_MAGIC_4TH
Store (PNP_ENTER_MAGIC_4TH, PNP_ADDR_REG)
#endif
#endif
#endif
#endif
If (LLess(Arg0, PNP_NO_LDN_CHANGE)) {
Store(Arg0, PNP_LOGICAL_DEVICE)
}
}
/*
* Exit configuration mode (i.e. release mutex)
* Method must be run after accessing the configuration region.
*/
Method (EXIT_CONFIG_MODE)
{
#ifdef PNP_EXIT_MAGIC_1ST
Store (PNP_EXIT_MAGIC_1ST, PNP_ADDR_REG)
#endif
#if defined(PNP_EXIT_SPECIAL_REG) && defined(PNP_EXIT_SPECIAL_VAL)
Store (PNP_EXIT_SPECIAL_VAL, PNP_EXIT_SPECIAL_REG)
#endif
Release (CONF_MODE_MUTEX)
}
/*
* Just change the LDN. Make sure that you are in config mode (or
* have otherwise acquired CONF_MODE_MUTEX), when calling.
*/
Method (SWITCH_LDN, 1)
{
Store(Arg0, PNP_LOGICAL_DEVICE)
}
|