152 lines
3.9 KiB
C
152 lines
3.9 KiB
C
|
/* 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 <linux/export.h>
|
||
|
#include <linux/spmi.h>
|
||
|
#include <linux/string.h>
|
||
|
|
||
|
/**
|
||
|
* 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);
|