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

Collapse All | Expand All

(-)a/include/linux/ioport.h (+14 lines)
Lines 53-58 struct resource { Link Here
53
#define IORESOURCE_MEM_64	0x00100000
53
#define IORESOURCE_MEM_64	0x00100000
54
#define IORESOURCE_WINDOW	0x00200000	/* forwarded by bridge */
54
#define IORESOURCE_WINDOW	0x00200000	/* forwarded by bridge */
55
#define IORESOURCE_MUXED	0x00400000	/* Resource is software muxed */
55
#define IORESOURCE_MUXED	0x00400000	/* Resource is software muxed */
56
#define IORESOURCE_ALLOCATED	0x00800000	/* Resource was allocated */
56
57
57
#define IORESOURCE_EXT_TYPE_BITS 0x01000000	/* Resource extended types */
58
#define IORESOURCE_EXT_TYPE_BITS 0x01000000	/* Resource extended types */
58
#define IORESOURCE_SYSRAM	0x01000000	/* System RAM (modifier) */
59
#define IORESOURCE_SYSRAM	0x01000000	/* System RAM (modifier) */
Lines 218-224 static inline bool resource_contains(struct resource *r1, struct resource *r2) Link Here
218
219
219
/* Convenience shorthand with allocation */
220
/* Convenience shorthand with allocation */
220
#define request_region(start,n,name)		__request_region(&ioport_resource, (start), (n), (name), 0)
221
#define request_region(start,n,name)		__request_region(&ioport_resource, (start), (n), (name), 0)
222
#define request_declared_region(res)		__request_region( \
223
							&ioport_resource, \
224
							(res), 0)
221
#define request_muxed_region(start,n,name)	__request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED)
225
#define request_muxed_region(start,n,name)	__request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED)
226
#define request_declared_muxed_region(res)	__request_declared_region( \
227
							&ioport_resource, \
228
							(res), \
229
							IORESOURCE_MUXED)
222
#define __request_mem_region(start,n,name, excl) __request_region(&iomem_resource, (start), (n), (name), excl)
230
#define __request_mem_region(start,n,name, excl) __request_region(&iomem_resource, (start), (n), (name), excl)
223
#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)
231
#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)
224
#define request_mem_region_exclusive(start,n,name) \
232
#define request_mem_region_exclusive(start,n,name) \
Lines 230-237 extern struct resource * __request_region(struct resource *, Link Here
230
					resource_size_t n,
238
					resource_size_t n,
231
					const char *name, int flags);
239
					const char *name, int flags);
232
240
241
extern struct resource *__request_declared_region(struct resource *parent,
242
					struct resource *res, int flags);
243
233
/* Compatibility cruft */
244
/* Compatibility cruft */
234
#define release_region(start,n)	__release_region(&ioport_resource, (start), (n))
245
#define release_region(start,n)	__release_region(&ioport_resource, (start), (n))
246
#define release_declared_region(res)	__release_region(&ioport_resource, \
247
						(res)->start, \
248
						(res)->end - (res)->start + 1)
235
#define release_mem_region(start,n)	__release_region(&iomem_resource, (start), (n))
249
#define release_mem_region(start,n)	__release_region(&iomem_resource, (start), (n))
236
250
237
extern void __release_region(struct resource *, resource_size_t,
251
extern void __release_region(struct resource *, resource_size_t,
(-)a/kernel/resource.c (-4 / +37 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 1128-1135 resource_size_t resource_alignment(struct resource *res) Link Here
1128
 * the IO flag meanings (busy etc).
1133
 * the IO flag meanings (busy etc).
1129
 *
1134
 *
1130
 * request_region creates a new busy region.
1135
 * request_region creates a new busy region.
1136
 * The resource descriptor is allocated by this function.
1137
 *
1138
 * request_declared_region creates a new busy region
1139
 * described in an existing resource descriptor.
1140
 *
1141
 * request_muxed_region creates a new shared busy region.
1142
 * The resource descriptor is allocated by this function.
1143
 *
1144
 * request_declared_muxed_region creates a new shared busy region
1145
 * described in an existing resource descriptor.
1131
 *
1146
 *
1132
 * release_region releases a matching busy region.
1147
 * release_region releases a matching busy region.
1148
 * The region is only freed if it was allocated.
1133
 */
1149
 */
1134
1150
1135
static DECLARE_WAIT_QUEUE_HEAD(muxed_resource_wait);
1151
static DECLARE_WAIT_QUEUE_HEAD(muxed_resource_wait);
Lines 1146-1152 struct resource * __request_region(struct resource *parent, Link Here
1146
				   resource_size_t start, resource_size_t n,
1162
				   resource_size_t start, resource_size_t n,
1147
				   const char *name, int flags)
1163
				   const char *name, int flags)
1148
{
1164
{
1149
	DECLARE_WAITQUEUE(wait, current);
1150
	struct resource *res = alloc_resource(GFP_KERNEL);
1165
	struct resource *res = alloc_resource(GFP_KERNEL);
1151
1166
1152
	if (!res)
1167
	if (!res)
Lines 1156-1161 struct resource * __request_region(struct resource *parent, Link Here
1156
	res->start = start;
1171
	res->start = start;
1157
	res->end = start + n - 1;
1172
	res->end = start + n - 1;
1158
1173
1174
	if (!__request_declared_region(parent, res, flags)) {
1175
		free_resource(res);
1176
		res = NULL;
1177
	}
1178
1179
	return res;
1180
}
1181
EXPORT_SYMBOL(__request_region);
1182
1183
/**
1184
 * __request_declared_region - create a new busy resource region
1185
 * @parent: parent resource descriptor
1186
 * @res: child resource descriptor
1187
 * @flags: IO resource flags
1188
 */
1189
struct resource *__request_declared_region(struct resource *parent,
1190
				   struct resource *res, int flags)
1191
{
1192
	DECLARE_WAITQUEUE(wait, current);
1193
1159
	write_lock(&resource_lock);
1194
	write_lock(&resource_lock);
1160
1195
1161
	for (;;) {
1196
	for (;;) {
Lines 1184-1197 struct resource * __request_region(struct resource *parent, Link Here
1184
			continue;
1219
			continue;
1185
		}
1220
		}
1186
		/* Uhhuh, that didn't work out.. */
1221
		/* Uhhuh, that didn't work out.. */
1187
		free_resource(res);
1188
		res = NULL;
1222
		res = NULL;
1189
		break;
1223
		break;
1190
	}
1224
	}
1191
	write_unlock(&resource_lock);
1225
	write_unlock(&resource_lock);
1192
	return res;
1226
	return res;
1193
}
1227
}
1194
EXPORT_SYMBOL(__request_region);
1228
EXPORT_SYMBOL(__request_declared_region);
1195
1229
1196
/**
1230
/**
1197
 * __release_region - release a previously reserved resource region
1231
 * __release_region - release a previously reserved resource region
1198
- 

Return to bug 170741