0001
0002
0003
0004
0005
0006 #include <linux/device.h>
0007 #include <linux/platform_device.h>
0008 #include <linux/module.h>
0009 #include <linux/delay.h>
0010 #include <linux/hid-sensor-hub.h>
0011 #include <linux/workqueue.h>
0012 #include <linux/iio/iio.h>
0013 #include <linux/iio/trigger.h>
0014 #include <linux/iio/triggered_buffer.h>
0015 #include <linux/iio/trigger_consumer.h>
0016 #include <linux/iio/sysfs.h>
0017 #include "hid-sensor-trigger.h"
0018
0019 static ssize_t _hid_sensor_set_report_latency(struct device *dev,
0020 struct device_attribute *attr,
0021 const char *buf, size_t len)
0022 {
0023 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
0024 struct hid_sensor_common *attrb = iio_device_get_drvdata(indio_dev);
0025 int integer, fract, ret;
0026 int latency;
0027
0028 ret = iio_str_to_fixpoint(buf, 100000, &integer, &fract);
0029 if (ret)
0030 return ret;
0031
0032 latency = integer * 1000 + fract / 1000;
0033 ret = hid_sensor_set_report_latency(attrb, latency);
0034 if (ret < 0)
0035 return len;
0036
0037 attrb->latency_ms = hid_sensor_get_report_latency(attrb);
0038
0039 return len;
0040 }
0041
0042 static ssize_t _hid_sensor_get_report_latency(struct device *dev,
0043 struct device_attribute *attr,
0044 char *buf)
0045 {
0046 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
0047 struct hid_sensor_common *attrb = iio_device_get_drvdata(indio_dev);
0048 int latency;
0049
0050 latency = hid_sensor_get_report_latency(attrb);
0051 if (latency < 0)
0052 return latency;
0053
0054 return sprintf(buf, "%d.%06u\n", latency / 1000, (latency % 1000) * 1000);
0055 }
0056
0057 static ssize_t _hid_sensor_get_fifo_state(struct device *dev,
0058 struct device_attribute *attr,
0059 char *buf)
0060 {
0061 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
0062 struct hid_sensor_common *attrb = iio_device_get_drvdata(indio_dev);
0063 int latency;
0064
0065 latency = hid_sensor_get_report_latency(attrb);
0066 if (latency < 0)
0067 return latency;
0068
0069 return sprintf(buf, "%d\n", !!latency);
0070 }
0071
0072 static IIO_DEVICE_ATTR(hwfifo_timeout, 0644,
0073 _hid_sensor_get_report_latency,
0074 _hid_sensor_set_report_latency, 0);
0075 static IIO_DEVICE_ATTR(hwfifo_enabled, 0444,
0076 _hid_sensor_get_fifo_state, NULL, 0);
0077
0078 static const struct attribute *hid_sensor_fifo_attributes[] = {
0079 &iio_dev_attr_hwfifo_timeout.dev_attr.attr,
0080 &iio_dev_attr_hwfifo_enabled.dev_attr.attr,
0081 NULL,
0082 };
0083
0084 static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state)
0085 {
0086 int state_val;
0087 int report_val;
0088 s32 poll_value = 0;
0089
0090 if (state) {
0091 if (sensor_hub_device_open(st->hsdev))
0092 return -EIO;
0093
0094 atomic_inc(&st->data_ready);
0095
0096 state_val = hid_sensor_get_usage_index(st->hsdev,
0097 st->power_state.report_id,
0098 st->power_state.index,
0099 HID_USAGE_SENSOR_PROP_POWER_STATE_D0_FULL_POWER_ENUM);
0100 report_val = hid_sensor_get_usage_index(st->hsdev,
0101 st->report_state.report_id,
0102 st->report_state.index,
0103 HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM);
0104
0105 poll_value = hid_sensor_read_poll_value(st);
0106 } else {
0107 int val;
0108
0109 val = atomic_dec_if_positive(&st->data_ready);
0110 if (val < 0)
0111 return 0;
0112
0113 sensor_hub_device_close(st->hsdev);
0114 state_val = hid_sensor_get_usage_index(st->hsdev,
0115 st->power_state.report_id,
0116 st->power_state.index,
0117 HID_USAGE_SENSOR_PROP_POWER_STATE_D4_POWER_OFF_ENUM);
0118 report_val = hid_sensor_get_usage_index(st->hsdev,
0119 st->report_state.report_id,
0120 st->report_state.index,
0121 HID_USAGE_SENSOR_PROP_REPORTING_STATE_NO_EVENTS_ENUM);
0122 }
0123
0124 if (state_val >= 0) {
0125 state_val += st->power_state.logical_minimum;
0126 sensor_hub_set_feature(st->hsdev, st->power_state.report_id,
0127 st->power_state.index, sizeof(state_val),
0128 &state_val);
0129 }
0130
0131 if (report_val >= 0) {
0132 report_val += st->report_state.logical_minimum;
0133 sensor_hub_set_feature(st->hsdev, st->report_state.report_id,
0134 st->report_state.index,
0135 sizeof(report_val),
0136 &report_val);
0137 }
0138
0139 pr_debug("HID_SENSOR %s set power_state %d report_state %d\n",
0140 st->pdev->name, state_val, report_val);
0141
0142 sensor_hub_get_feature(st->hsdev, st->power_state.report_id,
0143 st->power_state.index,
0144 sizeof(state_val), &state_val);
0145 if (state && poll_value)
0146 msleep_interruptible(poll_value * 2);
0147
0148 return 0;
0149 }
0150 EXPORT_SYMBOL_NS(hid_sensor_power_state, IIO_HID);
0151
0152 int hid_sensor_power_state(struct hid_sensor_common *st, bool state)
0153 {
0154
0155 #ifdef CONFIG_PM
0156 int ret;
0157
0158 if (atomic_add_unless(&st->runtime_pm_enable, 1, 1))
0159 pm_runtime_enable(&st->pdev->dev);
0160
0161 if (state) {
0162 atomic_inc(&st->user_requested_state);
0163 ret = pm_runtime_resume_and_get(&st->pdev->dev);
0164 } else {
0165 atomic_dec(&st->user_requested_state);
0166 pm_runtime_mark_last_busy(&st->pdev->dev);
0167 pm_runtime_use_autosuspend(&st->pdev->dev);
0168 ret = pm_runtime_put_autosuspend(&st->pdev->dev);
0169 }
0170 if (ret < 0)
0171 return ret;
0172
0173 return 0;
0174 #else
0175 atomic_set(&st->user_requested_state, state);
0176 return _hid_sensor_power_state(st, state);
0177 #endif
0178 }
0179
0180 static void hid_sensor_set_power_work(struct work_struct *work)
0181 {
0182 struct hid_sensor_common *attrb = container_of(work,
0183 struct hid_sensor_common,
0184 work);
0185
0186 if (attrb->poll_interval >= 0)
0187 sensor_hub_set_feature(attrb->hsdev, attrb->poll.report_id,
0188 attrb->poll.index,
0189 sizeof(attrb->poll_interval),
0190 &attrb->poll_interval);
0191
0192 if (attrb->raw_hystersis >= 0)
0193 sensor_hub_set_feature(attrb->hsdev,
0194 attrb->sensitivity.report_id,
0195 attrb->sensitivity.index,
0196 sizeof(attrb->raw_hystersis),
0197 &attrb->raw_hystersis);
0198
0199 if (attrb->latency_ms > 0)
0200 hid_sensor_set_report_latency(attrb, attrb->latency_ms);
0201
0202 if (atomic_read(&attrb->user_requested_state))
0203 _hid_sensor_power_state(attrb, true);
0204 }
0205
0206 static int hid_sensor_data_rdy_trigger_set_state(struct iio_trigger *trig,
0207 bool state)
0208 {
0209 return hid_sensor_power_state(iio_trigger_get_drvdata(trig), state);
0210 }
0211
0212 void hid_sensor_remove_trigger(struct iio_dev *indio_dev,
0213 struct hid_sensor_common *attrb)
0214 {
0215 if (atomic_read(&attrb->runtime_pm_enable))
0216 pm_runtime_disable(&attrb->pdev->dev);
0217
0218 pm_runtime_set_suspended(&attrb->pdev->dev);
0219
0220 cancel_work_sync(&attrb->work);
0221 iio_trigger_unregister(attrb->trigger);
0222 iio_trigger_free(attrb->trigger);
0223 iio_triggered_buffer_cleanup(indio_dev);
0224 }
0225 EXPORT_SYMBOL_NS(hid_sensor_remove_trigger, IIO_HID);
0226
0227 static const struct iio_trigger_ops hid_sensor_trigger_ops = {
0228 .set_trigger_state = &hid_sensor_data_rdy_trigger_set_state,
0229 };
0230
0231 int hid_sensor_setup_trigger(struct iio_dev *indio_dev, const char *name,
0232 struct hid_sensor_common *attrb)
0233 {
0234 const struct attribute **fifo_attrs;
0235 int ret;
0236 struct iio_trigger *trig;
0237
0238 if (hid_sensor_batch_mode_supported(attrb))
0239 fifo_attrs = hid_sensor_fifo_attributes;
0240 else
0241 fifo_attrs = NULL;
0242
0243 ret = iio_triggered_buffer_setup_ext(indio_dev,
0244 &iio_pollfunc_store_time, NULL,
0245 IIO_BUFFER_DIRECTION_IN,
0246 NULL, fifo_attrs);
0247 if (ret) {
0248 dev_err(&indio_dev->dev, "Triggered Buffer Setup Failed\n");
0249 return ret;
0250 }
0251
0252 trig = iio_trigger_alloc(indio_dev->dev.parent,
0253 "%s-dev%d", name, iio_device_id(indio_dev));
0254 if (trig == NULL) {
0255 dev_err(&indio_dev->dev, "Trigger Allocate Failed\n");
0256 ret = -ENOMEM;
0257 goto error_triggered_buffer_cleanup;
0258 }
0259
0260 iio_trigger_set_drvdata(trig, attrb);
0261 trig->ops = &hid_sensor_trigger_ops;
0262 ret = iio_trigger_register(trig);
0263
0264 if (ret) {
0265 dev_err(&indio_dev->dev, "Trigger Register Failed\n");
0266 goto error_free_trig;
0267 }
0268 attrb->trigger = trig;
0269 indio_dev->trig = iio_trigger_get(trig);
0270
0271 ret = pm_runtime_set_active(&indio_dev->dev);
0272 if (ret)
0273 goto error_unreg_trigger;
0274
0275 iio_device_set_drvdata(indio_dev, attrb);
0276
0277 INIT_WORK(&attrb->work, hid_sensor_set_power_work);
0278
0279 pm_suspend_ignore_children(&attrb->pdev->dev, true);
0280
0281 pm_runtime_set_autosuspend_delay(&attrb->pdev->dev,
0282 3000);
0283 return ret;
0284 error_unreg_trigger:
0285 iio_trigger_unregister(trig);
0286 error_free_trig:
0287 iio_trigger_free(trig);
0288 error_triggered_buffer_cleanup:
0289 iio_triggered_buffer_cleanup(indio_dev);
0290 return ret;
0291 }
0292 EXPORT_SYMBOL_NS(hid_sensor_setup_trigger, IIO_HID);
0293
0294 static int __maybe_unused hid_sensor_suspend(struct device *dev)
0295 {
0296 struct iio_dev *indio_dev = dev_get_drvdata(dev);
0297 struct hid_sensor_common *attrb = iio_device_get_drvdata(indio_dev);
0298
0299 return _hid_sensor_power_state(attrb, false);
0300 }
0301
0302 static int __maybe_unused hid_sensor_resume(struct device *dev)
0303 {
0304 struct iio_dev *indio_dev = dev_get_drvdata(dev);
0305 struct hid_sensor_common *attrb = iio_device_get_drvdata(indio_dev);
0306 schedule_work(&attrb->work);
0307 return 0;
0308 }
0309
0310 static int __maybe_unused hid_sensor_runtime_resume(struct device *dev)
0311 {
0312 struct iio_dev *indio_dev = dev_get_drvdata(dev);
0313 struct hid_sensor_common *attrb = iio_device_get_drvdata(indio_dev);
0314 return _hid_sensor_power_state(attrb, true);
0315 }
0316
0317 const struct dev_pm_ops hid_sensor_pm_ops = {
0318 SET_SYSTEM_SLEEP_PM_OPS(hid_sensor_suspend, hid_sensor_resume)
0319 SET_RUNTIME_PM_OPS(hid_sensor_suspend,
0320 hid_sensor_runtime_resume, NULL)
0321 };
0322 EXPORT_SYMBOL_NS(hid_sensor_pm_ops, IIO_HID);
0323
0324 MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@intel.com>");
0325 MODULE_DESCRIPTION("HID Sensor trigger processing");
0326 MODULE_LICENSE("GPL");
0327 MODULE_IMPORT_NS(IIO_HID_ATTRIBUTES);