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