lineage_kernel_xcoverpro/drivers/sensorhub/factory/magnetic_sensor.c

271 lines
8.6 KiB
C
Raw Normal View History

2023-06-18 22:53:49 +00:00
/*
* Copyright (C) 2015, Samsung Electronics Co. Ltd. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that 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.
*
*/
#include <linux/slab.h>
#include "../ssp.h"
#include "../sensors_core.h"
#include "../ssp_data.h"
#include "ssp_factory.h"
/*************************************************************************/
/* factory Sysfs */
/*************************************************************************/
static ssize_t magnetic_name_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct ssp_data *data = dev_get_drvdata(dev);
if (data->magnetic_ops == NULL || data->magnetic_ops->get_magnetic_name == NULL)
return -EINVAL;
return data->magnetic_ops->get_magnetic_name(buf);
}
static ssize_t magnetic_vendor_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct ssp_data *data = dev_get_drvdata(dev);
if (data->magnetic_ops == NULL || data->magnetic_ops->get_magnetic_vendor == NULL)
return -EINVAL;
return data->magnetic_ops->get_magnetic_vendor(buf);
}
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_AK09916C) || defined(CONFIG_SENSORS_SSP_MAGNETIC_AK09911)
static ssize_t magnetic_get_asa(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct ssp_data *data = dev_get_drvdata(dev);
if (data->magnetic_ops == NULL || data->magnetic_ops->get_magnetic_asa == NULL)
return -EINVAL;
return data->magnetic_ops->get_magnetic_asa(data, buf);
}
#endif
static ssize_t magnetic_get_status(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct ssp_data *data = dev_get_drvdata(dev);
if (data->magnetic_ops == NULL || data->magnetic_ops->get_magnetic_status == NULL)
return -EINVAL;
return data->magnetic_ops->get_magnetic_status(data, buf);
}
static ssize_t magnetic_check_dac(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct ssp_data *data = dev_get_drvdata(dev);
if (data->magnetic_ops == NULL || data->magnetic_ops->get_magnetic_dac == NULL)
return -EINVAL;
return data->magnetic_ops->get_magnetic_dac(data, buf);
}
static ssize_t magnetic_logging_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct ssp_data *data = dev_get_drvdata(dev);
if (data->magnetic_ops == NULL || data->magnetic_ops->get_magnetic_logging_data == NULL)
return -EINVAL;
return data->magnetic_ops->get_magnetic_logging_data(data, buf);
}
static ssize_t magnetic_hw_offset_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct ssp_data *data = dev_get_drvdata(dev);
return snprintf(buf, PAGE_SIZE, "%d,%d,%d\n", data->magcal.offset_x, data->magcal.offset_y, data->magcal.offset_z);
}
static ssize_t magnetic_matrix_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct ssp_data *data = dev_get_drvdata(dev);
if (data->magnetic_ops == NULL || data->magnetic_ops->get_magnetic_matrix == NULL)
return -EINVAL;
return data->magnetic_ops->get_magnetic_matrix(data, buf);
}
static ssize_t magnetic_matrix_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t size)
{
struct ssp_data *data = dev_get_drvdata(dev);
int ret = 0;
if (data->magnetic_ops == NULL || data->magnetic_ops->set_magnetic_matrix == NULL)
return -EINVAL;
ret = data->magnetic_ops->set_magnetic_matrix(data, buf);
if (ret < 0)
ssp_errf("- failed = %d", ret);
return size;
}
static ssize_t magnetic_raw_data_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct ssp_data *data = dev_get_drvdata(dev);
if (data->magnetic_ops == NULL || data->magnetic_ops->get_magnetic_raw_data == NULL)
return -EINVAL;
return data->magnetic_ops->get_magnetic_raw_data(data, buf);
}
static ssize_t magnetic_raw_data_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t size)
{
struct ssp_data *data = dev_get_drvdata(dev);
int ret = 0;
if (data->magnetic_ops == NULL || data->magnetic_ops->set_magnetic_raw_data == NULL)
return -EINVAL;
ret = data->magnetic_ops->set_magnetic_raw_data(data, buf);
if (ret < 0)
ssp_errf("- failed = %d", ret);
return size;
}
static ssize_t magnetic_adc_data_read(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct ssp_data *data = dev_get_drvdata(dev);
if (data->magnetic_ops == NULL || data->magnetic_ops->get_magnetic_adc == NULL)
return -EINVAL;
return data->magnetic_ops->get_magnetic_adc(data, buf);
}
static ssize_t magnetic_get_selftest(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct ssp_data *data = dev_get_drvdata(dev);
if (data->magnetic_ops == NULL || data->magnetic_ops->get_magnetic_selftest == NULL)
return -EINVAL;
return data->magnetic_ops->get_magnetic_selftest(data, buf);
}
static DEVICE_ATTR(name, S_IRUGO, magnetic_name_show, NULL);
static DEVICE_ATTR(vendor, S_IRUGO, magnetic_vendor_show, NULL);
static DEVICE_ATTR(raw_data, S_IRUGO | S_IWUSR | S_IWGRP,
magnetic_raw_data_show, magnetic_raw_data_store);
static DEVICE_ATTR(adc, S_IRUGO, magnetic_adc_data_read, NULL);
static DEVICE_ATTR(dac, S_IRUGO, magnetic_check_dac, NULL);
static DEVICE_ATTR(selftest, S_IRUGO, magnetic_get_selftest, NULL);
static DEVICE_ATTR(status, S_IRUGO, magnetic_get_status, NULL);
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_AK09916C) || defined(CONFIG_SENSORS_SSP_MAGNETIC_AK09911)
static DEVICE_ATTR(ak09911_asa, S_IRUGO, magnetic_get_asa, NULL);
#endif
static DEVICE_ATTR(logging_data, S_IRUGO, magnetic_logging_show, NULL);
static DEVICE_ATTR(hw_offset, S_IRUGO, magnetic_hw_offset_show, NULL);
static DEVICE_ATTR(matrix, S_IRUGO | S_IWUSR | S_IWGRP, magnetic_matrix_show,
magnetic_matrix_store);
static struct device_attribute *mag_attrs[] = {
&dev_attr_name,
&dev_attr_vendor,
&dev_attr_adc,
&dev_attr_dac,
&dev_attr_raw_data,
&dev_attr_selftest,
&dev_attr_status,
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_AK09916C) || defined(CONFIG_SENSORS_SSP_MAGNETIC_AK09911)
&dev_attr_ak09911_asa,
#endif
&dev_attr_logging_data,
&dev_attr_hw_offset,
&dev_attr_matrix,
NULL,
};
void select_magnetic_ops(struct ssp_data *data, char *name)
{
struct magnetic_sensor_operations **mag_ops_ary;
int count = 0, i;
char temp_buffer[SENSORNAME_MAX_LEN] = {0,};
ssp_infof("");
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_AK09918C)
count++;
#endif
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_MMC5603)
count++;
#endif
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_AK09916C)
count++;
#endif
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_AK09911)
count++;
#endif
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_LSM303AH)
count++;
#endif
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_YAS539)
count++;
#endif
if (count == 0) {
ssp_infof("count is 0");
return;
}
mag_ops_ary = (struct magnetic_sensor_operations **)kzalloc(count * sizeof(struct magnetic_sensor_operations *), GFP_KERNEL);
i = 0;
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_AK09918C)
mag_ops_ary[i++] = get_magnetic_ak09918c_function_pointer(data);
#endif
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_MMC5603)
mag_ops_ary[i++] = get_magnetic_mmc5603_function_pointer(data);
#endif
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_AK09916C)
mag_ops_ary[i++] = get_magnetic_ak09916c_function_pointer(data);
#endif
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_AK09911)
mag_ops_ary[i++] = get_magnetic_ak09911_function_pointer(data);
#endif
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_LSM303AH)
mag_ops_ary[i++] = get_magnetic_lsm303ah_function_pointer(data);
#endif
#if defined(CONFIG_SENSORS_SSP_MAGNETIC_YAS539)
mag_ops_ary[i++] = get_magnetic_yas539_function_pointer(data);
#endif
if (count > 1) {
for (i = 0; i < count ; i++) {
int size = mag_ops_ary[i]->get_magnetic_name(temp_buffer);
temp_buffer[size - 1] = '\0';
ssp_infof("%d name : %s", i, temp_buffer);
if (strcmp(temp_buffer, name) == 0)
break;
}
if (i == count)
i = 0;
} else
i = 0;
data->magnetic_ops = mag_ops_ary[i];
kfree(mag_ops_ary);
}
void initialize_magnetic_factorytest(struct ssp_data *data)
{
sensors_register(data->devices[SENSOR_TYPE_GEOMAGNETIC_FIELD], data, mag_attrs,
"magnetic_sensor");
}
void remove_magnetic_factorytest(struct ssp_data *data)
{
sensors_unregister(data->devices[SENSOR_TYPE_GEOMAGNETIC_FIELD], mag_attrs);
}