[go: nahoru, domu]

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