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 181637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron#include "iio.h" 191637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron#include "trigger.h" 20df9c1c42c26f9a516dd44c956cff301741a0884eJonathan Cameron#include "iio_core.h" 216aea1c364cde5b28b551844b7b8925f523310a18Jonathan Cameron#include "iio_core_trigger.h" 223f72395ee595a2a2fe1ed01c006c4f0cce313512Jonathan Cameron#include "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{ 4859c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron struct iio_trigger *trig = dev_get_drvdata(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 5459c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron/** 551637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * iio_trigger_register_sysfs() - create a device for this trigger 561637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * @trig_info: the trigger 571637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * 581637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * Also adds any control attribute registered by the trigger driver 591637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron **/ 601637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic int iio_trigger_register_sysfs(struct iio_trigger *trig_info) 611637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 6259c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron return sysfs_add_file_to_group(&trig_info->dev.kobj, 6359c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron &dev_attr_name.attr, 6459c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron NULL); 651637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 661637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 671637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic void iio_trigger_unregister_sysfs(struct iio_trigger *trig_info) 681637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 6959c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron sysfs_remove_file_from_group(&trig_info->dev.kobj, 7059c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron &dev_attr_name.attr, 7159c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron NULL); 721637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 731637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 741637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronint iio_trigger_register(struct iio_trigger *trig_info) 751637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 761637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron int ret; 771637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 7847c24fdd4253a2c8d730b978a186923b1af5e879Jonathan Cameron trig_info->id = ida_simple_get(&iio_trigger_ida, 0, 0, GFP_KERNEL); 7947c24fdd4253a2c8d730b978a186923b1af5e879Jonathan Cameron if (trig_info->id < 0) { 8047c24fdd4253a2c8d730b978a186923b1af5e879Jonathan Cameron ret = trig_info->id; 811637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron goto error_ret; 8247c24fdd4253a2c8d730b978a186923b1af5e879Jonathan Cameron } 831637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron /* Set the name used for the sysfs directory etc */ 841637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron dev_set_name(&trig_info->dev, "trigger%ld", 851637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron (unsigned long) trig_info->id); 861637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 871637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron ret = device_add(&trig_info->dev); 881637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron if (ret) 891637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron goto error_unregister_id; 901637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 911637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron ret = iio_trigger_register_sysfs(trig_info); 921637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron if (ret) 931637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron goto error_device_del; 941637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 951637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron /* Add to list of available triggers held by the IIO core */ 961637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron mutex_lock(&iio_trigger_list_lock); 971637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron list_add_tail(&trig_info->list, &iio_trigger_list); 981637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron mutex_unlock(&iio_trigger_list_lock); 991637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 1001637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron return 0; 1011637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 1021637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronerror_device_del: 1031637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron device_del(&trig_info->dev); 1041637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronerror_unregister_id: 10547c24fdd4253a2c8d730b978a186923b1af5e879Jonathan Cameron ida_simple_remove(&iio_trigger_ida, trig_info->id); 1061637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronerror_ret: 1071637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron return ret; 1081637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 1091637db44413e32a0f100dd4bd164644e641842f7Jonathan CameronEXPORT_SYMBOL(iio_trigger_register); 1101637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 1111637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronvoid iio_trigger_unregister(struct iio_trigger *trig_info) 1121637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 1131637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron mutex_lock(&iio_trigger_list_lock); 114582e548908729dd2f3e183fda5a8b7c2e2ca0b0eJonathan Cameron list_del(&trig_info->list); 1151637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron mutex_unlock(&iio_trigger_list_lock); 1161637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 1171637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron iio_trigger_unregister_sysfs(trig_info); 11847c24fdd4253a2c8d730b978a186923b1af5e879Jonathan Cameron ida_simple_remove(&iio_trigger_ida, trig_info->id); 1191637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron /* Possible issue in here */ 1201637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron device_unregister(&trig_info->dev); 1211637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 1221637db44413e32a0f100dd4bd164644e641842f7Jonathan CameronEXPORT_SYMBOL(iio_trigger_unregister); 1231637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 124f6517f22d4f6336ce37dc6b72aae4704ff872ba3Jonathan Cameronstatic struct iio_trigger *iio_trigger_find_by_name(const char *name, 125f6517f22d4f6336ce37dc6b72aae4704ff872ba3Jonathan Cameron size_t len) 1261637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 127f6517f22d4f6336ce37dc6b72aae4704ff872ba3Jonathan Cameron struct iio_trigger *trig = NULL, *iter; 1287c327857016116eba1595c67c25d0314d1385e85Michael Hennerich 1291637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron mutex_lock(&iio_trigger_list_lock); 130f6517f22d4f6336ce37dc6b72aae4704ff872ba3Jonathan Cameron list_for_each_entry(iter, &iio_trigger_list, list) 131f6517f22d4f6336ce37dc6b72aae4704ff872ba3Jonathan Cameron if (sysfs_streq(iter->name, name)) { 132f6517f22d4f6336ce37dc6b72aae4704ff872ba3Jonathan Cameron trig = iter; 1331637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron break; 1341637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron } 1351637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron mutex_unlock(&iio_trigger_list_lock); 1361637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 137f6517f22d4f6336ce37dc6b72aae4704ff872ba3Jonathan Cameron return trig; 1385f87404dfce14b2a194d085b7bac4b8c3672ab00Jonathan Cameron} 1391637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 1407b2c33b11ef003d83c87a58201ff42313e13eff4Jonathan Cameronvoid iio_trigger_poll(struct iio_trigger *trig, s64 time) 1411637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 142d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron int i; 143cb6c89a094df3823a1797b880e5dfda2fbfcd584Jonathan Cameron if (!trig->use_count) 144d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++) 145d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron if (trig->subirqs[i].enabled) { 146d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron trig->use_count++; 147d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron generic_handle_irq(trig->subirq_base + i); 148d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron } 1491637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 1501637db44413e32a0f100dd4bd164644e641842f7Jonathan CameronEXPORT_SYMBOL(iio_trigger_poll); 1518384d9573e937949eba96eaa1323253c2687aa5cJonathan Cameron 1528384d9573e937949eba96eaa1323253c2687aa5cJonathan Cameronirqreturn_t iio_trigger_generic_data_rdy_poll(int irq, void *private) 1538384d9573e937949eba96eaa1323253c2687aa5cJonathan Cameron{ 1548384d9573e937949eba96eaa1323253c2687aa5cJonathan Cameron iio_trigger_poll(private, iio_get_time_ns()); 1558384d9573e937949eba96eaa1323253c2687aa5cJonathan Cameron return IRQ_HANDLED; 1568384d9573e937949eba96eaa1323253c2687aa5cJonathan Cameron} 1578384d9573e937949eba96eaa1323253c2687aa5cJonathan CameronEXPORT_SYMBOL(iio_trigger_generic_data_rdy_poll); 1581637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 1591f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameronvoid iio_trigger_poll_chained(struct iio_trigger *trig, s64 time) 1601f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameron{ 1611f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameron int i; 162e69616b1e65cb9d3dcf34399e8fac331911abfe5Jonathan Cameron if (!trig->use_count) 1631f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameron for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++) 1641f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameron if (trig->subirqs[i].enabled) { 1651f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameron trig->use_count++; 1661f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameron handle_nested_irq(trig->subirq_base + i); 1671f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameron } 1681f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameron} 1691f785681a87068f123d3e23da13b2c55ab4f93acJonathan CameronEXPORT_SYMBOL(iio_trigger_poll_chained); 1701f785681a87068f123d3e23da13b2c55ab4f93acJonathan Cameron 1711637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronvoid iio_trigger_notify_done(struct iio_trigger *trig) 1721637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 1731637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron trig->use_count--; 174d29f73db791098179af90e6a5b1df41f941b32cdJonathan Cameron if (trig->use_count == 0 && trig->ops && trig->ops->try_reenable) 175e69616b1e65cb9d3dcf34399e8fac331911abfe5Jonathan Cameron if (trig->ops->try_reenable(trig)) 1761637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron /* Missed and interrupt so launch new poll now */ 1777b2c33b11ef003d83c87a58201ff42313e13eff4Jonathan Cameron iio_trigger_poll(trig, 0); 1781637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 1791637db44413e32a0f100dd4bd164644e641842f7Jonathan CameronEXPORT_SYMBOL(iio_trigger_notify_done); 1801637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 1811637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron/* Trigger Consumer related functions */ 182208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameronstatic int iio_trigger_get_irq(struct iio_trigger *trig) 183208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron{ 184208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron int ret; 185208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron mutex_lock(&trig->pool_lock); 186208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron ret = bitmap_find_free_region(trig->pool, 187208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron CONFIG_IIO_CONSUMERS_PER_TRIGGER, 188208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron ilog2(1)); 189208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron mutex_unlock(&trig->pool_lock); 190208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron if (ret >= 0) 191208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron ret += trig->subirq_base; 192208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron 193208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron return ret; 194208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron} 195208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron 196208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameronstatic void iio_trigger_put_irq(struct iio_trigger *trig, int irq) 197208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron{ 198208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron mutex_lock(&trig->pool_lock); 199208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron clear_bit(irq - trig->subirq_base, trig->pool); 200208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron mutex_unlock(&trig->pool_lock); 201208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron} 2021637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 2031637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron/* Complexity in here. With certain triggers (datardy) an acknowledgement 2041637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * may be needed if the pollfuncs do not include the data read for the 2051637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * triggering device. 2061637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * This is not currently handled. Alternative of not enabling trigger unless 2071637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * the relevant function is in there may be the best option. 2081637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron */ 2091637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron/* Worth protecting against double additions?*/ 210208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameronstatic int iio_trigger_attach_poll_func(struct iio_trigger *trig, 211208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron struct iio_poll_func *pf) 2121637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 2131637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron int ret = 0; 21451c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron bool notinuse 21551c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron = bitmap_empty(trig->pool, CONFIG_IIO_CONSUMERS_PER_TRIGGER); 21651c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron 217f60c4a02aa05817f00408ecefdf221f44781e08aJonathan Cameron /* Prevent the module being removed whilst attached to a trigger */ 218f60c4a02aa05817f00408ecefdf221f44781e08aJonathan Cameron __module_get(pf->indio_dev->info->driver_module); 21951c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron pf->irq = iio_trigger_get_irq(trig); 22051c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron ret = request_threaded_irq(pf->irq, pf->h, pf->thread, 22151c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron pf->type, pf->name, 22251c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron pf); 2235dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron if (ret < 0) { 2245dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron module_put(pf->indio_dev->info->driver_module); 2255dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron return ret; 2265dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron } 2275dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron 2285dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron if (trig->ops && trig->ops->set_trigger_state && notinuse) { 229d29f73db791098179af90e6a5b1df41f941b32cdJonathan Cameron ret = trig->ops->set_trigger_state(trig, true); 2305dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron if (ret < 0) 2315dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron module_put(pf->indio_dev->info->driver_module); 2325dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron } 233d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron 2341637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron return ret; 2351637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 2361637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 237208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameronstatic int iio_trigger_dettach_poll_func(struct iio_trigger *trig, 238208b813c04ef7e628783cc62eeb1a140ae25bd19Jonathan Cameron struct iio_poll_func *pf) 2391637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 24051c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron int ret = 0; 24151c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron bool no_other_users 24251c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron = (bitmap_weight(trig->pool, 24351c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron CONFIG_IIO_CONSUMERS_PER_TRIGGER) 24451c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron == 1); 245d29f73db791098179af90e6a5b1df41f941b32cdJonathan Cameron if (trig->ops && trig->ops->set_trigger_state && no_other_users) { 246d29f73db791098179af90e6a5b1df41f941b32cdJonathan Cameron ret = trig->ops->set_trigger_state(trig, false); 24751c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron if (ret) 24851c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron goto error_ret; 2491637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron } 25051c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron iio_trigger_put_irq(trig, pf->irq); 25151c060a069376385bc0c2f8010121303d3b7bd57Jonathan Cameron free_irq(pf->irq, pf); 252f60c4a02aa05817f00408ecefdf221f44781e08aJonathan Cameron module_put(pf->indio_dev->info->driver_module); 2531637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 2541637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronerror_ret: 2551637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron return ret; 2561637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 2571637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 258d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameronirqreturn_t iio_pollfunc_store_time(int irq, void *p) 259d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron{ 260d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron struct iio_poll_func *pf = p; 261d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron pf->timestamp = iio_get_time_ns(); 262d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron return IRQ_WAKE_THREAD; 263d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron} 264d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan CameronEXPORT_SYMBOL(iio_pollfunc_store_time); 265d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron 26621b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameronstruct iio_poll_func 26721b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron*iio_alloc_pollfunc(irqreturn_t (*h)(int irq, void *p), 26821b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron irqreturn_t (*thread)(int irq, void *p), 26921b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron int type, 270e65bc6ac6fa54959ac0b3712b0f35bbf073c073eJonathan Cameron struct iio_dev *indio_dev, 27121b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron const char *fmt, 27221b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron ...) 27321b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron{ 27421b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron va_list vargs; 27521b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron struct iio_poll_func *pf; 27621b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron 27721b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron pf = kmalloc(sizeof *pf, GFP_KERNEL); 27821b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron if (pf == NULL) 27921b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron return NULL; 28021b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron va_start(vargs, fmt); 28121b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron pf->name = kvasprintf(GFP_KERNEL, fmt, vargs); 28221b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron va_end(vargs); 28321b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron if (pf->name == NULL) { 28421b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron kfree(pf); 28521b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron return NULL; 28621b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron } 28721b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron pf->h = h; 28821b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron pf->thread = thread; 28921b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron pf->type = type; 290e65bc6ac6fa54959ac0b3712b0f35bbf073c073eJonathan Cameron pf->indio_dev = indio_dev; 29121b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron 29221b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron return pf; 29321b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron} 29421b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan CameronEXPORT_SYMBOL_GPL(iio_alloc_pollfunc); 29521b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron 29621b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameronvoid iio_dealloc_pollfunc(struct iio_poll_func *pf) 29721b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron{ 29821b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron kfree(pf->name); 29921b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron kfree(pf); 30021b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron} 30121b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan CameronEXPORT_SYMBOL_GPL(iio_dealloc_pollfunc); 30221b185f8d5951ebbf76d61f431fb541dce5113d1Jonathan Cameron 3031637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron/** 30442b2aa86c6670347a2a07e6d7af0e0ecc8fdbff9Justin P. Mattock * iio_trigger_read_current() - trigger consumer sysfs query which trigger 3051637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * 3061637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * For trigger consumers the current_trigger interface allows the trigger 3071637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * used by the device to be queried. 3081637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron **/ 3091637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic ssize_t iio_trigger_read_current(struct device *dev, 3101637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron struct device_attribute *attr, 3111637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron char *buf) 3121637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 313f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron struct iio_dev *indio_dev = dev_get_drvdata(dev); 314cb6c89a094df3823a1797b880e5dfda2fbfcd584Jonathan Cameron 315f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron if (indio_dev->trig) 316f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron return sprintf(buf, "%s\n", indio_dev->trig->name); 317cb6c89a094df3823a1797b880e5dfda2fbfcd584Jonathan Cameron return 0; 3181637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 3191637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 3201637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron/** 3211637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * iio_trigger_write_current() trigger consumer sysfs set current trigger 3221637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * 3231637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * For trigger consumers the current_trigger interface allows the trigger 3241637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * used for this device to be specified at run time based on the triggers 3251637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron * name. 3261637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron **/ 3271637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic ssize_t iio_trigger_write_current(struct device *dev, 3281637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron struct device_attribute *attr, 3291637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron const char *buf, 3301637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron size_t len) 3311637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 332f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron struct iio_dev *indio_dev = dev_get_drvdata(dev); 333f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron struct iio_trigger *oldtrig = indio_dev->trig; 33443a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich struct iio_trigger *trig; 33543a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich int ret; 33643a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich 337f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron mutex_lock(&indio_dev->mlock); 338f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) { 339f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron mutex_unlock(&indio_dev->mlock); 3401637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron return -EBUSY; 3411637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron } 342f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron mutex_unlock(&indio_dev->mlock); 3431637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 34443a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich trig = iio_trigger_find_by_name(buf, len); 3455dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron if (oldtrig == trig) 3465dd72ecb0166498852705939163f375d693d37f3Jonathan Cameron return len; 34743a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich 348f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron if (trig && indio_dev->info->validate_trigger) { 349f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron ret = indio_dev->info->validate_trigger(indio_dev, trig); 35043a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich if (ret) 35143a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich return ret; 35243a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich } 35343a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich 354d29f73db791098179af90e6a5b1df41f941b32cdJonathan Cameron if (trig && trig->ops && trig->ops->validate_device) { 355f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron ret = trig->ops->validate_device(trig, indio_dev); 35643a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich if (ret) 35743a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich return ret; 35843a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich } 35943a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich 360f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron indio_dev->trig = trig; 36143a4360ea8f075540cb7c1efc8d643b4261eb901Michael Hennerich 362f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron if (oldtrig && indio_dev->trig != oldtrig) 3631637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron iio_put_trigger(oldtrig); 364f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron if (indio_dev->trig) 365f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron iio_get_trigger(indio_dev->trig); 3661637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 3671637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron return len; 3681637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 3691637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 37074112d3f3a64afb98179169cf8af691ccc63434dGreg Kroah-Hartmanstatic DEVICE_ATTR(current_trigger, S_IRUGO | S_IWUSR, 37174112d3f3a64afb98179169cf8af691ccc63434dGreg Kroah-Hartman iio_trigger_read_current, 37274112d3f3a64afb98179169cf8af691ccc63434dGreg Kroah-Hartman iio_trigger_write_current); 3731637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 3741637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic struct attribute *iio_trigger_consumer_attrs[] = { 3751637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron &dev_attr_current_trigger.attr, 3761637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron NULL, 3771637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron}; 3781637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 3791637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic const struct attribute_group iio_trigger_consumer_attr_group = { 3801637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron .name = "trigger", 3811637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron .attrs = iio_trigger_consumer_attrs, 3821637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron}; 3831637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 3841637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic void iio_trig_release(struct device *device) 3851637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 3861637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron struct iio_trigger *trig = to_iio_trigger(device); 387d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron int i; 388d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron 389d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron if (trig->subirq_base) { 390d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++) { 391d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron irq_modify_status(trig->subirq_base + i, 392d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron IRQ_NOAUTOEN, 393d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron IRQ_NOREQUEST | IRQ_NOPROBE); 394d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron irq_set_chip(trig->subirq_base + i, 395d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron NULL); 396d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron irq_set_handler(trig->subirq_base + i, 397d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron NULL); 398d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron } 399d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron 400d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron irq_free_descs(trig->subirq_base, 401d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron CONFIG_IIO_CONSUMERS_PER_TRIGGER); 402d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron } 40359c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron kfree(trig->name); 4041637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron kfree(trig); 4051637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 4061637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 4071637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronstatic struct device_type iio_trig_type = { 4081637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron .release = iio_trig_release, 4091637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron}; 4101637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 411d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameronstatic void iio_trig_subirqmask(struct irq_data *d) 412d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron{ 413d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron struct irq_chip *chip = irq_data_get_irq_chip(d); 414d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron struct iio_trigger *trig 415d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron = container_of(chip, 416d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron struct iio_trigger, subirq_chip); 417d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron trig->subirqs[d->irq - trig->subirq_base].enabled = false; 418d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron} 419d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron 420d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameronstatic void iio_trig_subirqunmask(struct irq_data *d) 421d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron{ 422d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron struct irq_chip *chip = irq_data_get_irq_chip(d); 423d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron struct iio_trigger *trig 424d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron = container_of(chip, 425d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron struct iio_trigger, subirq_chip); 426d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron trig->subirqs[d->irq - trig->subirq_base].enabled = true; 427d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron} 428d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron 42959c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameronstruct iio_trigger *iio_allocate_trigger(const char *fmt, ...) 4301637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 43159c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron va_list vargs; 4321637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron struct iio_trigger *trig; 4331637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron trig = kzalloc(sizeof *trig, GFP_KERNEL); 4341637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron if (trig) { 435d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron int i; 4361637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron trig->dev.type = &iio_trig_type; 4375aaaeba82e00958ecb2c890b4953a249bbde9426Jonathan Cameron trig->dev.bus = &iio_bus_type; 4381637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron device_initialize(&trig->dev); 4391637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron dev_set_drvdata(&trig->dev, (void *)trig); 440d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron 44159c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron mutex_init(&trig->pool_lock); 44259c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron trig->subirq_base 44359c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron = irq_alloc_descs(-1, 0, 44459c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron CONFIG_IIO_CONSUMERS_PER_TRIGGER, 44559c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron 0); 44659c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron if (trig->subirq_base < 0) { 44759c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron kfree(trig); 44859c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron return NULL; 44959c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron } 45059c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron va_start(vargs, fmt); 45159c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron trig->name = kvasprintf(GFP_KERNEL, fmt, vargs); 45259c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron va_end(vargs); 45359c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron if (trig->name == NULL) { 45459c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron irq_free_descs(trig->subirq_base, 45559c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron CONFIG_IIO_CONSUMERS_PER_TRIGGER); 45659c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron kfree(trig); 45759c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron return NULL; 45859c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron } 45959c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron trig->subirq_chip.name = trig->name; 46059c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron trig->subirq_chip.irq_mask = &iio_trig_subirqmask; 46159c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron trig->subirq_chip.irq_unmask = &iio_trig_subirqunmask; 46259c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++) { 46359c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron irq_set_chip(trig->subirq_base + i, 46459c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron &trig->subirq_chip); 46559c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron irq_set_handler(trig->subirq_base + i, 46659c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron &handle_simple_irq); 46759c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron irq_modify_status(trig->subirq_base + i, 46859c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron IRQ_NOREQUEST | IRQ_NOAUTOEN, 46959c85e82c2e7a672cb4342dc5ccf9df8a3a14f73Jonathan Cameron IRQ_NOPROBE); 470d96d1337e339521a2bd56dc9d51fef140c1a49eeJonathan Cameron } 4715f9c035cae18be30b70efc88c3c88b34283db62fJonathan Cameron get_device(&trig->dev); 4721637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron } 4731637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron return trig; 4741637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 4751637db44413e32a0f100dd4bd164644e641842f7Jonathan CameronEXPORT_SYMBOL(iio_allocate_trigger); 4761637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 4771637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameronvoid iio_free_trigger(struct iio_trigger *trig) 4781637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 4791637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron if (trig) 4801637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron put_device(&trig->dev); 4811637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 4821637db44413e32a0f100dd4bd164644e641842f7Jonathan CameronEXPORT_SYMBOL(iio_free_trigger); 4831637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 48467be8e32c9f98453faeb9a992a47bd5910c9fb2eJonathan Cameronvoid iio_device_register_trigger_consumer(struct iio_dev *indio_dev) 4851637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 486f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron indio_dev->groups[indio_dev->groupcounter++] = 48726d25ae3f0d8ffe350aacc75b71198d6b35bd1f4Jonathan Cameron &iio_trigger_consumer_attr_group; 4881637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 4891637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 490f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameronvoid iio_device_unregister_trigger_consumer(struct iio_dev *indio_dev) 4911637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron{ 4925f9c035cae18be30b70efc88c3c88b34283db62fJonathan Cameron /* Clean up and associated but not attached triggers references */ 493f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron if (indio_dev->trig) 494f8c6f4e9a40d47ce86a641eb20fb7c5a59f06ff0Jonathan Cameron iio_put_trigger(indio_dev->trig); 4951637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron} 4961637db44413e32a0f100dd4bd164644e641842f7Jonathan Cameron 4973b99fb7656a73d483b00fd4777646c00db16b040Jonathan Cameronint iio_triggered_buffer_postenable(struct iio_dev *indio_dev) 498c3db00cc80cf01f9a2033c3f3eb03345d0024761Jonathan Cameron{ 49967be8e32c9f98453faeb9a992a47bd5910c9fb2eJonathan Cameron return iio_trigger_attach_poll_func(indio_dev->trig, 50067be8e32c9f98453faeb9a992a47bd5910c9fb2eJonathan Cameron indio_dev->pollfunc); 501c3db00cc80cf01f9a2033c3f3eb03345d0024761Jonathan Cameron} 5023b99fb7656a73d483b00fd4777646c00db16b040Jonathan CameronEXPORT_SYMBOL(iio_triggered_buffer_postenable); 503c3db00cc80cf01f9a2033c3f3eb03345d0024761Jonathan Cameron 5043b99fb7656a73d483b00fd4777646c00db16b040Jonathan Cameronint iio_triggered_buffer_predisable(struct iio_dev *indio_dev) 505c3db00cc80cf01f9a2033c3f3eb03345d0024761Jonathan Cameron{ 50667be8e32c9f98453faeb9a992a47bd5910c9fb2eJonathan Cameron return iio_trigger_dettach_poll_func(indio_dev->trig, 50767be8e32c9f98453faeb9a992a47bd5910c9fb2eJonathan Cameron indio_dev->pollfunc); 508c3db00cc80cf01f9a2033c3f3eb03345d0024761Jonathan Cameron} 5093b99fb7656a73d483b00fd4777646c00db16b040Jonathan CameronEXPORT_SYMBOL(iio_triggered_buffer_predisable); 510