linux/drivers/gpio/gpiolib-sysfs.c
<<
>>
Prefs
   1#include <linux/idr.h>
   2#include <linux/mutex.h>
   3#include <linux/device.h>
   4#include <linux/sysfs.h>
   5#include <linux/gpio/consumer.h>
   6#include <linux/gpio/driver.h>
   7#include <linux/interrupt.h>
   8#include <linux/kdev_t.h>
   9#include <linux/slab.h>
  10
  11#include "gpiolib.h"
  12
  13#define GPIO_IRQF_TRIGGER_FALLING       BIT(0)
  14#define GPIO_IRQF_TRIGGER_RISING        BIT(1)
  15#define GPIO_IRQF_TRIGGER_BOTH          (GPIO_IRQF_TRIGGER_FALLING | \
  16                                         GPIO_IRQF_TRIGGER_RISING)
  17
  18struct gpiod_data {
  19        struct gpio_desc *desc;
  20
  21        struct mutex mutex;
  22        struct kernfs_node *value_kn;
  23        int irq;
  24        unsigned char irq_flags;
  25
  26        bool direction_can_change;
  27};
  28
  29/*
  30 * Lock to serialise gpiod export and unexport, and prevent re-export of
  31 * gpiod whose chip is being unregistered.
  32 */
  33static DEFINE_MUTEX(sysfs_lock);
  34
  35/*
  36 * /sys/class/gpio/gpioN... only for GPIOs that are exported
  37 *   /direction
  38 *      * MAY BE OMITTED if kernel won't allow direction changes
  39 *      * is read/write as "in" or "out"
  40 *      * may also be written as "high" or "low", initializing
  41 *        output value as specified ("out" implies "low")
  42 *   /value
  43 *      * always readable, subject to hardware behavior
  44 *      * may be writable, as zero/nonzero
  45 *   /edge
  46 *      * configures behavior of poll(2) on /value
  47 *      * available only if pin can generate IRQs on input
  48 *      * is read/write as "none", "falling", "rising", or "both"
  49 *   /active_low
  50 *      * configures polarity of /value
  51 *      * is read/write as zero/nonzero
  52 *      * also affects existing and subsequent "falling" and "rising"
  53 *        /edge configuration
  54 */
  55
  56static ssize_t direction_show(struct device *dev,
  57                struct device_attribute *attr, char *buf)
  58{
  59        struct gpiod_data *data = dev_get_drvdata(dev);
  60        struct gpio_desc *desc = data->desc;
  61        ssize_t                 status;
  62
  63        mutex_lock(&data->mutex);
  64
  65        gpiod_get_direction(desc);
  66        status = sprintf(buf, "%s\n",
  67                        test_bit(FLAG_IS_OUT, &desc->flags)
  68                                ? "out" : "in");
  69
  70        mutex_unlock(&data->mutex);
  71
  72        return status;
  73}
  74
  75static ssize_t direction_store(struct device *dev,
  76                struct device_attribute *attr, const char *buf, size_t size)
  77{
  78        struct gpiod_data *data = dev_get_drvdata(dev);
  79        struct gpio_desc *desc = data->desc;
  80        ssize_t                 status;
  81
  82        mutex_lock(&data->mutex);
  83
  84        if (sysfs_streq(buf, "high"))
  85                status = gpiod_direction_output_raw(desc, 1);
  86        else if (sysfs_streq(buf, "out") || sysfs_streq(buf, "low"))
  87                status = gpiod_direction_output_raw(desc, 0);
  88        else if (sysfs_streq(buf, "in"))
  89                status = gpiod_direction_input(desc);
  90        else
  91                status = -EINVAL;
  92
  93        mutex_unlock(&data->mutex);
  94
  95        return status ? : size;
  96}
  97static DEVICE_ATTR_RW(direction);
  98
  99static ssize_t value_show(struct device *dev,
 100                struct device_attribute *attr, char *buf)
 101{
 102        struct gpiod_data *data = dev_get_drvdata(dev);
 103        struct gpio_desc *desc = data->desc;
 104        ssize_t                 status;
 105
 106        mutex_lock(&data->mutex);
 107
 108        status = sprintf(buf, "%d\n", gpiod_get_value_cansleep(desc));
 109
 110        mutex_unlock(&data->mutex);
 111
 112        return status;
 113}
 114
 115static ssize_t value_store(struct device *dev,
 116                struct device_attribute *attr, const char *buf, size_t size)
 117{
 118        struct gpiod_data *data = dev_get_drvdata(dev);
 119        struct gpio_desc *desc = data->desc;
 120        ssize_t                 status;
 121
 122        mutex_lock(&data->mutex);
 123
 124        if (!test_bit(FLAG_IS_OUT, &desc->flags)) {
 125                status = -EPERM;
 126        } else {
 127                long            value;
 128
 129                status = kstrtol(buf, 0, &value);
 130                if (status == 0) {
 131                        gpiod_set_value_cansleep(desc, value);
 132                        status = size;
 133                }
 134        }
 135
 136        mutex_unlock(&data->mutex);
 137
 138        return status;
 139}
 140static DEVICE_ATTR_RW(value);
 141
 142static irqreturn_t gpio_sysfs_irq(int irq, void *priv)
 143{
 144        struct gpiod_data *data = priv;
 145
 146        sysfs_notify_dirent(data->value_kn);
 147
 148        return IRQ_HANDLED;
 149}
 150
 151/* Caller holds gpiod-data mutex. */
 152static int gpio_sysfs_request_irq(struct device *dev, unsigned char flags)
 153{
 154        struct gpiod_data       *data = dev_get_drvdata(dev);
 155        struct gpio_desc        *desc = data->desc;
 156        unsigned long           irq_flags;
 157        int                     ret;
 158
 159        data->irq = gpiod_to_irq(desc);
 160        if (data->irq < 0)
 161                return -EIO;
 162
 163        data->value_kn = sysfs_get_dirent(dev->kobj.sd, "value");
 164        if (!data->value_kn)
 165                return -ENODEV;
 166
 167        irq_flags = IRQF_SHARED;
 168        if (flags & GPIO_IRQF_TRIGGER_FALLING)
 169                irq_flags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ?
 170                        IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING;
 171        if (flags & GPIO_IRQF_TRIGGER_RISING)
 172                irq_flags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ?
 173                        IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
 174
 175        /*
 176         * FIXME: This should be done in the irq_request_resources callback
 177         *        when the irq is requested, but a few drivers currently fail
 178         *        to do so.
 179         *
 180         *        Remove this redundant call (along with the corresponding
 181         *        unlock) when those drivers have been fixed.
 182         */
 183        ret = gpiochip_lock_as_irq(desc->gdev->chip, gpio_chip_hwgpio(desc));
 184        if (ret < 0)
 185                goto err_put_kn;
 186
 187        ret = request_any_context_irq(data->irq, gpio_sysfs_irq, irq_flags,
 188                                "gpiolib", data);
 189        if (ret < 0)
 190                goto err_unlock;
 191
 192        data->irq_flags = flags;
 193
 194        return 0;
 195
 196err_unlock:
 197        gpiochip_unlock_as_irq(desc->gdev->chip, gpio_chip_hwgpio(desc));
 198err_put_kn:
 199        sysfs_put(data->value_kn);
 200
 201        return ret;
 202}
 203
 204/*
 205 * Caller holds gpiod-data mutex (unless called after class-device
 206 * deregistration).
 207 */
 208static void gpio_sysfs_free_irq(struct device *dev)
 209{
 210        struct gpiod_data *data = dev_get_drvdata(dev);
 211        struct gpio_desc *desc = data->desc;
 212
 213        data->irq_flags = 0;
 214        free_irq(data->irq, data);
 215        gpiochip_unlock_as_irq(desc->gdev->chip, gpio_chip_hwgpio(desc));
 216        sysfs_put(data->value_kn);
 217}
 218
 219static const struct {
 220        const char *name;
 221        unsigned char flags;
 222} trigger_types[] = {
 223        { "none",    0 },
 224        { "falling", GPIO_IRQF_TRIGGER_FALLING },
 225        { "rising",  GPIO_IRQF_TRIGGER_RISING },
 226        { "both",    GPIO_IRQF_TRIGGER_BOTH },
 227};
 228
 229static ssize_t edge_show(struct device *dev,
 230                struct device_attribute *attr, char *buf)
 231{
 232        struct gpiod_data *data = dev_get_drvdata(dev);
 233        ssize_t status = 0;
 234        int i;
 235
 236        mutex_lock(&data->mutex);
 237
 238        for (i = 0; i < ARRAY_SIZE(trigger_types); i++) {
 239                if (data->irq_flags == trigger_types[i].flags) {
 240                        status = sprintf(buf, "%s\n", trigger_types[i].name);
 241                        break;
 242                }
 243        }
 244
 245        mutex_unlock(&data->mutex);
 246
 247        return status;
 248}
 249
 250static ssize_t edge_store(struct device *dev,
 251                struct device_attribute *attr, const char *buf, size_t size)
 252{
 253        struct gpiod_data *data = dev_get_drvdata(dev);
 254        unsigned char flags;
 255        ssize_t status = size;
 256        int i;
 257
 258        for (i = 0; i < ARRAY_SIZE(trigger_types); i++) {
 259                if (sysfs_streq(trigger_types[i].name, buf))
 260                        break;
 261        }
 262
 263        if (i == ARRAY_SIZE(trigger_types))
 264                return -EINVAL;
 265
 266        flags = trigger_types[i].flags;
 267
 268        mutex_lock(&data->mutex);
 269
 270        if (flags == data->irq_flags) {
 271                status = size;
 272                goto out_unlock;
 273        }
 274
 275        if (data->irq_flags)
 276                gpio_sysfs_free_irq(dev);
 277
 278        if (flags) {
 279                status = gpio_sysfs_request_irq(dev, flags);
 280                if (!status)
 281                        status = size;
 282        }
 283
 284out_unlock:
 285        mutex_unlock(&data->mutex);
 286
 287        return status;
 288}
 289static DEVICE_ATTR_RW(edge);
 290
 291/* Caller holds gpiod-data mutex. */
 292static int gpio_sysfs_set_active_low(struct device *dev, int value)
 293{
 294        struct gpiod_data       *data = dev_get_drvdata(dev);
 295        struct gpio_desc        *desc = data->desc;
 296        int                     status = 0;
 297        unsigned int            flags = data->irq_flags;
 298
 299        if (!!test_bit(FLAG_ACTIVE_LOW, &desc->flags) == !!value)
 300                return 0;
 301
 302        if (value)
 303                set_bit(FLAG_ACTIVE_LOW, &desc->flags);
 304        else
 305                clear_bit(FLAG_ACTIVE_LOW, &desc->flags);
 306
 307        /* reconfigure poll(2) support if enabled on one edge only */
 308        if (flags == GPIO_IRQF_TRIGGER_FALLING ||
 309                                        flags == GPIO_IRQF_TRIGGER_RISING) {
 310                gpio_sysfs_free_irq(dev);
 311                status = gpio_sysfs_request_irq(dev, flags);
 312        }
 313
 314        return status;
 315}
 316
 317static ssize_t active_low_show(struct device *dev,
 318                struct device_attribute *attr, char *buf)
 319{
 320        struct gpiod_data *data = dev_get_drvdata(dev);
 321        struct gpio_desc *desc = data->desc;
 322        ssize_t                 status;
 323
 324        mutex_lock(&data->mutex);
 325
 326        status = sprintf(buf, "%d\n",
 327                                !!test_bit(FLAG_ACTIVE_LOW, &desc->flags));
 328
 329        mutex_unlock(&data->mutex);
 330
 331        return status;
 332}
 333
 334static ssize_t active_low_store(struct device *dev,
 335                struct device_attribute *attr, const char *buf, size_t size)
 336{
 337        struct gpiod_data       *data = dev_get_drvdata(dev);
 338        ssize_t                 status;
 339        long                    value;
 340
 341        mutex_lock(&data->mutex);
 342
 343        status = kstrtol(buf, 0, &value);
 344        if (status == 0)
 345                status = gpio_sysfs_set_active_low(dev, value);
 346
 347        mutex_unlock(&data->mutex);
 348
 349        return status ? : size;
 350}
 351static DEVICE_ATTR_RW(active_low);
 352
 353static umode_t gpio_is_visible(struct kobject *kobj, struct attribute *attr,
 354                               int n)
 355{
 356        struct device *dev = container_of(kobj, struct device, kobj);
 357        struct gpiod_data *data = dev_get_drvdata(dev);
 358        struct gpio_desc *desc = data->desc;
 359        umode_t mode = attr->mode;
 360        bool show_direction = data->direction_can_change;
 361
 362        if (attr == &dev_attr_direction.attr) {
 363                if (!show_direction)
 364                        mode = 0;
 365        } else if (attr == &dev_attr_edge.attr) {
 366                if (gpiod_to_irq(desc) < 0)
 367                        mode = 0;
 368                if (!show_direction && test_bit(FLAG_IS_OUT, &desc->flags))
 369                        mode = 0;
 370        }
 371
 372        return mode;
 373}
 374
 375static struct attribute *gpio_attrs[] = {
 376        &dev_attr_direction.attr,
 377        &dev_attr_edge.attr,
 378        &dev_attr_value.attr,
 379        &dev_attr_active_low.attr,
 380        NULL,
 381};
 382
 383static const struct attribute_group gpio_group = {
 384        .attrs = gpio_attrs,
 385        .is_visible = gpio_is_visible,
 386};
 387
 388static const struct attribute_group *gpio_groups[] = {
 389        &gpio_group,
 390        NULL
 391};
 392
 393/*
 394 * /sys/class/gpio/gpiochipN/
 395 *   /base ... matching gpio_chip.base (N)
 396 *   /label ... matching gpio_chip.label
 397 *   /ngpio ... matching gpio_chip.ngpio
 398 */
 399
 400static ssize_t base_show(struct device *dev,
 401                               struct device_attribute *attr, char *buf)
 402{
 403        const struct gpio_chip  *chip = dev_get_drvdata(dev);
 404
 405        return sprintf(buf, "%d\n", chip->base);
 406}
 407static DEVICE_ATTR_RO(base);
 408
 409static ssize_t label_show(struct device *dev,
 410                               struct device_attribute *attr, char *buf)
 411{
 412        const struct gpio_chip  *chip = dev_get_drvdata(dev);
 413
 414        return sprintf(buf, "%s\n", chip->label ? : "");
 415}
 416static DEVICE_ATTR_RO(label);
 417
 418static ssize_t ngpio_show(struct device *dev,
 419                               struct device_attribute *attr, char *buf)
 420{
 421        const struct gpio_chip  *chip = dev_get_drvdata(dev);
 422
 423        return sprintf(buf, "%u\n", chip->ngpio);
 424}
 425static DEVICE_ATTR_RO(ngpio);
 426
 427static struct attribute *gpiochip_attrs[] = {
 428        &dev_attr_base.attr,
 429        &dev_attr_label.attr,
 430        &dev_attr_ngpio.attr,
 431        NULL,
 432};
 433ATTRIBUTE_GROUPS(gpiochip);
 434
 435/*
 436 * /sys/class/gpio/export ... write-only
 437 *      integer N ... number of GPIO to export (full access)
 438 * /sys/class/gpio/unexport ... write-only
 439 *      integer N ... number of GPIO to unexport
 440 */
 441static ssize_t export_store(struct class *class,
 442                                struct class_attribute *attr,
 443                                const char *buf, size_t len)
 444{
 445        long                    gpio;
 446        struct gpio_desc        *desc;
 447        int                     status;
 448
 449        status = kstrtol(buf, 0, &gpio);
 450        if (status < 0)
 451                goto done;
 452
 453        desc = gpio_to_desc(gpio);
 454        /* reject invalid GPIOs */
 455        if (!desc) {
 456                pr_warn("%s: invalid GPIO %ld\n", __func__, gpio);
 457                return -EINVAL;
 458        }
 459
 460        /* No extra locking here; FLAG_SYSFS just signifies that the
 461         * request and export were done by on behalf of userspace, so
 462         * they may be undone on its behalf too.
 463         */
 464
 465        status = gpiod_request(desc, "sysfs");
 466        if (status < 0) {
 467                if (status == -EPROBE_DEFER)
 468                        status = -ENODEV;
 469                goto done;
 470        }
 471        status = gpiod_export(desc, true);
 472        if (status < 0)
 473                gpiod_free(desc);
 474        else
 475                set_bit(FLAG_SYSFS, &desc->flags);
 476
 477done:
 478        if (status)
 479                pr_debug("%s: status %d\n", __func__, status);
 480        return status ? : len;
 481}
 482
 483static ssize_t unexport_store(struct class *class,
 484                                struct class_attribute *attr,
 485                                const char *buf, size_t len)
 486{
 487        long                    gpio;
 488        struct gpio_desc        *desc;
 489        int                     status;
 490
 491        status = kstrtol(buf, 0, &gpio);
 492        if (status < 0)
 493                goto done;
 494
 495        desc = gpio_to_desc(gpio);
 496        /* reject bogus commands (gpio_unexport ignores them) */
 497        if (!desc) {
 498                pr_warn("%s: invalid GPIO %ld\n", __func__, gpio);
 499                return -EINVAL;
 500        }
 501
 502        status = -EINVAL;
 503
 504        /* No extra locking here; FLAG_SYSFS just signifies that the
 505         * request and export were done by on behalf of userspace, so
 506         * they may be undone on its behalf too.
 507         */
 508        if (test_and_clear_bit(FLAG_SYSFS, &desc->flags)) {
 509                status = 0;
 510                gpiod_free(desc);
 511        }
 512done:
 513        if (status)
 514                pr_debug("%s: status %d\n", __func__, status);
 515        return status ? : len;
 516}
 517
 518static struct class_attribute gpio_class_attrs[] = {
 519        __ATTR(export, 0200, NULL, export_store),
 520        __ATTR(unexport, 0200, NULL, unexport_store),
 521        __ATTR_NULL,
 522};
 523
 524static struct class gpio_class = {
 525        .name =         "gpio",
 526        .owner =        THIS_MODULE,
 527
 528        .class_attrs =  gpio_class_attrs,
 529};
 530
 531
 532/**
 533 * gpiod_export - export a GPIO through sysfs
 534 * @gpio: gpio to make available, already requested
 535 * @direction_may_change: true if userspace may change gpio direction
 536 * Context: arch_initcall or later
 537 *
 538 * When drivers want to make a GPIO accessible to userspace after they
 539 * have requested it -- perhaps while debugging, or as part of their
 540 * public interface -- they may use this routine.  If the GPIO can
 541 * change direction (some can't) and the caller allows it, userspace
 542 * will see "direction" sysfs attribute which may be used to change
 543 * the gpio's direction.  A "value" attribute will always be provided.
 544 *
 545 * Returns zero on success, else an error.
 546 */
 547int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
 548{
 549        struct gpio_chip        *chip;
 550        struct gpio_device      *gdev;
 551        struct gpiod_data       *data;
 552        unsigned long           flags;
 553        int                     status;
 554        const char              *ioname = NULL;
 555        struct device           *dev;
 556        int                     offset;
 557
 558        /* can't export until sysfs is available ... */
 559        if (!gpio_class.p) {
 560                pr_debug("%s: called too early!\n", __func__);
 561                return -ENOENT;
 562        }
 563
 564        if (!desc) {
 565                pr_debug("%s: invalid gpio descriptor\n", __func__);
 566                return -EINVAL;
 567        }
 568
 569        gdev = desc->gdev;
 570        chip = gdev->chip;
 571
 572        mutex_lock(&sysfs_lock);
 573
 574        /* check if chip is being removed */
 575        if (!chip || !gdev->mockdev) {
 576                status = -ENODEV;
 577                goto err_unlock;
 578        }
 579
 580        spin_lock_irqsave(&gpio_lock, flags);
 581        if (!test_bit(FLAG_REQUESTED, &desc->flags) ||
 582             test_bit(FLAG_EXPORT, &desc->flags)) {
 583                spin_unlock_irqrestore(&gpio_lock, flags);
 584                gpiod_dbg(desc, "%s: unavailable (requested=%d, exported=%d)\n",
 585                                __func__,
 586                                test_bit(FLAG_REQUESTED, &desc->flags),
 587                                test_bit(FLAG_EXPORT, &desc->flags));
 588                status = -EPERM;
 589                goto err_unlock;
 590        }
 591        spin_unlock_irqrestore(&gpio_lock, flags);
 592
 593        data = kzalloc(sizeof(*data), GFP_KERNEL);
 594        if (!data) {
 595                status = -ENOMEM;
 596                goto err_unlock;
 597        }
 598
 599        data->desc = desc;
 600        mutex_init(&data->mutex);
 601        if (chip->direction_input && chip->direction_output)
 602                data->direction_can_change = direction_may_change;
 603        else
 604                data->direction_can_change = false;
 605
 606        offset = gpio_chip_hwgpio(desc);
 607        if (chip->names && chip->names[offset])
 608                ioname = chip->names[offset];
 609
 610        dev = device_create_with_groups(&gpio_class, &gdev->dev,
 611                                        MKDEV(0, 0), data, gpio_groups,
 612                                        ioname ? ioname : "gpio%u",
 613                                        desc_to_gpio(desc));
 614        if (IS_ERR(dev)) {
 615                status = PTR_ERR(dev);
 616                goto err_free_data;
 617        }
 618
 619        set_bit(FLAG_EXPORT, &desc->flags);
 620        mutex_unlock(&sysfs_lock);
 621        return 0;
 622
 623err_free_data:
 624        kfree(data);
 625err_unlock:
 626        mutex_unlock(&sysfs_lock);
 627        gpiod_dbg(desc, "%s: status %d\n", __func__, status);
 628        return status;
 629}
 630EXPORT_SYMBOL_GPL(gpiod_export);
 631
 632static int match_export(struct device *dev, const void *desc)
 633{
 634        struct gpiod_data *data = dev_get_drvdata(dev);
 635
 636        return data->desc == desc;
 637}
 638
 639/**
 640 * gpiod_export_link - create a sysfs link to an exported GPIO node
 641 * @dev: device under which to create symlink
 642 * @name: name of the symlink
 643 * @gpio: gpio to create symlink to, already exported
 644 *
 645 * Set up a symlink from /sys/.../dev/name to /sys/class/gpio/gpioN
 646 * node. Caller is responsible for unlinking.
 647 *
 648 * Returns zero on success, else an error.
 649 */
 650int gpiod_export_link(struct device *dev, const char *name,
 651                      struct gpio_desc *desc)
 652{
 653        struct device *cdev;
 654        int ret;
 655
 656        if (!desc) {
 657                pr_warn("%s: invalid GPIO\n", __func__);
 658                return -EINVAL;
 659        }
 660
 661        cdev = class_find_device(&gpio_class, NULL, desc, match_export);
 662        if (!cdev)
 663                return -ENODEV;
 664
 665        ret = sysfs_create_link(&dev->kobj, &cdev->kobj, name);
 666        put_device(cdev);
 667
 668        return ret;
 669}
 670EXPORT_SYMBOL_GPL(gpiod_export_link);
 671
 672/**
 673 * gpiod_unexport - reverse effect of gpio_export()
 674 * @gpio: gpio to make unavailable
 675 *
 676 * This is implicit on gpio_free().
 677 */
 678void gpiod_unexport(struct gpio_desc *desc)
 679{
 680        struct gpiod_data *data;
 681        struct device *dev;
 682
 683        if (!desc) {
 684                pr_warn("%s: invalid GPIO\n", __func__);
 685                return;
 686        }
 687
 688        mutex_lock(&sysfs_lock);
 689
 690        if (!test_bit(FLAG_EXPORT, &desc->flags))
 691                goto err_unlock;
 692
 693        dev = class_find_device(&gpio_class, NULL, desc, match_export);
 694        if (!dev)
 695                goto err_unlock;
 696
 697        data = dev_get_drvdata(dev);
 698
 699        clear_bit(FLAG_EXPORT, &desc->flags);
 700
 701        device_unregister(dev);
 702
 703        /*
 704         * Release irq after deregistration to prevent race with edge_store.
 705         */
 706        if (data->irq_flags)
 707                gpio_sysfs_free_irq(dev);
 708
 709        mutex_unlock(&sysfs_lock);
 710
 711        put_device(dev);
 712        kfree(data);
 713
 714        return;
 715
 716err_unlock:
 717        mutex_unlock(&sysfs_lock);
 718}
 719EXPORT_SYMBOL_GPL(gpiod_unexport);
 720
 721int gpiochip_sysfs_register(struct gpio_device *gdev)
 722{
 723        struct device   *dev;
 724        struct device   *parent;
 725        struct gpio_chip *chip = gdev->chip;
 726
 727        /*
 728         * Many systems add gpio chips for SOC support very early,
 729         * before driver model support is available.  In those cases we
 730         * register later, in gpiolib_sysfs_init() ... here we just
 731         * verify that _some_ field of gpio_class got initialized.
 732         */
 733        if (!gpio_class.p)
 734                return 0;
 735
 736        /*
 737         * For sysfs backward compatibility we need to preserve this
 738         * preferred parenting to the gpio_chip parent field, if set.
 739         */
 740        if (chip->parent)
 741                parent = chip->parent;
 742        else
 743                parent = &gdev->dev;
 744
 745        /* use chip->base for the ID; it's already known to be unique */
 746        dev = device_create_with_groups(&gpio_class, parent,
 747                                        MKDEV(0, 0),
 748                                        chip, gpiochip_groups,
 749                                        "gpiochip%d", chip->base);
 750        if (IS_ERR(dev))
 751                return PTR_ERR(dev);
 752
 753        mutex_lock(&sysfs_lock);
 754        gdev->mockdev = dev;
 755        mutex_unlock(&sysfs_lock);
 756
 757        return 0;
 758}
 759
 760void gpiochip_sysfs_unregister(struct gpio_device *gdev)
 761{
 762        struct gpio_desc *desc;
 763        struct gpio_chip *chip = gdev->chip;
 764        unsigned int i;
 765
 766        if (!gdev->mockdev)
 767                return;
 768
 769        device_unregister(gdev->mockdev);
 770
 771        /* prevent further gpiod exports */
 772        mutex_lock(&sysfs_lock);
 773        gdev->mockdev = NULL;
 774        mutex_unlock(&sysfs_lock);
 775
 776        /* unregister gpiod class devices owned by sysfs */
 777        for (i = 0; i < chip->ngpio; i++) {
 778                desc = &gdev->descs[i];
 779                if (test_and_clear_bit(FLAG_SYSFS, &desc->flags))
 780                        gpiod_free(desc);
 781        }
 782}
 783
 784static int __init gpiolib_sysfs_init(void)
 785{
 786        int             status;
 787        unsigned long   flags;
 788        struct gpio_device *gdev;
 789
 790        status = class_register(&gpio_class);
 791        if (status < 0)
 792                return status;
 793
 794        /* Scan and register the gpio_chips which registered very
 795         * early (e.g. before the class_register above was called).
 796         *
 797         * We run before arch_initcall() so chip->dev nodes can have
 798         * registered, and so arch_initcall() can always gpio_export().
 799         */
 800        spin_lock_irqsave(&gpio_lock, flags);
 801        list_for_each_entry(gdev, &gpio_devices, list) {
 802                if (gdev->mockdev)
 803                        continue;
 804
 805                /*
 806                 * TODO we yield gpio_lock here because
 807                 * gpiochip_sysfs_register() acquires a mutex. This is unsafe
 808                 * and needs to be fixed.
 809                 *
 810                 * Also it would be nice to use gpiochip_find() here so we
 811                 * can keep gpio_chips local to gpiolib.c, but the yield of
 812                 * gpio_lock prevents us from doing this.
 813                 */
 814                spin_unlock_irqrestore(&gpio_lock, flags);
 815                status = gpiochip_sysfs_register(gdev);
 816                spin_lock_irqsave(&gpio_lock, flags);
 817        }
 818        spin_unlock_irqrestore(&gpio_lock, flags);
 819
 820        return status;
 821}
 822postcore_initcall(gpiolib_sysfs_init);
 823