LCOV - code coverage report
Current view: top level - drivers/regulator - of_regulator.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 69 0.0 %
Date: 2014-02-18 Functions: 0 3 0.0 %
Branches: 0 64 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * OF helpers for regulator framework
       3                 :            :  *
       4                 :            :  * Copyright (C) 2011 Texas Instruments, Inc.
       5                 :            :  * Rajendra Nayak <rnayak@ti.com>
       6                 :            :  *
       7                 :            :  * This program is free software; you can redistribute it and/or modify
       8                 :            :  * it under the terms of the GNU General Public License as published by
       9                 :            :  * the Free Software Foundation; either version 2 of the License, or
      10                 :            :  * (at your option) any later version.
      11                 :            :  */
      12                 :            : 
      13                 :            : #include <linux/module.h>
      14                 :            : #include <linux/slab.h>
      15                 :            : #include <linux/of.h>
      16                 :            : #include <linux/regulator/machine.h>
      17                 :            : #include <linux/regulator/of_regulator.h>
      18                 :            : 
      19                 :          0 : static void of_get_regulation_constraints(struct device_node *np,
      20                 :            :                                         struct regulator_init_data **init_data)
      21                 :            : {
      22                 :            :         const __be32 *min_uV, *max_uV, *uV_offset;
      23                 :            :         const __be32 *min_uA, *max_uA, *ramp_delay;
      24                 :            :         struct property *prop;
      25                 :          0 :         struct regulation_constraints *constraints = &(*init_data)->constraints;
      26                 :            :         int ret;
      27                 :            :         u32 pval;
      28                 :            : 
      29                 :          0 :         constraints->name = of_get_property(np, "regulator-name", NULL);
      30                 :            : 
      31                 :          0 :         min_uV = of_get_property(np, "regulator-min-microvolt", NULL);
      32         [ #  # ]:          0 :         if (min_uV)
      33         [ #  # ]:          0 :                 constraints->min_uV = be32_to_cpu(*min_uV);
      34                 :          0 :         max_uV = of_get_property(np, "regulator-max-microvolt", NULL);
      35         [ #  # ]:          0 :         if (max_uV)
      36         [ #  # ]:          0 :                 constraints->max_uV = be32_to_cpu(*max_uV);
      37                 :            : 
      38                 :            :         /* Voltage change possible? */
      39         [ #  # ]:          0 :         if (constraints->min_uV != constraints->max_uV)
      40                 :          0 :                 constraints->valid_ops_mask |= REGULATOR_CHANGE_VOLTAGE;
      41                 :            :         /* Only one voltage?  Then make sure it's set. */
      42 [ #  # ][ #  # ]:          0 :         if (min_uV && max_uV && constraints->min_uV == constraints->max_uV)
      43                 :          0 :                 constraints->apply_uV = true;
      44                 :            : 
      45                 :          0 :         uV_offset = of_get_property(np, "regulator-microvolt-offset", NULL);
      46         [ #  # ]:          0 :         if (uV_offset)
      47         [ #  # ]:          0 :                 constraints->uV_offset = be32_to_cpu(*uV_offset);
      48                 :          0 :         min_uA = of_get_property(np, "regulator-min-microamp", NULL);
      49         [ #  # ]:          0 :         if (min_uA)
      50         [ #  # ]:          0 :                 constraints->min_uA = be32_to_cpu(*min_uA);
      51                 :          0 :         max_uA = of_get_property(np, "regulator-max-microamp", NULL);
      52         [ #  # ]:          0 :         if (max_uA)
      53         [ #  # ]:          0 :                 constraints->max_uA = be32_to_cpu(*max_uA);
      54                 :            : 
      55                 :            :         /* Current change possible? */
      56         [ #  # ]:          0 :         if (constraints->min_uA != constraints->max_uA)
      57                 :          0 :                 constraints->valid_ops_mask |= REGULATOR_CHANGE_CURRENT;
      58                 :            : 
      59         [ #  # ]:          0 :         if (of_find_property(np, "regulator-boot-on", NULL))
      60                 :          0 :                 constraints->boot_on = true;
      61                 :            : 
      62         [ #  # ]:          0 :         if (of_find_property(np, "regulator-always-on", NULL))
      63                 :          0 :                 constraints->always_on = true;
      64                 :            :         else /* status change should be possible if not always on. */
      65                 :          0 :                 constraints->valid_ops_mask |= REGULATOR_CHANGE_STATUS;
      66                 :            : 
      67         [ #  # ]:          0 :         if (of_property_read_bool(np, "regulator-allow-bypass"))
      68                 :          0 :                 constraints->valid_ops_mask |= REGULATOR_CHANGE_BYPASS;
      69                 :            : 
      70                 :          0 :         prop = of_find_property(np, "regulator-ramp-delay", NULL);
      71 [ #  # ][ #  # ]:          0 :         if (prop && prop->value) {
      72                 :            :                 ramp_delay = prop->value;
      73         [ #  # ]:          0 :                 if (*ramp_delay)
      74         [ #  # ]:          0 :                         constraints->ramp_delay = be32_to_cpu(*ramp_delay);
      75                 :            :                 else
      76                 :          0 :                         constraints->ramp_disable = true;
      77                 :            :         }
      78                 :            : 
      79                 :            :         ret = of_property_read_u32(np, "regulator-enable-ramp-delay", &pval);
      80         [ #  # ]:          0 :         if (!ret)
      81                 :          0 :                 constraints->enable_time = pval;
      82                 :          0 : }
      83                 :            : 
      84                 :            : /**
      85                 :            :  * of_get_regulator_init_data - extract regulator_init_data structure info
      86                 :            :  * @dev: device requesting for regulator_init_data
      87                 :            :  *
      88                 :            :  * Populates regulator_init_data structure by extracting data from device
      89                 :            :  * tree node, returns a pointer to the populated struture or NULL if memory
      90                 :            :  * alloc fails.
      91                 :            :  */
      92                 :          0 : struct regulator_init_data *of_get_regulator_init_data(struct device *dev,
      93                 :            :                                                 struct device_node *node)
      94                 :            : {
      95                 :            :         struct regulator_init_data *init_data;
      96                 :            : 
      97         [ #  # ]:          0 :         if (!node)
      98                 :            :                 return NULL;
      99                 :            : 
     100                 :            :         init_data = devm_kzalloc(dev, sizeof(*init_data), GFP_KERNEL);
     101         [ #  # ]:          0 :         if (!init_data)
     102                 :            :                 return NULL; /* Out of memory? */
     103                 :            : 
     104                 :          0 :         of_get_regulation_constraints(node, &init_data);
     105                 :          0 :         return init_data;
     106                 :            : }
     107                 :            : EXPORT_SYMBOL_GPL(of_get_regulator_init_data);
     108                 :            : 
     109                 :            : /**
     110                 :            :  * of_regulator_match - extract multiple regulator init data from device tree.
     111                 :            :  * @dev: device requesting the data
     112                 :            :  * @node: parent device node of the regulators
     113                 :            :  * @matches: match table for the regulators
     114                 :            :  * @num_matches: number of entries in match table
     115                 :            :  *
     116                 :            :  * This function uses a match table specified by the regulator driver to
     117                 :            :  * parse regulator init data from the device tree. @node is expected to
     118                 :            :  * contain a set of child nodes, each providing the init data for one
     119                 :            :  * regulator. The data parsed from a child node will be matched to a regulator
     120                 :            :  * based on either the deprecated property regulator-compatible if present,
     121                 :            :  * or otherwise the child node's name. Note that the match table is modified
     122                 :            :  * in place.
     123                 :            :  *
     124                 :            :  * Returns the number of matches found or a negative error code on failure.
     125                 :            :  */
     126                 :          0 : int of_regulator_match(struct device *dev, struct device_node *node,
     127                 :            :                        struct of_regulator_match *matches,
     128                 :            :                        unsigned int num_matches)
     129                 :            : {
     130                 :            :         unsigned int count = 0;
     131                 :            :         unsigned int i;
     132                 :            :         const char *name;
     133                 :            :         struct device_node *child;
     134                 :            : 
     135         [ #  # ]:          0 :         if (!dev || !node)
     136                 :            :                 return -EINVAL;
     137                 :            : 
     138         [ #  # ]:          0 :         for (i = 0; i < num_matches; i++) {
     139                 :          0 :                 struct of_regulator_match *match = &matches[i];
     140                 :          0 :                 match->init_data = NULL;
     141                 :          0 :                 match->of_node = NULL;
     142                 :            :         }
     143                 :            : 
     144         [ #  # ]:          0 :         for_each_child_of_node(node, child) {
     145                 :          0 :                 name = of_get_property(child,
     146                 :            :                                         "regulator-compatible", NULL);
     147         [ #  # ]:          0 :                 if (!name)
     148                 :          0 :                         name = child->name;
     149         [ #  # ]:          0 :                 for (i = 0; i < num_matches; i++) {
     150                 :          0 :                         struct of_regulator_match *match = &matches[i];
     151         [ #  # ]:          0 :                         if (match->of_node)
     152                 :          0 :                                 continue;
     153                 :            : 
     154         [ #  # ]:          0 :                         if (strcmp(match->name, name))
     155                 :          0 :                                 continue;
     156                 :            : 
     157                 :          0 :                         match->init_data =
     158                 :          0 :                                 of_get_regulator_init_data(dev, child);
     159         [ #  # ]:          0 :                         if (!match->init_data) {
     160                 :          0 :                                 dev_err(dev,
     161                 :            :                                         "failed to parse DT for regulator %s\n",
     162                 :            :                                         child->name);
     163                 :          0 :                                 return -EINVAL;
     164                 :            :                         }
     165                 :          0 :                         match->of_node = child;
     166                 :          0 :                         count++;
     167                 :          0 :                         break;
     168                 :            :                 }
     169                 :            :         }
     170                 :            : 
     171                 :          0 :         return count;
     172                 :            : }
     173                 :            : EXPORT_SYMBOL_GPL(of_regulator_match);

Generated by: LCOV version 1.9