Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

staging:iio:triggers:interrupt trigger - one per platform device.

Switching from one platform device registering a lot of triggers
to one for each trigger simplifies the code somewhat. It would be
relatively unusual to have more than a couple of such devices
registered so this change will not result in much additional overhead.

Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Reviewed-by: Lars-Peter Clausen <lars@metafoo.de>

+39 -70
+39 -70
drivers/staging/iio/trigger/iio-trig-interrupt.c
··· 17 17 #include <linux/iio/iio.h> 18 18 #include <linux/iio/trigger.h> 19 19 20 - static LIST_HEAD(iio_interrupt_trigger_list); 21 - static DEFINE_MUTEX(iio_interrupt_trigger_list_lock); 22 20 23 21 struct iio_interrupt_trigger_info { 24 - struct mutex in_use; 25 22 unsigned int irq; 26 23 }; 27 24 ··· 36 39 static int iio_interrupt_trigger_probe(struct platform_device *pdev) 37 40 { 38 41 struct iio_interrupt_trigger_info *trig_info; 39 - struct iio_trigger *trig, *trig2; 42 + struct iio_trigger *trig; 40 43 unsigned long irqflags; 41 44 struct resource *irq_res; 42 - int irq, ret = 0, irq_res_cnt = 0; 45 + int irq, ret = 0; 43 46 44 - do { 45 - irq_res = platform_get_resource(pdev, 46 - IORESOURCE_IRQ, irq_res_cnt); 47 + irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 47 48 48 - if (irq_res == NULL) { 49 - if (irq_res_cnt == 0) 50 - dev_err(&pdev->dev, "No IRQs specified"); 51 - break; 52 - } 53 - irqflags = (irq_res->flags & IRQF_TRIGGER_MASK) | IRQF_SHARED; 49 + if (irq_res == NULL) 50 + return -ENODEV; 54 51 55 - for (irq = irq_res->start; irq <= irq_res->end; irq++) { 52 + irqflags = (irq_res->flags & IRQF_TRIGGER_MASK) | IRQF_SHARED; 56 53 57 - trig = iio_trigger_alloc("irqtrig%d", irq); 58 - if (!trig) { 59 - ret = -ENOMEM; 60 - goto error_free_completed_registrations; 61 - } 54 + irq = irq_res->start; 62 55 63 - trig_info = kzalloc(sizeof(*trig_info), GFP_KERNEL); 64 - if (!trig_info) { 65 - ret = -ENOMEM; 66 - goto error_put_trigger; 67 - } 68 - iio_trigger_set_drvdata(trig, trig_info); 69 - trig_info->irq = irq; 70 - trig->ops = &iio_interrupt_trigger_ops; 71 - ret = request_irq(irq, iio_interrupt_trigger_poll, 72 - irqflags, trig->name, trig); 73 - if (ret) { 74 - dev_err(&pdev->dev, 75 - "request IRQ-%d failed", irq); 76 - goto error_free_trig_info; 77 - } 56 + trig = iio_trigger_alloc("irqtrig%d", irq_res->start); 57 + if (!trig) { 58 + ret = -ENOMEM; 59 + goto error_ret; 60 + } 78 61 79 - ret = iio_trigger_register(trig); 80 - if (ret) 81 - goto error_release_irq; 62 + trig_info = kzalloc(sizeof(*trig_info), GFP_KERNEL); 63 + if (!trig_info) { 64 + ret = -ENOMEM; 65 + goto error_put_trigger; 66 + } 67 + iio_trigger_set_drvdata(trig, trig_info); 68 + trig_info->irq = irq; 69 + trig->ops = &iio_interrupt_trigger_ops; 70 + ret = request_irq(irq, iio_interrupt_trigger_poll, 71 + irqflags, trig->name, trig); 72 + if (ret) { 73 + dev_err(&pdev->dev, 74 + "request IRQ-%d failed", irq); 75 + goto error_free_trig_info; 76 + } 82 77 83 - list_add_tail(&trig->alloc_list, 84 - &iio_interrupt_trigger_list); 85 - } 86 - 87 - irq_res_cnt++; 88 - } while (irq_res != NULL); 89 - 78 + ret = iio_trigger_register(trig); 79 + if (ret) 80 + goto error_release_irq; 81 + platform_set_drvdata(pdev, trig); 90 82 91 83 return 0; 92 84 ··· 86 100 kfree(trig_info); 87 101 error_put_trigger: 88 102 iio_trigger_put(trig); 89 - error_free_completed_registrations: 90 - /* The rest should have been added to the iio_interrupt_trigger_list */ 91 - list_for_each_entry_safe(trig, 92 - trig2, 93 - &iio_interrupt_trigger_list, 94 - alloc_list) { 95 - trig_info = iio_trigger_get_drvdata(trig); 96 - free_irq(trig_info->irq, trig); 97 - kfree(trig_info); 98 - iio_trigger_unregister(trig); 99 - } 100 - 103 + error_ret: 101 104 return ret; 102 105 } 103 106 104 107 static int iio_interrupt_trigger_remove(struct platform_device *pdev) 105 108 { 106 - struct iio_trigger *trig, *trig2; 109 + struct iio_trigger *trig; 107 110 struct iio_interrupt_trigger_info *trig_info; 108 111 109 - mutex_lock(&iio_interrupt_trigger_list_lock); 110 - list_for_each_entry_safe(trig, 111 - trig2, 112 - &iio_interrupt_trigger_list, 113 - alloc_list) { 114 - trig_info = iio_trigger_get_drvdata(trig); 115 - iio_trigger_unregister(trig); 116 - free_irq(trig_info->irq, trig); 117 - kfree(trig_info); 118 - iio_trigger_put(trig); 119 - } 120 - mutex_unlock(&iio_interrupt_trigger_list_lock); 112 + trig = platform_get_drvdata(pdev); 113 + trig_info = iio_trigger_get_drvdata(trig); 114 + iio_trigger_unregister(trig); 115 + free_irq(trig_info->irq, trig); 116 + kfree(trig_info); 117 + iio_trigger_put(trig); 121 118 122 119 return 0; 123 120 }