View | Details | Raw Unified | Return to bug 170741 | Differences between
and this patch

Collapse All | Expand All

(-)a/include/linux/ioport.h (+5 lines)
Lines 52-57 struct resource { Link Here
52
#define IORESOURCE_MEM_64	0x00100000
52
#define IORESOURCE_MEM_64	0x00100000
53
#define IORESOURCE_WINDOW	0x00200000	/* forwarded by bridge */
53
#define IORESOURCE_WINDOW	0x00200000	/* forwarded by bridge */
54
#define IORESOURCE_MUXED	0x00400000	/* Resource is software muxed */
54
#define IORESOURCE_MUXED	0x00400000	/* Resource is software muxed */
55
#define IORESOURCE_ALLOCATED	0x00800000	/* Resource was allocated */
55
56
56
#define IORESOURCE_EXT_TYPE_BITS 0x01000000	/* Resource extended types */
57
#define IORESOURCE_EXT_TYPE_BITS 0x01000000	/* Resource extended types */
57
#define IORESOURCE_SYSRAM	0x01000000	/* System RAM (modifier) */
58
#define IORESOURCE_SYSRAM	0x01000000	/* System RAM (modifier) */
Lines 216-227 static inline bool resource_contains(struct resource *r1, struct resource *r2) Link Here
216
/* Convenience shorthand with allocation */
217
/* Convenience shorthand with allocation */
217
#define request_region(start,n,name)		__request_region(&ioport_resource, (start), (n), (name), 0)
218
#define request_region(start,n,name)		__request_region(&ioport_resource, (start), (n), (name), 0)
218
#define request_muxed_region(start,n,name)	__request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED)
219
#define request_muxed_region(start,n,name)	__request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED)
220
#define request_declared_muxed_region(res)	__request_declared_region(&ioport_resource, (res), IORESOURCE_MUXED)
219
#define __request_mem_region(start,n,name, excl) __request_region(&iomem_resource, (start), (n), (name), excl)
221
#define __request_mem_region(start,n,name, excl) __request_region(&iomem_resource, (start), (n), (name), excl)
220
#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)
222
#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)
221
#define request_mem_region_exclusive(start,n,name) \
223
#define request_mem_region_exclusive(start,n,name) \
222
	__request_region(&iomem_resource, (start), (n), (name), IORESOURCE_EXCLUSIVE)
224
	__request_region(&iomem_resource, (start), (n), (name), IORESOURCE_EXCLUSIVE)
223
#define rename_region(region, newname) do { (region)->name = (newname); } while (0)
225
#define rename_region(region, newname) do { (region)->name = (newname); } while (0)
224
226
227
extern struct resource * __request_declared_region(struct resource *,
228
					struct resource *res, int flags);
229
225
extern struct resource * __request_region(struct resource *,
230
extern struct resource * __request_region(struct resource *,
226
					resource_size_t start,
231
					resource_size_t start,
227
					resource_size_t n,
232
					resource_size_t n,
(-)a/kernel/resource.c (-17 / +39 lines)
Lines 184-189 static void free_resource(struct resource *res) Link Here
184
	if (!res)
184
	if (!res)
185
		return;
185
		return;
186
186
187
	if (!(res->flags & IORESOURCE_ALLOCATED))
188
		return;
189
187
	if (!PageSlab(virt_to_head_page(res))) {
190
	if (!PageSlab(virt_to_head_page(res))) {
188
		spin_lock(&bootmem_resource_lock);
191
		spin_lock(&bootmem_resource_lock);
189
		res->sibling = bootmem_resource_free;
192
		res->sibling = bootmem_resource_free;
Lines 210-215 static struct resource *alloc_resource(gfp_t flags) Link Here
210
	else
213
	else
211
		res = kzalloc(sizeof(struct resource), flags);
214
		res = kzalloc(sizeof(struct resource), flags);
212
215
216
	res->flags = IORESOURCE_ALLOCATED;
217
213
	return res;
218
	return res;
214
}
219
}
215
220
Lines 1117-1142 resource_size_t resource_alignment(struct resource *res) Link Here
1117
static DECLARE_WAIT_QUEUE_HEAD(muxed_resource_wait);
1122
static DECLARE_WAIT_QUEUE_HEAD(muxed_resource_wait);
1118
1123
1119
/**
1124
/**
1120
 * __request_region - create a new busy resource region
1125
 * __request_declared_region - create a new busy resource region
1121
 * @parent: parent resource descriptor
1126
 * @parent: parent resource descriptor
1122
 * @start: resource start address
1127
 * @res: child resource descriptor
1123
 * @n: resource region size
1124
 * @name: reserving caller's ID string
1125
 * @flags: IO resource flags
1128
 * @flags: IO resource flags
1126
 */
1129
 */
1127
struct resource * __request_region(struct resource *parent,
1130
struct resource * __request_declared_region(struct resource *parent,
1128
				   resource_size_t start, resource_size_t n,
1131
				   struct resource *res, int flags)
1129
				   const char *name, int flags)
1130
{
1132
{
1131
	DECLARE_WAITQUEUE(wait, current);
1133
	DECLARE_WAITQUEUE(wait, current);
1132
	struct resource *res = alloc_resource(GFP_KERNEL);
1133
1134
	if (!res)
1135
		return NULL;
1136
1137
	res->name = name;
1138
	res->start = start;
1139
	res->end = start + n - 1;
1140
1134
1141
	write_lock(&resource_lock);
1135
	write_lock(&resource_lock);
1142
1136
Lines 1166-1178 struct resource * __request_region(struct resource *parent, Link Here
1166
			continue;
1160
			continue;
1167
		}
1161
		}
1168
		/* Uhhuh, that didn't work out.. */
1162
		/* Uhhuh, that didn't work out.. */
1169
		free_resource(res);
1170
		res = NULL;
1163
		res = NULL;
1171
		break;
1164
		break;
1172
	}
1165
	}
1173
	write_unlock(&resource_lock);
1166
	write_unlock(&resource_lock);
1174
	return res;
1167
	return res;
1175
}
1168
}
1169
EXPORT_SYMBOL(__request_declared_region);
1170
1171
/**
1172
 * __request_region - create a new busy resource region
1173
 * @parent: parent resource descriptor
1174
 * @start: resource start address
1175
 * @n: resource region size
1176
 * @name: reserving caller's ID string
1177
 * @flags: IO resource flags
1178
 */
1179
struct resource * __request_region(struct resource *parent,
1180
				   resource_size_t start, resource_size_t n,
1181
				   const char *name, int flags)
1182
{
1183
	struct resource *res = alloc_resource(GFP_KERNEL);
1184
1185
	if (!res)
1186
		return NULL;
1187
1188
	res->name = name;
1189
	res->start = start;
1190
	res->end = start + n - 1;
1191
1192
	if (!__request_declared_region(parent, res, flags)) {
1193
		free_resource(res);
1194
		res = NULL;
1195
	}
1196
1197
	return res;
1198
}
1176
EXPORT_SYMBOL(__request_region);
1199
EXPORT_SYMBOL(__request_region);
1177
1200
1178
/**
1201
/**
1179
- 

Return to bug 170741