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