1*925ca369SKent Gibson // SPDX-License-Identifier: GPL-2.0 2*925ca369SKent Gibson 3*925ca369SKent Gibson #include <linux/bitmap.h> 4*925ca369SKent Gibson #include <linux/kernel.h> 5*925ca369SKent Gibson #include <linux/module.h> 6*925ca369SKent Gibson #include <linux/interrupt.h> 7*925ca369SKent Gibson #include <linux/irqreturn.h> 8*925ca369SKent Gibson #include <linux/spinlock.h> 9*925ca369SKent Gibson #include <linux/device.h> 10*925ca369SKent Gibson #include <linux/err.h> 11*925ca369SKent Gibson #include <linux/gpio.h> 12*925ca369SKent Gibson #include <linux/gpio/driver.h> 13*925ca369SKent Gibson #include <linux/pinctrl/consumer.h> 14*925ca369SKent Gibson #include <linux/cdev.h> 15*925ca369SKent Gibson #include <linux/uaccess.h> 16*925ca369SKent Gibson #include <linux/compat.h> 17*925ca369SKent Gibson #include <linux/anon_inodes.h> 18*925ca369SKent Gibson #include <linux/file.h> 19*925ca369SKent Gibson #include <linux/kfifo.h> 20*925ca369SKent Gibson #include <linux/poll.h> 21*925ca369SKent Gibson #include <linux/timekeeping.h> 22*925ca369SKent Gibson #include <uapi/linux/gpio.h> 23*925ca369SKent Gibson 24*925ca369SKent Gibson #include "gpiolib.h" 25*925ca369SKent Gibson #include "gpiolib-cdev.h" 26*925ca369SKent Gibson 27*925ca369SKent Gibson /* Character device interface to GPIO. 28*925ca369SKent Gibson * 29*925ca369SKent Gibson * The GPIO character device, /dev/gpiochipN, provides userspace an 30*925ca369SKent Gibson * interface to gpiolib GPIOs via ioctl()s. 31*925ca369SKent Gibson */ 32*925ca369SKent Gibson 33*925ca369SKent Gibson /* 34*925ca369SKent Gibson * GPIO line handle management 35*925ca369SKent Gibson */ 36*925ca369SKent Gibson 37*925ca369SKent Gibson /** 38*925ca369SKent Gibson * struct linehandle_state - contains the state of a userspace handle 39*925ca369SKent Gibson * @gdev: the GPIO device the handle pertains to 40*925ca369SKent Gibson * @label: consumer label used to tag descriptors 41*925ca369SKent Gibson * @descs: the GPIO descriptors held by this handle 42*925ca369SKent Gibson * @numdescs: the number of descriptors held in the descs array 43*925ca369SKent Gibson */ 44*925ca369SKent Gibson struct linehandle_state { 45*925ca369SKent Gibson struct gpio_device *gdev; 46*925ca369SKent Gibson const char *label; 47*925ca369SKent Gibson struct gpio_desc *descs[GPIOHANDLES_MAX]; 48*925ca369SKent Gibson u32 numdescs; 49*925ca369SKent Gibson }; 50*925ca369SKent Gibson 51*925ca369SKent Gibson #define GPIOHANDLE_REQUEST_VALID_FLAGS \ 52*925ca369SKent Gibson (GPIOHANDLE_REQUEST_INPUT | \ 53*925ca369SKent Gibson GPIOHANDLE_REQUEST_OUTPUT | \ 54*925ca369SKent Gibson GPIOHANDLE_REQUEST_ACTIVE_LOW | \ 55*925ca369SKent Gibson GPIOHANDLE_REQUEST_BIAS_PULL_UP | \ 56*925ca369SKent Gibson GPIOHANDLE_REQUEST_BIAS_PULL_DOWN | \ 57*925ca369SKent Gibson GPIOHANDLE_REQUEST_BIAS_DISABLE | \ 58*925ca369SKent Gibson GPIOHANDLE_REQUEST_OPEN_DRAIN | \ 59*925ca369SKent Gibson GPIOHANDLE_REQUEST_OPEN_SOURCE) 60*925ca369SKent Gibson 61*925ca369SKent Gibson static int linehandle_validate_flags(u32 flags) 62*925ca369SKent Gibson { 63*925ca369SKent Gibson /* Return an error if an unknown flag is set */ 64*925ca369SKent Gibson if (flags & ~GPIOHANDLE_REQUEST_VALID_FLAGS) 65*925ca369SKent Gibson return -EINVAL; 66*925ca369SKent Gibson 67*925ca369SKent Gibson /* 68*925ca369SKent Gibson * Do not allow both INPUT & OUTPUT flags to be set as they are 69*925ca369SKent Gibson * contradictory. 70*925ca369SKent Gibson */ 71*925ca369SKent Gibson if ((flags & GPIOHANDLE_REQUEST_INPUT) && 72*925ca369SKent Gibson (flags & GPIOHANDLE_REQUEST_OUTPUT)) 73*925ca369SKent Gibson return -EINVAL; 74*925ca369SKent Gibson 75*925ca369SKent Gibson /* 76*925ca369SKent Gibson * Do not allow OPEN_SOURCE & OPEN_DRAIN flags in a single request. If 77*925ca369SKent Gibson * the hardware actually supports enabling both at the same time the 78*925ca369SKent Gibson * electrical result would be disastrous. 79*925ca369SKent Gibson */ 80*925ca369SKent Gibson if ((flags & GPIOHANDLE_REQUEST_OPEN_DRAIN) && 81*925ca369SKent Gibson (flags & GPIOHANDLE_REQUEST_OPEN_SOURCE)) 82*925ca369SKent Gibson return -EINVAL; 83*925ca369SKent Gibson 84*925ca369SKent Gibson /* OPEN_DRAIN and OPEN_SOURCE flags only make sense for output mode. */ 85*925ca369SKent Gibson if (!(flags & GPIOHANDLE_REQUEST_OUTPUT) && 86*925ca369SKent Gibson ((flags & GPIOHANDLE_REQUEST_OPEN_DRAIN) || 87*925ca369SKent Gibson (flags & GPIOHANDLE_REQUEST_OPEN_SOURCE))) 88*925ca369SKent Gibson return -EINVAL; 89*925ca369SKent Gibson 90*925ca369SKent Gibson /* Bias flags only allowed for input or output mode. */ 91*925ca369SKent Gibson if (!((flags & GPIOHANDLE_REQUEST_INPUT) || 92*925ca369SKent Gibson (flags & GPIOHANDLE_REQUEST_OUTPUT)) && 93*925ca369SKent Gibson ((flags & GPIOHANDLE_REQUEST_BIAS_DISABLE) || 94*925ca369SKent Gibson (flags & GPIOHANDLE_REQUEST_BIAS_PULL_UP) || 95*925ca369SKent Gibson (flags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN))) 96*925ca369SKent Gibson return -EINVAL; 97*925ca369SKent Gibson 98*925ca369SKent Gibson /* Only one bias flag can be set. */ 99*925ca369SKent Gibson if (((flags & GPIOHANDLE_REQUEST_BIAS_DISABLE) && 100*925ca369SKent Gibson (flags & (GPIOHANDLE_REQUEST_BIAS_PULL_DOWN | 101*925ca369SKent Gibson GPIOHANDLE_REQUEST_BIAS_PULL_UP))) || 102*925ca369SKent Gibson ((flags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) && 103*925ca369SKent Gibson (flags & GPIOHANDLE_REQUEST_BIAS_PULL_UP))) 104*925ca369SKent Gibson return -EINVAL; 105*925ca369SKent Gibson 106*925ca369SKent Gibson return 0; 107*925ca369SKent Gibson } 108*925ca369SKent Gibson 109*925ca369SKent Gibson static long linehandle_set_config(struct linehandle_state *lh, 110*925ca369SKent Gibson void __user *ip) 111*925ca369SKent Gibson { 112*925ca369SKent Gibson struct gpiohandle_config gcnf; 113*925ca369SKent Gibson struct gpio_desc *desc; 114*925ca369SKent Gibson int i, ret; 115*925ca369SKent Gibson u32 lflags; 116*925ca369SKent Gibson unsigned long *flagsp; 117*925ca369SKent Gibson 118*925ca369SKent Gibson if (copy_from_user(&gcnf, ip, sizeof(gcnf))) 119*925ca369SKent Gibson return -EFAULT; 120*925ca369SKent Gibson 121*925ca369SKent Gibson lflags = gcnf.flags; 122*925ca369SKent Gibson ret = linehandle_validate_flags(lflags); 123*925ca369SKent Gibson if (ret) 124*925ca369SKent Gibson return ret; 125*925ca369SKent Gibson 126*925ca369SKent Gibson for (i = 0; i < lh->numdescs; i++) { 127*925ca369SKent Gibson desc = lh->descs[i]; 128*925ca369SKent Gibson flagsp = &desc->flags; 129*925ca369SKent Gibson 130*925ca369SKent Gibson assign_bit(FLAG_ACTIVE_LOW, flagsp, 131*925ca369SKent Gibson lflags & GPIOHANDLE_REQUEST_ACTIVE_LOW); 132*925ca369SKent Gibson 133*925ca369SKent Gibson assign_bit(FLAG_OPEN_DRAIN, flagsp, 134*925ca369SKent Gibson lflags & GPIOHANDLE_REQUEST_OPEN_DRAIN); 135*925ca369SKent Gibson 136*925ca369SKent Gibson assign_bit(FLAG_OPEN_SOURCE, flagsp, 137*925ca369SKent Gibson lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE); 138*925ca369SKent Gibson 139*925ca369SKent Gibson assign_bit(FLAG_PULL_UP, flagsp, 140*925ca369SKent Gibson lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP); 141*925ca369SKent Gibson 142*925ca369SKent Gibson assign_bit(FLAG_PULL_DOWN, flagsp, 143*925ca369SKent Gibson lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN); 144*925ca369SKent Gibson 145*925ca369SKent Gibson assign_bit(FLAG_BIAS_DISABLE, flagsp, 146*925ca369SKent Gibson lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE); 147*925ca369SKent Gibson 148*925ca369SKent Gibson /* 149*925ca369SKent Gibson * Lines have to be requested explicitly for input 150*925ca369SKent Gibson * or output, else the line will be treated "as is". 151*925ca369SKent Gibson */ 152*925ca369SKent Gibson if (lflags & GPIOHANDLE_REQUEST_OUTPUT) { 153*925ca369SKent Gibson int val = !!gcnf.default_values[i]; 154*925ca369SKent Gibson 155*925ca369SKent Gibson ret = gpiod_direction_output(desc, val); 156*925ca369SKent Gibson if (ret) 157*925ca369SKent Gibson return ret; 158*925ca369SKent Gibson } else if (lflags & GPIOHANDLE_REQUEST_INPUT) { 159*925ca369SKent Gibson ret = gpiod_direction_input(desc); 160*925ca369SKent Gibson if (ret) 161*925ca369SKent Gibson return ret; 162*925ca369SKent Gibson } 163*925ca369SKent Gibson 164*925ca369SKent Gibson atomic_notifier_call_chain(&desc->gdev->notifier, 165*925ca369SKent Gibson GPIOLINE_CHANGED_CONFIG, desc); 166*925ca369SKent Gibson } 167*925ca369SKent Gibson return 0; 168*925ca369SKent Gibson } 169*925ca369SKent Gibson 170*925ca369SKent Gibson static long linehandle_ioctl(struct file *filep, unsigned int cmd, 171*925ca369SKent Gibson unsigned long arg) 172*925ca369SKent Gibson { 173*925ca369SKent Gibson struct linehandle_state *lh = filep->private_data; 174*925ca369SKent Gibson void __user *ip = (void __user *)arg; 175*925ca369SKent Gibson struct gpiohandle_data ghd; 176*925ca369SKent Gibson DECLARE_BITMAP(vals, GPIOHANDLES_MAX); 177*925ca369SKent Gibson int i; 178*925ca369SKent Gibson 179*925ca369SKent Gibson if (cmd == GPIOHANDLE_GET_LINE_VALUES_IOCTL) { 180*925ca369SKent Gibson /* NOTE: It's ok to read values of output lines. */ 181*925ca369SKent Gibson int ret = gpiod_get_array_value_complex(false, 182*925ca369SKent Gibson true, 183*925ca369SKent Gibson lh->numdescs, 184*925ca369SKent Gibson lh->descs, 185*925ca369SKent Gibson NULL, 186*925ca369SKent Gibson vals); 187*925ca369SKent Gibson if (ret) 188*925ca369SKent Gibson return ret; 189*925ca369SKent Gibson 190*925ca369SKent Gibson memset(&ghd, 0, sizeof(ghd)); 191*925ca369SKent Gibson for (i = 0; i < lh->numdescs; i++) 192*925ca369SKent Gibson ghd.values[i] = test_bit(i, vals); 193*925ca369SKent Gibson 194*925ca369SKent Gibson if (copy_to_user(ip, &ghd, sizeof(ghd))) 195*925ca369SKent Gibson return -EFAULT; 196*925ca369SKent Gibson 197*925ca369SKent Gibson return 0; 198*925ca369SKent Gibson } else if (cmd == GPIOHANDLE_SET_LINE_VALUES_IOCTL) { 199*925ca369SKent Gibson /* 200*925ca369SKent Gibson * All line descriptors were created at once with the same 201*925ca369SKent Gibson * flags so just check if the first one is really output. 202*925ca369SKent Gibson */ 203*925ca369SKent Gibson if (!test_bit(FLAG_IS_OUT, &lh->descs[0]->flags)) 204*925ca369SKent Gibson return -EPERM; 205*925ca369SKent Gibson 206*925ca369SKent Gibson if (copy_from_user(&ghd, ip, sizeof(ghd))) 207*925ca369SKent Gibson return -EFAULT; 208*925ca369SKent Gibson 209*925ca369SKent Gibson /* Clamp all values to [0,1] */ 210*925ca369SKent Gibson for (i = 0; i < lh->numdescs; i++) 211*925ca369SKent Gibson __assign_bit(i, vals, ghd.values[i]); 212*925ca369SKent Gibson 213*925ca369SKent Gibson /* Reuse the array setting function */ 214*925ca369SKent Gibson return gpiod_set_array_value_complex(false, 215*925ca369SKent Gibson true, 216*925ca369SKent Gibson lh->numdescs, 217*925ca369SKent Gibson lh->descs, 218*925ca369SKent Gibson NULL, 219*925ca369SKent Gibson vals); 220*925ca369SKent Gibson } else if (cmd == GPIOHANDLE_SET_CONFIG_IOCTL) { 221*925ca369SKent Gibson return linehandle_set_config(lh, ip); 222*925ca369SKent Gibson } 223*925ca369SKent Gibson return -EINVAL; 224*925ca369SKent Gibson } 225*925ca369SKent Gibson 226*925ca369SKent Gibson #ifdef CONFIG_COMPAT 227*925ca369SKent Gibson static long linehandle_ioctl_compat(struct file *filep, unsigned int cmd, 228*925ca369SKent Gibson unsigned long arg) 229*925ca369SKent Gibson { 230*925ca369SKent Gibson return linehandle_ioctl(filep, cmd, (unsigned long)compat_ptr(arg)); 231*925ca369SKent Gibson } 232*925ca369SKent Gibson #endif 233*925ca369SKent Gibson 234*925ca369SKent Gibson static int linehandle_release(struct inode *inode, struct file *filep) 235*925ca369SKent Gibson { 236*925ca369SKent Gibson struct linehandle_state *lh = filep->private_data; 237*925ca369SKent Gibson struct gpio_device *gdev = lh->gdev; 238*925ca369SKent Gibson int i; 239*925ca369SKent Gibson 240*925ca369SKent Gibson for (i = 0; i < lh->numdescs; i++) 241*925ca369SKent Gibson gpiod_free(lh->descs[i]); 242*925ca369SKent Gibson kfree(lh->label); 243*925ca369SKent Gibson kfree(lh); 244*925ca369SKent Gibson put_device(&gdev->dev); 245*925ca369SKent Gibson return 0; 246*925ca369SKent Gibson } 247*925ca369SKent Gibson 248*925ca369SKent Gibson static const struct file_operations linehandle_fileops = { 249*925ca369SKent Gibson .release = linehandle_release, 250*925ca369SKent Gibson .owner = THIS_MODULE, 251*925ca369SKent Gibson .llseek = noop_llseek, 252*925ca369SKent Gibson .unlocked_ioctl = linehandle_ioctl, 253*925ca369SKent Gibson #ifdef CONFIG_COMPAT 254*925ca369SKent Gibson .compat_ioctl = linehandle_ioctl_compat, 255*925ca369SKent Gibson #endif 256*925ca369SKent Gibson }; 257*925ca369SKent Gibson 258*925ca369SKent Gibson static int linehandle_create(struct gpio_device *gdev, void __user *ip) 259*925ca369SKent Gibson { 260*925ca369SKent Gibson struct gpiohandle_request handlereq; 261*925ca369SKent Gibson struct linehandle_state *lh; 262*925ca369SKent Gibson struct file *file; 263*925ca369SKent Gibson int fd, i, count = 0, ret; 264*925ca369SKent Gibson u32 lflags; 265*925ca369SKent Gibson 266*925ca369SKent Gibson if (copy_from_user(&handlereq, ip, sizeof(handlereq))) 267*925ca369SKent Gibson return -EFAULT; 268*925ca369SKent Gibson if ((handlereq.lines == 0) || (handlereq.lines > GPIOHANDLES_MAX)) 269*925ca369SKent Gibson return -EINVAL; 270*925ca369SKent Gibson 271*925ca369SKent Gibson lflags = handlereq.flags; 272*925ca369SKent Gibson 273*925ca369SKent Gibson ret = linehandle_validate_flags(lflags); 274*925ca369SKent Gibson if (ret) 275*925ca369SKent Gibson return ret; 276*925ca369SKent Gibson 277*925ca369SKent Gibson lh = kzalloc(sizeof(*lh), GFP_KERNEL); 278*925ca369SKent Gibson if (!lh) 279*925ca369SKent Gibson return -ENOMEM; 280*925ca369SKent Gibson lh->gdev = gdev; 281*925ca369SKent Gibson get_device(&gdev->dev); 282*925ca369SKent Gibson 283*925ca369SKent Gibson /* Make sure this is terminated */ 284*925ca369SKent Gibson handlereq.consumer_label[sizeof(handlereq.consumer_label)-1] = '\0'; 285*925ca369SKent Gibson if (strlen(handlereq.consumer_label)) { 286*925ca369SKent Gibson lh->label = kstrdup(handlereq.consumer_label, 287*925ca369SKent Gibson GFP_KERNEL); 288*925ca369SKent Gibson if (!lh->label) { 289*925ca369SKent Gibson ret = -ENOMEM; 290*925ca369SKent Gibson goto out_free_lh; 291*925ca369SKent Gibson } 292*925ca369SKent Gibson } 293*925ca369SKent Gibson 294*925ca369SKent Gibson /* Request each GPIO */ 295*925ca369SKent Gibson for (i = 0; i < handlereq.lines; i++) { 296*925ca369SKent Gibson u32 offset = handlereq.lineoffsets[i]; 297*925ca369SKent Gibson struct gpio_desc *desc = gpiochip_get_desc(gdev->chip, offset); 298*925ca369SKent Gibson 299*925ca369SKent Gibson if (IS_ERR(desc)) { 300*925ca369SKent Gibson ret = PTR_ERR(desc); 301*925ca369SKent Gibson goto out_free_descs; 302*925ca369SKent Gibson } 303*925ca369SKent Gibson 304*925ca369SKent Gibson ret = gpiod_request(desc, lh->label); 305*925ca369SKent Gibson if (ret) 306*925ca369SKent Gibson goto out_free_descs; 307*925ca369SKent Gibson lh->descs[i] = desc; 308*925ca369SKent Gibson count = i + 1; 309*925ca369SKent Gibson 310*925ca369SKent Gibson if (lflags & GPIOHANDLE_REQUEST_ACTIVE_LOW) 311*925ca369SKent Gibson set_bit(FLAG_ACTIVE_LOW, &desc->flags); 312*925ca369SKent Gibson if (lflags & GPIOHANDLE_REQUEST_OPEN_DRAIN) 313*925ca369SKent Gibson set_bit(FLAG_OPEN_DRAIN, &desc->flags); 314*925ca369SKent Gibson if (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE) 315*925ca369SKent Gibson set_bit(FLAG_OPEN_SOURCE, &desc->flags); 316*925ca369SKent Gibson if (lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE) 317*925ca369SKent Gibson set_bit(FLAG_BIAS_DISABLE, &desc->flags); 318*925ca369SKent Gibson if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) 319*925ca369SKent Gibson set_bit(FLAG_PULL_DOWN, &desc->flags); 320*925ca369SKent Gibson if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP) 321*925ca369SKent Gibson set_bit(FLAG_PULL_UP, &desc->flags); 322*925ca369SKent Gibson 323*925ca369SKent Gibson ret = gpiod_set_transitory(desc, false); 324*925ca369SKent Gibson if (ret < 0) 325*925ca369SKent Gibson goto out_free_descs; 326*925ca369SKent Gibson 327*925ca369SKent Gibson /* 328*925ca369SKent Gibson * Lines have to be requested explicitly for input 329*925ca369SKent Gibson * or output, else the line will be treated "as is". 330*925ca369SKent Gibson */ 331*925ca369SKent Gibson if (lflags & GPIOHANDLE_REQUEST_OUTPUT) { 332*925ca369SKent Gibson int val = !!handlereq.default_values[i]; 333*925ca369SKent Gibson 334*925ca369SKent Gibson ret = gpiod_direction_output(desc, val); 335*925ca369SKent Gibson if (ret) 336*925ca369SKent Gibson goto out_free_descs; 337*925ca369SKent Gibson } else if (lflags & GPIOHANDLE_REQUEST_INPUT) { 338*925ca369SKent Gibson ret = gpiod_direction_input(desc); 339*925ca369SKent Gibson if (ret) 340*925ca369SKent Gibson goto out_free_descs; 341*925ca369SKent Gibson } 342*925ca369SKent Gibson 343*925ca369SKent Gibson atomic_notifier_call_chain(&desc->gdev->notifier, 344*925ca369SKent Gibson GPIOLINE_CHANGED_REQUESTED, desc); 345*925ca369SKent Gibson 346*925ca369SKent Gibson dev_dbg(&gdev->dev, "registered chardev handle for line %d\n", 347*925ca369SKent Gibson offset); 348*925ca369SKent Gibson } 349*925ca369SKent Gibson /* Let i point at the last handle */ 350*925ca369SKent Gibson i--; 351*925ca369SKent Gibson lh->numdescs = handlereq.lines; 352*925ca369SKent Gibson 353*925ca369SKent Gibson fd = get_unused_fd_flags(O_RDONLY | O_CLOEXEC); 354*925ca369SKent Gibson if (fd < 0) { 355*925ca369SKent Gibson ret = fd; 356*925ca369SKent Gibson goto out_free_descs; 357*925ca369SKent Gibson } 358*925ca369SKent Gibson 359*925ca369SKent Gibson file = anon_inode_getfile("gpio-linehandle", 360*925ca369SKent Gibson &linehandle_fileops, 361*925ca369SKent Gibson lh, 362*925ca369SKent Gibson O_RDONLY | O_CLOEXEC); 363*925ca369SKent Gibson if (IS_ERR(file)) { 364*925ca369SKent Gibson ret = PTR_ERR(file); 365*925ca369SKent Gibson goto out_put_unused_fd; 366*925ca369SKent Gibson } 367*925ca369SKent Gibson 368*925ca369SKent Gibson handlereq.fd = fd; 369*925ca369SKent Gibson if (copy_to_user(ip, &handlereq, sizeof(handlereq))) { 370*925ca369SKent Gibson /* 371*925ca369SKent Gibson * fput() will trigger the release() callback, so do not go onto 372*925ca369SKent Gibson * the regular error cleanup path here. 373*925ca369SKent Gibson */ 374*925ca369SKent Gibson fput(file); 375*925ca369SKent Gibson put_unused_fd(fd); 376*925ca369SKent Gibson return -EFAULT; 377*925ca369SKent Gibson } 378*925ca369SKent Gibson 379*925ca369SKent Gibson fd_install(fd, file); 380*925ca369SKent Gibson 381*925ca369SKent Gibson dev_dbg(&gdev->dev, "registered chardev handle for %d lines\n", 382*925ca369SKent Gibson lh->numdescs); 383*925ca369SKent Gibson 384*925ca369SKent Gibson return 0; 385*925ca369SKent Gibson 386*925ca369SKent Gibson out_put_unused_fd: 387*925ca369SKent Gibson put_unused_fd(fd); 388*925ca369SKent Gibson out_free_descs: 389*925ca369SKent Gibson for (i = 0; i < count; i++) 390*925ca369SKent Gibson gpiod_free(lh->descs[i]); 391*925ca369SKent Gibson kfree(lh->label); 392*925ca369SKent Gibson out_free_lh: 393*925ca369SKent Gibson kfree(lh); 394*925ca369SKent Gibson put_device(&gdev->dev); 395*925ca369SKent Gibson return ret; 396*925ca369SKent Gibson } 397*925ca369SKent Gibson 398*925ca369SKent Gibson /* 399*925ca369SKent Gibson * GPIO line event management 400*925ca369SKent Gibson */ 401*925ca369SKent Gibson 402*925ca369SKent Gibson /** 403*925ca369SKent Gibson * struct lineevent_state - contains the state of a userspace event 404*925ca369SKent Gibson * @gdev: the GPIO device the event pertains to 405*925ca369SKent Gibson * @label: consumer label used to tag descriptors 406*925ca369SKent Gibson * @desc: the GPIO descriptor held by this event 407*925ca369SKent Gibson * @eflags: the event flags this line was requested with 408*925ca369SKent Gibson * @irq: the interrupt that trigger in response to events on this GPIO 409*925ca369SKent Gibson * @wait: wait queue that handles blocking reads of events 410*925ca369SKent Gibson * @events: KFIFO for the GPIO events 411*925ca369SKent Gibson * @timestamp: cache for the timestamp storing it between hardirq 412*925ca369SKent Gibson * and IRQ thread, used to bring the timestamp close to the actual 413*925ca369SKent Gibson * event 414*925ca369SKent Gibson */ 415*925ca369SKent Gibson struct lineevent_state { 416*925ca369SKent Gibson struct gpio_device *gdev; 417*925ca369SKent Gibson const char *label; 418*925ca369SKent Gibson struct gpio_desc *desc; 419*925ca369SKent Gibson u32 eflags; 420*925ca369SKent Gibson int irq; 421*925ca369SKent Gibson wait_queue_head_t wait; 422*925ca369SKent Gibson DECLARE_KFIFO(events, struct gpioevent_data, 16); 423*925ca369SKent Gibson u64 timestamp; 424*925ca369SKent Gibson }; 425*925ca369SKent Gibson 426*925ca369SKent Gibson #define GPIOEVENT_REQUEST_VALID_FLAGS \ 427*925ca369SKent Gibson (GPIOEVENT_REQUEST_RISING_EDGE | \ 428*925ca369SKent Gibson GPIOEVENT_REQUEST_FALLING_EDGE) 429*925ca369SKent Gibson 430*925ca369SKent Gibson static __poll_t lineevent_poll(struct file *filep, 431*925ca369SKent Gibson struct poll_table_struct *wait) 432*925ca369SKent Gibson { 433*925ca369SKent Gibson struct lineevent_state *le = filep->private_data; 434*925ca369SKent Gibson __poll_t events = 0; 435*925ca369SKent Gibson 436*925ca369SKent Gibson poll_wait(filep, &le->wait, wait); 437*925ca369SKent Gibson 438*925ca369SKent Gibson if (!kfifo_is_empty_spinlocked_noirqsave(&le->events, &le->wait.lock)) 439*925ca369SKent Gibson events = EPOLLIN | EPOLLRDNORM; 440*925ca369SKent Gibson 441*925ca369SKent Gibson return events; 442*925ca369SKent Gibson } 443*925ca369SKent Gibson 444*925ca369SKent Gibson 445*925ca369SKent Gibson static ssize_t lineevent_read(struct file *filep, 446*925ca369SKent Gibson char __user *buf, 447*925ca369SKent Gibson size_t count, 448*925ca369SKent Gibson loff_t *f_ps) 449*925ca369SKent Gibson { 450*925ca369SKent Gibson struct lineevent_state *le = filep->private_data; 451*925ca369SKent Gibson struct gpioevent_data ge; 452*925ca369SKent Gibson ssize_t bytes_read = 0; 453*925ca369SKent Gibson int ret; 454*925ca369SKent Gibson 455*925ca369SKent Gibson if (count < sizeof(ge)) 456*925ca369SKent Gibson return -EINVAL; 457*925ca369SKent Gibson 458*925ca369SKent Gibson do { 459*925ca369SKent Gibson spin_lock(&le->wait.lock); 460*925ca369SKent Gibson if (kfifo_is_empty(&le->events)) { 461*925ca369SKent Gibson if (bytes_read) { 462*925ca369SKent Gibson spin_unlock(&le->wait.lock); 463*925ca369SKent Gibson return bytes_read; 464*925ca369SKent Gibson } 465*925ca369SKent Gibson 466*925ca369SKent Gibson if (filep->f_flags & O_NONBLOCK) { 467*925ca369SKent Gibson spin_unlock(&le->wait.lock); 468*925ca369SKent Gibson return -EAGAIN; 469*925ca369SKent Gibson } 470*925ca369SKent Gibson 471*925ca369SKent Gibson ret = wait_event_interruptible_locked(le->wait, 472*925ca369SKent Gibson !kfifo_is_empty(&le->events)); 473*925ca369SKent Gibson if (ret) { 474*925ca369SKent Gibson spin_unlock(&le->wait.lock); 475*925ca369SKent Gibson return ret; 476*925ca369SKent Gibson } 477*925ca369SKent Gibson } 478*925ca369SKent Gibson 479*925ca369SKent Gibson ret = kfifo_out(&le->events, &ge, 1); 480*925ca369SKent Gibson spin_unlock(&le->wait.lock); 481*925ca369SKent Gibson if (ret != 1) { 482*925ca369SKent Gibson /* 483*925ca369SKent Gibson * This should never happen - we were holding the lock 484*925ca369SKent Gibson * from the moment we learned the fifo is no longer 485*925ca369SKent Gibson * empty until now. 486*925ca369SKent Gibson */ 487*925ca369SKent Gibson ret = -EIO; 488*925ca369SKent Gibson break; 489*925ca369SKent Gibson } 490*925ca369SKent Gibson 491*925ca369SKent Gibson if (copy_to_user(buf + bytes_read, &ge, sizeof(ge))) 492*925ca369SKent Gibson return -EFAULT; 493*925ca369SKent Gibson bytes_read += sizeof(ge); 494*925ca369SKent Gibson } while (count >= bytes_read + sizeof(ge)); 495*925ca369SKent Gibson 496*925ca369SKent Gibson return bytes_read; 497*925ca369SKent Gibson } 498*925ca369SKent Gibson 499*925ca369SKent Gibson static int lineevent_release(struct inode *inode, struct file *filep) 500*925ca369SKent Gibson { 501*925ca369SKent Gibson struct lineevent_state *le = filep->private_data; 502*925ca369SKent Gibson struct gpio_device *gdev = le->gdev; 503*925ca369SKent Gibson 504*925ca369SKent Gibson free_irq(le->irq, le); 505*925ca369SKent Gibson gpiod_free(le->desc); 506*925ca369SKent Gibson kfree(le->label); 507*925ca369SKent Gibson kfree(le); 508*925ca369SKent Gibson put_device(&gdev->dev); 509*925ca369SKent Gibson return 0; 510*925ca369SKent Gibson } 511*925ca369SKent Gibson 512*925ca369SKent Gibson static long lineevent_ioctl(struct file *filep, unsigned int cmd, 513*925ca369SKent Gibson unsigned long arg) 514*925ca369SKent Gibson { 515*925ca369SKent Gibson struct lineevent_state *le = filep->private_data; 516*925ca369SKent Gibson void __user *ip = (void __user *)arg; 517*925ca369SKent Gibson struct gpiohandle_data ghd; 518*925ca369SKent Gibson 519*925ca369SKent Gibson /* 520*925ca369SKent Gibson * We can get the value for an event line but not set it, 521*925ca369SKent Gibson * because it is input by definition. 522*925ca369SKent Gibson */ 523*925ca369SKent Gibson if (cmd == GPIOHANDLE_GET_LINE_VALUES_IOCTL) { 524*925ca369SKent Gibson int val; 525*925ca369SKent Gibson 526*925ca369SKent Gibson memset(&ghd, 0, sizeof(ghd)); 527*925ca369SKent Gibson 528*925ca369SKent Gibson val = gpiod_get_value_cansleep(le->desc); 529*925ca369SKent Gibson if (val < 0) 530*925ca369SKent Gibson return val; 531*925ca369SKent Gibson ghd.values[0] = val; 532*925ca369SKent Gibson 533*925ca369SKent Gibson if (copy_to_user(ip, &ghd, sizeof(ghd))) 534*925ca369SKent Gibson return -EFAULT; 535*925ca369SKent Gibson 536*925ca369SKent Gibson return 0; 537*925ca369SKent Gibson } 538*925ca369SKent Gibson return -EINVAL; 539*925ca369SKent Gibson } 540*925ca369SKent Gibson 541*925ca369SKent Gibson #ifdef CONFIG_COMPAT 542*925ca369SKent Gibson static long lineevent_ioctl_compat(struct file *filep, unsigned int cmd, 543*925ca369SKent Gibson unsigned long arg) 544*925ca369SKent Gibson { 545*925ca369SKent Gibson return lineevent_ioctl(filep, cmd, (unsigned long)compat_ptr(arg)); 546*925ca369SKent Gibson } 547*925ca369SKent Gibson #endif 548*925ca369SKent Gibson 549*925ca369SKent Gibson static const struct file_operations lineevent_fileops = { 550*925ca369SKent Gibson .release = lineevent_release, 551*925ca369SKent Gibson .read = lineevent_read, 552*925ca369SKent Gibson .poll = lineevent_poll, 553*925ca369SKent Gibson .owner = THIS_MODULE, 554*925ca369SKent Gibson .llseek = noop_llseek, 555*925ca369SKent Gibson .unlocked_ioctl = lineevent_ioctl, 556*925ca369SKent Gibson #ifdef CONFIG_COMPAT 557*925ca369SKent Gibson .compat_ioctl = lineevent_ioctl_compat, 558*925ca369SKent Gibson #endif 559*925ca369SKent Gibson }; 560*925ca369SKent Gibson 561*925ca369SKent Gibson static irqreturn_t lineevent_irq_thread(int irq, void *p) 562*925ca369SKent Gibson { 563*925ca369SKent Gibson struct lineevent_state *le = p; 564*925ca369SKent Gibson struct gpioevent_data ge; 565*925ca369SKent Gibson int ret; 566*925ca369SKent Gibson 567*925ca369SKent Gibson /* Do not leak kernel stack to userspace */ 568*925ca369SKent Gibson memset(&ge, 0, sizeof(ge)); 569*925ca369SKent Gibson 570*925ca369SKent Gibson /* 571*925ca369SKent Gibson * We may be running from a nested threaded interrupt in which case 572*925ca369SKent Gibson * we didn't get the timestamp from lineevent_irq_handler(). 573*925ca369SKent Gibson */ 574*925ca369SKent Gibson if (!le->timestamp) 575*925ca369SKent Gibson ge.timestamp = ktime_get_ns(); 576*925ca369SKent Gibson else 577*925ca369SKent Gibson ge.timestamp = le->timestamp; 578*925ca369SKent Gibson 579*925ca369SKent Gibson if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE 580*925ca369SKent Gibson && le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE) { 581*925ca369SKent Gibson int level = gpiod_get_value_cansleep(le->desc); 582*925ca369SKent Gibson 583*925ca369SKent Gibson if (level) 584*925ca369SKent Gibson /* Emit low-to-high event */ 585*925ca369SKent Gibson ge.id = GPIOEVENT_EVENT_RISING_EDGE; 586*925ca369SKent Gibson else 587*925ca369SKent Gibson /* Emit high-to-low event */ 588*925ca369SKent Gibson ge.id = GPIOEVENT_EVENT_FALLING_EDGE; 589*925ca369SKent Gibson } else if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE) { 590*925ca369SKent Gibson /* Emit low-to-high event */ 591*925ca369SKent Gibson ge.id = GPIOEVENT_EVENT_RISING_EDGE; 592*925ca369SKent Gibson } else if (le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE) { 593*925ca369SKent Gibson /* Emit high-to-low event */ 594*925ca369SKent Gibson ge.id = GPIOEVENT_EVENT_FALLING_EDGE; 595*925ca369SKent Gibson } else { 596*925ca369SKent Gibson return IRQ_NONE; 597*925ca369SKent Gibson } 598*925ca369SKent Gibson 599*925ca369SKent Gibson ret = kfifo_in_spinlocked_noirqsave(&le->events, &ge, 600*925ca369SKent Gibson 1, &le->wait.lock); 601*925ca369SKent Gibson if (ret) 602*925ca369SKent Gibson wake_up_poll(&le->wait, EPOLLIN); 603*925ca369SKent Gibson else 604*925ca369SKent Gibson pr_debug_ratelimited("event FIFO is full - event dropped\n"); 605*925ca369SKent Gibson 606*925ca369SKent Gibson return IRQ_HANDLED; 607*925ca369SKent Gibson } 608*925ca369SKent Gibson 609*925ca369SKent Gibson static irqreturn_t lineevent_irq_handler(int irq, void *p) 610*925ca369SKent Gibson { 611*925ca369SKent Gibson struct lineevent_state *le = p; 612*925ca369SKent Gibson 613*925ca369SKent Gibson /* 614*925ca369SKent Gibson * Just store the timestamp in hardirq context so we get it as 615*925ca369SKent Gibson * close in time as possible to the actual event. 616*925ca369SKent Gibson */ 617*925ca369SKent Gibson le->timestamp = ktime_get_ns(); 618*925ca369SKent Gibson 619*925ca369SKent Gibson return IRQ_WAKE_THREAD; 620*925ca369SKent Gibson } 621*925ca369SKent Gibson 622*925ca369SKent Gibson static int lineevent_create(struct gpio_device *gdev, void __user *ip) 623*925ca369SKent Gibson { 624*925ca369SKent Gibson struct gpioevent_request eventreq; 625*925ca369SKent Gibson struct lineevent_state *le; 626*925ca369SKent Gibson struct gpio_desc *desc; 627*925ca369SKent Gibson struct file *file; 628*925ca369SKent Gibson u32 offset; 629*925ca369SKent Gibson u32 lflags; 630*925ca369SKent Gibson u32 eflags; 631*925ca369SKent Gibson int fd; 632*925ca369SKent Gibson int ret; 633*925ca369SKent Gibson int irqflags = 0; 634*925ca369SKent Gibson 635*925ca369SKent Gibson if (copy_from_user(&eventreq, ip, sizeof(eventreq))) 636*925ca369SKent Gibson return -EFAULT; 637*925ca369SKent Gibson 638*925ca369SKent Gibson offset = eventreq.lineoffset; 639*925ca369SKent Gibson lflags = eventreq.handleflags; 640*925ca369SKent Gibson eflags = eventreq.eventflags; 641*925ca369SKent Gibson 642*925ca369SKent Gibson desc = gpiochip_get_desc(gdev->chip, offset); 643*925ca369SKent Gibson if (IS_ERR(desc)) 644*925ca369SKent Gibson return PTR_ERR(desc); 645*925ca369SKent Gibson 646*925ca369SKent Gibson /* Return an error if a unknown flag is set */ 647*925ca369SKent Gibson if ((lflags & ~GPIOHANDLE_REQUEST_VALID_FLAGS) || 648*925ca369SKent Gibson (eflags & ~GPIOEVENT_REQUEST_VALID_FLAGS)) 649*925ca369SKent Gibson return -EINVAL; 650*925ca369SKent Gibson 651*925ca369SKent Gibson /* This is just wrong: we don't look for events on output lines */ 652*925ca369SKent Gibson if ((lflags & GPIOHANDLE_REQUEST_OUTPUT) || 653*925ca369SKent Gibson (lflags & GPIOHANDLE_REQUEST_OPEN_DRAIN) || 654*925ca369SKent Gibson (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE)) 655*925ca369SKent Gibson return -EINVAL; 656*925ca369SKent Gibson 657*925ca369SKent Gibson /* Only one bias flag can be set. */ 658*925ca369SKent Gibson if (((lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE) && 659*925ca369SKent Gibson (lflags & (GPIOHANDLE_REQUEST_BIAS_PULL_DOWN | 660*925ca369SKent Gibson GPIOHANDLE_REQUEST_BIAS_PULL_UP))) || 661*925ca369SKent Gibson ((lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) && 662*925ca369SKent Gibson (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP))) 663*925ca369SKent Gibson return -EINVAL; 664*925ca369SKent Gibson 665*925ca369SKent Gibson le = kzalloc(sizeof(*le), GFP_KERNEL); 666*925ca369SKent Gibson if (!le) 667*925ca369SKent Gibson return -ENOMEM; 668*925ca369SKent Gibson le->gdev = gdev; 669*925ca369SKent Gibson get_device(&gdev->dev); 670*925ca369SKent Gibson 671*925ca369SKent Gibson /* Make sure this is terminated */ 672*925ca369SKent Gibson eventreq.consumer_label[sizeof(eventreq.consumer_label)-1] = '\0'; 673*925ca369SKent Gibson if (strlen(eventreq.consumer_label)) { 674*925ca369SKent Gibson le->label = kstrdup(eventreq.consumer_label, 675*925ca369SKent Gibson GFP_KERNEL); 676*925ca369SKent Gibson if (!le->label) { 677*925ca369SKent Gibson ret = -ENOMEM; 678*925ca369SKent Gibson goto out_free_le; 679*925ca369SKent Gibson } 680*925ca369SKent Gibson } 681*925ca369SKent Gibson 682*925ca369SKent Gibson ret = gpiod_request(desc, le->label); 683*925ca369SKent Gibson if (ret) 684*925ca369SKent Gibson goto out_free_label; 685*925ca369SKent Gibson le->desc = desc; 686*925ca369SKent Gibson le->eflags = eflags; 687*925ca369SKent Gibson 688*925ca369SKent Gibson if (lflags & GPIOHANDLE_REQUEST_ACTIVE_LOW) 689*925ca369SKent Gibson set_bit(FLAG_ACTIVE_LOW, &desc->flags); 690*925ca369SKent Gibson if (lflags & GPIOHANDLE_REQUEST_BIAS_DISABLE) 691*925ca369SKent Gibson set_bit(FLAG_BIAS_DISABLE, &desc->flags); 692*925ca369SKent Gibson if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_DOWN) 693*925ca369SKent Gibson set_bit(FLAG_PULL_DOWN, &desc->flags); 694*925ca369SKent Gibson if (lflags & GPIOHANDLE_REQUEST_BIAS_PULL_UP) 695*925ca369SKent Gibson set_bit(FLAG_PULL_UP, &desc->flags); 696*925ca369SKent Gibson 697*925ca369SKent Gibson ret = gpiod_direction_input(desc); 698*925ca369SKent Gibson if (ret) 699*925ca369SKent Gibson goto out_free_desc; 700*925ca369SKent Gibson 701*925ca369SKent Gibson atomic_notifier_call_chain(&desc->gdev->notifier, 702*925ca369SKent Gibson GPIOLINE_CHANGED_REQUESTED, desc); 703*925ca369SKent Gibson 704*925ca369SKent Gibson le->irq = gpiod_to_irq(desc); 705*925ca369SKent Gibson if (le->irq <= 0) { 706*925ca369SKent Gibson ret = -ENODEV; 707*925ca369SKent Gibson goto out_free_desc; 708*925ca369SKent Gibson } 709*925ca369SKent Gibson 710*925ca369SKent Gibson if (eflags & GPIOEVENT_REQUEST_RISING_EDGE) 711*925ca369SKent Gibson irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ? 712*925ca369SKent Gibson IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING; 713*925ca369SKent Gibson if (eflags & GPIOEVENT_REQUEST_FALLING_EDGE) 714*925ca369SKent Gibson irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ? 715*925ca369SKent Gibson IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING; 716*925ca369SKent Gibson irqflags |= IRQF_ONESHOT; 717*925ca369SKent Gibson 718*925ca369SKent Gibson INIT_KFIFO(le->events); 719*925ca369SKent Gibson init_waitqueue_head(&le->wait); 720*925ca369SKent Gibson 721*925ca369SKent Gibson /* Request a thread to read the events */ 722*925ca369SKent Gibson ret = request_threaded_irq(le->irq, 723*925ca369SKent Gibson lineevent_irq_handler, 724*925ca369SKent Gibson lineevent_irq_thread, 725*925ca369SKent Gibson irqflags, 726*925ca369SKent Gibson le->label, 727*925ca369SKent Gibson le); 728*925ca369SKent Gibson if (ret) 729*925ca369SKent Gibson goto out_free_desc; 730*925ca369SKent Gibson 731*925ca369SKent Gibson fd = get_unused_fd_flags(O_RDONLY | O_CLOEXEC); 732*925ca369SKent Gibson if (fd < 0) { 733*925ca369SKent Gibson ret = fd; 734*925ca369SKent Gibson goto out_free_irq; 735*925ca369SKent Gibson } 736*925ca369SKent Gibson 737*925ca369SKent Gibson file = anon_inode_getfile("gpio-event", 738*925ca369SKent Gibson &lineevent_fileops, 739*925ca369SKent Gibson le, 740*925ca369SKent Gibson O_RDONLY | O_CLOEXEC); 741*925ca369SKent Gibson if (IS_ERR(file)) { 742*925ca369SKent Gibson ret = PTR_ERR(file); 743*925ca369SKent Gibson goto out_put_unused_fd; 744*925ca369SKent Gibson } 745*925ca369SKent Gibson 746*925ca369SKent Gibson eventreq.fd = fd; 747*925ca369SKent Gibson if (copy_to_user(ip, &eventreq, sizeof(eventreq))) { 748*925ca369SKent Gibson /* 749*925ca369SKent Gibson * fput() will trigger the release() callback, so do not go onto 750*925ca369SKent Gibson * the regular error cleanup path here. 751*925ca369SKent Gibson */ 752*925ca369SKent Gibson fput(file); 753*925ca369SKent Gibson put_unused_fd(fd); 754*925ca369SKent Gibson return -EFAULT; 755*925ca369SKent Gibson } 756*925ca369SKent Gibson 757*925ca369SKent Gibson fd_install(fd, file); 758*925ca369SKent Gibson 759*925ca369SKent Gibson return 0; 760*925ca369SKent Gibson 761*925ca369SKent Gibson out_put_unused_fd: 762*925ca369SKent Gibson put_unused_fd(fd); 763*925ca369SKent Gibson out_free_irq: 764*925ca369SKent Gibson free_irq(le->irq, le); 765*925ca369SKent Gibson out_free_desc: 766*925ca369SKent Gibson gpiod_free(le->desc); 767*925ca369SKent Gibson out_free_label: 768*925ca369SKent Gibson kfree(le->label); 769*925ca369SKent Gibson out_free_le: 770*925ca369SKent Gibson kfree(le); 771*925ca369SKent Gibson put_device(&gdev->dev); 772*925ca369SKent Gibson return ret; 773*925ca369SKent Gibson } 774*925ca369SKent Gibson 775*925ca369SKent Gibson static void gpio_desc_to_lineinfo(struct gpio_desc *desc, 776*925ca369SKent Gibson struct gpioline_info *info) 777*925ca369SKent Gibson { 778*925ca369SKent Gibson struct gpio_chip *gc = desc->gdev->chip; 779*925ca369SKent Gibson bool ok_for_pinctrl; 780*925ca369SKent Gibson unsigned long flags; 781*925ca369SKent Gibson 782*925ca369SKent Gibson /* 783*925ca369SKent Gibson * This function takes a mutex so we must check this before taking 784*925ca369SKent Gibson * the spinlock. 785*925ca369SKent Gibson * 786*925ca369SKent Gibson * FIXME: find a non-racy way to retrieve this information. Maybe a 787*925ca369SKent Gibson * lock common to both frameworks? 788*925ca369SKent Gibson */ 789*925ca369SKent Gibson ok_for_pinctrl = 790*925ca369SKent Gibson pinctrl_gpio_can_use_line(gc->base + info->line_offset); 791*925ca369SKent Gibson 792*925ca369SKent Gibson spin_lock_irqsave(&gpio_lock, flags); 793*925ca369SKent Gibson 794*925ca369SKent Gibson if (desc->name) { 795*925ca369SKent Gibson strncpy(info->name, desc->name, sizeof(info->name)); 796*925ca369SKent Gibson info->name[sizeof(info->name) - 1] = '\0'; 797*925ca369SKent Gibson } else { 798*925ca369SKent Gibson info->name[0] = '\0'; 799*925ca369SKent Gibson } 800*925ca369SKent Gibson 801*925ca369SKent Gibson if (desc->label) { 802*925ca369SKent Gibson strncpy(info->consumer, desc->label, sizeof(info->consumer)); 803*925ca369SKent Gibson info->consumer[sizeof(info->consumer) - 1] = '\0'; 804*925ca369SKent Gibson } else { 805*925ca369SKent Gibson info->consumer[0] = '\0'; 806*925ca369SKent Gibson } 807*925ca369SKent Gibson 808*925ca369SKent Gibson /* 809*925ca369SKent Gibson * Userspace only need to know that the kernel is using this GPIO so 810*925ca369SKent Gibson * it can't use it. 811*925ca369SKent Gibson */ 812*925ca369SKent Gibson info->flags = 0; 813*925ca369SKent Gibson if (test_bit(FLAG_REQUESTED, &desc->flags) || 814*925ca369SKent Gibson test_bit(FLAG_IS_HOGGED, &desc->flags) || 815*925ca369SKent Gibson test_bit(FLAG_USED_AS_IRQ, &desc->flags) || 816*925ca369SKent Gibson test_bit(FLAG_EXPORT, &desc->flags) || 817*925ca369SKent Gibson test_bit(FLAG_SYSFS, &desc->flags) || 818*925ca369SKent Gibson !ok_for_pinctrl) 819*925ca369SKent Gibson info->flags |= GPIOLINE_FLAG_KERNEL; 820*925ca369SKent Gibson if (test_bit(FLAG_IS_OUT, &desc->flags)) 821*925ca369SKent Gibson info->flags |= GPIOLINE_FLAG_IS_OUT; 822*925ca369SKent Gibson if (test_bit(FLAG_ACTIVE_LOW, &desc->flags)) 823*925ca369SKent Gibson info->flags |= GPIOLINE_FLAG_ACTIVE_LOW; 824*925ca369SKent Gibson if (test_bit(FLAG_OPEN_DRAIN, &desc->flags)) 825*925ca369SKent Gibson info->flags |= (GPIOLINE_FLAG_OPEN_DRAIN | 826*925ca369SKent Gibson GPIOLINE_FLAG_IS_OUT); 827*925ca369SKent Gibson if (test_bit(FLAG_OPEN_SOURCE, &desc->flags)) 828*925ca369SKent Gibson info->flags |= (GPIOLINE_FLAG_OPEN_SOURCE | 829*925ca369SKent Gibson GPIOLINE_FLAG_IS_OUT); 830*925ca369SKent Gibson if (test_bit(FLAG_BIAS_DISABLE, &desc->flags)) 831*925ca369SKent Gibson info->flags |= GPIOLINE_FLAG_BIAS_DISABLE; 832*925ca369SKent Gibson if (test_bit(FLAG_PULL_DOWN, &desc->flags)) 833*925ca369SKent Gibson info->flags |= GPIOLINE_FLAG_BIAS_PULL_DOWN; 834*925ca369SKent Gibson if (test_bit(FLAG_PULL_UP, &desc->flags)) 835*925ca369SKent Gibson info->flags |= GPIOLINE_FLAG_BIAS_PULL_UP; 836*925ca369SKent Gibson 837*925ca369SKent Gibson spin_unlock_irqrestore(&gpio_lock, flags); 838*925ca369SKent Gibson } 839*925ca369SKent Gibson 840*925ca369SKent Gibson struct gpio_chardev_data { 841*925ca369SKent Gibson struct gpio_device *gdev; 842*925ca369SKent Gibson wait_queue_head_t wait; 843*925ca369SKent Gibson DECLARE_KFIFO(events, struct gpioline_info_changed, 32); 844*925ca369SKent Gibson struct notifier_block lineinfo_changed_nb; 845*925ca369SKent Gibson unsigned long *watched_lines; 846*925ca369SKent Gibson }; 847*925ca369SKent Gibson 848*925ca369SKent Gibson /* 849*925ca369SKent Gibson * gpio_ioctl() - ioctl handler for the GPIO chardev 850*925ca369SKent Gibson */ 851*925ca369SKent Gibson static long gpio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 852*925ca369SKent Gibson { 853*925ca369SKent Gibson struct gpio_chardev_data *priv = filp->private_data; 854*925ca369SKent Gibson struct gpio_device *gdev = priv->gdev; 855*925ca369SKent Gibson struct gpio_chip *gc = gdev->chip; 856*925ca369SKent Gibson void __user *ip = (void __user *)arg; 857*925ca369SKent Gibson struct gpio_desc *desc; 858*925ca369SKent Gibson __u32 offset; 859*925ca369SKent Gibson int hwgpio; 860*925ca369SKent Gibson 861*925ca369SKent Gibson /* We fail any subsequent ioctl():s when the chip is gone */ 862*925ca369SKent Gibson if (!gc) 863*925ca369SKent Gibson return -ENODEV; 864*925ca369SKent Gibson 865*925ca369SKent Gibson /* Fill in the struct and pass to userspace */ 866*925ca369SKent Gibson if (cmd == GPIO_GET_CHIPINFO_IOCTL) { 867*925ca369SKent Gibson struct gpiochip_info chipinfo; 868*925ca369SKent Gibson 869*925ca369SKent Gibson memset(&chipinfo, 0, sizeof(chipinfo)); 870*925ca369SKent Gibson 871*925ca369SKent Gibson strncpy(chipinfo.name, dev_name(&gdev->dev), 872*925ca369SKent Gibson sizeof(chipinfo.name)); 873*925ca369SKent Gibson chipinfo.name[sizeof(chipinfo.name)-1] = '\0'; 874*925ca369SKent Gibson strncpy(chipinfo.label, gdev->label, 875*925ca369SKent Gibson sizeof(chipinfo.label)); 876*925ca369SKent Gibson chipinfo.label[sizeof(chipinfo.label)-1] = '\0'; 877*925ca369SKent Gibson chipinfo.lines = gdev->ngpio; 878*925ca369SKent Gibson if (copy_to_user(ip, &chipinfo, sizeof(chipinfo))) 879*925ca369SKent Gibson return -EFAULT; 880*925ca369SKent Gibson return 0; 881*925ca369SKent Gibson } else if (cmd == GPIO_GET_LINEINFO_IOCTL) { 882*925ca369SKent Gibson struct gpioline_info lineinfo; 883*925ca369SKent Gibson 884*925ca369SKent Gibson if (copy_from_user(&lineinfo, ip, sizeof(lineinfo))) 885*925ca369SKent Gibson return -EFAULT; 886*925ca369SKent Gibson 887*925ca369SKent Gibson desc = gpiochip_get_desc(gc, lineinfo.line_offset); 888*925ca369SKent Gibson if (IS_ERR(desc)) 889*925ca369SKent Gibson return PTR_ERR(desc); 890*925ca369SKent Gibson 891*925ca369SKent Gibson hwgpio = gpio_chip_hwgpio(desc); 892*925ca369SKent Gibson 893*925ca369SKent Gibson gpio_desc_to_lineinfo(desc, &lineinfo); 894*925ca369SKent Gibson 895*925ca369SKent Gibson if (copy_to_user(ip, &lineinfo, sizeof(lineinfo))) 896*925ca369SKent Gibson return -EFAULT; 897*925ca369SKent Gibson return 0; 898*925ca369SKent Gibson } else if (cmd == GPIO_GET_LINEHANDLE_IOCTL) { 899*925ca369SKent Gibson return linehandle_create(gdev, ip); 900*925ca369SKent Gibson } else if (cmd == GPIO_GET_LINEEVENT_IOCTL) { 901*925ca369SKent Gibson return lineevent_create(gdev, ip); 902*925ca369SKent Gibson } else if (cmd == GPIO_GET_LINEINFO_WATCH_IOCTL) { 903*925ca369SKent Gibson struct gpioline_info lineinfo; 904*925ca369SKent Gibson 905*925ca369SKent Gibson if (copy_from_user(&lineinfo, ip, sizeof(lineinfo))) 906*925ca369SKent Gibson return -EFAULT; 907*925ca369SKent Gibson 908*925ca369SKent Gibson desc = gpiochip_get_desc(gc, lineinfo.line_offset); 909*925ca369SKent Gibson if (IS_ERR(desc)) 910*925ca369SKent Gibson return PTR_ERR(desc); 911*925ca369SKent Gibson 912*925ca369SKent Gibson hwgpio = gpio_chip_hwgpio(desc); 913*925ca369SKent Gibson 914*925ca369SKent Gibson if (test_bit(hwgpio, priv->watched_lines)) 915*925ca369SKent Gibson return -EBUSY; 916*925ca369SKent Gibson 917*925ca369SKent Gibson gpio_desc_to_lineinfo(desc, &lineinfo); 918*925ca369SKent Gibson 919*925ca369SKent Gibson if (copy_to_user(ip, &lineinfo, sizeof(lineinfo))) 920*925ca369SKent Gibson return -EFAULT; 921*925ca369SKent Gibson 922*925ca369SKent Gibson set_bit(hwgpio, priv->watched_lines); 923*925ca369SKent Gibson return 0; 924*925ca369SKent Gibson } else if (cmd == GPIO_GET_LINEINFO_UNWATCH_IOCTL) { 925*925ca369SKent Gibson if (copy_from_user(&offset, ip, sizeof(offset))) 926*925ca369SKent Gibson return -EFAULT; 927*925ca369SKent Gibson 928*925ca369SKent Gibson desc = gpiochip_get_desc(gc, offset); 929*925ca369SKent Gibson if (IS_ERR(desc)) 930*925ca369SKent Gibson return PTR_ERR(desc); 931*925ca369SKent Gibson 932*925ca369SKent Gibson hwgpio = gpio_chip_hwgpio(desc); 933*925ca369SKent Gibson 934*925ca369SKent Gibson if (!test_bit(hwgpio, priv->watched_lines)) 935*925ca369SKent Gibson return -EBUSY; 936*925ca369SKent Gibson 937*925ca369SKent Gibson clear_bit(hwgpio, priv->watched_lines); 938*925ca369SKent Gibson return 0; 939*925ca369SKent Gibson } 940*925ca369SKent Gibson return -EINVAL; 941*925ca369SKent Gibson } 942*925ca369SKent Gibson 943*925ca369SKent Gibson #ifdef CONFIG_COMPAT 944*925ca369SKent Gibson static long gpio_ioctl_compat(struct file *filp, unsigned int cmd, 945*925ca369SKent Gibson unsigned long arg) 946*925ca369SKent Gibson { 947*925ca369SKent Gibson return gpio_ioctl(filp, cmd, (unsigned long)compat_ptr(arg)); 948*925ca369SKent Gibson } 949*925ca369SKent Gibson #endif 950*925ca369SKent Gibson 951*925ca369SKent Gibson static struct gpio_chardev_data * 952*925ca369SKent Gibson to_gpio_chardev_data(struct notifier_block *nb) 953*925ca369SKent Gibson { 954*925ca369SKent Gibson return container_of(nb, struct gpio_chardev_data, lineinfo_changed_nb); 955*925ca369SKent Gibson } 956*925ca369SKent Gibson 957*925ca369SKent Gibson static int lineinfo_changed_notify(struct notifier_block *nb, 958*925ca369SKent Gibson unsigned long action, void *data) 959*925ca369SKent Gibson { 960*925ca369SKent Gibson struct gpio_chardev_data *priv = to_gpio_chardev_data(nb); 961*925ca369SKent Gibson struct gpioline_info_changed chg; 962*925ca369SKent Gibson struct gpio_desc *desc = data; 963*925ca369SKent Gibson int ret; 964*925ca369SKent Gibson 965*925ca369SKent Gibson if (!test_bit(gpio_chip_hwgpio(desc), priv->watched_lines)) 966*925ca369SKent Gibson return NOTIFY_DONE; 967*925ca369SKent Gibson 968*925ca369SKent Gibson memset(&chg, 0, sizeof(chg)); 969*925ca369SKent Gibson chg.info.line_offset = gpio_chip_hwgpio(desc); 970*925ca369SKent Gibson chg.event_type = action; 971*925ca369SKent Gibson chg.timestamp = ktime_get_ns(); 972*925ca369SKent Gibson gpio_desc_to_lineinfo(desc, &chg.info); 973*925ca369SKent Gibson 974*925ca369SKent Gibson ret = kfifo_in_spinlocked(&priv->events, &chg, 1, &priv->wait.lock); 975*925ca369SKent Gibson if (ret) 976*925ca369SKent Gibson wake_up_poll(&priv->wait, EPOLLIN); 977*925ca369SKent Gibson else 978*925ca369SKent Gibson pr_debug_ratelimited("lineinfo event FIFO is full - event dropped\n"); 979*925ca369SKent Gibson 980*925ca369SKent Gibson return NOTIFY_OK; 981*925ca369SKent Gibson } 982*925ca369SKent Gibson 983*925ca369SKent Gibson static __poll_t lineinfo_watch_poll(struct file *filep, 984*925ca369SKent Gibson struct poll_table_struct *pollt) 985*925ca369SKent Gibson { 986*925ca369SKent Gibson struct gpio_chardev_data *priv = filep->private_data; 987*925ca369SKent Gibson __poll_t events = 0; 988*925ca369SKent Gibson 989*925ca369SKent Gibson poll_wait(filep, &priv->wait, pollt); 990*925ca369SKent Gibson 991*925ca369SKent Gibson if (!kfifo_is_empty_spinlocked_noirqsave(&priv->events, 992*925ca369SKent Gibson &priv->wait.lock)) 993*925ca369SKent Gibson events = EPOLLIN | EPOLLRDNORM; 994*925ca369SKent Gibson 995*925ca369SKent Gibson return events; 996*925ca369SKent Gibson } 997*925ca369SKent Gibson 998*925ca369SKent Gibson static ssize_t lineinfo_watch_read(struct file *filep, char __user *buf, 999*925ca369SKent Gibson size_t count, loff_t *off) 1000*925ca369SKent Gibson { 1001*925ca369SKent Gibson struct gpio_chardev_data *priv = filep->private_data; 1002*925ca369SKent Gibson struct gpioline_info_changed event; 1003*925ca369SKent Gibson ssize_t bytes_read = 0; 1004*925ca369SKent Gibson int ret; 1005*925ca369SKent Gibson 1006*925ca369SKent Gibson if (count < sizeof(event)) 1007*925ca369SKent Gibson return -EINVAL; 1008*925ca369SKent Gibson 1009*925ca369SKent Gibson do { 1010*925ca369SKent Gibson spin_lock(&priv->wait.lock); 1011*925ca369SKent Gibson if (kfifo_is_empty(&priv->events)) { 1012*925ca369SKent Gibson if (bytes_read) { 1013*925ca369SKent Gibson spin_unlock(&priv->wait.lock); 1014*925ca369SKent Gibson return bytes_read; 1015*925ca369SKent Gibson } 1016*925ca369SKent Gibson 1017*925ca369SKent Gibson if (filep->f_flags & O_NONBLOCK) { 1018*925ca369SKent Gibson spin_unlock(&priv->wait.lock); 1019*925ca369SKent Gibson return -EAGAIN; 1020*925ca369SKent Gibson } 1021*925ca369SKent Gibson 1022*925ca369SKent Gibson ret = wait_event_interruptible_locked(priv->wait, 1023*925ca369SKent Gibson !kfifo_is_empty(&priv->events)); 1024*925ca369SKent Gibson if (ret) { 1025*925ca369SKent Gibson spin_unlock(&priv->wait.lock); 1026*925ca369SKent Gibson return ret; 1027*925ca369SKent Gibson } 1028*925ca369SKent Gibson } 1029*925ca369SKent Gibson 1030*925ca369SKent Gibson ret = kfifo_out(&priv->events, &event, 1); 1031*925ca369SKent Gibson spin_unlock(&priv->wait.lock); 1032*925ca369SKent Gibson if (ret != 1) { 1033*925ca369SKent Gibson ret = -EIO; 1034*925ca369SKent Gibson break; 1035*925ca369SKent Gibson /* We should never get here. See lineevent_read(). */ 1036*925ca369SKent Gibson } 1037*925ca369SKent Gibson 1038*925ca369SKent Gibson if (copy_to_user(buf + bytes_read, &event, sizeof(event))) 1039*925ca369SKent Gibson return -EFAULT; 1040*925ca369SKent Gibson bytes_read += sizeof(event); 1041*925ca369SKent Gibson } while (count >= bytes_read + sizeof(event)); 1042*925ca369SKent Gibson 1043*925ca369SKent Gibson return bytes_read; 1044*925ca369SKent Gibson } 1045*925ca369SKent Gibson 1046*925ca369SKent Gibson /** 1047*925ca369SKent Gibson * gpio_chrdev_open() - open the chardev for ioctl operations 1048*925ca369SKent Gibson * @inode: inode for this chardev 1049*925ca369SKent Gibson * @filp: file struct for storing private data 1050*925ca369SKent Gibson * Returns 0 on success 1051*925ca369SKent Gibson */ 1052*925ca369SKent Gibson static int gpio_chrdev_open(struct inode *inode, struct file *filp) 1053*925ca369SKent Gibson { 1054*925ca369SKent Gibson struct gpio_device *gdev = container_of(inode->i_cdev, 1055*925ca369SKent Gibson struct gpio_device, chrdev); 1056*925ca369SKent Gibson struct gpio_chardev_data *priv; 1057*925ca369SKent Gibson int ret = -ENOMEM; 1058*925ca369SKent Gibson 1059*925ca369SKent Gibson /* Fail on open if the backing gpiochip is gone */ 1060*925ca369SKent Gibson if (!gdev->chip) 1061*925ca369SKent Gibson return -ENODEV; 1062*925ca369SKent Gibson 1063*925ca369SKent Gibson priv = kzalloc(sizeof(*priv), GFP_KERNEL); 1064*925ca369SKent Gibson if (!priv) 1065*925ca369SKent Gibson return -ENOMEM; 1066*925ca369SKent Gibson 1067*925ca369SKent Gibson priv->watched_lines = bitmap_zalloc(gdev->chip->ngpio, GFP_KERNEL); 1068*925ca369SKent Gibson if (!priv->watched_lines) 1069*925ca369SKent Gibson goto out_free_priv; 1070*925ca369SKent Gibson 1071*925ca369SKent Gibson init_waitqueue_head(&priv->wait); 1072*925ca369SKent Gibson INIT_KFIFO(priv->events); 1073*925ca369SKent Gibson priv->gdev = gdev; 1074*925ca369SKent Gibson 1075*925ca369SKent Gibson priv->lineinfo_changed_nb.notifier_call = lineinfo_changed_notify; 1076*925ca369SKent Gibson ret = atomic_notifier_chain_register(&gdev->notifier, 1077*925ca369SKent Gibson &priv->lineinfo_changed_nb); 1078*925ca369SKent Gibson if (ret) 1079*925ca369SKent Gibson goto out_free_bitmap; 1080*925ca369SKent Gibson 1081*925ca369SKent Gibson get_device(&gdev->dev); 1082*925ca369SKent Gibson filp->private_data = priv; 1083*925ca369SKent Gibson 1084*925ca369SKent Gibson ret = nonseekable_open(inode, filp); 1085*925ca369SKent Gibson if (ret) 1086*925ca369SKent Gibson goto out_unregister_notifier; 1087*925ca369SKent Gibson 1088*925ca369SKent Gibson return ret; 1089*925ca369SKent Gibson 1090*925ca369SKent Gibson out_unregister_notifier: 1091*925ca369SKent Gibson atomic_notifier_chain_unregister(&gdev->notifier, 1092*925ca369SKent Gibson &priv->lineinfo_changed_nb); 1093*925ca369SKent Gibson out_free_bitmap: 1094*925ca369SKent Gibson bitmap_free(priv->watched_lines); 1095*925ca369SKent Gibson out_free_priv: 1096*925ca369SKent Gibson kfree(priv); 1097*925ca369SKent Gibson return ret; 1098*925ca369SKent Gibson } 1099*925ca369SKent Gibson 1100*925ca369SKent Gibson /** 1101*925ca369SKent Gibson * gpio_chrdev_release() - close chardev after ioctl operations 1102*925ca369SKent Gibson * @inode: inode for this chardev 1103*925ca369SKent Gibson * @filp: file struct for storing private data 1104*925ca369SKent Gibson * Returns 0 on success 1105*925ca369SKent Gibson */ 1106*925ca369SKent Gibson static int gpio_chrdev_release(struct inode *inode, struct file *filp) 1107*925ca369SKent Gibson { 1108*925ca369SKent Gibson struct gpio_chardev_data *priv = filp->private_data; 1109*925ca369SKent Gibson struct gpio_device *gdev = priv->gdev; 1110*925ca369SKent Gibson 1111*925ca369SKent Gibson bitmap_free(priv->watched_lines); 1112*925ca369SKent Gibson atomic_notifier_chain_unregister(&gdev->notifier, 1113*925ca369SKent Gibson &priv->lineinfo_changed_nb); 1114*925ca369SKent Gibson put_device(&gdev->dev); 1115*925ca369SKent Gibson kfree(priv); 1116*925ca369SKent Gibson 1117*925ca369SKent Gibson return 0; 1118*925ca369SKent Gibson } 1119*925ca369SKent Gibson 1120*925ca369SKent Gibson static const struct file_operations gpio_fileops = { 1121*925ca369SKent Gibson .release = gpio_chrdev_release, 1122*925ca369SKent Gibson .open = gpio_chrdev_open, 1123*925ca369SKent Gibson .poll = lineinfo_watch_poll, 1124*925ca369SKent Gibson .read = lineinfo_watch_read, 1125*925ca369SKent Gibson .owner = THIS_MODULE, 1126*925ca369SKent Gibson .llseek = no_llseek, 1127*925ca369SKent Gibson .unlocked_ioctl = gpio_ioctl, 1128*925ca369SKent Gibson #ifdef CONFIG_COMPAT 1129*925ca369SKent Gibson .compat_ioctl = gpio_ioctl_compat, 1130*925ca369SKent Gibson #endif 1131*925ca369SKent Gibson }; 1132*925ca369SKent Gibson 1133*925ca369SKent Gibson int gpiolib_cdev_register(struct gpio_device *gdev, dev_t devt) 1134*925ca369SKent Gibson { 1135*925ca369SKent Gibson int ret; 1136*925ca369SKent Gibson 1137*925ca369SKent Gibson cdev_init(&gdev->chrdev, &gpio_fileops); 1138*925ca369SKent Gibson gdev->chrdev.owner = THIS_MODULE; 1139*925ca369SKent Gibson gdev->dev.devt = MKDEV(MAJOR(devt), gdev->id); 1140*925ca369SKent Gibson 1141*925ca369SKent Gibson ret = cdev_device_add(&gdev->chrdev, &gdev->dev); 1142*925ca369SKent Gibson if (ret) 1143*925ca369SKent Gibson return ret; 1144*925ca369SKent Gibson 1145*925ca369SKent Gibson chip_dbg(gdev->chip, "added GPIO chardev (%d:%d)\n", 1146*925ca369SKent Gibson MAJOR(devt), gdev->id); 1147*925ca369SKent Gibson 1148*925ca369SKent Gibson return 0; 1149*925ca369SKent Gibson } 1150*925ca369SKent Gibson 1151*925ca369SKent Gibson void gpiolib_cdev_unregister(struct gpio_device *gdev) 1152*925ca369SKent Gibson { 1153*925ca369SKent Gibson cdev_device_del(&gdev->chrdev, &gdev->dev); 1154*925ca369SKent Gibson } 1155