+ /*
+ * The specified sensor was either enabled or disabled. Other sensors in the same group may have constraints related to this sensor
+ * sampling rate on their own sampling rate, so reevaluate them by retrying to use their requested sampling rate, rather than the one
+ * that ended up being used after arbitration.
+ */
+
+ int i, j, base;
+
+ if (sensor[s].is_virtual) {
+ /* Take care of downwards dependencies */
+ for (i=0; i<sensor[s].base_count; i++) {
+ base = sensor[s].base[i];
+ sensor_set_rate(base, sensor[base].requested_rate);
+ }
+ return;
+ }
+
+ /* Upwards too */
+ for (i=0; i<sensor_count; i++)
+ for (j=0; j<sensor[i].base_count; j++)
+ if (sensor[i].base[j] == s) /* If sensor i depends on sensor s */
+ sensor_set_rate(i, sensor[i].requested_rate);
+}
+
+
+static int sensor_activate_virtual (int s, int enabled, int from_virtual)
+{
+ int i, base;
+
+ sensor[s].event_count = 0;
+ sensor[s].meta_data_pending = 0;
+
+ if (!check_state_change(s, enabled, from_virtual))
+ return 0; /* The state of the sensor remains the same ; we're done */
+
+ if (enabled)
+ ALOGI("Enabling sensor %d (%s)\n", s, sensor[s].friendly_name);
+ else
+ ALOGI("Disabling sensor %d (%s)\n", s, sensor[s].friendly_name);
+
+ sensor[s].report_pending = 0;
+
+ for (i=0; i<sensor[s].base_count; i++) {
+
+ base = sensor[s].base[i];
+ sensor_activate(base, enabled, 1);
+
+ if (enabled)
+ sensor[base].ref_count++;
+ else
+ sensor[base].ref_count--;
+ }
+
+ /* Reevaluate sampling rates of linked sensors */
+ reapply_sampling_rates(s);
+ return 0;
+}
+
+
+int sensor_activate (int s, int enabled, int from_virtual)
+{
+ char device_name[PATH_MAX];
+ struct epoll_event ev = {0};
+ int dev_fd, event_fd;
+ int ret, c, d;
+ int dev_num = sensor[s].dev_num;
+ size_t field_size;
+ int catalog_index = sensor[s].catalog_index;
+
+ if (sensor[s].is_virtual)
+ return sensor_activate_virtual(s, enabled, from_virtual);
+
+ /* Prepare the report timestamp field for the first event, see set_report_ts method */
+ sensor[s].report_ts = 0;
+
+ ret = adjust_counters(s, enabled, from_virtual);
+
+ /* If the operation was neutral in terms of state, we're done */
+ if (ret <= 0)
+ return ret;
+
+ sensor[s].event_count = 0;
+ sensor[s].meta_data_pending = 0;
+
+ if (enabled)
+ setup_noise_filtering(s); /* Initialize filtering data if required */
+
+ if (sensor[s].mode == MODE_TRIGGER) {
+
+ /* Stop sampling */
+ enable_buffer(dev_num, 0);
+ setup_trigger(s, "\n");
+
+ /* If there's at least one sensor enabled on this iio device */
+ if (trig_sensors_per_dev[dev_num]) {
+
+ /* Start sampling */
+ if (sensor[s].hrtimer_trigger_name[0] != '\0')
+ setup_trigger(s, sensor[s].hrtimer_trigger_name);
+ else
+ setup_trigger(s, sensor[s].init_trigger_name);
+
+ enable_buffer(dev_num, 1);
+ }
+ } else if (sensor[s].mode == MODE_POLL) {
+ if (sensor[s].needs_enable) {
+ enable_sensor(dev_num, sensor_catalog[catalog_index].tag, enabled);
+ }
+ }