2012-09-05 13:56:00 +01:00
/*
* HID Sensors Driver
* Copyright ( c ) 2012 , Intel Corporation .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms and conditions of the GNU General Public License ,
* version 2 , as published by the Free Software Foundation .
*
* This program is distributed in the hope it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License for
* more details .
*
* You should have received a copy of the GNU General Public License along with
* this program ; if not , write to the Free Software Foundation , Inc . ,
* 51 Franklin St - Fifth Floor , Boston , MA 02110 - 1301 USA .
*
*/
# include <linux/device.h>
# include <linux/platform_device.h>
# include <linux/module.h>
# include <linux/interrupt.h>
# include <linux/irq.h>
# include <linux/slab.h>
# include <linux/hid-sensor-hub.h>
# include <linux/iio/iio.h>
# include <linux/iio/trigger.h>
# include <linux/iio/sysfs.h>
# include "hid-sensor-trigger.h"
static int hid_sensor_data_rdy_trigger_set_state ( struct iio_trigger * trig ,
bool state )
{
2013-03-25 08:58:00 +00:00
struct hid_sensor_common * st = iio_trigger_get_drvdata ( trig ) ;
2012-09-05 13:56:00 +01:00
int state_val ;
2013-11-27 22:19:00 +00:00
int report_val ;
2012-09-05 13:56:00 +01:00
2013-09-18 18:13:00 +01:00
if ( state ) {
if ( sensor_hub_device_open ( st - > hsdev ) )
return - EIO ;
2013-11-27 22:19:00 +00:00
state_val =
HID_USAGE_SENSOR_PROP_POWER_STATE_D0_FULL_POWER_ENUM ;
report_val =
HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM ;
} else {
2013-09-18 18:13:00 +01:00
sensor_hub_device_close ( st - > hsdev ) ;
2013-11-27 22:19:00 +00:00
state_val =
HID_USAGE_SENSOR_PROP_POWER_STATE_D4_POWER_OFF_ENUM ;
report_val =
HID_USAGE_SENSOR_PROP_REPORTING_STATE_NO_EVENTS_ENUM ;
}
2013-09-18 18:13:00 +01:00
2012-09-05 13:56:00 +01:00
st - > data_ready = state ;
2013-11-27 22:19:00 +00:00
state_val + = st - > power_state . logical_minimum ;
report_val + = st - > report_state . logical_minimum ;
2012-09-05 13:56:00 +01:00
sensor_hub_set_feature ( st - > hsdev , st - > power_state . report_id ,
st - > power_state . index ,
( s32 ) state_val ) ;
sensor_hub_set_feature ( st - > hsdev , st - > report_state . report_id ,
st - > report_state . index ,
2013-11-27 22:19:00 +00:00
( s32 ) report_val ) ;
2012-09-05 13:56:00 +01:00
return 0 ;
}
2013-10-30 22:48:00 +00:00
void hid_sensor_remove_trigger ( struct hid_sensor_common * attrb )
2012-09-05 13:56:00 +01:00
{
2013-10-30 22:48:00 +00:00
iio_trigger_unregister ( attrb - > trigger ) ;
iio_trigger_free ( attrb - > trigger ) ;
2012-09-05 13:56:00 +01:00
}
EXPORT_SYMBOL ( hid_sensor_remove_trigger ) ;
static const struct iio_trigger_ops hid_sensor_trigger_ops = {
. owner = THIS_MODULE ,
. set_trigger_state = & hid_sensor_data_rdy_trigger_set_state ,
} ;
int hid_sensor_setup_trigger ( struct iio_dev * indio_dev , const char * name ,
2012-12-15 12:45:00 +00:00
struct hid_sensor_common * attrb )
2012-09-05 13:56:00 +01:00
{
int ret ;
struct iio_trigger * trig ;
trig = iio_trigger_alloc ( " %s-dev%d " , name , indio_dev - > id ) ;
if ( trig = = NULL ) {
dev_err ( & indio_dev - > dev , " Trigger Allocate Failed \n " ) ;
ret = - ENOMEM ;
goto error_ret ;
}
trig - > dev . parent = indio_dev - > dev . parent ;
2013-03-25 08:58:00 +00:00
iio_trigger_set_drvdata ( trig , attrb ) ;
2012-09-05 13:56:00 +01:00
trig - > ops = & hid_sensor_trigger_ops ;
ret = iio_trigger_register ( trig ) ;
if ( ret ) {
dev_err ( & indio_dev - > dev , " Trigger Register Failed \n " ) ;
goto error_free_trig ;
}
2013-10-30 22:48:00 +00:00
indio_dev - > trig = attrb - > trigger = trig ;
2012-09-05 13:56:00 +01:00
return ret ;
error_free_trig :
iio_trigger_free ( trig ) ;
error_ret :
return ret ;
}
EXPORT_SYMBOL ( hid_sensor_setup_trigger ) ;
MODULE_AUTHOR ( " Srinivas Pandruvada <srinivas.pandruvada@intel.com> " ) ;
MODULE_DESCRIPTION ( " HID Sensor trigger processing " ) ;
MODULE_LICENSE ( " GPL " ) ;