15 Mar, 2015

1 commit

  • When an error occurred during event registration memory was freed twice
    resulting in kernel memory corruption and a crash in unrelated code.

    The problem was caused by
    iio_device_unregister_eventset()
    iio_device_unregister_sysfs()

    being called twice, once on the error path and then
    again via iio_dev_release().

    Fix this by making these two functions idempotent so they
    may be called multiple times.

    The problem was observed before applying
    78b33216 iio:core: Handle error when mask type is not separate

    Signed-off-by: Martin Fuzzey
    Cc:
    Signed-off-by: Jonathan Cameron

    Martin Fuzzey
     

30 Jan, 2015

1 commit

  • The pedometer needs to filter out false steps that might be generated by
    tapping the foot, sitting, etc. To do that it computes the number of
    steps that occur in a given time and decides the user is moving only
    if this value is over a threshold. E.g.: the user starts moving only
    if he takes 4 steps in 3 seconds. This filter is applied only when
    the user starts moving.

    A device that has such pedometer functionality is Freescale's MMA9553L:
    http://www.freescale.com/files/sensors/doc/ref_manual/MMA9553LSWRM.pdf.

    To export this feature, this patch introduces IIO_CHAN_INFO_DEBOUNCE_COUNT
    and IIO_CHAN_INFO_DEBOUNCE_TIME. For the pedometer, in_steps_debounce_count
    will specify the number of steps that need to occur in
    in_steps_debounce_time seconds so that the pedometer decides the user is
    moving.

    Signed-off-by: Irina Tirdea
    Signed-off-by: Jonathan Cameron

    Irina Tirdea
     

28 Jan, 2015

4 commits

  • Some devices need the weight of the user to compute other
    parameters. One of this devices is Freescale's MMA9553L
    (http://www.freescale.com/files/sensors/doc/ref_manual/MMA9553LSWRM.pdf)
    that needs the weight of the user to compute the number of calories burnt.

    Signed-off-by: Irina Tirdea
    Signed-off-by: Jonathan Cameron

    Irina Tirdea
     
  • Some devices export the current speed value of the user.

    One of this devices is Freescale's MMA9553L
    (http://www.freescale.com/files/sensors/doc/ref_manual/MMA9553LSWRM.pdf)
    that computes the speed of the user based on the number of steps and
    stride length.

    Introduce a new channel type VELOCITY and a modifier for the magniture or
    norm of the velocity vector, IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z.

    Signed-off-by: Irina Tirdea
    Signed-off-by: Jonathan Cameron

    Irina Tirdea
     
  • Some devices export an estimation of the distance the user has covered
    since the last reset.

    One of this devices is Freescale's MMA9553L
    (http://www.freescale.com/files/sensors/doc/ref_manual/MMA9553LSWRM.pdf)
    that computes the distance based on the stride length and step rate.

    Introduce a new channel type DISTANCE to export these values.

    Signed-off-by: Irina Tirdea
    Signed-off-by: Jonathan Cameron

    Irina Tirdea
     
  • Human activity sensors report the energy burnt by the user.
    One of this devices is Freescale's MMA9553L
    (http://www.freescale.com/files/sensors/doc/ref_manual/MMA9553LSWRM.pdf)
    that computes the number of calories based on weight and step rate.

    Introduce a new channel type ENERGY to export these values.

    Signed-off-by: Irina Tirdea
    Signed-off-by: Jonathan Cameron

    Irina Tirdea
     

06 Jan, 2015

1 commit


26 Dec, 2014

1 commit


12 Dec, 2014

1 commit

  • Originally device and buffer registration were kept as separate operations
    in IIO to allow to register two distinct sets of channels for buffered and
    non-buffered operations. This has since already been further restricted and
    the channel set registered for the buffer needs to be a subset of the
    channel set registered for the device. Additionally the possibility to not
    have a raw (or processed) attribute for a channel which was registered for
    the device was added a while ago. This means it is possible to not register
    any device level attributes for a channel even if it is registered for the
    device. Also if a channel's scan_index is set to -1 and the channel is
    registered for the buffer it is ignored.

    So in summary it means it is possible to register the same channel array for
    both the device and the buffer yet still end up with distinctive sets of
    channels for both of them. This makes the argument for having to have to
    manually register the channels for both the device and the buffer invalid.
    Considering that the vast majority of all drivers want to register the same
    set of channels for both the buffer and the device it makes sense to move
    the buffer registration into the core to avoid some boiler-plate code in the
    device driver setup path.

    Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Jonathan Cameron

    Lars-Peter Clausen
     

22 Nov, 2014

3 commits

  • Some devices need the height of the user to compute various
    parameters. One of this devices is Freescale's MMA9553L
    (http://www.freescale.com/files/sensors/doc/ref_manual/MMA9553LSWRM.pdf)
    that needs the height of the user to compute the stride length which
    is used further to determine distance, speed and activity type.

    Signed-off-by: Irina Tirdea
    Signed-off-by: Daniel Baluta
    Signed-off-by: Jonathan Cameron

    Irina Tirdea
     
  • These changes are needed to support the functionality of a pedometer.
    A pedometer has two basic functionalities: step counter and step detector.

    The step counter needs to be enabled and then it will count the steps
    in its hardware register. Whenever the application needs to check
    the step count, it will read the step counter register. To support the
    step counter a new channel type STEPS is added. Since the pedometer needs
    to be enabled first so that the hardware can count and store the steps,
    we need a specific ENABLE channel info mask.

    The step detector will generate an interrupt each time a step is detected.
    To support this functionality we add a new event type INSTANCE.

    For more information on the Android requirements for step counter and step
    detector see:
    http://source.android.com/devices/sensors/composite_sensors.html#counter
    and http://source.android.com/devices/sensors/composite_sensors.html#detector.

    A device that has the pedometer functionality this interface needs to
    support is Freescale's MMA9553L:
    http://www.freescale.com/files/sensors/doc/ref_manual/MMA9553LSWRM.pdf

    Signed-off-by: Irina Tirdea
    Signed-off-by: Daniel Baluta
    Signed-off-by: Jonathan Cameron

    Irina Tirdea
     
  • This channel will be used for exposing information about
    activity composite sensors. Activities supported so far:
    * running
    * jogging
    * walking
    * still

    THRESHOLD event is used to signal a change in the activity
    state.

    We associate a confidence interval for each activity expressed
    as a percentage from 0 to 100.
    * 0, means the sensor IS NOT reporting that activity.
    * 100, means the sensor IS reporting that activity.

    Users of this interface have two possible means to gather
    information about the ongoing activities.

    1. Event based, via event file descriptor
    * sensor may report an event when ENTERING an activity or LEAVING
    an activity based on a threshold value.
    * drivers will wake up applications waiting data on the event fd

    2. Polling, by reading the sysfs associated attribute files:
    * /sys/bus/iio/devices/iio:device0/in_activity_running_input
    expressed as percentage confidence value from 0 to 100.

    This will offer an interface for Android significant motion
    composite sensor defined here:
    http://source.android.com/devices/sensors/composite_sensors.html

    Activities listed above are supported by Freescale's MMA9553 sensor:
    http://freescale.com/files/sensors/doc/ref_manual/MMA9553LSWRM.pdf

    Signed-off-by: Irina Tirdea
    Signed-off-by: Daniel Baluta
    Signed-off-by: Jonathan Cameron

    Daniel Baluta
     

20 Jul, 2014

1 commit


03 May, 2014

1 commit


30 Apr, 2014

2 commits

  • Added quaternion in the list of supported modifiers.

    Signed-off-by: Srinivas Pandruvada
    Signed-off-by: Jonathan Cameron

    Srinivas Pandruvada
     
  • This callback is introduced to overcome some limitations of existing
    read_raw callback. The functionality of both existing read_raw and
    read_raw_multi is similar, both are used to request values from the
    device. The current read_raw callback allows only two return values.
    The new read_raw_multi allows returning multiple values. Instead of
    passing just address of val and val2, it passes length and pointer
    to values. Depending on the type and length of passed buffer, iio
    client drivers can return multiple values.

    Signed-off-by: Srinivas Pandruvada
    Signed-off-by: Jonathan Cameron

    Srinivas Pandruvada
     

17 Mar, 2014

1 commit


15 Mar, 2014

1 commit

  • This is a tiny preventative measure to make sure we can't write beyond
    PAGE_SIZE on the buffers being used in sysfs for iio. There is currently
    no way for this to happen, but the change makes this code more robust
    for the future.

    Signed-off-by: Kees Cook
    Signed-off-by: Jonathan Cameron

    Kees Cook
     

18 Feb, 2014

3 commits

  • name_format already contains the final name and no format characters. So the
    code basically reads:

    dev_attr->attr.name = kstrdup(GFP_KERNEL, name_format);
    if (dev_attr->attr.name == NULL)
    ...
    kfree(name_format);

    Which means we can save one alloc and free pair per attribute name if we
    directly assign name_format to dev_attr->attr.name.

    The patch also renames name_format to name to denote that this is indeed the
    final name and has no format characters in it.

    Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Jonathan Cameron

    Lars-Peter Clausen
     
  • The extended name is channel specific and should not be included in shared
    attributes.

    Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Jonathan Cameron

    Lars-Peter Clausen
     
  • Get rid of obsolete uses of goto error_ret and some empty lines.

    Signed-off-by: Hartmut Knaack
    Signed-off-by: Jonathan Cameron

    Hartmut Knaack
     

04 Dec, 2013

1 commit


25 Nov, 2013

2 commits


24 Oct, 2013

2 commits


12 Oct, 2013

5 commits

  • Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Jonathan Cameron

    Lars-Peter Clausen
     
  • We have the same code to free a IIO device attribute list in multiple place.
    This patch adds a new helper function to take care of this and replaces the
    custom instances with a call to the helper function. Note that we do not need to
    call list_del() for each of the list items since we will never look at any of
    the list items nor the list itself again.

    Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Jonathan Cameron

    Lars-Peter Clausen
     
  • Once the device has been unregistered there won't be any new data no matter how
    long a userspace application waits, so we might as well wake them up and let
    them know.

    Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Jonathan Cameron

    Lars-Peter Clausen
     
  • If the IIO device has been unregistered return -ENODEV for any further file
    operations like read() and ioctl(). This avoids userspace being able to grab new
    references to the device.

    Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Jonathan Cameron

    Lars-Peter Clausen
     
  • Since the buffer is accessed by userspace we can not just free the buffers
    memory once we are done with it in kernel space. There might still be open file
    descriptors and userspace still might be accessing the buffer. This patch adds
    support for reference counting to the IIO buffers. When a buffer is created and
    initialized its initial reference count is set to 1. Instead of freeing the
    memory of the buffer the buffer's _free() function will drop that reference
    again. But only after the last reference to the buffer has been dropped the
    buffer the buffer's memory will be freed. The IIO device will take a reference
    to its primary buffer. The patch adds a small helper function for this called
    iio_device_attach_buffer() which will get a reference to the buffer and assign
    the buffer to the IIO device. This function must be used instead of assigning
    the buffer to the device by hand. The reference is only dropped once the IIO
    device is freed and we can be sure that there are no more open file handles. A
    reference to a buffer will also be taken whenever the buffer is active to avoid
    the buffer being freed while data is still being send to it.

    Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Jonathan Cameron

    Lars-Peter Clausen
     

07 Oct, 2013

1 commit


01 Oct, 2013

1 commit


25 Sep, 2013

1 commit


21 Sep, 2013

3 commits

  • Set the IIO device as the parent for the character device

    We need to make sure that the IIO device is not freed while the character device
    exists, otherwise the freeing of the IIO device might race against the file open
    callback. Do this by setting the character device's parent to the IIO device,
    this will cause the character device to grab a reference to the IIO device and
    only release it once the character device itself has been removed.

    Also move the registration of the character device before the registration of
    the IIO device to avoid the (rather theoretical case) that the IIO device is
    already freed again before we can add the character device and grab a reference
    to the IIO device.

    We also need to move the call to cdev_del() from iio_dev_release() to
    iio_device_unregister() (where it should have been in the first place anyway) to
    avoid a reference cycle. As iio_dev_release() is only called once all reference
    are dropped, but the character device holds a reference to the IIO device.

    Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Jonathan Cameron

    Lars-Peter Clausen
     
  • Make sure that the IIO device is not freed while we still have file descriptors
    for it.

    Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Jonathan Cameron

    Lars-Peter Clausen
     
  • Make sure to stop sampling when the device is removed, otherwise it will
    continue to sample forever.

    Signed-off-by: Lars-Peter Clausen
    Signed-off-by: Jonathan Cameron

    Lars-Peter Clausen
     

16 Sep, 2013

2 commits

  • These two additional info_mask bitmaps should allow all 'standard'
    numeric attributes to be handled using the read_raw and write_raw
    callbacks. Whilst this should reduce code, the more important element
    is that this makes these values easily accessible to in kernel users
    of IIO devices.

    Signed-off-by: Jonathan Cameron
    Reviewed-by: Lars-Peter Clausen

    Jonathan Cameron
     
  • Introduce an enum to specify whether the attribute is separate or
    shared.

    Factor out the bitmap handling for loop into a separate function.

    Tidy up error handling and add a NULL assignment to squish a false
    positive warning from GCC.

    Change ext_info shared type from boolean to enum and update in all
    drivers.

    Signed-off-by: Jonathan Cameron
    Reviewed-by: Lars-Peter Clausen

    Jonathan Cameron
     

15 Sep, 2013

1 commit

  • Integration time is in seconds; it controls the measurement
    time and influences the gain of a sensor.

    There are two typical ways that scaling is implemented in a device:
    1) input amplifier,
    2) reference to the ADC is changed.
    These both result in the accuracy of the ADC varying (by applying its
    sampling over a more relevant range).

    Integration time is a way of dealing with noise inherent in the analog
    sensor itself. In the case of a light sensor, a mixture of photon noise
    and device specific noise. Photon noise is dealt with by either improving
    the efficiency of the sensor, (more photons actually captured) which is not
    easily varied dynamically, or by integrating the measurement over a longer
    time period. Note that this can also be thought of as an averaging of a
    number of individual samples and is infact sometimes implemented this way.
    Altering integration time implies that the duration of a measurement changes,
    a fact the device's user may be interested in.

    Hence it makes sense to distinguish between integration time and simple
    scale. In some devices both types of control are present and whilst they
    will have similar effects on the amplitude of the reading, their effect
    on the noise of the measurements will differ considerably.

    Used by adjd_s311, tsl4531, tcs3472
    The following drivers have similar controls (and could be adapted):
    * tsl2563 (integration time is controlled via CALIBSCALE among other things)
    * tsl2583 (has integration_time device_attr, but driver doesn't use channels yet)
    * tsl2x7x (has integration_time attr)

    Signed-off-by: Peter Meerwald
    Cc: Jon Brenner
    Signed-off-by: Jonathan Cameron

    Peter Meerwald