/* Copyright (c) 2002-3 Patrick Mochel * Copyright (c) 2002-3 Open Source Development Labs * Copyright (c) 2012, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Resource handling based on platform.c. */ #include #include #include /** * spmi_get_resource - get a resource for a device * @dev: spmi device * @node: device node resource * @type: resource type * @res_num: resource index * * If 'node' is specified as NULL, then the API treats this as a special * case to assume the first devnode. For configurations that do not use * spmi-dev-container, there is only one node to begin with, so NULL should * be passed in this case. * * Returns * NULL on failure. */ struct resource *spmi_get_resource(struct spmi_device *dev, struct spmi_resource *node, unsigned int type, unsigned int res_num) { int i; /* if a node is not specified, default to the first node */ if (!node) node = &dev->res; for (i = 0; i < node->num_resources; i++) { struct resource *r = &node->resource[i]; if (type == resource_type(r) && res_num-- == 0) return r; } return NULL; } EXPORT_SYMBOL_GPL(spmi_get_resource); #define SPMI_MAX_RES_NAME 256 /** * spmi_get_resource_byname - get a resource for a device given a name * @dev: spmi device handle * @node: device node resource * @type: resource type * @name: resource name to lookup */ struct resource *spmi_get_resource_byname(struct spmi_device *dev, struct spmi_resource *node, unsigned int type, const char *name) { int i; /* if a node is not specified, default to the first node */ if (!node) node = &dev->res; for (i = 0; i < node->num_resources; i++) { struct resource *r = &node->resource[i]; if (type == resource_type(r) && r->name && !strncmp(r->name, name, SPMI_MAX_RES_NAME)) return r; } return NULL; } EXPORT_SYMBOL_GPL(spmi_get_resource_byname); /** * spmi_get_irq - get an IRQ for a device * @dev: spmi device * @node: device node resource * @res_num: IRQ number index * * Returns * -ENXIO on failure. */ int spmi_get_irq(struct spmi_device *dev, struct spmi_resource *node, unsigned int res_num) { struct resource *r = spmi_get_resource(dev, node, IORESOURCE_IRQ, res_num); return r ? r->start : -ENXIO; } EXPORT_SYMBOL_GPL(spmi_get_irq); /** * spmi_get_irq_byname - get an IRQ for a device given a name * @dev: spmi device handle * @node: device node resource * @name: resource name to lookup * * Returns -ENXIO on failure */ int spmi_get_irq_byname(struct spmi_device *dev, struct spmi_resource *node, const char *name) { struct resource *r = spmi_get_resource_byname(dev, node, IORESOURCE_IRQ, name); return r ? r->start : -ENXIO; } EXPORT_SYMBOL_GPL(spmi_get_irq_byname); /* * spmi_get_container_dev_byname - get a device node resource * @dev: spmi device handle * @label: device name to lookup * * Only useable in spmi-dev-container configurations. Given a name, * find the associated spmi_resource that matches the name. * * Return NULL if the spmi_device is not a dev-container, * or if the lookup fails. */ struct spmi_resource *spmi_get_dev_container_byname(struct spmi_device *dev, const char *label) { int i; if (!label) return NULL; for (i = 0; i < dev->num_dev_node; i++) { struct spmi_resource *r = &dev->dev_node[i]; if (r && r->label && !strncmp(r->label, label, SPMI_MAX_RES_NAME)) return r; } return NULL; } EXPORT_SYMBOL(spmi_get_dev_container_byname);