18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * rsrc_mgr.c -- Resource management routines and/or wrappers 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * The initial developer of the original code is David A. Hinds 68c2ecf20Sopenharmony_ci * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds 78c2ecf20Sopenharmony_ci * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * (C) 1999 David A. Hinds 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <linux/slab.h> 138c2ecf20Sopenharmony_ci#include <linux/module.h> 148c2ecf20Sopenharmony_ci#include <linux/kernel.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include <pcmcia/ss.h> 178c2ecf20Sopenharmony_ci#include <pcmcia/cistpl.h> 188c2ecf20Sopenharmony_ci#include "cs_internal.h" 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ciint static_init(struct pcmcia_socket *s) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci /* the good thing about SS_CAP_STATIC_MAP sockets is 238c2ecf20Sopenharmony_ci * that they don't need a resource database */ 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci s->resource_setup_done = 1; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci return 0; 288c2ecf20Sopenharmony_ci} 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_cistruct resource *pcmcia_make_resource(resource_size_t start, 318c2ecf20Sopenharmony_ci resource_size_t end, 328c2ecf20Sopenharmony_ci unsigned long flags, const char *name) 338c2ecf20Sopenharmony_ci{ 348c2ecf20Sopenharmony_ci struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL); 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci if (res) { 378c2ecf20Sopenharmony_ci res->name = name; 388c2ecf20Sopenharmony_ci res->start = start; 398c2ecf20Sopenharmony_ci res->end = start + end - 1; 408c2ecf20Sopenharmony_ci res->flags = flags; 418c2ecf20Sopenharmony_ci } 428c2ecf20Sopenharmony_ci return res; 438c2ecf20Sopenharmony_ci} 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistatic int static_find_io(struct pcmcia_socket *s, unsigned int attr, 468c2ecf20Sopenharmony_ci unsigned int *base, unsigned int num, 478c2ecf20Sopenharmony_ci unsigned int align, struct resource **parent) 488c2ecf20Sopenharmony_ci{ 498c2ecf20Sopenharmony_ci if (!s->io_offset) 508c2ecf20Sopenharmony_ci return -EINVAL; 518c2ecf20Sopenharmony_ci *base = s->io_offset | (*base & 0x0fff); 528c2ecf20Sopenharmony_ci *parent = NULL; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci return 0; 558c2ecf20Sopenharmony_ci} 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_cistruct pccard_resource_ops pccard_static_ops = { 598c2ecf20Sopenharmony_ci .validate_mem = NULL, 608c2ecf20Sopenharmony_ci .find_io = static_find_io, 618c2ecf20Sopenharmony_ci .find_mem = NULL, 628c2ecf20Sopenharmony_ci .init = static_init, 638c2ecf20Sopenharmony_ci .exit = NULL, 648c2ecf20Sopenharmony_ci}; 658c2ecf20Sopenharmony_ciEXPORT_SYMBOL(pccard_static_ops); 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ciMODULE_AUTHOR("David A. Hinds, Dominik Brodowski"); 698c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 708c2ecf20Sopenharmony_ciMODULE_ALIAS("rsrc_nonstatic"); 71