11637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron/* The industrial I/O core, trigger handling functions 21637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * 31637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * Copyright (c) 2008 Jonathan Cameron 41637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * 51637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * This program is free software; you can redistribute it and/or modify it 61637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * under the terms of the GNU General Public License version 2 as published by 71637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * the Free Software Foundation. 81637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron */ 91637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 101637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron#include <linux/kernel.h> 111637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron#include <linux/idr.h> 121637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron#include <linux/err.h> 131637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron#include <linux/device.h> 141637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron#include <linux/interrupt.h> 151637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron#include <linux/list.h> 165a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h> 171637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 1806458e277eac2b8761b0a04d3c808d57be281a2eJonathan Cameron#include <linux/iio/iio.h> 1906458e277eac2b8761b0a04d3c808d57be281a2eJonathan Cameron#include <linux/iio/trigger.h> 20df9c1c42c26f9a516dd44c956cff301741a0884eJonathan Cameron#include "iio_core.h" 216aea1c364cde5b28b551844b7b8925f523310a18Jonathan Cameron#include "iio_core_trigger.h" 2206458e277eac2b8761b0a04d3c808d57be281a2eJonathan Cameron#include <linux/iio/trigger_consumer.h> 231637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 241637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron/* RFC - Question of approach 251637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * Make the common case (single sensor single trigger) 261637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * simple by starting trigger capture from when first sensors 271637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * is added. 281637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * 291637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * Complex simultaneous start requires use of 'hold' functionality 301637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * of the trigger. (not implemented) 311637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * 321637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * Any other suggestions? 331637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron */ 341637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 3547c24fdd4253a2c8d730b978a186923b1af5e879Jonathan Cameronstatic DEFINE_IDA(iio_trigger_ida); 361637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 371637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron/* Single list of all available triggers */ 381637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic LIST_HEAD(iio_trigger_list); 391637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic DEFINE_MUTEX(iio_trigger_list_lock); 401637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 411637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron/** 4259c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron * iio_trigger_read_name() - retrieve useful identifying name 4359c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron **/ 4459c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameronstatic ssize_t iio_trigger_read_name(struct device *dev, 4559c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron struct device_attribute *attr, 4659c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron char *buf) 4759c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron{ 48971ff1db41b0f16f34cfdeb9e0460d7dc598e68eLars-Peter Clausen struct iio_trigger *trig = to_iio_trigger(dev); 4959c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron return sprintf(buf, "%s\n", trig->name); 5059c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron} 5159c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron 5259c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameronstatic DEVICE_ATTR(name, S_IRUGO, iio_trigger_read_name, NULL); 5359c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron 546d459aa011cb087ed1f5c17836b032fcc670e306Lars-Peter Clausenstatic struct attribute *iio_trig_dev_attrs[] = { 556d459aa011cb087ed1f5c17836b032fcc670e306Lars-Peter Clausen &dev_attr_name.attr, 566d459aa011cb087ed1f5c17836b032fcc670e306Lars-Peter Clausen NULL, 576d459aa011cb087ed1f5c17836b032fcc670e306Lars-Peter Clausen}; 58f59c2576c12d4367ca4bdade0eb054b4558f9762Axel LinATTRIBUTE_GROUPS(iio_trig_dev); 591637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 601637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronint iio_trigger_register(struct iio_trigger *trig_info) 611637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 621637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron int ret; 631637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 6447c24fdd4253a2c8d730b978a186923b1af5e879Jonathan Cameron trig_info->id = ida_simple_get(&iio_trigger_ida, 0, 0, GFP_KERNEL); 6592825ff97411f0121166485798cdaf2deb6b5952Hartmut Knaack if (trig_info->id < 0) 6692825ff97411f0121166485798cdaf2deb6b5952Hartmut Knaack return trig_info->id; 6792825ff97411f0121166485798cdaf2deb6b5952Hartmut Knaack 681637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron /* Set the name used for the sysfs directory etc */ 691637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron dev_set_name(&trig_info->dev, "trigger%ld", 701637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron (unsigned long) trig_info->id); 711637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 721637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron ret = device_add(&trig_info->dev); 731637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron if (ret) 741637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron goto error_unregister_id; 751637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 761637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron /* Add to list of available triggers held by the IIO core */ 771637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron mutex_lock(&iio_trigger_list_lock); 781637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron list_add_tail(&trig_info->list, &iio_trigger_list); 791637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron mutex_unlock(&iio_trigger_list_lock); 801637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 811637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron return 0; 821637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 831637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronerror_unregister_id: 8447c24fdd4253a2c8d730b978a186923b1af5e879Jonathan Cameron ida_simple_remove(&iio_trigger_ida, trig_info->id); 851637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron return ret; 861637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 871637db44413e32a0f100dd4bd164644e641842f7Jonathan CameronEXPORT_SYMBOL(iio_trigger_register); 881637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 891637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronvoid iio_trigger_unregister(struct iio_trigger *trig_info) 901637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 911637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron mutex_lock(&iio_trigger_list_lock); 92582e548908729dd2f3e183fda5a8b7c2e2ca0b0eJonathan Cameron list_del(&trig_info->list); 931637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron mutex_unlock(&iio_trigger_list_lock); 941637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 9547c24fdd4253a2c8d730b978a186923b1af5e879Jonathan Cameron ida_simple_remove(&iio_trigger_ida, trig_info->id); 961637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron /* Possible issue in here */ 978bade406649245292d6fcd1947cd7ad2ad8c80c1Jonathan Cameron device_del(&trig_info->dev); 981637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 991637db44413e32a0f100dd4bd164644e641842f7Jonathan CameronEXPORT_SYMBOL(iio_trigger_unregister); 1001637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 101f6517f22d4f6336ce37dc6b72aae4704ff872ba3Jonathan Cameronstatic struct iio_trigger *iio_trigger_find_by_name(const char *name, 102f6517f22d4f6336ce37dc6b72aae4704ff872ba3Jonathan Cameron size_t len) 1031637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 104f6517f22d4f6336ce37dc6b72aae4704ff872ba3Jonathan Cameron struct iio_trigger *trig = NULL, *iter; 1057c327857016116eba1595c67c25d0314d1385e85Michael Hennerich 1061637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron mutex_lock(&iio_trigger_list_lock); 107f6517f22d4f6336ce37dc6b72aae4704ff872ba3Jonathan Cameron list_for_each_entry(iter, &iio_trigger_list, list) 108f6517f22d4f6336ce37dc6b72aae4704ff872ba3Jonathan Cameron if (sysfs_streq(iter->name, name)) { 109f6517f22d4f6336ce37dc6b72aae4704ff872ba3Jonathan Cameron trig = iter; 1101637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron break; 1111637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron } 1121637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron mutex_unlock(&iio_trigger_list_lock); 1131637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 114f6517f22d4f6336ce37dc6b72aae4704ff872ba3Jonathan Cameron return trig; 1155f87404dfce14b2a194d085b7bac4b8c3672ab00Jonathan Cameron} 1161637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 117398fd22b6b94cb15c1c299bceecd63644a1b17b4Peter Meerwaldvoid iio_trigger_poll(struct iio_trigger *trig) 1181637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 119d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron int i; 120a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen 121a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen if (!atomic_read(&trig->use_count)) { 122a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen atomic_set(&trig->use_count, CONFIG_IIO_CONSUMERS_PER_TRIGGER); 123a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen 124a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++) { 125a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen if (trig->subirqs[i].enabled) 126d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron generic_handle_irq(trig->subirq_base + i); 127a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen else 128a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen iio_trigger_notify_done(trig); 129a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen } 130a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen } 1311637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 1321637db44413e32a0f100dd4bd164644e641842f7Jonathan CameronEXPORT_SYMBOL(iio_trigger_poll); 1338384d9573e937949eba96eaa1323253c2687aa5cJonathan Cameron 1348384d9573e937949eba96eaa1323253c2687aa5cJonathan Cameronirqreturn_t iio_trigger_generic_data_rdy_poll(int irq, void *private) 1358384d9573e937949eba96eaa1323253c2687aa5cJonathan Cameron{ 136398fd22b6b94cb15c1c299bceecd63644a1b17b4Peter Meerwald iio_trigger_poll(private); 1378384d9573e937949eba96eaa1323253c2687aa5cJonathan Cameron return IRQ_HANDLED; 1388384d9573e937949eba96eaa1323253c2687aa5cJonathan Cameron} 1398384d9573e937949eba96eaa1323253c2687aa5cJonathan CameronEXPORT_SYMBOL(iio_trigger_generic_data_rdy_poll); 1401637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 141398fd22b6b94cb15c1c299bceecd63644a1b17b4Peter Meerwaldvoid iio_trigger_poll_chained(struct iio_trigger *trig) 1421f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameron{ 1431f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameron int i; 144a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen 145a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen if (!atomic_read(&trig->use_count)) { 146a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen atomic_set(&trig->use_count, CONFIG_IIO_CONSUMERS_PER_TRIGGER); 147a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen 148a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++) { 149a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen if (trig->subirqs[i].enabled) 1501f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameron handle_nested_irq(trig->subirq_base + i); 151a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen else 152a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen iio_trigger_notify_done(trig); 153a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen } 154a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen } 1551f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameron} 1561f785681a87068f123d3e23da13b2c55ab4f93acJonathan CameronEXPORT_SYMBOL(iio_trigger_poll_chained); 1571f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameron 1581637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronvoid iio_trigger_notify_done(struct iio_trigger *trig) 1591637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 160a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen if (atomic_dec_and_test(&trig->use_count) && trig->ops && 161a1a8e1dc111d6f05e7164e851e58219d428359e1Lars-Peter Clausen trig->ops->try_reenable) 162e69616b1e65cb9d3dcf34399e8fac331911abfe5Jonathan Cameron if (trig->ops->try_reenable(trig)) 163860c9c54272deaab43b40dbe416becb34abd344fPeter Meerwald /* Missed an interrupt so launch new poll now */ 164398fd22b6b94cb15c1c299bceecd63644a1b17b4Peter Meerwald iio_trigger_poll(trig); 1651637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 1661637db44413e32a0f100dd4bd164644e641842f7Jonathan CameronEXPORT_SYMBOL(iio_trigger_notify_done); 1671637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 1681637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron/* Trigger Consumer related functions */ 169208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameronstatic int iio_trigger_get_irq(struct iio_trigger *trig) 170208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron{ 171208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron int ret; 172208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron mutex_lock(&trig->pool_lock); 173208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron ret = bitmap_find_free_region(trig->pool, 174208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron CONFIG_IIO_CONSUMERS_PER_TRIGGER, 175208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron ilog2(1)); 176208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron mutex_unlock(&trig->pool_lock); 177208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron if (ret >= 0) 178208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron ret += trig->subirq_base; 179208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron 180208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron return ret; 181208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron} 182208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron 183208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameronstatic void iio_trigger_put_irq(struct iio_trigger *trig, int irq) 184208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron{ 185208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron mutex_lock(&trig->pool_lock); 186208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron clear_bit(irq - trig->subirq_base, trig->pool); 187208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron mutex_unlock(&trig->pool_lock); 188208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron} 1891637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 1901637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron/* Complexity in here. With certain triggers (datardy) an acknowledgement 1911637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * may be needed if the pollfuncs do not include the data read for the 1921637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * triggering device. 1931637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * This is not currently handled. Alternative of not enabling trigger unless 1941637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * the relevant function is in there may be the best option. 1951637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron */ 196860c9c54272deaab43b40dbe416becb34abd344fPeter Meerwald/* Worth protecting against double additions? */ 197208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameronstatic int iio_trigger_attach_poll_func(struct iio_trigger *trig, 198208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron struct iio_poll_func *pf) 1991637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 2001637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron int ret = 0; 20151c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron bool notinuse 20251c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron = bitmap_empty(trig->pool, CONFIG_IIO_CONSUMERS_PER_TRIGGER); 20351c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron 204860c9c54272deaab43b40dbe416becb34abd344fPeter Meerwald /* Prevent the module from being removed whilst attached to a trigger */ 205f60c4a02aa05817f00408ecefdf221f44781e08aJonathan Cameron __module_get(pf->indio_dev->info->driver_module); 20651c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron pf->irq = iio_trigger_get_irq(trig); 20751c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron ret = request_threaded_irq(pf->irq, pf->h, pf->thread, 20851c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron pf->type, pf->name, 20951c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron pf); 2105dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron if (ret < 0) { 2115dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron module_put(pf->indio_dev->info->driver_module); 2125dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron return ret; 2135dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron } 2145dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron 2155dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron if (trig->ops && trig->ops->set_trigger_state && notinuse) { 216d29f73db791098179af90e6a5b1df41f941b32cdJonathan Cameron ret = trig->ops->set_trigger_state(trig, true); 2175dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron if (ret < 0) 2185dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron module_put(pf->indio_dev->info->driver_module); 2195dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron } 220d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron 2211637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron return ret; 2221637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 2231637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 224034bd7b5d926816285deb71c41a230b912524f8bPeter Meerwaldstatic int iio_trigger_detach_poll_func(struct iio_trigger *trig, 225208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron struct iio_poll_func *pf) 2261637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 22751c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron int ret = 0; 22851c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron bool no_other_users 22951c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron = (bitmap_weight(trig->pool, 23051c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron CONFIG_IIO_CONSUMERS_PER_TRIGGER) 23151c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron == 1); 232d29f73db791098179af90e6a5b1df41f941b32cdJonathan Cameron if (trig->ops && trig->ops->set_trigger_state && no_other_users) { 233d29f73db791098179af90e6a5b1df41f941b32cdJonathan Cameron ret = trig->ops->set_trigger_state(trig, false); 23451c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron if (ret) 23592825ff97411f0121166485798cdaf2deb6b5952Hartmut Knaack return ret; 2361637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron } 23751c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron iio_trigger_put_irq(trig, pf->irq); 23851c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron free_irq(pf->irq, pf); 239f60c4a02aa05817f00408ecefdf221f44781e08aJonathan Cameron module_put(pf->indio_dev->info->driver_module); 2401637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 2411637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron return ret; 2421637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 2431637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 244d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameronirqreturn_t iio_pollfunc_store_time(int irq, void *p) 245d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron{ 246d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron struct iio_poll_func *pf = p; 247d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron pf->timestamp = iio_get_time_ns(); 248d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron return IRQ_WAKE_THREAD; 249d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron} 250d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan CameronEXPORT_SYMBOL(iio_pollfunc_store_time); 251d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron 25221b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameronstruct iio_poll_func 25321b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron*iio_alloc_pollfunc(irqreturn_t (*h)(int irq, void *p), 25421b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron irqreturn_t (*thread)(int irq, void *p), 25521b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron int type, 256e65bc6ac6fa54959ac0b3712b0f35bbf073c073eJonathan Cameron struct iio_dev *indio_dev, 25721b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron const char *fmt, 25821b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron ...) 25921b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron{ 26021b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron va_list vargs; 26121b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron struct iio_poll_func *pf; 26221b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron 26321b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron pf = kmalloc(sizeof *pf, GFP_KERNEL); 26421b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron if (pf == NULL) 26521b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron return NULL; 26621b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron va_start(vargs, fmt); 26721b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron pf->name = kvasprintf(GFP_KERNEL, fmt, vargs); 26821b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron va_end(vargs); 26921b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron if (pf->name == NULL) { 27021b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron kfree(pf); 27121b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron return NULL; 27221b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron } 27321b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron pf->h = h; 27421b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron pf->thread = thread; 27521b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron pf->type = type; 276e65bc6ac6fa54959ac0b3712b0f35bbf073c073eJonathan Cameron pf->indio_dev = indio_dev; 27721b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron 27821b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron return pf; 27921b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron} 28021b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan CameronEXPORT_SYMBOL_GPL(iio_alloc_pollfunc); 28121b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron 28221b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameronvoid iio_dealloc_pollfunc(struct iio_poll_func *pf) 28321b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron{ 28421b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron kfree(pf->name); 28521b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron kfree(pf); 28621b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron} 28721b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan CameronEXPORT_SYMBOL_GPL(iio_dealloc_pollfunc); 28821b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron 2891637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron/** 290860c9c54272deaab43b40dbe416becb34abd344fPeter Meerwald * iio_trigger_read_current() - trigger consumer sysfs query current trigger 2911637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * 2921637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * For trigger consumers the current_trigger interface allows the trigger 2931637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * used by the device to be queried. 2941637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron **/ 2951637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic ssize_t iio_trigger_read_current(struct device *dev, 2961637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron struct device_attribute *attr, 2971637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron char *buf) 2981637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 299e53f5ac52ec19c8c606aeacdd13fed2a03d7365aLars-Peter Clausen struct iio_dev *indio_dev = dev_to_iio_dev(dev); 300cb6c89a094df3823a1797b880e5dfda2fbfcd584Jonathan Cameron 301f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron if (indio_dev->trig) 302f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron return sprintf(buf, "%s\n", indio_dev->trig->name); 303cb6c89a094df3823a1797b880e5dfda2fbfcd584Jonathan Cameron return 0; 3041637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 3051637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 3061637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron/** 307860c9c54272deaab43b40dbe416becb34abd344fPeter Meerwald * iio_trigger_write_current() - trigger consumer sysfs set current trigger 3081637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * 3091637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * For trigger consumers the current_trigger interface allows the trigger 31017666ef3c765afa9f70de1f3c733a2f7ea2f6ca3Peter Meerwald * used for this device to be specified at run time based on the trigger's 3111637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * name. 3121637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron **/ 3131637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic ssize_t iio_trigger_write_current(struct device *dev, 3141637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron struct device_attribute *attr, 3151637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron const char *buf, 3161637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron size_t len) 3171637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 318e53f5ac52ec19c8c606aeacdd13fed2a03d7365aLars-Peter Clausen struct iio_dev *indio_dev = dev_to_iio_dev(dev); 319f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron struct iio_trigger *oldtrig = indio_dev->trig; 32043a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich struct iio_trigger *trig; 32143a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich int ret; 32243a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich 323f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron mutex_lock(&indio_dev->mlock); 324f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) { 325f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron mutex_unlock(&indio_dev->mlock); 3261637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron return -EBUSY; 3271637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron } 328f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron mutex_unlock(&indio_dev->mlock); 3291637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 33043a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich trig = iio_trigger_find_by_name(buf, len); 3315dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron if (oldtrig == trig) 3325dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron return len; 33343a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich 334f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron if (trig && indio_dev->info->validate_trigger) { 335f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron ret = indio_dev->info->validate_trigger(indio_dev, trig); 33643a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich if (ret) 33743a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich return ret; 33843a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich } 33943a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich 340d29f73db791098179af90e6a5b1df41f941b32cdJonathan Cameron if (trig && trig->ops && trig->ops->validate_device) { 341f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron ret = trig->ops->validate_device(trig, indio_dev); 34243a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich if (ret) 34343a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich return ret; 34443a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich } 34543a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich 346f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron indio_dev->trig = trig; 34743a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich 348a35e1fd26826faa5595bcb4c8ab370f331221ff7Peter Meerwald if (oldtrig) 3497cbb753701d11f3c71e8543e1ae0fc0772edac06Lars-Peter Clausen iio_trigger_put(oldtrig); 350f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron if (indio_dev->trig) 3517cbb753701d11f3c71e8543e1ae0fc0772edac06Lars-Peter Clausen iio_trigger_get(indio_dev->trig); 3521637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 3531637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron return len; 3541637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 3551637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 35674112d3f3a64afb98179169cf8af691ccc63434dGreg Kroah-Hartmanstatic DEVICE_ATTR(current_trigger, S_IRUGO | S_IWUSR, 35774112d3f3a64afb98179169cf8af691ccc63434dGreg Kroah-Hartman iio_trigger_read_current, 35874112d3f3a64afb98179169cf8af691ccc63434dGreg Kroah-Hartman iio_trigger_write_current); 3591637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 3601637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic struct attribute *iio_trigger_consumer_attrs[] = { 3611637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron &dev_attr_current_trigger.attr, 3621637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron NULL, 3631637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron}; 3641637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 3651637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic const struct attribute_group iio_trigger_consumer_attr_group = { 3661637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron .name = "trigger", 3671637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron .attrs = iio_trigger_consumer_attrs, 3681637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron}; 3691637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 3701637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic void iio_trig_release(struct device *device) 3711637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 3721637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron struct iio_trigger *trig = to_iio_trigger(device); 373d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron int i; 374d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron 375d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron if (trig->subirq_base) { 376d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++) { 377d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron irq_modify_status(trig->subirq_base + i, 378d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron IRQ_NOAUTOEN, 379d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron IRQ_NOREQUEST | IRQ_NOPROBE); 380d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron irq_set_chip(trig->subirq_base + i, 381d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron NULL); 382d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron irq_set_handler(trig->subirq_base + i, 383d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron NULL); 384d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron } 385d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron 386d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron irq_free_descs(trig->subirq_base, 387d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron CONFIG_IIO_CONSUMERS_PER_TRIGGER); 388d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron } 38959c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron kfree(trig->name); 3901637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron kfree(trig); 3911637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 3921637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 3931637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic struct device_type iio_trig_type = { 3941637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron .release = iio_trig_release, 395f59c2576c12d4367ca4bdade0eb054b4558f9762Axel Lin .groups = iio_trig_dev_groups, 3961637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron}; 3971637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 398d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameronstatic void iio_trig_subirqmask(struct irq_data *d) 399d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron{ 400d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron struct irq_chip *chip = irq_data_get_irq_chip(d); 401d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron struct iio_trigger *trig 402d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron = container_of(chip, 403d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron struct iio_trigger, subirq_chip); 404d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron trig->subirqs[d->irq - trig->subirq_base].enabled = false; 405d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron} 406d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron 407d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameronstatic void iio_trig_subirqunmask(struct irq_data *d) 408d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron{ 409d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron struct irq_chip *chip = irq_data_get_irq_chip(d); 410d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron struct iio_trigger *trig 411d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron = container_of(chip, 412d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron struct iio_trigger, subirq_chip); 413d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron trig->subirqs[d->irq - trig->subirq_base].enabled = true; 414d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron} 415d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron 416d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewskistatic struct iio_trigger *viio_trigger_alloc(const char *fmt, va_list vargs) 4171637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 4181637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron struct iio_trigger *trig; 4191637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron trig = kzalloc(sizeof *trig, GFP_KERNEL); 4201637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron if (trig) { 421d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron int i; 4221637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron trig->dev.type = &iio_trig_type; 4235aaaeba82e00958ecb2c890b4953a249bbde9426Jonathan Cameron trig->dev.bus = &iio_bus_type; 4241637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron device_initialize(&trig->dev); 425d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron 42659c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron mutex_init(&trig->pool_lock); 42759c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron trig->subirq_base 42859c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron = irq_alloc_descs(-1, 0, 42959c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron CONFIG_IIO_CONSUMERS_PER_TRIGGER, 43059c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron 0); 43159c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron if (trig->subirq_base < 0) { 43259c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron kfree(trig); 43359c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron return NULL; 43459c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron } 435d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 43659c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron trig->name = kvasprintf(GFP_KERNEL, fmt, vargs); 43759c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron if (trig->name == NULL) { 43859c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron irq_free_descs(trig->subirq_base, 43959c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron CONFIG_IIO_CONSUMERS_PER_TRIGGER); 44059c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron kfree(trig); 44159c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron return NULL; 44259c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron } 44359c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron trig->subirq_chip.name = trig->name; 44459c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron trig->subirq_chip.irq_mask = &iio_trig_subirqmask; 44559c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron trig->subirq_chip.irq_unmask = &iio_trig_subirqunmask; 44659c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++) { 44759c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron irq_set_chip(trig->subirq_base + i, 44859c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron &trig->subirq_chip); 44959c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron irq_set_handler(trig->subirq_base + i, 45059c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron &handle_simple_irq); 45159c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron irq_modify_status(trig->subirq_base + i, 45259c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron IRQ_NOREQUEST | IRQ_NOAUTOEN, 45359c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron IRQ_NOPROBE); 454d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron } 4555f9c035cae18be30b70efc88c3c88b34283db62fJonathan Cameron get_device(&trig->dev); 4561637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron } 457d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 458d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski return trig; 459d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski} 460d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 461d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewskistruct iio_trigger *iio_trigger_alloc(const char *fmt, ...) 462d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski{ 463d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski struct iio_trigger *trig; 464d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski va_list vargs; 465d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 466d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski va_start(vargs, fmt); 467d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski trig = viio_trigger_alloc(fmt, vargs); 468d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski va_end(vargs); 469d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 4701637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron return trig; 4711637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 4727cbb753701d11f3c71e8543e1ae0fc0772edac06Lars-Peter ClausenEXPORT_SYMBOL(iio_trigger_alloc); 4731637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 4747cbb753701d11f3c71e8543e1ae0fc0772edac06Lars-Peter Clausenvoid iio_trigger_free(struct iio_trigger *trig) 4751637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 4761637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron if (trig) 4771637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron put_device(&trig->dev); 4781637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 4797cbb753701d11f3c71e8543e1ae0fc0772edac06Lars-Peter ClausenEXPORT_SYMBOL(iio_trigger_free); 4801637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 481d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewskistatic void devm_iio_trigger_release(struct device *dev, void *res) 482d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski{ 483d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski iio_trigger_free(*(struct iio_trigger **)res); 484d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski} 485d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 486d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewskistatic int devm_iio_trigger_match(struct device *dev, void *res, void *data) 487d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski{ 488d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski struct iio_trigger **r = res; 489d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 490d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski if (!r || !*r) { 491d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski WARN_ON(!r || !*r); 492d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski return 0; 493d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski } 494d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 495d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski return *r == data; 496d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski} 497d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 498a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat/** 499a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * devm_iio_trigger_alloc - Resource-managed iio_trigger_alloc() 500a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * @dev: Device to allocate iio_trigger for 501a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * @fmt: trigger name format. If it includes format 502a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * specifiers, the additional arguments following 503a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * format are formatted and inserted in the resulting 504a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * string replacing their respective specifiers. 505a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * 506a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * Managed iio_trigger_alloc. iio_trigger allocated with this function is 507a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * automatically freed on driver detach. 508a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * 509a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * If an iio_trigger allocated with this function needs to be freed separately, 510a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * devm_iio_trigger_free() must be used. 511a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * 512a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * RETURNS: 513a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * Pointer to allocated iio_trigger on success, NULL on failure. 514a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat */ 515d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewskistruct iio_trigger *devm_iio_trigger_alloc(struct device *dev, 516d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski const char *fmt, ...) 517d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski{ 518d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski struct iio_trigger **ptr, *trig; 519d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski va_list vargs; 520d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 521d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski ptr = devres_alloc(devm_iio_trigger_release, sizeof(*ptr), 522d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski GFP_KERNEL); 523d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski if (!ptr) 524d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski return NULL; 525d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 526d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski /* use raw alloc_dr for kmalloc caller tracing */ 527d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski va_start(vargs, fmt); 528d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski trig = viio_trigger_alloc(fmt, vargs); 529d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski va_end(vargs); 530d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski if (trig) { 531d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski *ptr = trig; 532d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski devres_add(dev, ptr); 533d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski } else { 534d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski devres_free(ptr); 535d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski } 536d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 537d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski return trig; 538d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski} 539d536321df392ee0db6a5e92d98f0303020315f40Jacek AnaszewskiEXPORT_SYMBOL_GPL(devm_iio_trigger_alloc); 540d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 541a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat/** 542a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * devm_iio_trigger_free - Resource-managed iio_trigger_free() 543a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * @dev: Device this iio_dev belongs to 544a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * @iio_trig: the iio_trigger associated with the device 545a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * 546a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat * Free iio_trigger allocated with devm_iio_trigger_alloc(). 547a7e57dce02ceb8212f106191fdfbc0fcb61ce9e0Sachin Kamat */ 548d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewskivoid devm_iio_trigger_free(struct device *dev, struct iio_trigger *iio_trig) 549d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski{ 550d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski int rc; 551d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 552d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski rc = devres_release(dev, devm_iio_trigger_release, 553d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski devm_iio_trigger_match, iio_trig); 554d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski WARN_ON(rc); 555d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski} 556d536321df392ee0db6a5e92d98f0303020315f40Jacek AnaszewskiEXPORT_SYMBOL_GPL(devm_iio_trigger_free); 557d536321df392ee0db6a5e92d98f0303020315f40Jacek Anaszewski 55867be8e32c9f98453faeb9a992a47bd5910c9fb2eJonathan Cameronvoid iio_device_register_trigger_consumer(struct iio_dev *indio_dev) 5591637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 560f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron indio_dev->groups[indio_dev->groupcounter++] = 56126d25ae3f0d8ffe350aacc75b71198d6b35bd1f4Jonathan Cameron &iio_trigger_consumer_attr_group; 5621637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 5631637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 564f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameronvoid iio_device_unregister_trigger_consumer(struct iio_dev *indio_dev) 5651637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 566860c9c54272deaab43b40dbe416becb34abd344fPeter Meerwald /* Clean up an associated but not attached trigger reference */ 567f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron if (indio_dev->trig) 5687cbb753701d11f3c71e8543e1ae0fc0772edac06Lars-Peter Clausen iio_trigger_put(indio_dev->trig); 5691637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 5701637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 5713b99fb7656a73d483b00fd4777646c00db16b040Jonathan Cameronint iio_triggered_buffer_postenable(struct iio_dev *indio_dev) 572c3db00cc80cf01f9a2033c3f3eb03345d0024761Jonathan Cameron{ 57367be8e32c9f98453faeb9a992a47bd5910c9fb2eJonathan Cameron return iio_trigger_attach_poll_func(indio_dev->trig, 57467be8e32c9f98453faeb9a992a47bd5910c9fb2eJonathan Cameron indio_dev->pollfunc); 575c3db00cc80cf01f9a2033c3f3eb03345d0024761Jonathan Cameron} 5763b99fb7656a73d483b00fd4777646c00db16b040Jonathan CameronEXPORT_SYMBOL(iio_triggered_buffer_postenable); 577c3db00cc80cf01f9a2033c3f3eb03345d0024761Jonathan Cameron 5783b99fb7656a73d483b00fd4777646c00db16b040Jonathan Cameronint iio_triggered_buffer_predisable(struct iio_dev *indio_dev) 579c3db00cc80cf01f9a2033c3f3eb03345d0024761Jonathan Cameron{ 580034bd7b5d926816285deb71c41a230b912524f8bPeter Meerwald return iio_trigger_detach_poll_func(indio_dev->trig, 58167be8e32c9f98453faeb9a992a47bd5910c9fb2eJonathan Cameron indio_dev->pollfunc); 582c3db00cc80cf01f9a2033c3f3eb03345d0024761Jonathan Cameron} 5833b99fb7656a73d483b00fd4777646c00db16b040Jonathan CameronEXPORT_SYMBOL(iio_triggered_buffer_predisable); 584