cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gpiolib-sysfs.c (19562B)


      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_NONE		0
     17#define GPIO_IRQF_TRIGGER_FALLING	BIT(0)
     18#define GPIO_IRQF_TRIGGER_RISING	BIT(1)
     19#define GPIO_IRQF_TRIGGER_BOTH		(GPIO_IRQF_TRIGGER_FALLING | \
     20					 GPIO_IRQF_TRIGGER_RISING)
     21
     22struct gpiod_data {
     23	struct gpio_desc *desc;
     24
     25	struct mutex mutex;
     26	struct kernfs_node *value_kn;
     27	int irq;
     28	unsigned char irq_flags;
     29
     30	bool direction_can_change;
     31};
     32
     33/*
     34 * Lock to serialise gpiod export and unexport, and prevent re-export of
     35 * gpiod whose chip is being unregistered.
     36 */
     37static DEFINE_MUTEX(sysfs_lock);
     38
     39/*
     40 * /sys/class/gpio/gpioN... only for GPIOs that are exported
     41 *   /direction
     42 *      * MAY BE OMITTED if kernel won't allow direction changes
     43 *      * is read/write as "in" or "out"
     44 *      * may also be written as "high" or "low", initializing
     45 *        output value as specified ("out" implies "low")
     46 *   /value
     47 *      * always readable, subject to hardware behavior
     48 *      * may be writable, as zero/nonzero
     49 *   /edge
     50 *      * configures behavior of poll(2) on /value
     51 *      * available only if pin can generate IRQs on input
     52 *      * is read/write as "none", "falling", "rising", or "both"
     53 *   /active_low
     54 *      * configures polarity of /value
     55 *      * is read/write as zero/nonzero
     56 *      * also affects existing and subsequent "falling" and "rising"
     57 *        /edge configuration
     58 */
     59
     60static ssize_t direction_show(struct device *dev,
     61		struct device_attribute *attr, char *buf)
     62{
     63	struct gpiod_data *data = dev_get_drvdata(dev);
     64	struct gpio_desc *desc = data->desc;
     65	int value;
     66
     67	mutex_lock(&data->mutex);
     68
     69	gpiod_get_direction(desc);
     70	value = !!test_bit(FLAG_IS_OUT, &desc->flags);
     71
     72	mutex_unlock(&data->mutex);
     73
     74	return sysfs_emit(buf, "%s\n", value ? "out" : "in");
     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
    112	mutex_unlock(&data->mutex);
    113
    114	if (status < 0)
    115		return status;
    116
    117	return sysfs_emit(buf, "%zd\n", status);
    118}
    119
    120static ssize_t value_store(struct device *dev,
    121		struct device_attribute *attr, const char *buf, size_t size)
    122{
    123	struct gpiod_data *data = dev_get_drvdata(dev);
    124	struct gpio_desc *desc = data->desc;
    125	ssize_t status;
    126	long value;
    127
    128	status = kstrtol(buf, 0, &value);
    129
    130	mutex_lock(&data->mutex);
    131
    132	if (!test_bit(FLAG_IS_OUT, &desc->flags)) {
    133		status = -EPERM;
    134	} else if (status == 0) {
    135		gpiod_set_value_cansleep(desc, value);
    136		status = size;
    137	}
    138
    139	mutex_unlock(&data->mutex);
    140
    141	return status;
    142}
    143static DEVICE_ATTR_PREALLOC(value, S_IWUSR | S_IRUGO, value_show, value_store);
    144
    145static irqreturn_t gpio_sysfs_irq(int irq, void *priv)
    146{
    147	struct gpiod_data *data = priv;
    148
    149	sysfs_notify_dirent(data->value_kn);
    150
    151	return IRQ_HANDLED;
    152}
    153
    154/* Caller holds gpiod-data mutex. */
    155static int gpio_sysfs_request_irq(struct device *dev, unsigned char flags)
    156{
    157	struct gpiod_data	*data = dev_get_drvdata(dev);
    158	struct gpio_desc	*desc = data->desc;
    159	unsigned long		irq_flags;
    160	int			ret;
    161
    162	data->irq = gpiod_to_irq(desc);
    163	if (data->irq < 0)
    164		return -EIO;
    165
    166	data->value_kn = sysfs_get_dirent(dev->kobj.sd, "value");
    167	if (!data->value_kn)
    168		return -ENODEV;
    169
    170	irq_flags = IRQF_SHARED;
    171	if (flags & GPIO_IRQF_TRIGGER_FALLING)
    172		irq_flags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ?
    173			IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING;
    174	if (flags & GPIO_IRQF_TRIGGER_RISING)
    175		irq_flags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ?
    176			IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
    177
    178	/*
    179	 * FIXME: This should be done in the irq_request_resources callback
    180	 *        when the irq is requested, but a few drivers currently fail
    181	 *        to do so.
    182	 *
    183	 *        Remove this redundant call (along with the corresponding
    184	 *        unlock) when those drivers have been fixed.
    185	 */
    186	ret = gpiochip_lock_as_irq(desc->gdev->chip, gpio_chip_hwgpio(desc));
    187	if (ret < 0)
    188		goto err_put_kn;
    189
    190	ret = request_any_context_irq(data->irq, gpio_sysfs_irq, irq_flags,
    191				"gpiolib", data);
    192	if (ret < 0)
    193		goto err_unlock;
    194
    195	data->irq_flags = flags;
    196
    197	return 0;
    198
    199err_unlock:
    200	gpiochip_unlock_as_irq(desc->gdev->chip, gpio_chip_hwgpio(desc));
    201err_put_kn:
    202	sysfs_put(data->value_kn);
    203
    204	return ret;
    205}
    206
    207/*
    208 * Caller holds gpiod-data mutex (unless called after class-device
    209 * deregistration).
    210 */
    211static void gpio_sysfs_free_irq(struct device *dev)
    212{
    213	struct gpiod_data *data = dev_get_drvdata(dev);
    214	struct gpio_desc *desc = data->desc;
    215
    216	data->irq_flags = 0;
    217	free_irq(data->irq, data);
    218	gpiochip_unlock_as_irq(desc->gdev->chip, gpio_chip_hwgpio(desc));
    219	sysfs_put(data->value_kn);
    220}
    221
    222static const char * const trigger_names[] = {
    223	[GPIO_IRQF_TRIGGER_NONE]	= "none",
    224	[GPIO_IRQF_TRIGGER_FALLING]	= "falling",
    225	[GPIO_IRQF_TRIGGER_RISING]	= "rising",
    226	[GPIO_IRQF_TRIGGER_BOTH]	= "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	int flags;
    234
    235	mutex_lock(&data->mutex);
    236
    237	flags = data->irq_flags;
    238
    239	mutex_unlock(&data->mutex);
    240
    241	if (flags >= ARRAY_SIZE(trigger_names))
    242		return 0;
    243
    244	return sysfs_emit(buf, "%s\n", trigger_names[flags]);
    245}
    246
    247static ssize_t edge_store(struct device *dev,
    248		struct device_attribute *attr, const char *buf, size_t size)
    249{
    250	struct gpiod_data *data = dev_get_drvdata(dev);
    251	ssize_t	status = size;
    252	int flags;
    253
    254	flags = sysfs_match_string(trigger_names, buf);
    255	if (flags < 0)
    256		return flags;
    257
    258	mutex_lock(&data->mutex);
    259
    260	if (flags == data->irq_flags) {
    261		status = size;
    262		goto out_unlock;
    263	}
    264
    265	if (data->irq_flags)
    266		gpio_sysfs_free_irq(dev);
    267
    268	if (flags) {
    269		status = gpio_sysfs_request_irq(dev, flags);
    270		if (!status)
    271			status = size;
    272	}
    273
    274out_unlock:
    275	mutex_unlock(&data->mutex);
    276
    277	return status;
    278}
    279static DEVICE_ATTR_RW(edge);
    280
    281/* Caller holds gpiod-data mutex. */
    282static int gpio_sysfs_set_active_low(struct device *dev, int value)
    283{
    284	struct gpiod_data	*data = dev_get_drvdata(dev);
    285	struct gpio_desc	*desc = data->desc;
    286	int			status = 0;
    287	unsigned int		flags = data->irq_flags;
    288
    289	if (!!test_bit(FLAG_ACTIVE_LOW, &desc->flags) == !!value)
    290		return 0;
    291
    292	assign_bit(FLAG_ACTIVE_LOW, &desc->flags, value);
    293
    294	/* reconfigure poll(2) support if enabled on one edge only */
    295	if (flags == GPIO_IRQF_TRIGGER_FALLING ||
    296					flags == GPIO_IRQF_TRIGGER_RISING) {
    297		gpio_sysfs_free_irq(dev);
    298		status = gpio_sysfs_request_irq(dev, flags);
    299	}
    300
    301	return status;
    302}
    303
    304static ssize_t active_low_show(struct device *dev,
    305		struct device_attribute *attr, char *buf)
    306{
    307	struct gpiod_data *data = dev_get_drvdata(dev);
    308	struct gpio_desc *desc = data->desc;
    309	int value;
    310
    311	mutex_lock(&data->mutex);
    312
    313	value = !!test_bit(FLAG_ACTIVE_LOW, &desc->flags);
    314
    315	mutex_unlock(&data->mutex);
    316
    317	return sysfs_emit(buf, "%d\n", value);
    318}
    319
    320static ssize_t active_low_store(struct device *dev,
    321		struct device_attribute *attr, const char *buf, size_t size)
    322{
    323	struct gpiod_data	*data = dev_get_drvdata(dev);
    324	ssize_t			status;
    325	long			value;
    326
    327	status = kstrtol(buf, 0, &value);
    328	if (status)
    329		return status;
    330
    331	mutex_lock(&data->mutex);
    332
    333	status = gpio_sysfs_set_active_low(dev, value);
    334
    335	mutex_unlock(&data->mutex);
    336
    337	return status ? : size;
    338}
    339static DEVICE_ATTR_RW(active_low);
    340
    341static umode_t gpio_is_visible(struct kobject *kobj, struct attribute *attr,
    342			       int n)
    343{
    344	struct device *dev = kobj_to_dev(kobj);
    345	struct gpiod_data *data = dev_get_drvdata(dev);
    346	struct gpio_desc *desc = data->desc;
    347	umode_t mode = attr->mode;
    348	bool show_direction = data->direction_can_change;
    349
    350	if (attr == &dev_attr_direction.attr) {
    351		if (!show_direction)
    352			mode = 0;
    353	} else if (attr == &dev_attr_edge.attr) {
    354		if (gpiod_to_irq(desc) < 0)
    355			mode = 0;
    356		if (!show_direction && test_bit(FLAG_IS_OUT, &desc->flags))
    357			mode = 0;
    358	}
    359
    360	return mode;
    361}
    362
    363static struct attribute *gpio_attrs[] = {
    364	&dev_attr_direction.attr,
    365	&dev_attr_edge.attr,
    366	&dev_attr_value.attr,
    367	&dev_attr_active_low.attr,
    368	NULL,
    369};
    370
    371static const struct attribute_group gpio_group = {
    372	.attrs = gpio_attrs,
    373	.is_visible = gpio_is_visible,
    374};
    375
    376static const struct attribute_group *gpio_groups[] = {
    377	&gpio_group,
    378	NULL
    379};
    380
    381/*
    382 * /sys/class/gpio/gpiochipN/
    383 *   /base ... matching gpio_chip.base (N)
    384 *   /label ... matching gpio_chip.label
    385 *   /ngpio ... matching gpio_chip.ngpio
    386 */
    387
    388static ssize_t base_show(struct device *dev,
    389			       struct device_attribute *attr, char *buf)
    390{
    391	const struct gpio_chip	*chip = dev_get_drvdata(dev);
    392
    393	return sysfs_emit(buf, "%d\n", chip->base);
    394}
    395static DEVICE_ATTR_RO(base);
    396
    397static ssize_t label_show(struct device *dev,
    398			       struct device_attribute *attr, char *buf)
    399{
    400	const struct gpio_chip	*chip = dev_get_drvdata(dev);
    401
    402	return sysfs_emit(buf, "%s\n", chip->label ?: "");
    403}
    404static DEVICE_ATTR_RO(label);
    405
    406static ssize_t ngpio_show(struct device *dev,
    407			       struct device_attribute *attr, char *buf)
    408{
    409	const struct gpio_chip	*chip = dev_get_drvdata(dev);
    410
    411	return sysfs_emit(buf, "%u\n", chip->ngpio);
    412}
    413static DEVICE_ATTR_RO(ngpio);
    414
    415static struct attribute *gpiochip_attrs[] = {
    416	&dev_attr_base.attr,
    417	&dev_attr_label.attr,
    418	&dev_attr_ngpio.attr,
    419	NULL,
    420};
    421ATTRIBUTE_GROUPS(gpiochip);
    422
    423/*
    424 * /sys/class/gpio/export ... write-only
    425 *	integer N ... number of GPIO to export (full access)
    426 * /sys/class/gpio/unexport ... write-only
    427 *	integer N ... number of GPIO to unexport
    428 */
    429static ssize_t export_store(struct class *class,
    430				struct class_attribute *attr,
    431				const char *buf, size_t len)
    432{
    433	long			gpio;
    434	struct gpio_desc	*desc;
    435	int			status;
    436	struct gpio_chip	*gc;
    437	int			offset;
    438
    439	status = kstrtol(buf, 0, &gpio);
    440	if (status < 0)
    441		goto done;
    442
    443	desc = gpio_to_desc(gpio);
    444	/* reject invalid GPIOs */
    445	if (!desc) {
    446		pr_warn("%s: invalid GPIO %ld\n", __func__, gpio);
    447		return -EINVAL;
    448	}
    449	gc = desc->gdev->chip;
    450	offset = gpio_chip_hwgpio(desc);
    451	if (!gpiochip_line_is_valid(gc, offset)) {
    452		pr_warn("%s: GPIO %ld masked\n", __func__, gpio);
    453		return -EINVAL;
    454	}
    455
    456	/* No extra locking here; FLAG_SYSFS just signifies that the
    457	 * request and export were done by on behalf of userspace, so
    458	 * they may be undone on its behalf too.
    459	 */
    460
    461	status = gpiod_request_user(desc, "sysfs");
    462	if (status)
    463		goto done;
    464
    465	status = gpiod_set_transitory(desc, false);
    466	if (!status) {
    467		status = gpiod_export(desc, true);
    468		if (status < 0)
    469			gpiod_free(desc);
    470		else
    471			set_bit(FLAG_SYSFS, &desc->flags);
    472	}
    473
    474done:
    475	if (status)
    476		pr_debug("%s: status %d\n", __func__, status);
    477	return status ? : len;
    478}
    479static CLASS_ATTR_WO(export);
    480
    481static ssize_t unexport_store(struct class *class,
    482				struct class_attribute *attr,
    483				const char *buf, size_t len)
    484{
    485	long			gpio;
    486	struct gpio_desc	*desc;
    487	int			status;
    488
    489	status = kstrtol(buf, 0, &gpio);
    490	if (status < 0)
    491		goto done;
    492
    493	desc = gpio_to_desc(gpio);
    494	/* reject bogus commands (gpio_unexport ignores them) */
    495	if (!desc) {
    496		pr_warn("%s: invalid GPIO %ld\n", __func__, gpio);
    497		return -EINVAL;
    498	}
    499
    500	status = -EINVAL;
    501
    502	/* No extra locking here; FLAG_SYSFS just signifies that the
    503	 * request and export were done by on behalf of userspace, so
    504	 * they may be undone on its behalf too.
    505	 */
    506	if (test_and_clear_bit(FLAG_SYSFS, &desc->flags)) {
    507		status = 0;
    508		gpiod_free(desc);
    509	}
    510done:
    511	if (status)
    512		pr_debug("%s: status %d\n", __func__, status);
    513	return status ? : len;
    514}
    515static CLASS_ATTR_WO(unexport);
    516
    517static struct attribute *gpio_class_attrs[] = {
    518	&class_attr_export.attr,
    519	&class_attr_unexport.attr,
    520	NULL,
    521};
    522ATTRIBUTE_GROUPS(gpio_class);
    523
    524static struct class gpio_class = {
    525	.name =		"gpio",
    526	.owner =	THIS_MODULE,
    527
    528	.class_groups = gpio_class_groups,
    529};
    530
    531
    532/**
    533 * gpiod_export - export a GPIO through sysfs
    534 * @desc: 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 * @desc: 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 gpiod_export()
    674 * @desc: GPIO to make unavailable
    675 *
    676 * This is implicit on gpiod_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, MKDEV(0, 0), chip,
    747					gpiochip_groups, GPIOCHIP_NAME "%d",
    748					chip->base);
    749	if (IS_ERR(dev))
    750		return PTR_ERR(dev);
    751
    752	mutex_lock(&sysfs_lock);
    753	gdev->mockdev = dev;
    754	mutex_unlock(&sysfs_lock);
    755
    756	return 0;
    757}
    758
    759void gpiochip_sysfs_unregister(struct gpio_device *gdev)
    760{
    761	struct gpio_desc *desc;
    762	struct gpio_chip *chip = gdev->chip;
    763
    764	if (!gdev->mockdev)
    765		return;
    766
    767	device_unregister(gdev->mockdev);
    768
    769	/* prevent further gpiod exports */
    770	mutex_lock(&sysfs_lock);
    771	gdev->mockdev = NULL;
    772	mutex_unlock(&sysfs_lock);
    773
    774	/* unregister gpiod class devices owned by sysfs */
    775	for_each_gpio_desc_with_flag(chip, desc, FLAG_SYSFS)
    776		gpiod_free(desc);
    777}
    778
    779static int __init gpiolib_sysfs_init(void)
    780{
    781	int		status;
    782	unsigned long	flags;
    783	struct gpio_device *gdev;
    784
    785	status = class_register(&gpio_class);
    786	if (status < 0)
    787		return status;
    788
    789	/* Scan and register the gpio_chips which registered very
    790	 * early (e.g. before the class_register above was called).
    791	 *
    792	 * We run before arch_initcall() so chip->dev nodes can have
    793	 * registered, and so arch_initcall() can always gpio_export().
    794	 */
    795	spin_lock_irqsave(&gpio_lock, flags);
    796	list_for_each_entry(gdev, &gpio_devices, list) {
    797		if (gdev->mockdev)
    798			continue;
    799
    800		/*
    801		 * TODO we yield gpio_lock here because
    802		 * gpiochip_sysfs_register() acquires a mutex. This is unsafe
    803		 * and needs to be fixed.
    804		 *
    805		 * Also it would be nice to use gpiochip_find() here so we
    806		 * can keep gpio_chips local to gpiolib.c, but the yield of
    807		 * gpio_lock prevents us from doing this.
    808		 */
    809		spin_unlock_irqrestore(&gpio_lock, flags);
    810		status = gpiochip_sysfs_register(gdev);
    811		spin_lock_irqsave(&gpio_lock, flags);
    812	}
    813	spin_unlock_irqrestore(&gpio_lock, flags);
    814
    815	return status;
    816}
    817postcore_initcall(gpiolib_sysfs_init);