linux/drivers/sh/pfc/pinctrl.c
<<
>>
Prefs
   1/*
   2 * SuperH Pin Function Controller pinmux support.
   3 *
   4 * Copyright (C) 2012  Paul Mundt
   5 *
   6 * This file is subject to the terms and conditions of the GNU General Public
   7 * License.  See the file "COPYING" in the main directory of this archive
   8 * for more details.
   9 */
  10#define DRV_NAME "pinctrl-sh_pfc"
  11
  12#define pr_fmt(fmt) DRV_NAME " " KBUILD_MODNAME ": " fmt
  13
  14#include <linux/init.h>
  15#include <linux/module.h>
  16#include <linux/sh_pfc.h>
  17#include <linux/err.h>
  18#include <linux/slab.h>
  19#include <linux/spinlock.h>
  20#include <linux/platform_device.h>
  21#include <linux/pinctrl/consumer.h>
  22#include <linux/pinctrl/pinctrl.h>
  23#include <linux/pinctrl/pinconf.h>
  24#include <linux/pinctrl/pinmux.h>
  25#include <linux/pinctrl/pinconf-generic.h>
  26
  27struct sh_pfc_pinctrl {
  28        struct pinctrl_dev *pctl;
  29        struct sh_pfc *pfc;
  30
  31        struct pinmux_gpio **functions;
  32        unsigned int nr_functions;
  33
  34        struct pinctrl_pin_desc *pads;
  35        unsigned int nr_pads;
  36
  37        spinlock_t lock;
  38};
  39
  40static struct sh_pfc_pinctrl *sh_pfc_pmx;
  41
  42static int sh_pfc_get_groups_count(struct pinctrl_dev *pctldev)
  43{
  44        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  45
  46        return pmx->nr_pads;
  47}
  48
  49static const char *sh_pfc_get_group_name(struct pinctrl_dev *pctldev,
  50                                         unsigned selector)
  51{
  52        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  53
  54        return pmx->pads[selector].name;
  55}
  56
  57static int sh_pfc_get_group_pins(struct pinctrl_dev *pctldev, unsigned group,
  58                                 const unsigned **pins, unsigned *num_pins)
  59{
  60        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  61
  62        *pins = &pmx->pads[group].number;
  63        *num_pins = 1;
  64
  65        return 0;
  66}
  67
  68static void sh_pfc_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
  69                                unsigned offset)
  70{
  71        seq_printf(s, "%s", DRV_NAME);
  72}
  73
  74static struct pinctrl_ops sh_pfc_pinctrl_ops = {
  75        .get_groups_count       = sh_pfc_get_groups_count,
  76        .get_group_name         = sh_pfc_get_group_name,
  77        .get_group_pins         = sh_pfc_get_group_pins,
  78        .pin_dbg_show           = sh_pfc_pin_dbg_show,
  79};
  80
  81static int sh_pfc_get_functions_count(struct pinctrl_dev *pctldev)
  82{
  83        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  84
  85        return pmx->nr_functions;
  86}
  87
  88static const char *sh_pfc_get_function_name(struct pinctrl_dev *pctldev,
  89                                            unsigned selector)
  90{
  91        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  92
  93        return pmx->functions[selector]->name;
  94}
  95
  96static int sh_pfc_get_function_groups(struct pinctrl_dev *pctldev, unsigned func,
  97                                      const char * const **groups,
  98                                      unsigned * const num_groups)
  99{
 100        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
 101
 102        *groups = &pmx->functions[func]->name;
 103        *num_groups = 1;
 104
 105        return 0;
 106}
 107
 108static int sh_pfc_noop_enable(struct pinctrl_dev *pctldev, unsigned func,
 109                              unsigned group)
 110{
 111        return 0;
 112}
 113
 114static void sh_pfc_noop_disable(struct pinctrl_dev *pctldev, unsigned func,
 115                                unsigned group)
 116{
 117}
 118
 119static inline int sh_pfc_config_function(struct sh_pfc *pfc, unsigned offset)
 120{
 121        if (sh_pfc_config_gpio(pfc, offset,
 122                               PINMUX_TYPE_FUNCTION,
 123                               GPIO_CFG_DRYRUN) != 0)
 124                return -EINVAL;
 125
 126        if (sh_pfc_config_gpio(pfc, offset,
 127                               PINMUX_TYPE_FUNCTION,
 128                               GPIO_CFG_REQ) != 0)
 129                return -EINVAL;
 130
 131        return 0;
 132}
 133
 134static int sh_pfc_reconfig_pin(struct sh_pfc *pfc, unsigned offset,
 135                               int new_type)
 136{
 137        unsigned long flags;
 138        int pinmux_type;
 139        int ret = -EINVAL;
 140
 141        spin_lock_irqsave(&pfc->lock, flags);
 142
 143        pinmux_type = pfc->gpios[offset].flags & PINMUX_FLAG_TYPE;
 144
 145        /*
 146         * See if the present config needs to first be de-configured.
 147         */
 148        switch (pinmux_type) {
 149        case PINMUX_TYPE_GPIO:
 150                break;
 151        case PINMUX_TYPE_OUTPUT:
 152        case PINMUX_TYPE_INPUT:
 153        case PINMUX_TYPE_INPUT_PULLUP:
 154        case PINMUX_TYPE_INPUT_PULLDOWN:
 155                sh_pfc_config_gpio(pfc, offset, pinmux_type, GPIO_CFG_FREE);
 156                break;
 157        default:
 158                goto err;
 159        }
 160
 161        /*
 162         * Dry run
 163         */
 164        if (sh_pfc_config_gpio(pfc, offset, new_type,
 165                               GPIO_CFG_DRYRUN) != 0)
 166                goto err;
 167
 168        /*
 169         * Request
 170         */
 171        if (sh_pfc_config_gpio(pfc, offset, new_type,
 172                               GPIO_CFG_REQ) != 0)
 173                goto err;
 174
 175        pfc->gpios[offset].flags &= ~PINMUX_FLAG_TYPE;
 176        pfc->gpios[offset].flags |= new_type;
 177
 178        ret = 0;
 179
 180err:
 181        spin_unlock_irqrestore(&pfc->lock, flags);
 182
 183        return ret;
 184}
 185
 186
 187static int sh_pfc_gpio_request_enable(struct pinctrl_dev *pctldev,
 188                                      struct pinctrl_gpio_range *range,
 189                                      unsigned offset)
 190{
 191        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
 192        struct sh_pfc *pfc = pmx->pfc;
 193        unsigned long flags;
 194        int ret, pinmux_type;
 195
 196        spin_lock_irqsave(&pfc->lock, flags);
 197
 198        pinmux_type = pfc->gpios[offset].flags & PINMUX_FLAG_TYPE;
 199
 200        switch (pinmux_type) {
 201        case PINMUX_TYPE_FUNCTION:
 202                pr_notice_once("Use of GPIO API for function requests is "
 203                               "deprecated, convert to pinctrl\n");
 204                /* handle for now */
 205                ret = sh_pfc_config_function(pfc, offset);
 206                if (unlikely(ret < 0))
 207                        goto err;
 208
 209                break;
 210        case PINMUX_TYPE_GPIO:
 211        case PINMUX_TYPE_INPUT:
 212        case PINMUX_TYPE_OUTPUT:
 213                break;
 214        default:
 215                pr_err("Unsupported mux type (%d), bailing...\n", pinmux_type);
 216                ret = -ENOTSUPP;
 217                goto err;
 218        }
 219
 220        ret = 0;
 221
 222err:
 223        spin_unlock_irqrestore(&pfc->lock, flags);
 224
 225        return ret;
 226}
 227
 228static void sh_pfc_gpio_disable_free(struct pinctrl_dev *pctldev,
 229                                     struct pinctrl_gpio_range *range,
 230                                     unsigned offset)
 231{
 232        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
 233        struct sh_pfc *pfc = pmx->pfc;
 234        unsigned long flags;
 235        int pinmux_type;
 236
 237        spin_lock_irqsave(&pfc->lock, flags);
 238
 239        pinmux_type = pfc->gpios[offset].flags & PINMUX_FLAG_TYPE;
 240
 241        sh_pfc_config_gpio(pfc, offset, pinmux_type, GPIO_CFG_FREE);
 242
 243        spin_unlock_irqrestore(&pfc->lock, flags);
 244}
 245
 246static int sh_pfc_gpio_set_direction(struct pinctrl_dev *pctldev,
 247                                     struct pinctrl_gpio_range *range,
 248                                     unsigned offset, bool input)
 249{
 250        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
 251        int type = input ? PINMUX_TYPE_INPUT : PINMUX_TYPE_OUTPUT;
 252
 253        return sh_pfc_reconfig_pin(pmx->pfc, offset, type);
 254}
 255
 256static struct pinmux_ops sh_pfc_pinmux_ops = {
 257        .get_functions_count    = sh_pfc_get_functions_count,
 258        .get_function_name      = sh_pfc_get_function_name,
 259        .get_function_groups    = sh_pfc_get_function_groups,
 260        .enable                 = sh_pfc_noop_enable,
 261        .disable                = sh_pfc_noop_disable,
 262        .gpio_request_enable    = sh_pfc_gpio_request_enable,
 263        .gpio_disable_free      = sh_pfc_gpio_disable_free,
 264        .gpio_set_direction     = sh_pfc_gpio_set_direction,
 265};
 266
 267static int sh_pfc_pinconf_get(struct pinctrl_dev *pctldev, unsigned pin,
 268                              unsigned long *config)
 269{
 270        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
 271        struct sh_pfc *pfc = pmx->pfc;
 272
 273        *config = pfc->gpios[pin].flags & PINMUX_FLAG_TYPE;
 274
 275        return 0;
 276}
 277
 278static int sh_pfc_pinconf_set(struct pinctrl_dev *pctldev, unsigned pin,
 279                              unsigned long config)
 280{
 281        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
 282
 283        /* Validate the new type */
 284        if (config >= PINMUX_FLAG_TYPE)
 285                return -EINVAL;
 286
 287        return sh_pfc_reconfig_pin(pmx->pfc, pin, config);
 288}
 289
 290static void sh_pfc_pinconf_dbg_show(struct pinctrl_dev *pctldev,
 291                                    struct seq_file *s, unsigned pin)
 292{
 293        const char *pinmux_type_str[] = {
 294                [PINMUX_TYPE_NONE]              = "none",
 295                [PINMUX_TYPE_FUNCTION]          = "function",
 296                [PINMUX_TYPE_GPIO]              = "gpio",
 297                [PINMUX_TYPE_OUTPUT]            = "output",
 298                [PINMUX_TYPE_INPUT]             = "input",
 299                [PINMUX_TYPE_INPUT_PULLUP]      = "input bias pull up",
 300                [PINMUX_TYPE_INPUT_PULLDOWN]    = "input bias pull down",
 301        };
 302        unsigned long config;
 303        int rc;
 304
 305        rc = sh_pfc_pinconf_get(pctldev, pin, &config);
 306        if (unlikely(rc != 0))
 307                return;
 308
 309        seq_printf(s, " %s", pinmux_type_str[config]);
 310}
 311
 312static struct pinconf_ops sh_pfc_pinconf_ops = {
 313        .pin_config_get         = sh_pfc_pinconf_get,
 314        .pin_config_set         = sh_pfc_pinconf_set,
 315        .pin_config_dbg_show    = sh_pfc_pinconf_dbg_show,
 316};
 317
 318static struct pinctrl_gpio_range sh_pfc_gpio_range = {
 319        .name           = DRV_NAME,
 320        .id             = 0,
 321};
 322
 323static struct pinctrl_desc sh_pfc_pinctrl_desc = {
 324        .name           = DRV_NAME,
 325        .owner          = THIS_MODULE,
 326        .pctlops        = &sh_pfc_pinctrl_ops,
 327        .pmxops         = &sh_pfc_pinmux_ops,
 328        .confops        = &sh_pfc_pinconf_ops,
 329};
 330
 331static inline void sh_pfc_map_one_gpio(struct sh_pfc *pfc,
 332                                       struct sh_pfc_pinctrl *pmx,
 333                                       struct pinmux_gpio *gpio,
 334                                       unsigned offset)
 335{
 336        struct pinmux_data_reg *dummy;
 337        unsigned long flags;
 338        int bit;
 339
 340        gpio->flags &= ~PINMUX_FLAG_TYPE;
 341
 342        if (sh_pfc_get_data_reg(pfc, offset, &dummy, &bit) == 0)
 343                gpio->flags |= PINMUX_TYPE_GPIO;
 344        else {
 345                gpio->flags |= PINMUX_TYPE_FUNCTION;
 346
 347                spin_lock_irqsave(&pmx->lock, flags);
 348                pmx->nr_functions++;
 349                spin_unlock_irqrestore(&pmx->lock, flags);
 350        }
 351}
 352
 353/* pinmux ranges -> pinctrl pin descs */
 354static int sh_pfc_map_gpios(struct sh_pfc *pfc, struct sh_pfc_pinctrl *pmx)
 355{
 356        unsigned long flags;
 357        int i;
 358
 359        pmx->nr_pads = pfc->last_gpio - pfc->first_gpio + 1;
 360
 361        pmx->pads = kmalloc(sizeof(struct pinctrl_pin_desc) * pmx->nr_pads,
 362                            GFP_KERNEL);
 363        if (unlikely(!pmx->pads)) {
 364                pmx->nr_pads = 0;
 365                return -ENOMEM;
 366        }
 367
 368        spin_lock_irqsave(&pfc->lock, flags);
 369
 370        /*
 371         * We don't necessarily have a 1:1 mapping between pin and linux
 372         * GPIO number, as the latter maps to the associated enum_id.
 373         * Care needs to be taken to translate back to pin space when
 374         * dealing with any pin configurations.
 375         */
 376        for (i = 0; i < pmx->nr_pads; i++) {
 377                struct pinctrl_pin_desc *pin = pmx->pads + i;
 378                struct pinmux_gpio *gpio = pfc->gpios + i;
 379
 380                pin->number = pfc->first_gpio + i;
 381                pin->name = gpio->name;
 382
 383                /* XXX */
 384                if (unlikely(!gpio->enum_id))
 385                        continue;
 386
 387                sh_pfc_map_one_gpio(pfc, pmx, gpio, i);
 388        }
 389
 390        spin_unlock_irqrestore(&pfc->lock, flags);
 391
 392        sh_pfc_pinctrl_desc.pins = pmx->pads;
 393        sh_pfc_pinctrl_desc.npins = pmx->nr_pads;
 394
 395        return 0;
 396}
 397
 398static int sh_pfc_map_functions(struct sh_pfc *pfc, struct sh_pfc_pinctrl *pmx)
 399{
 400        unsigned long flags;
 401        int i, fn;
 402
 403        pmx->functions = kzalloc(pmx->nr_functions * sizeof(void *),
 404                                 GFP_KERNEL);
 405        if (unlikely(!pmx->functions))
 406                return -ENOMEM;
 407
 408        spin_lock_irqsave(&pmx->lock, flags);
 409
 410        for (i = fn = 0; i < pmx->nr_pads; i++) {
 411                struct pinmux_gpio *gpio = pfc->gpios + i;
 412
 413                if ((gpio->flags & PINMUX_FLAG_TYPE) == PINMUX_TYPE_FUNCTION)
 414                        pmx->functions[fn++] = gpio;
 415        }
 416
 417        spin_unlock_irqrestore(&pmx->lock, flags);
 418
 419        return 0;
 420}
 421
 422static int sh_pfc_pinctrl_probe(struct platform_device *pdev)
 423{
 424        struct sh_pfc *pfc;
 425        int ret;
 426
 427        if (unlikely(!sh_pfc_pmx))
 428                return -ENODEV;
 429
 430        pfc = sh_pfc_pmx->pfc;
 431
 432        ret = sh_pfc_map_gpios(pfc, sh_pfc_pmx);
 433        if (unlikely(ret != 0))
 434                return ret;
 435
 436        ret = sh_pfc_map_functions(pfc, sh_pfc_pmx);
 437        if (unlikely(ret != 0))
 438                goto free_pads;
 439
 440        sh_pfc_pmx->pctl = pinctrl_register(&sh_pfc_pinctrl_desc, &pdev->dev,
 441                                            sh_pfc_pmx);
 442        if (IS_ERR(sh_pfc_pmx->pctl)) {
 443                ret = PTR_ERR(sh_pfc_pmx->pctl);
 444                goto free_functions;
 445        }
 446
 447        sh_pfc_gpio_range.npins = pfc->last_gpio - pfc->first_gpio + 1;
 448        sh_pfc_gpio_range.base = pfc->first_gpio;
 449        sh_pfc_gpio_range.pin_base = pfc->first_gpio;
 450
 451        pinctrl_add_gpio_range(sh_pfc_pmx->pctl, &sh_pfc_gpio_range);
 452
 453        platform_set_drvdata(pdev, sh_pfc_pmx);
 454
 455        return 0;
 456
 457free_functions:
 458        kfree(sh_pfc_pmx->functions);
 459free_pads:
 460        kfree(sh_pfc_pmx->pads);
 461        kfree(sh_pfc_pmx);
 462
 463        return ret;
 464}
 465
 466static int sh_pfc_pinctrl_remove(struct platform_device *pdev)
 467{
 468        struct sh_pfc_pinctrl *pmx = platform_get_drvdata(pdev);
 469
 470        pinctrl_unregister(pmx->pctl);
 471
 472        platform_set_drvdata(pdev, NULL);
 473
 474        kfree(sh_pfc_pmx->functions);
 475        kfree(sh_pfc_pmx->pads);
 476        kfree(sh_pfc_pmx);
 477
 478        return 0;
 479}
 480
 481static struct platform_driver sh_pfc_pinctrl_driver = {
 482        .probe          = sh_pfc_pinctrl_probe,
 483        .remove         = sh_pfc_pinctrl_remove,
 484        .driver         = {
 485                .name   = DRV_NAME,
 486                .owner  = THIS_MODULE,
 487        },
 488};
 489
 490static struct platform_device sh_pfc_pinctrl_device = {
 491        .name           = DRV_NAME,
 492        .id             = -1,
 493};
 494
 495static int sh_pfc_pinctrl_init(void)
 496{
 497        int rc;
 498
 499        rc = platform_driver_register(&sh_pfc_pinctrl_driver);
 500        if (likely(!rc)) {
 501                rc = platform_device_register(&sh_pfc_pinctrl_device);
 502                if (unlikely(rc))
 503                        platform_driver_unregister(&sh_pfc_pinctrl_driver);
 504        }
 505
 506        return rc;
 507}
 508
 509int sh_pfc_register_pinctrl(struct sh_pfc *pfc)
 510{
 511        sh_pfc_pmx = kzalloc(sizeof(struct sh_pfc_pinctrl), GFP_KERNEL);
 512        if (unlikely(!sh_pfc_pmx))
 513                return -ENOMEM;
 514
 515        spin_lock_init(&sh_pfc_pmx->lock);
 516
 517        sh_pfc_pmx->pfc = pfc;
 518
 519        return sh_pfc_pinctrl_init();
 520}
 521EXPORT_SYMBOL_GPL(sh_pfc_register_pinctrl);
 522
 523static void __exit sh_pfc_pinctrl_exit(void)
 524{
 525        platform_driver_unregister(&sh_pfc_pinctrl_driver);
 526}
 527module_exit(sh_pfc_pinctrl_exit);
 528