162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * rsrc_mgr.c -- Resource management routines and/or wrappers
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * The initial developer of the original code is David A. Hinds
662306a36Sopenharmony_ci * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
762306a36Sopenharmony_ci * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * (C) 1999		David A. Hinds
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/slab.h>
1362306a36Sopenharmony_ci#include <linux/module.h>
1462306a36Sopenharmony_ci#include <linux/kernel.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include <pcmcia/ss.h>
1762306a36Sopenharmony_ci#include <pcmcia/cistpl.h>
1862306a36Sopenharmony_ci#include "cs_internal.h"
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciint static_init(struct pcmcia_socket *s)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	/* the good thing about SS_CAP_STATIC_MAP sockets is
2362306a36Sopenharmony_ci	 * that they don't need a resource database */
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	s->resource_setup_done = 1;
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	return 0;
2862306a36Sopenharmony_ci}
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistruct resource *pcmcia_make_resource(resource_size_t start,
3162306a36Sopenharmony_ci					resource_size_t end,
3262306a36Sopenharmony_ci					unsigned long flags, const char *name)
3362306a36Sopenharmony_ci{
3462306a36Sopenharmony_ci	struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL);
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	if (res) {
3762306a36Sopenharmony_ci		res->name = name;
3862306a36Sopenharmony_ci		res->start = start;
3962306a36Sopenharmony_ci		res->end = start + end - 1;
4062306a36Sopenharmony_ci		res->flags = flags;
4162306a36Sopenharmony_ci	}
4262306a36Sopenharmony_ci	return res;
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistatic int static_find_io(struct pcmcia_socket *s, unsigned int attr,
4662306a36Sopenharmony_ci			unsigned int *base, unsigned int num,
4762306a36Sopenharmony_ci			unsigned int align, struct resource **parent)
4862306a36Sopenharmony_ci{
4962306a36Sopenharmony_ci	if (!s->io_offset)
5062306a36Sopenharmony_ci		return -EINVAL;
5162306a36Sopenharmony_ci	*base = s->io_offset | (*base & 0x0fff);
5262306a36Sopenharmony_ci	*parent = NULL;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	return 0;
5562306a36Sopenharmony_ci}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistruct pccard_resource_ops pccard_static_ops = {
5962306a36Sopenharmony_ci	.validate_mem = NULL,
6062306a36Sopenharmony_ci	.find_io = static_find_io,
6162306a36Sopenharmony_ci	.find_mem = NULL,
6262306a36Sopenharmony_ci	.init = static_init,
6362306a36Sopenharmony_ci	.exit = NULL,
6462306a36Sopenharmony_ci};
6562306a36Sopenharmony_ciEXPORT_SYMBOL(pccard_static_ops);
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciMODULE_AUTHOR("David A. Hinds, Dominik Brodowski");
6962306a36Sopenharmony_ciMODULE_LICENSE("GPL");
7062306a36Sopenharmony_ciMODULE_ALIAS("rsrc_nonstatic");
71