linux/drivers/pinctrl/pinmux.c
<<
>>
Prefs
   1/*
   2 * Core driver for the pin muxing portions of the pin control subsystem
   3 *
   4 * Copyright (C) 2011-2012 ST-Ericsson SA
   5 * Written on behalf of Linaro for ST-Ericsson
   6 * Based on bits of regulator core, gpio core and clk core
   7 *
   8 * Author: Linus Walleij <linus.walleij@linaro.org>
   9 *
  10 * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved.
  11 *
  12 * License terms: GNU General Public License (GPL) version 2
  13 */
  14#define pr_fmt(fmt) "pinmux core: " fmt
  15
  16#include <linux/kernel.h>
  17#include <linux/module.h>
  18#include <linux/init.h>
  19#include <linux/device.h>
  20#include <linux/slab.h>
  21#include <linux/radix-tree.h>
  22#include <linux/err.h>
  23#include <linux/list.h>
  24#include <linux/string.h>
  25#include <linux/sysfs.h>
  26#include <linux/debugfs.h>
  27#include <linux/seq_file.h>
  28#include <linux/pinctrl/machine.h>
  29#include <linux/pinctrl/pinmux.h>
  30#include "core.h"
  31#include "pinmux.h"
  32
  33int pinmux_check_ops(struct pinctrl_dev *pctldev)
  34{
  35        const struct pinmux_ops *ops = pctldev->desc->pmxops;
  36        unsigned nfuncs;
  37        unsigned selector = 0;
  38
  39        /* Check that we implement required operations */
  40        if (!ops ||
  41            !ops->get_functions_count ||
  42            !ops->get_function_name ||
  43            !ops->get_function_groups ||
  44            !ops->enable) {
  45                dev_err(pctldev->dev, "pinmux ops lacks necessary functions\n");
  46                return -EINVAL;
  47        }
  48        /* Check that all functions registered have names */
  49        nfuncs = ops->get_functions_count(pctldev);
  50        while (selector < nfuncs) {
  51                const char *fname = ops->get_function_name(pctldev,
  52                                                           selector);
  53                if (!fname) {
  54                        dev_err(pctldev->dev, "pinmux ops has no name for function%u\n",
  55                                selector);
  56                        return -EINVAL;
  57                }
  58                selector++;
  59        }
  60
  61        return 0;
  62}
  63
  64int pinmux_validate_map(struct pinctrl_map const *map, int i)
  65{
  66        if (!map->data.mux.function) {
  67                pr_err("failed to register map %s (%d): no function given\n",
  68                       map->name, i);
  69                return -EINVAL;
  70        }
  71
  72        return 0;
  73}
  74
  75/**
  76 * pin_request() - request a single pin to be muxed in, typically for GPIO
  77 * @pin: the pin number in the global pin space
  78 * @owner: a representation of the owner of this pin; typically the device
  79 *      name that controls its mux function, or the requested GPIO name
  80 * @gpio_range: the range matching the GPIO pin if this is a request for a
  81 *      single GPIO pin
  82 */
  83static int pin_request(struct pinctrl_dev *pctldev,
  84                       int pin, const char *owner,
  85                       struct pinctrl_gpio_range *gpio_range)
  86{
  87        struct pin_desc *desc;
  88        const struct pinmux_ops *ops = pctldev->desc->pmxops;
  89        int status = -EINVAL;
  90
  91        desc = pin_desc_get(pctldev, pin);
  92        if (desc == NULL) {
  93                dev_err(pctldev->dev,
  94                        "pin %d is not registered so it cannot be requested\n",
  95                        pin);
  96                goto out;
  97        }
  98
  99        dev_dbg(pctldev->dev, "request pin %d (%s) for %s\n",
 100                pin, desc->name, owner);
 101
 102        if (gpio_range) {
 103                /* There's no need to support multiple GPIO requests */
 104                if (desc->gpio_owner) {
 105                        dev_err(pctldev->dev,
 106                                "pin %s already requested by %s; cannot claim for %s\n",
 107                                desc->name, desc->gpio_owner, owner);
 108                        goto out;
 109                }
 110
 111                desc->gpio_owner = owner;
 112        } else {
 113                if (desc->mux_usecount && strcmp(desc->mux_owner, owner)) {
 114                        dev_err(pctldev->dev,
 115                                "pin %s already requested by %s; cannot claim for %s\n",
 116                                desc->name, desc->mux_owner, owner);
 117                        goto out;
 118                }
 119
 120                desc->mux_usecount++;
 121                if (desc->mux_usecount > 1)
 122                        return 0;
 123
 124                desc->mux_owner = owner;
 125        }
 126
 127        /* Let each pin increase references to this module */
 128        if (!try_module_get(pctldev->owner)) {
 129                dev_err(pctldev->dev,
 130                        "could not increase module refcount for pin %d\n",
 131                        pin);
 132                status = -EINVAL;
 133                goto out_free_pin;
 134        }
 135
 136        /*
 137         * If there is no kind of request function for the pin we just assume
 138         * we got it by default and proceed.
 139         */
 140        if (gpio_range && ops->gpio_request_enable)
 141                /* This requests and enables a single GPIO pin */
 142                status = ops->gpio_request_enable(pctldev, gpio_range, pin);
 143        else if (ops->request)
 144                status = ops->request(pctldev, pin);
 145        else
 146                status = 0;
 147
 148        if (status) {
 149                dev_err(pctldev->dev, "request() failed for pin %d\n", pin);
 150                module_put(pctldev->owner);
 151        }
 152
 153out_free_pin:
 154        if (status) {
 155                if (gpio_range) {
 156                        desc->gpio_owner = NULL;
 157                } else {
 158                        desc->mux_usecount--;
 159                        if (!desc->mux_usecount)
 160                                desc->mux_owner = NULL;
 161                }
 162        }
 163out:
 164        if (status)
 165                dev_err(pctldev->dev, "pin-%d (%s) status %d\n",
 166                        pin, owner, status);
 167
 168        return status;
 169}
 170
 171/**
 172 * pin_free() - release a single muxed in pin so something else can be muxed
 173 * @pctldev: pin controller device handling this pin
 174 * @pin: the pin to free
 175 * @gpio_range: the range matching the GPIO pin if this is a request for a
 176 *      single GPIO pin
 177 *
 178 * This function returns a pointer to the previous owner. This is used
 179 * for callers that dynamically allocate an owner name so it can be freed
 180 * once the pin is free. This is done for GPIO request functions.
 181 */
 182static const char *pin_free(struct pinctrl_dev *pctldev, int pin,
 183                            struct pinctrl_gpio_range *gpio_range)
 184{
 185        const struct pinmux_ops *ops = pctldev->desc->pmxops;
 186        struct pin_desc *desc;
 187        const char *owner;
 188
 189        desc = pin_desc_get(pctldev, pin);
 190        if (desc == NULL) {
 191                dev_err(pctldev->dev,
 192                        "pin is not registered so it cannot be freed\n");
 193                return NULL;
 194        }
 195
 196        if (!gpio_range) {
 197                /*
 198                 * A pin should not be freed more times than allocated.
 199                 */
 200                if (WARN_ON(!desc->mux_usecount))
 201                        return NULL;
 202                desc->mux_usecount--;
 203                if (desc->mux_usecount)
 204                        return NULL;
 205        }
 206
 207        /*
 208         * If there is no kind of request function for the pin we just assume
 209         * we got it by default and proceed.
 210         */
 211        if (gpio_range && ops->gpio_disable_free)
 212                ops->gpio_disable_free(pctldev, gpio_range, pin);
 213        else if (ops->free)
 214                ops->free(pctldev, pin);
 215
 216        if (gpio_range) {
 217                owner = desc->gpio_owner;
 218                desc->gpio_owner = NULL;
 219        } else {
 220                owner = desc->mux_owner;
 221                desc->mux_owner = NULL;
 222                desc->mux_setting = NULL;
 223        }
 224
 225        module_put(pctldev->owner);
 226
 227        return owner;
 228}
 229
 230/**
 231 * pinmux_request_gpio() - request pinmuxing for a GPIO pin
 232 * @pctldev: pin controller device affected
 233 * @pin: the pin to mux in for GPIO
 234 * @range: the applicable GPIO range
 235 */
 236int pinmux_request_gpio(struct pinctrl_dev *pctldev,
 237                        struct pinctrl_gpio_range *range,
 238                        unsigned pin, unsigned gpio)
 239{
 240        const char *owner;
 241        int ret;
 242
 243        /* Conjure some name stating what chip and pin this is taken by */
 244        owner = kasprintf(GFP_KERNEL, "%s:%d", range->name, gpio);
 245        if (!owner)
 246                return -EINVAL;
 247
 248        ret = pin_request(pctldev, pin, owner, range);
 249        if (ret < 0)
 250                kfree(owner);
 251
 252        return ret;
 253}
 254
 255/**
 256 * pinmux_free_gpio() - release a pin from GPIO muxing
 257 * @pctldev: the pin controller device for the pin
 258 * @pin: the affected currently GPIO-muxed in pin
 259 * @range: applicable GPIO range
 260 */
 261void pinmux_free_gpio(struct pinctrl_dev *pctldev, unsigned pin,
 262                      struct pinctrl_gpio_range *range)
 263{
 264        const char *owner;
 265
 266        owner = pin_free(pctldev, pin, range);
 267        kfree(owner);
 268}
 269
 270/**
 271 * pinmux_gpio_direction() - set the direction of a single muxed-in GPIO pin
 272 * @pctldev: the pin controller handling this pin
 273 * @range: applicable GPIO range
 274 * @pin: the affected GPIO pin in this controller
 275 * @input: true if we set the pin as input, false for output
 276 */
 277int pinmux_gpio_direction(struct pinctrl_dev *pctldev,
 278                          struct pinctrl_gpio_range *range,
 279                          unsigned pin, bool input)
 280{
 281        const struct pinmux_ops *ops;
 282        int ret;
 283
 284        ops = pctldev->desc->pmxops;
 285
 286        if (ops->gpio_set_direction)
 287                ret = ops->gpio_set_direction(pctldev, range, pin, input);
 288        else
 289                ret = 0;
 290
 291        return ret;
 292}
 293
 294static int pinmux_func_name_to_selector(struct pinctrl_dev *pctldev,
 295                                        const char *function)
 296{
 297        const struct pinmux_ops *ops = pctldev->desc->pmxops;
 298        unsigned nfuncs = ops->get_functions_count(pctldev);
 299        unsigned selector = 0;
 300
 301        /* See if this pctldev has this function */
 302        while (selector < nfuncs) {
 303                const char *fname = ops->get_function_name(pctldev,
 304                                                           selector);
 305
 306                if (!strcmp(function, fname))
 307                        return selector;
 308
 309                selector++;
 310        }
 311
 312        pr_err("%s does not support function %s\n",
 313               pinctrl_dev_get_name(pctldev), function);
 314        return -EINVAL;
 315}
 316
 317int pinmux_map_to_setting(struct pinctrl_map const *map,
 318                          struct pinctrl_setting *setting)
 319{
 320        struct pinctrl_dev *pctldev = setting->pctldev;
 321        const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
 322        char const * const *groups;
 323        unsigned num_groups;
 324        int ret;
 325        const char *group;
 326        int i;
 327
 328        if (!pmxops) {
 329                dev_err(pctldev->dev, "does not support mux function\n");
 330                return -EINVAL;
 331        }
 332
 333        ret = pinmux_func_name_to_selector(pctldev, map->data.mux.function);
 334        if (ret < 0) {
 335                dev_err(pctldev->dev, "invalid function %s in map table\n",
 336                        map->data.mux.function);
 337                return ret;
 338        }
 339        setting->data.mux.func = ret;
 340
 341        ret = pmxops->get_function_groups(pctldev, setting->data.mux.func,
 342                                          &groups, &num_groups);
 343        if (ret < 0) {
 344                dev_err(pctldev->dev, "can't query groups for function %s\n",
 345                        map->data.mux.function);
 346                return ret;
 347        }
 348        if (!num_groups) {
 349                dev_err(pctldev->dev,
 350                        "function %s can't be selected on any group\n",
 351                        map->data.mux.function);
 352                return -EINVAL;
 353        }
 354        if (map->data.mux.group) {
 355                bool found = false;
 356                group = map->data.mux.group;
 357                for (i = 0; i < num_groups; i++) {
 358                        if (!strcmp(group, groups[i])) {
 359                                found = true;
 360                                break;
 361                        }
 362                }
 363                if (!found) {
 364                        dev_err(pctldev->dev,
 365                                "invalid group \"%s\" for function \"%s\"\n",
 366                                group, map->data.mux.function);
 367                        return -EINVAL;
 368                }
 369        } else {
 370                group = groups[0];
 371        }
 372
 373        ret = pinctrl_get_group_selector(pctldev, group);
 374        if (ret < 0) {
 375                dev_err(pctldev->dev, "invalid group %s in map table\n",
 376                        map->data.mux.group);
 377                return ret;
 378        }
 379        setting->data.mux.group = ret;
 380
 381        return 0;
 382}
 383
 384void pinmux_free_setting(struct pinctrl_setting const *setting)
 385{
 386        /* This function is currently unused */
 387}
 388
 389int pinmux_enable_setting(struct pinctrl_setting const *setting)
 390{
 391        struct pinctrl_dev *pctldev = setting->pctldev;
 392        const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
 393        const struct pinmux_ops *ops = pctldev->desc->pmxops;
 324        int ret;
 325     >        _ops *pmxops;
 386        unsigned  297        int i;
 298 *def">i;
 269
 370        ret = pcmxops->pctldev, setting->data.mux.t;,
 361                             ups, &pmxroups, & 302        if ( 303       >        
 304                dev_err(pctldev->dev,
 365                dev, ,
 306       a>                setting->data.mux.group);
 307       a>, & 378        }
 269
 310        
 361i = 0; i < i++) {
 362       >        ret = pin_request(pctldev, pmxroups[setting->pctldev, group);
 313      a>        if ( 364                        dev_err(pctldev->dev,
 365                                pie setid grd selntrollefunction %s\n",
 366                                pmxroups[pinctrl_dev_get_name" class="sref">pinctrl_dev_get_name(pctgroup);
 367               go thname(def">i;
 318       >        }
 378        }
 380
 301        
 322i = 0; i < i++) {
 303       >ps *d">ret = (pctldev, pmxroups[ 364       >        if (d">>ret = g>i++) {
 345                        dev_err(pctldev->dev,
 366                        dev, ,
 367                                 pmxroups[ 358                in inueroup);
 329       >        }
 330       a>->desc->d">rupssetting->data. 331        }
 332
 333        ret = ops->pinmn_request" clasr>pinm_selector(pctldev, setting->data.mux.func,
 364                          setting->data.mux.group);
 305
 336        if ( 337       go thname(pinmn_request" clasref_">pinmf">def">i;
 388
 339        return 0;
 340
(pinmn_request" clasref_">pinmf">d:> 340
 322i = 0; i < i++) {
 303       >ps *d">ret = (pctldev, pmxroups[ 344       >        if (da> 305
 345                        desc->d">ret = ro/a>++) {
 346        }
(d:> 340
 348         349      -  return -a> 305
 350       et = pide=desc" class=f="_">pin_request(pctldev, pmxroups[group);
 311
 352ret;
        }
 384void pinctrl_setting const *setting)
 296{
 357        struct pinctrl_dev *pctldev = setting->pctldev;
 358        const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
 359        const struct pinmux_ops *ops = pctldev->desc->pmxtlops;
 360        int ret;
 321     >        _ops *pmxops;
 362        unsigned  363        int i;
 364 *def">i;
 305
 366        ret = pcmxops->pctldev, setting->data.mux.>func,
 367                             ups, &pmxroups, & 348        if ( 329       >        
 370                dev_err(pctldev->dev,
 361                dev, ,
 342                dev, setting->data.mux.group);
 303       >ps * 374        }
 305
 376         377i = 0; i < i++) {
 358       >ps *d">ret = (pctldev, pmxroups[ 329       >        if (d">>ret = g>i++) {
 350                        dev_err(pctldev->dev,
 361                        dev, ,
 342                        dev, pmxroups[ 303                in inueroup);
 344       >        }
 375                desc->d">ret = ro/a>++) {
 346        }
 327
 348         377i = 0; i < 
 350       et = pide=desc" class=f="_">pin_request(pctldev, pmxroups[group);
 311
 302        if (ops->setting)
 303       >ps *ops->seector(pctldev, setting->data.mux.ldev, setting->data.mux.group);
        }
 305
,  305
 327
                int  *pmxro> 384_ops *setting)
 390{
 391        struct pinctrl_dev *pctldev = pmxesc->ro/a>++) {
 392        const struct pinmux_ops *pmxops = pctldev->desc->pmxtlops;
 303        unsigned /* pinmux_ops" clasf>/* p>pmxtlops;
 304        unsigned /* get_group_selector" clas>/* get_group>pmxector = 0;
 305
 336        if (!pmxtting)
 307       >        return 0;
 388
 379        , &pctldev->group);
 370        /* pinmux_ops" clasf>/* p>pmxops = pmxmxops->/* Thiss_counr">seector(pcgroup);
 361      unsigned /* get_group_selector" clas>/* get_group>pmxef">i < /* pinmux_ops" clasf>/* p>pmxg>i++) {
 362       >     charx_ops * = pmxmxops->seector(pct++) {
 313      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaunsigned /* get_group_selector" clas>/* get_group>pmxgroup);
 364       >     charx_tting const *group);
 365       >        unsigned num_group);
 366       >        int ret;
 367       >        int i;
 388
 329       >    int pmxmxops->seector(pctldev, /* get_group_selector" clas>/* get_group>pmxt++) {
 360                                         ups, &groups, &num_ggroup);
 361       >        if ( 342               >(struct seector(pmxrodev,  303                      >(struct );
 345       >(struct seector(pmxrodev, );
 366                for (i = 0; i < num_groups; 
 367               >(struct seector(pmxrodev, groups[ 358       >(struct seector(pmxrodev,  269
 330       a>->/* get_group_selector" clas>/* get_group>pmx++ro/a>++) {
 331        }
 332
 333        , &pctldev->group);
 345        return 0;
        }
 327
        int (struct  *pmxro> 384_ops *setting)
++) {
 330        struct pinctrl_dev *pctldev = pmxesc->ro/a>++) {
 321        const struct pinctrl_ops *pctlops = pctldev->desc-> 392        const struct pinmux_ops *pmxops = pctldev->desc->pmxtlops;
 303        unsigned  345        if (!pmxtting)
 366       >        return 0;
 327
 348(struct seector(pmxrodev, ++) {
 379        seector(pmxrodev, ++) {
 340
 379        , &pctldev->group);
 332
 333        
 364i = 0; i < pctldev->desc->pmxooups; i++) {
 345          const struct  *def">i;
 366       ops *ups; pmxops = def">i;
 327
 358       >(struct pctldev->desc->pmxroups[mux.def">i;
 329       >    int d">ret = (pctldev,  330       a         361       >        if (d">>ret = g*/
 342                in inueroup);
);
 344       >        if (desc->);
 345                if (!(desc->, pinctrl_dev_get_name" class="sref">pinctrl_dev_get_name(pctgg*/
 366       >       >    int pmxops = def">i;
 327
 358       >(struct seector(pmxrodev,  329              >(struct desc->(struct desc->,  370              >(struct desc->(struct desc->,
 361                       :odev,  342                  >(struct desc->desc-> 303                       :odev,  364                  >    int pmxo?odev, ++) {
 305
 366       >        if (desc->dg*/
 367               >(struct seector(pmxrodev,  358                      >(struct pmxmxops->seector(pct++) {
 329                           >(struct desc->desc->++) {
 350                          >(struct pcmxops->seector(pct++) {
 361                               >(struct desc->desc->ggro/a>++) {
 342       elseo/a>++) {
 303               >(struct seector(pmxrodev,  374        }
 305
 346        , &pctldev->group);
 327
 348        return 0;
        }
 340
 384void  *pmxro   const struct 
++) {
 303(struct seector(pmxrodev,  364       > const *->data.mux.e? >(struct ->data.mux.e:odev,  345       >(struct ->data.mux./* Thiscode=func" class="sThisef">group);
        }
 327
 384void  *pmxr> 327
 329               const struct pinctrl_setting const *setting)
 390{
 391        struct pinctrl_dev *pctldev = setting->pctldev;
 392        const struct pinmux_ops *pmxops = pctldev->desc->pmxtldev;
 303        const struct pinctrl_ops *pctlops = pctldev->desc-> 345(struct seector(pmxrodev,  366       >  >(struct pcmxops->seector(pctldev, setting->data.mux.gt;,
 307       (struct setting->data.mux.t;,
 358       (struct pmxmxops->seector(pcta>(struct setting->data.mux.++) {
 329          >(struct setting->data.mux.);
        }
 311
        int (struct  * *)
 390{
 364      >(struct seector((struct ->);
        }
        int (struct  * *)
 390{
 329      >(struct seector((struct (struct ->);
        }
 311
        const struct      int pctlo> 390{
 303mux.se>          >ret = ++) {
 303mux.se>          >ret = ++) {
 345mux.se>        >ret = ++) {
 366mux. 366ret = ++) {
);
 388
        const struct      int pctlo> 390{
 330mux.se>          >ret = ++) {
 331mux.se>          >ret = ++) {
 345mux.se>        >ret = ++) {
 303mux. 366ret = ++) {
);
 305
 384void piice">pbugfpinmux_ops" class="srefinit">piice">pbugfpn_reqting(struct  *piroorde=desc" class=>piroorn_ret++) {
 367               a>        struct pinctrl_dev *pctting)
 390{
 379        pbugfp_create_finmde=desc" class=>pbugfp_create_finm">seecev, | >(struct ++) {
 350                   ops *piroorde=desc" class=>piroorn_retops = pcroups, &pcgroup);
 379        pbugfp_create_finmde=desc" class=>pbugfp_create_finm">seecev, (struct | >(struct ++) {
 342                   ops *piroorde=desc" class=>piroorn_retops = pcroups, &pcgroup);
        }



meweoriginal LXR software byef we/ http://sourceforge.net/projects/lxr">LXR n clunity">pcrothis experilassal hrefhis bye/ mailto:lxr@" cctrnoaslxr@" cctrnosref"
lxr." cctrno kindly hosted bye/ http://www.redpill-" cprornoasRedpill L cpro AS">pcroprovider of L cuxa> ulsref and operaThiss seriices sdrie 1995.