aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/motherboard.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/motherboard.c')
-rw-r--r--drivers/acpi/motherboard.c108
1 files changed, 56 insertions, 52 deletions
diff --git a/drivers/acpi/motherboard.c b/drivers/acpi/motherboard.c
index 2934475d67d6..e10fb4f842b1 100644
--- a/drivers/acpi/motherboard.c
+++ b/drivers/acpi/motherboard.c
@@ -30,12 +30,11 @@
30#include <acpi/acpi_drivers.h> 30#include <acpi/acpi_drivers.h>
31 31
32#define _COMPONENT ACPI_SYSTEM_COMPONENT 32#define _COMPONENT ACPI_SYSTEM_COMPONENT
33ACPI_MODULE_NAME ("acpi_motherboard") 33ACPI_MODULE_NAME("acpi_motherboard")
34 34
35/* Dell use PNP0C01 instead of PNP0C02 */ 35/* Dell use PNP0C01 instead of PNP0C02 */
36#define ACPI_MB_HID1 "PNP0C01" 36#define ACPI_MB_HID1 "PNP0C01"
37#define ACPI_MB_HID2 "PNP0C02" 37#define ACPI_MB_HID2 "PNP0C02"
38
39/** 38/**
40 * Doesn't care about legacy IO ports, only IO ports beyond 0x1000 are reserved 39 * Doesn't care about legacy IO ports, only IO ports beyond 0x1000 are reserved
41 * Doesn't care about the failure of 'request_region', since other may reserve 40 * Doesn't care about the failure of 'request_region', since other may reserve
@@ -44,15 +43,12 @@ ACPI_MODULE_NAME ("acpi_motherboard")
44#define IS_RESERVED_ADDR(base, len) \ 43#define IS_RESERVED_ADDR(base, len) \
45 (((len) > 0) && ((base) > 0) && ((base) + (len) < IO_SPACE_LIMIT) \ 44 (((len) > 0) && ((base) > 0) && ((base) + (len) < IO_SPACE_LIMIT) \
46 && ((base) + (len) > 0x1000)) 45 && ((base) + (len) > 0x1000))
47
48/* 46/*
49 * Clearing the flag (IORESOURCE_BUSY) allows drivers to use 47 * Clearing the flag (IORESOURCE_BUSY) allows drivers to use
50 * the io ports if they really know they can use it, while 48 * the io ports if they really know they can use it, while
51 * still preventing hotplug PCI devices from using it. 49 * still preventing hotplug PCI devices from using it.
52 */ 50 */
53 51static acpi_status acpi_reserve_io_ranges(struct acpi_resource *res, void *data)
54static acpi_status
55acpi_reserve_io_ranges (struct acpi_resource *res, void *data)
56{ 52{
57 struct resource *requested_res = NULL; 53 struct resource *requested_res = NULL;
58 54
@@ -63,22 +59,32 @@ acpi_reserve_io_ranges (struct acpi_resource *res, void *data)
63 59
64 if (io_res->min_base_address != io_res->max_base_address) 60 if (io_res->min_base_address != io_res->max_base_address)
65 return_VALUE(AE_OK); 61 return_VALUE(AE_OK);
66 if (IS_RESERVED_ADDR(io_res->min_base_address, io_res->range_length)) { 62 if (IS_RESERVED_ADDR
67 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Motherboard resources 0x%08x - 0x%08x\n", 63 (io_res->min_base_address, io_res->range_length)) {
68 io_res->min_base_address, 64 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
69 io_res->min_base_address + io_res->range_length)); 65 "Motherboard resources 0x%08x - 0x%08x\n",
70 requested_res = request_region(io_res->min_base_address, 66 io_res->min_base_address,
71 io_res->range_length, "motherboard"); 67 io_res->min_base_address +
68 io_res->range_length));
69 requested_res =
70 request_region(io_res->min_base_address,
71 io_res->range_length, "motherboard");
72 } 72 }
73 } else if (res->id == ACPI_RSTYPE_FIXED_IO) { 73 } else if (res->id == ACPI_RSTYPE_FIXED_IO) {
74 struct acpi_resource_fixed_io *fixed_io_res = &res->data.fixed_io; 74 struct acpi_resource_fixed_io *fixed_io_res =
75 75 &res->data.fixed_io;
76 if (IS_RESERVED_ADDR(fixed_io_res->base_address, fixed_io_res->range_length)) { 76
77 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Motherboard resources 0x%08x - 0x%08x\n", 77 if (IS_RESERVED_ADDR
78 fixed_io_res->base_address, 78 (fixed_io_res->base_address, fixed_io_res->range_length)) {
79 fixed_io_res->base_address + fixed_io_res->range_length)); 79 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
80 requested_res = request_region(fixed_io_res->base_address, 80 "Motherboard resources 0x%08x - 0x%08x\n",
81 fixed_io_res->range_length, "motherboard"); 81 fixed_io_res->base_address,
82 fixed_io_res->base_address +
83 fixed_io_res->range_length));
84 requested_res =
85 request_region(fixed_io_res->base_address,
86 fixed_io_res->range_length,
87 "motherboard");
82 } 88 }
83 } else { 89 } else {
84 /* Memory mapped IO? */ 90 /* Memory mapped IO? */
@@ -89,72 +95,70 @@ acpi_reserve_io_ranges (struct acpi_resource *res, void *data)
89 return_VALUE(AE_OK); 95 return_VALUE(AE_OK);
90} 96}
91 97
92static int acpi_motherboard_add (struct acpi_device *device) 98static int acpi_motherboard_add(struct acpi_device *device)
93{ 99{
94 if (!device) 100 if (!device)
95 return -EINVAL; 101 return -EINVAL;
96 acpi_walk_resources(device->handle, METHOD_NAME__CRS, 102 acpi_walk_resources(device->handle, METHOD_NAME__CRS,
97 acpi_reserve_io_ranges, NULL); 103 acpi_reserve_io_ranges, NULL);
98 104
99 return 0; 105 return 0;
100} 106}
101 107
102static struct acpi_driver acpi_motherboard_driver1 = { 108static struct acpi_driver acpi_motherboard_driver1 = {
103 .name = "motherboard", 109 .name = "motherboard",
104 .class = "", 110 .class = "",
105 .ids = ACPI_MB_HID1, 111 .ids = ACPI_MB_HID1,
106 .ops = { 112 .ops = {
107 .add = acpi_motherboard_add, 113 .add = acpi_motherboard_add,
108 }, 114 },
109}; 115};
110 116
111static struct acpi_driver acpi_motherboard_driver2 = { 117static struct acpi_driver acpi_motherboard_driver2 = {
112 .name = "motherboard", 118 .name = "motherboard",
113 .class = "", 119 .class = "",
114 .ids = ACPI_MB_HID2, 120 .ids = ACPI_MB_HID2,
115 .ops = { 121 .ops = {
116 .add = acpi_motherboard_add, 122 .add = acpi_motherboard_add,
117 }, 123 },
118}; 124};
119 125
120static void __init 126static void __init acpi_reserve_resources(void)
121acpi_reserve_resources (void)
122{ 127{
123 if (acpi_gbl_FADT->xpm1a_evt_blk.address && acpi_gbl_FADT->pm1_evt_len) 128 if (acpi_gbl_FADT->xpm1a_evt_blk.address && acpi_gbl_FADT->pm1_evt_len)
124 request_region(acpi_gbl_FADT->xpm1a_evt_blk.address, 129 request_region(acpi_gbl_FADT->xpm1a_evt_blk.address,
125 acpi_gbl_FADT->pm1_evt_len, "PM1a_EVT_BLK"); 130 acpi_gbl_FADT->pm1_evt_len, "PM1a_EVT_BLK");
126 131
127 if (acpi_gbl_FADT->xpm1b_evt_blk.address && acpi_gbl_FADT->pm1_evt_len) 132 if (acpi_gbl_FADT->xpm1b_evt_blk.address && acpi_gbl_FADT->pm1_evt_len)
128 request_region(acpi_gbl_FADT->xpm1b_evt_blk.address, 133 request_region(acpi_gbl_FADT->xpm1b_evt_blk.address,
129 acpi_gbl_FADT->pm1_evt_len, "PM1b_EVT_BLK"); 134 acpi_gbl_FADT->pm1_evt_len, "PM1b_EVT_BLK");
130 135
131 if (acpi_gbl_FADT->xpm1a_cnt_blk.address && acpi_gbl_FADT->pm1_cnt_len) 136 if (acpi_gbl_FADT->xpm1a_cnt_blk.address && acpi_gbl_FADT->pm1_cnt_len)
132 request_region(acpi_gbl_FADT->xpm1a_cnt_blk.address, 137 request_region(acpi_gbl_FADT->xpm1a_cnt_blk.address,
133 acpi_gbl_FADT->pm1_cnt_len, "PM1a_CNT_BLK"); 138 acpi_gbl_FADT->pm1_cnt_len, "PM1a_CNT_BLK");
134 139
135 if (acpi_gbl_FADT->xpm1b_cnt_blk.address && acpi_gbl_FADT->pm1_cnt_len) 140 if (acpi_gbl_FADT->xpm1b_cnt_blk.address && acpi_gbl_FADT->pm1_cnt_len)
136 request_region(acpi_gbl_FADT->xpm1b_cnt_blk.address, 141 request_region(acpi_gbl_FADT->xpm1b_cnt_blk.address,
137 acpi_gbl_FADT->pm1_cnt_len, "PM1b_CNT_BLK"); 142 acpi_gbl_FADT->pm1_cnt_len, "PM1b_CNT_BLK");
138 143
139 if (acpi_gbl_FADT->xpm_tmr_blk.address && acpi_gbl_FADT->pm_tm_len == 4) 144 if (acpi_gbl_FADT->xpm_tmr_blk.address && acpi_gbl_FADT->pm_tm_len == 4)
140 request_region(acpi_gbl_FADT->xpm_tmr_blk.address, 145 request_region(acpi_gbl_FADT->xpm_tmr_blk.address, 4, "PM_TMR");
141 4, "PM_TMR");
142 146
143 if (acpi_gbl_FADT->xpm2_cnt_blk.address && acpi_gbl_FADT->pm2_cnt_len) 147 if (acpi_gbl_FADT->xpm2_cnt_blk.address && acpi_gbl_FADT->pm2_cnt_len)
144 request_region(acpi_gbl_FADT->xpm2_cnt_blk.address, 148 request_region(acpi_gbl_FADT->xpm2_cnt_blk.address,
145 acpi_gbl_FADT->pm2_cnt_len, "PM2_CNT_BLK"); 149 acpi_gbl_FADT->pm2_cnt_len, "PM2_CNT_BLK");
146 150
147 /* Length of GPE blocks must be a non-negative multiple of 2 */ 151 /* Length of GPE blocks must be a non-negative multiple of 2 */
148 152
149 if (acpi_gbl_FADT->xgpe0_blk.address && acpi_gbl_FADT->gpe0_blk_len && 153 if (acpi_gbl_FADT->xgpe0_blk.address && acpi_gbl_FADT->gpe0_blk_len &&
150 !(acpi_gbl_FADT->gpe0_blk_len & 0x1)) 154 !(acpi_gbl_FADT->gpe0_blk_len & 0x1))
151 request_region(acpi_gbl_FADT->xgpe0_blk.address, 155 request_region(acpi_gbl_FADT->xgpe0_blk.address,
152 acpi_gbl_FADT->gpe0_blk_len, "GPE0_BLK"); 156 acpi_gbl_FADT->gpe0_blk_len, "GPE0_BLK");
153 157
154 if (acpi_gbl_FADT->xgpe1_blk.address && acpi_gbl_FADT->gpe1_blk_len && 158 if (acpi_gbl_FADT->xgpe1_blk.address && acpi_gbl_FADT->gpe1_blk_len &&
155 !(acpi_gbl_FADT->gpe1_blk_len & 0x1)) 159 !(acpi_gbl_FADT->gpe1_blk_len & 0x1))
156 request_region(acpi_gbl_FADT->xgpe1_blk.address, 160 request_region(acpi_gbl_FADT->xgpe1_blk.address,
157 acpi_gbl_FADT->gpe1_blk_len, "GPE1_BLK"); 161 acpi_gbl_FADT->gpe1_blk_len, "GPE1_BLK");
158} 162}
159 163
160static int __init acpi_motherboard_init(void) 164static int __init acpi_motherboard_init(void)
@@ -166,7 +170,7 @@ static int __init acpi_motherboard_init(void)
166 * This module must run after scan.c 170 * This module must run after scan.c
167 */ 171 */
168 if (!acpi_disabled) 172 if (!acpi_disabled)
169 acpi_reserve_resources (); 173 acpi_reserve_resources();
170 return 0; 174 return 0;
171} 175}
172 176