spmi: qpnp: Change APIs to take a spmi_resource pointer instead of index
Pointers are more flexible than index numbers, since index
numbers depend upon an additional reference to the array in
question. In particular, we'd like to add a new API to lookup a
devnode based on a predefined name in the Device Tree. This API
will return a spmi_resource, and so it's natural to want to use
this pointer directly with the other existing APIs.
Also introduce a new API spmi_for_each_devnode that can be used
to iterate each spmi_resource in the dev_node array. This
abstracts the traversal of the array, which was previously done
within the existing APIs.
Change-Id: I18f9397e5d78770e840a9f95dd8061201931df6e
Signed-off-by: Michael Bohan <mbohan@codeaurora.org>
diff --git a/drivers/spmi/spmi-resources.c b/drivers/spmi/spmi-resources.c
index b692f82..d7adea9 100644
--- a/drivers/spmi/spmi-resources.c
+++ b/drivers/spmi/spmi-resources.c
@@ -20,21 +20,30 @@
/**
* spmi_get_resource - get a resource for a device
* @dev: spmi device
- * @node_idx: dev_node index
+ * @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,
- unsigned int node_idx, unsigned int type,
- unsigned int res_num)
+ struct spmi_resource *node,
+ unsigned int type, unsigned int res_num)
{
int i;
- for (i = 0; i < dev->dev_node[node_idx].num_resources; i++) {
- struct resource *r = &dev->dev_node[node_idx].resource[i];
+ /* if a node is not specified, default to the first node */
+ if (!node)
+ node = &dev->dev_node[0];
+
+ for (i = 0; i < node->num_resources; i++) {
+ struct resource *r = &node->resource[i];
if (type == resource_type(r) && res_num-- == 0)
return r;
@@ -46,19 +55,18 @@
/**
* spmi_get_irq - get an IRQ for a device
* @dev: spmi device
- * @node_idx: dev_node index
+ * @node: device node resource
* @res_num: IRQ number index
*
* Returns
* -ENXIO on failure.
*/
-int spmi_get_irq(struct spmi_device *dev, unsigned int node_idx,
+int spmi_get_irq(struct spmi_device *dev, struct spmi_resource *node,
unsigned int res_num)
{
- struct resource *r = spmi_get_resource(dev, node_idx,
+ struct resource *r = spmi_get_resource(dev, node,
IORESOURCE_IRQ, res_num);
return r ? r->start : -ENXIO;
}
EXPORT_SYMBOL_GPL(spmi_get_irq);
-