linux/drivers/iio/common/ssp_sensors/ssp_iio.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *  Copyright (C) 2014, Samsung Electronics Co. Ltd. All Rights Reserved.
   4 */
   5
   6#include <linux/iio/common/ssp_sensors.h>
   7#include <linux/iio/buffer.h>
   8#include <linux/iio/kfifo_buf.h>
   9#include <linux/module.h>
  10#include <linux/slab.h>
  11#include "ssp_iio_sensor.h"
  12
  13/**
  14 * ssp_common_buffer_postenable() - generic postenable callback for ssp buffer
  15 *
  16 * @indio_dev:          iio device
  17 *
  18 * Returns 0 or negative value in case of error
  19 */
  20int ssp_common_buffer_postenable(struct iio_dev *indio_dev)
  21{
  22        struct ssp_sensor_data *spd = iio_priv(indio_dev);
  23        struct ssp_data *data = dev_get_drvdata(indio_dev->dev.parent->parent);
  24
  25        /* the allocation is made in post because scan size is known in this
  26         * moment
  27         * */
  28        spd->buffer = kmalloc(indio_dev->scan_bytes, GFP_KERNEL | GFP_DMA);
  29        if (!spd->buffer)
  30                return -ENOMEM;
  31
  32        return ssp_enable_sensor(data, spd->type,
  33                                 ssp_get_sensor_delay(data, spd->type));
  34}
  35EXPORT_SYMBOL(ssp_common_buffer_postenable);
  36
  37/**
  38 * ssp_common_buffer_postdisable() - generic postdisable callback for ssp buffer
  39 *
  40 * @indio_dev:          iio device
  41 *
  42 * Returns 0 or negative value in case of error
  43 */
  44int ssp_common_buffer_postdisable(struct iio_dev *indio_dev)
  45{
  46        int ret;
  47        struct ssp_sensor_data *spd = iio_priv(indio_dev);
  48        struct ssp_data *data = dev_get_drvdata(indio_dev->dev.parent->parent);
  49
  50        ret = ssp_disable_sensor(data, spd->type);
  51        if (ret < 0)
  52                return ret;
  53
  54        kfree(spd->buffer);
  55
  56        return ret;
  57}
  58EXPORT_SYMBOL(ssp_common_buffer_postdisable);
  59
  60/**
  61 * ssp_common_process_data() - Common process data callback for ssp sensors
  62 *
  63 * @indio_dev:          iio device
  64 * @buf:                source buffer
  65 * @len:                sensor data length
  66 * @timestamp:          system timestamp
  67 *
  68 * Returns 0 or negative value in case of error
  69 */
  70int ssp_common_process_data(struct iio_dev *indio_dev, void *buf,
  71                            unsigned int len, int64_t timestamp)
  72{
  73        __le32 time;
  74        int64_t calculated_time = 0;
  75        struct ssp_sensor_data *spd = iio_priv(indio_dev);
  76
  77        if (indio_dev->scan_bytes == 0)
  78                return 0;
  79
  80        /*
  81         * it always sends full set of samples, remember about available masks
  82         */
  83        memcpy(spd->buffer, buf, len);
  84
  85        if (indio_dev->scan_timestamp) {
  86                memcpy(&time, &((char *)buf)[len], SSP_TIME_SIZE);
  87                calculated_time =
  88                        timestamp + (int64_t)le32_to_cpu(time) * 1000000;
  89        }
  90
  91        return iio_push_to_buffers_with_timestamp(indio_dev, spd->buffer,
  92                                                  calculated_time);
  93}
  94EXPORT_SYMBOL(ssp_common_process_data);
  95
  96MODULE_AUTHOR("Karol Wrona <k.wrona@samsung.com>");
  97MODULE_DESCRIPTION("Samsung sensorhub commons");
  98MODULE_LICENSE("GPL");
  99