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

staging:iio:triggers introduce iio_trigger_ops to take const bits out of iio_trig_structure.

Right now this results in increased code, but I still think it is worth doing to avoid
replication across instances of drivers etc and move as much stuff as possible to constant.
Ops structure is optional for the occasional driver that uses none of it (currently
only the ad7793).

Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Jonathan Cameron and committed by
Greg Kroah-Hartman
d29f73db 214320b6

+109 -44
+6 -2
drivers/staging/iio/accel/adis16201_trigger.c
··· 23 23 return adis16201_set_irq(indio_dev, state); 24 24 } 25 25 26 + static const struct iio_trigger_ops adis16201_trigger_ops = { 27 + .owner = THIS_MODULE, 28 + .set_trigger_state = &adis16201_data_rdy_trigger_set_state, 29 + }; 30 + 26 31 int adis16201_probe_trigger(struct iio_dev *indio_dev) 27 32 { 28 33 int ret; ··· 46 41 if (ret) 47 42 goto error_free_trig; 48 43 st->trig->dev.parent = &st->us->dev; 49 - st->trig->owner = THIS_MODULE; 44 + st->trig->ops = &adis16201_trigger_ops; 50 45 st->trig->private_data = indio_dev; 51 - st->trig->set_trigger_state = &adis16201_data_rdy_trigger_set_state; 52 46 ret = iio_trigger_register(st->trig); 53 47 54 48 /* select default trigger */
+6 -2
drivers/staging/iio/accel/adis16203_trigger.c
··· 24 24 return adis16203_set_irq(indio_dev, state); 25 25 } 26 26 27 + static const struct iio_trigger_ops adis16203_trigger_ops = { 28 + .owner = THIS_MODULE, 29 + .set_trigger_state = &adis16203_data_rdy_trigger_set_state, 30 + }; 31 + 27 32 int adis16203_probe_trigger(struct iio_dev *indio_dev) 28 33 { 29 34 int ret; ··· 49 44 goto error_free_trig; 50 45 51 46 st->trig->dev.parent = &st->us->dev; 52 - st->trig->owner = THIS_MODULE; 47 + st->trig->ops = &adis16203_trigger_ops; 53 48 st->trig->private_data = indio_dev; 54 - st->trig->set_trigger_state = &adis16203_data_rdy_trigger_set_state; 55 49 ret = iio_trigger_register(st->trig); 56 50 57 51 /* select default trigger */
+6 -2
drivers/staging/iio/accel/adis16204_trigger.c
··· 24 24 return adis16204_set_irq(indio_dev, state); 25 25 } 26 26 27 + static const struct iio_trigger_ops adis16204_trigger_ops = { 28 + .owner = THIS_MODULE, 29 + .set_trigger_state = &adis16204_data_rdy_trigger_set_state, 30 + }; 31 + 27 32 int adis16204_probe_trigger(struct iio_dev *indio_dev) 28 33 { 29 34 int ret; ··· 49 44 goto error_free_trig; 50 45 51 46 st->trig->dev.parent = &st->us->dev; 52 - st->trig->owner = THIS_MODULE; 47 + st->trig->ops = &adis16204_trigger_ops; 53 48 st->trig->private_data = indio_dev; 54 - st->trig->set_trigger_state = &adis16204_data_rdy_trigger_set_state; 55 49 ret = iio_trigger_register(st->trig); 56 50 57 51 /* select default trigger */
+6 -2
drivers/staging/iio/accel/adis16209_trigger.c
··· 33 33 return adis16209_set_irq(indio_dev, state); 34 34 } 35 35 36 + static const struct iio_trigger_ops adis16209_trigger_ops = { 37 + .owner = THIS_MODULE, 38 + .set_trigger_state = &adis16209_data_rdy_trigger_set_state, 39 + }; 40 + 36 41 int adis16209_probe_trigger(struct iio_dev *indio_dev) 37 42 { 38 43 int ret; ··· 57 52 if (ret) 58 53 goto error_free_trig; 59 54 st->trig->dev.parent = &st->us->dev; 60 - st->trig->owner = THIS_MODULE; 55 + st->trig->ops = &adis16209_trigger_ops; 61 56 st->trig->private_data = indio_dev; 62 - st->trig->set_trigger_state = &adis16209_data_rdy_trigger_set_state; 63 57 ret = iio_trigger_register(st->trig); 64 58 65 59 /* select default trigger */
+6 -2
drivers/staging/iio/accel/adis16240_trigger.c
··· 33 33 return adis16240_set_irq(indio_dev, state); 34 34 } 35 35 36 + static const struct iio_trigger_ops adis16240_trigger_ops = { 37 + .owner = THIS_MODULE, 38 + .set_trigger_state = &adis16240_data_rdy_trigger_set_state, 39 + }; 40 + 36 41 int adis16240_probe_trigger(struct iio_dev *indio_dev) 37 42 { 38 43 int ret; ··· 58 53 goto error_free_trig; 59 54 60 55 st->trig->dev.parent = &st->us->dev; 61 - st->trig->owner = THIS_MODULE; 56 + st->trig->ops = &adis16240_trigger_ops; 62 57 st->trig->private_data = indio_dev; 63 - st->trig->set_trigger_state = &adis16240_data_rdy_trigger_set_state; 64 58 ret = iio_trigger_register(st->trig); 65 59 66 60 /* select default trigger */
+7 -3
drivers/staging/iio/accel/lis3l02dq_ring.c
··· 306 306 return 0; 307 307 } 308 308 309 + static const struct iio_trigger_ops lis3l02dq_trigger_ops = { 310 + .owner = THIS_MODULE, 311 + .set_trigger_state = &lis3l02dq_data_rdy_trigger_set_state, 312 + .try_reenable = &lis3l02dq_trig_try_reen, 313 + }; 314 + 309 315 int lis3l02dq_probe_trigger(struct iio_dev *indio_dev) 310 316 { 311 317 int ret; ··· 324 318 } 325 319 326 320 st->trig->dev.parent = &st->us->dev; 327 - st->trig->owner = THIS_MODULE; 321 + st->trig->ops = &lis3l02dq_trigger_ops; 328 322 st->trig->private_data = indio_dev; 329 - st->trig->set_trigger_state = &lis3l02dq_data_rdy_trigger_set_state; 330 - st->trig->try_reenable = &lis3l02dq_trig_try_reen; 331 323 ret = iio_trigger_register(st->trig); 332 324 if (ret) 333 325 goto error_free_trig;
+6 -2
drivers/staging/iio/gyro/adis16260_trigger.c
··· 24 24 return adis16260_set_irq(indio_dev, state); 25 25 } 26 26 27 + static const struct iio_trigger_ops adis16260_trigger_ops = { 28 + .owner = THIS_MODULE, 29 + .set_trigger_state = &adis16260_data_rdy_trigger_set_state, 30 + }; 31 + 27 32 int adis16260_probe_trigger(struct iio_dev *indio_dev) 28 33 { 29 34 int ret; ··· 51 46 goto error_free_trig; 52 47 53 48 st->trig->dev.parent = &st->us->dev; 54 - st->trig->owner = THIS_MODULE; 49 + st->trig->ops = &adis16260_trigger_ops; 55 50 st->trig->private_data = indio_dev; 56 - st->trig->set_trigger_state = &adis16260_data_rdy_trigger_set_state; 57 51 ret = iio_trigger_register(st->trig); 58 52 59 53 /* select default trigger */
+6 -2
drivers/staging/iio/imu/adis16400_trigger.c
··· 18 18 return adis16400_set_irq(indio_dev, state); 19 19 } 20 20 21 + static const struct iio_trigger_ops adis16400_trigger_ops = { 22 + .owner = THIS_MODULE, 23 + .set_trigger_state = &adis16400_data_rdy_trigger_set_state, 24 + }; 25 + 21 26 int adis16400_probe_trigger(struct iio_dev *indio_dev) 22 27 { 23 28 int ret; ··· 44 39 if (ret) 45 40 goto error_free_trig; 46 41 st->trig->dev.parent = &st->us->dev; 47 - st->trig->owner = THIS_MODULE; 48 42 st->trig->private_data = indio_dev; 49 - st->trig->set_trigger_state = &adis16400_data_rdy_trigger_set_state; 43 + st->trig->ops = &adis16400_trigger_ops; 50 44 ret = iio_trigger_register(st->trig); 51 45 52 46 /* select default trigger */
+8 -8
drivers/staging/iio/industrialio-trigger.c
··· 206 206 void iio_trigger_notify_done(struct iio_trigger *trig) 207 207 { 208 208 trig->use_count--; 209 - if (trig->use_count == 0 && trig->try_reenable) 210 - if (trig->try_reenable(trig)) { 209 + if (trig->use_count == 0 && trig->ops && trig->ops->try_reenable) 210 + if (trig->ops->try_reenable(trig)) { 211 211 /* Missed and interrupt so launch new poll now */ 212 212 iio_trigger_poll(trig, 0); 213 213 } ··· 234 234 ret = request_threaded_irq(pf->irq, pf->h, pf->thread, 235 235 pf->type, pf->name, 236 236 pf); 237 - if (trig->set_trigger_state && notinuse) 238 - ret = trig->set_trigger_state(trig, true); 237 + if (trig->ops && trig->ops->set_trigger_state && notinuse) 238 + ret = trig->ops->set_trigger_state(trig, true); 239 239 240 240 return ret; 241 241 } ··· 249 249 = (bitmap_weight(trig->pool, 250 250 CONFIG_IIO_CONSUMERS_PER_TRIGGER) 251 251 == 1); 252 - if (trig->set_trigger_state && no_other_users) { 253 - ret = trig->set_trigger_state(trig, false); 252 + if (trig->ops && trig->ops->set_trigger_state && no_other_users) { 253 + ret = trig->ops->set_trigger_state(trig, false); 254 254 if (ret) 255 255 goto error_ret; 256 256 } ··· 358 358 return ret; 359 359 } 360 360 361 - if (trig && trig->validate_device) { 362 - ret = trig->validate_device(trig, dev_info); 361 + if (trig && trig->ops && trig->ops->validate_device) { 362 + ret = trig->ops->validate_device(trig, dev_info); 363 363 if (ret) 364 364 return ret; 365 365 }
+7 -3
drivers/staging/iio/meter/ade7758_trigger.c
··· 57 57 return 0; 58 58 } 59 59 60 + static const struct iio_trigger_ops ade7758_trigger_ops = { 61 + .owner = THIS_MODULE, 62 + .set_trigger_state = &ade7758_data_rdy_trigger_set_state, 63 + .try_reenable = &ade7758_trig_try_reen, 64 + }; 65 + 60 66 int ade7758_probe_trigger(struct iio_dev *indio_dev) 61 67 { 62 68 struct ade7758_state *st = iio_priv(indio_dev); ··· 85 79 goto error_free_trig; 86 80 87 81 st->trig->dev.parent = &st->us->dev; 88 - st->trig->owner = THIS_MODULE; 82 + st->trig->ops = &ade7758_trigger_ops; 89 83 st->trig->private_data = indio_dev; 90 - st->trig->set_trigger_state = &ade7758_data_rdy_trigger_set_state; 91 - st->trig->try_reenable = &ade7758_trig_try_reen; 92 84 ret = iio_trigger_register(st->trig); 93 85 94 86 /* select default trigger */
+24 -12
drivers/staging/iio/trigger.h
··· 16 16 }; 17 17 18 18 /** 19 + * struct iio_trigger_ops - operations structure for an iio_trigger. 20 + * @owner: used to monitor usage count of the trigger. 21 + * @set_trigger_state: switch on/off the trigger on demand 22 + * @try_reenable: function to reenable the trigger when the 23 + * use count is zero (may be NULL) 24 + * @validate_device: function to validate the device when the 25 + * current trigger gets changed. 26 + * 27 + * This is typically static const within a driver and shared by 28 + * instances of a given device. 29 + **/ 30 + struct iio_trigger_ops { 31 + struct module *owner; 32 + int (*set_trigger_state)(struct iio_trigger *trig, bool state); 33 + int (*try_reenable)(struct iio_trigger *trig); 34 + int (*validate_device)(struct iio_trigger *trig, 35 + struct iio_dev *indio_dev); 36 + }; 37 + 38 + 39 + /** 19 40 * struct iio_trigger - industrial I/O trigger device 20 41 * 21 42 * @id: [INTERN] unique id number ··· 47 26 * @alloc_list: [DRIVER] used for driver specific trigger list 48 27 * @owner: [DRIVER] used to monitor usage count of the trigger. 49 28 * @use_count: use count for the trigger 50 - * @set_trigger_state: [DRIVER] switch on/off the trigger on demand 51 - * @try_reenable: function to reenable the trigger when the 52 - * use count is zero (may be NULL) 53 - * @validate_device: function to validate the device when the 54 - * current trigger gets changed. 55 29 * @subirq_chip: [INTERN] associate 'virtual' irq chip. 56 30 * @subirq_base: [INTERN] base number for irqs provided by trigger. 57 31 * @subirqs: [INTERN] information about the 'child' irqs. ··· 54 38 * @pool_lock: [INTERN] protection of the irq pool. 55 39 **/ 56 40 struct iio_trigger { 41 + const struct iio_trigger_ops *ops; 57 42 int id; 58 43 const char *name; 59 44 struct device dev; ··· 64 47 struct list_head alloc_list; 65 48 struct module *owner; 66 49 int use_count; 67 - 68 - int (*set_trigger_state)(struct iio_trigger *trig, bool state); 69 - int (*try_reenable)(struct iio_trigger *trig); 70 - int (*validate_device)(struct iio_trigger *trig, 71 - struct iio_dev *indio_dev); 72 50 73 51 struct irq_chip subirq_chip; 74 52 int subirq_base; ··· 105 93 static inline void iio_put_trigger(struct iio_trigger *trig) 106 94 { 107 95 put_device(&trig->dev); 108 - module_put(trig->owner); 96 + module_put(trig->ops->owner); 109 97 }; 110 98 111 99 static inline void iio_get_trigger(struct iio_trigger *trig) 112 100 { 113 - __module_get(trig->owner); 101 + __module_get(trig->ops->owner); 114 102 get_device(&trig->dev); 115 103 }; 116 104
+5 -1
drivers/staging/iio/trigger/iio-trig-bfin-timer.c
··· 143 143 return -ENODEV; 144 144 } 145 145 146 + static const struct iio_trigger_ops iio_bfin_tmr_trigger_ops = { 147 + owner = THIS_MODULE, 148 + }; 149 + 146 150 static int __devinit iio_bfin_tmr_trigger_probe(struct platform_device *pdev) 147 151 { 148 152 struct bfin_tmr_state *st; ··· 179 175 } 180 176 181 177 st->trig->private_data = st; 182 - st->trig->owner = THIS_MODULE; 178 + st->trig->ops = &iio_bfin_tmr_trigger_ops; 183 179 st->trig->dev.groups = iio_bfin_tmr_trigger_attr_groups; 184 180 ret = iio_trigger_register(st->trig); 185 181 if (ret)
+5 -1
drivers/staging/iio/trigger/iio-trig-gpio.c
··· 47 47 return IRQ_HANDLED; 48 48 } 49 49 50 + static const struct iio_trigger_ops iio_gpio_trigger_ops = { 51 + .owner = THIS_MODULE, 52 + }; 53 + 50 54 static int iio_gpio_trigger_probe(struct platform_device *pdev) 51 55 { 52 56 struct iio_gpio_trigger_info *trig_info; ··· 85 81 } 86 82 trig->private_data = trig_info; 87 83 trig_info->irq = irq; 88 - trig->owner = THIS_MODULE; 84 + trig->ops = &iio_gpio_trigger_ops; 89 85 ret = request_irq(irq, iio_gpio_trigger_poll, 90 86 irqflags, trig->name, trig); 91 87 if (ret) {
+6 -1
drivers/staging/iio/trigger/iio-trig-periodic-rtc.c
··· 96 96 iio_trigger_poll(private_data, 0); 97 97 } 98 98 99 + static const struct iio_trigger_ops iio_prtc_trigger_ops = { 100 + .owner = THIS_MODULE, 101 + .set_trigger_state = &iio_trig_periodic_rtc_set_state, 102 + }; 103 + 99 104 static int iio_trig_periodic_rtc_probe(struct platform_device *dev) 100 105 { 101 106 char **pdata = dev->dev.platform_data; ··· 126 121 } 127 122 trig->private_data = trig_info; 128 123 trig->owner = THIS_MODULE; 129 - trig->set_trigger_state = &iio_trig_periodic_rtc_set_state; 124 + trig->ops = &iio_prtc_trigger_ops; 130 125 /* RTC access */ 131 126 trig_info->rtc 132 127 = rtc_class_open(pdata[i]);
+5 -1
drivers/staging/iio/trigger/iio-trig-sysfs.c
··· 107 107 NULL 108 108 }; 109 109 110 + static const struct iio_trigger_ops iio_sysfs_trigger_ops = { 111 + .owner = THIS_MODULE, 112 + }; 113 + 110 114 static int iio_sysfs_trigger_probe(int id) 111 115 { 112 116 struct iio_sysfs_trig *t; ··· 139 135 } 140 136 141 137 t->trig->dev.groups = iio_sysfs_trigger_attr_groups; 142 - t->trig->owner = THIS_MODULE; 138 + t->trig->ops = &iio_sysfs_trigger_ops; 143 139 t->trig->dev.parent = &iio_sysfs_trig_dev; 144 140 145 141 ret = iio_trigger_register(t->trig);