12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085 |
- /*
- * Copyright (C) 2012, 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 "ssp.h"
- #include <linux/math64.h>
- #include "../../staging/iio/events.h"
- #include "../../staging/iio/iio.h"
- #define BATCH_IOCTL_MAGIC 0xFC
- struct batch_config {
- int64_t timeout;
- int64_t delay;
- int flag;
- };
- /*************************************************************************/
- /* SSP data delay function */
- /*************************************************************************/
- int get_msdelay(int64_t dDelayRate) {
- return div_s64(dDelayRate, 1000000);
- }
- static void enable_sensor(struct ssp_data *data,
- int iSensorType, int64_t dNewDelay)
- {
- u8 uBuf[9];
- unsigned int uNewEnable = 0;
- s32 maxBatchReportLatency = 0;
- s8 batchOptions = 0;
- int64_t dTempDelay = data->adDelayBuf[iSensorType];
- s32 dMsDelay = get_msdelay(dNewDelay);
- int ret = 0;
- data->adDelayBuf[iSensorType] = dNewDelay;
- maxBatchReportLatency = data->batchLatencyBuf[iSensorType];
- batchOptions = data->batchOptBuf[iSensorType];
- switch (data->aiCheckStatus[iSensorType]) {
- case ADD_SENSOR_STATE:
- pr_debug("[SSP]: %s - add %u, New = %lldns\n",
- __func__, 1 << iSensorType, dNewDelay);
- memcpy(&uBuf[0], &dMsDelay, 4);
- memcpy(&uBuf[4], &maxBatchReportLatency, 4);
- uBuf[8] = batchOptions;
- if (iSensorType == TEMPERATURE_HUMIDITY_SENSOR &&
- dMsDelay == 10000)
- pr_info("[SSP] Skip Add Temphumidity Sensor\n");
- else
- ret = send_instruction(data, ADD_SENSOR,
- iSensorType, uBuf, 9);
- pr_info("[SSP], delay %d, timeout %d, flag=%d, ret%d",
- dMsDelay, maxBatchReportLatency, uBuf[8], ret);
- if (ret <= 0) {
- uNewEnable =
- (unsigned int)atomic_read(&data->aSensorEnable)
- & (~(unsigned int)(1 << iSensorType));
- atomic_set(&data->aSensorEnable, uNewEnable);
- data->aiCheckStatus[iSensorType] = NO_SENSOR_STATE;
- break;
- }
- data->aiCheckStatus[iSensorType] = RUNNING_SENSOR_STATE;
- if (iSensorType == PROXIMITY_SENSOR) {
- proximity_open_lcd_ldi(data);
- proximity_open_calibration(data);
- set_proximity_threshold(data, data->uProxHiThresh, data->uProxLoThresh);
- input_report_abs(data->prox_input_dev, ABS_DISTANCE, 1);
- input_sync(data->prox_input_dev);
- }
- break;
- case RUNNING_SENSOR_STATE:
- if (get_msdelay(dTempDelay)
- == get_msdelay(data->adDelayBuf[iSensorType]))
- break;
- pr_debug("[SSP]: %s - Change %u, New = %lldns\n",
- __func__, 1 << iSensorType, dNewDelay);
- memcpy(&uBuf[0], &dMsDelay, 4);
- memcpy(&uBuf[4], &maxBatchReportLatency, 4);
- uBuf[8] = batchOptions;
- send_instruction(data, CHANGE_DELAY, iSensorType, uBuf, 9);
- break;
- default:
- data->aiCheckStatus[iSensorType] = ADD_SENSOR_STATE;
- }
- }
- static void change_sensor_delay(struct ssp_data *data,
- int iSensorType, int64_t dNewDelay)
- {
- u8 uBuf[9];
- s32 maxBatchReportLatency = 0;
- s8 batchOptions = 0;
- int64_t dTempDelay = data->adDelayBuf[iSensorType];
- s32 dMsDelay = get_msdelay(dNewDelay);
- data->adDelayBuf[iSensorType] = dNewDelay;
- data->batchLatencyBuf[iSensorType] = maxBatchReportLatency;
- data->batchOptBuf[iSensorType] = batchOptions;
- switch (data->aiCheckStatus[iSensorType]) {
- case RUNNING_SENSOR_STATE:
- if (get_msdelay(dTempDelay)
- == get_msdelay(data->adDelayBuf[iSensorType]))
- break;
- ssp_dbg("[SSP]: %s - Change %u, New = %lldns\n",
- __func__, 1 << iSensorType, dNewDelay);
- memcpy(&uBuf[0], &dMsDelay, 4);
- memcpy(&uBuf[4], &maxBatchReportLatency, 4);
- uBuf[8] = batchOptions;
- send_instruction(data, CHANGE_DELAY, iSensorType, uBuf, 9);
- break;
- default:
- break;
- }
- }
- /*************************************************************************/
- /* SSP data enable function */
- /*************************************************************************/
- static int ssp_remove_sensor(struct ssp_data *data,
- unsigned int uChangedSensor, unsigned int uNewEnable)
- {
- u8 uBuf[4];
- int64_t dSensorDelay = data->adDelayBuf[uChangedSensor];
- pr_debug("[SSP]: %s - remove sensor = %d, current state = %d\n",
- __func__, (1 << uChangedSensor), uNewEnable);
- data->adDelayBuf[uChangedSensor] = DEFUALT_POLLING_DELAY;
- data->batchLatencyBuf[uChangedSensor] = 0;
- data->batchOptBuf[uChangedSensor] = 0;
- if (uChangedSensor == ORIENTATION_SENSOR) {
- if (!(atomic_read(&data->aSensorEnable)
- & (1 << ACCELEROMETER_SENSOR))) {
- uChangedSensor = ACCELEROMETER_SENSOR;
- } else {
- change_sensor_delay(data, ACCELEROMETER_SENSOR,
- data->adDelayBuf[ACCELEROMETER_SENSOR]);
- return 0;
- }
- } else if (uChangedSensor == ACCELEROMETER_SENSOR) {
- if (atomic_read(&data->aSensorEnable)
- & (1 << ORIENTATION_SENSOR)) {
- change_sensor_delay(data, ORIENTATION_SENSOR,
- data->adDelayBuf[ORIENTATION_SENSOR]);
- return 0;
- }
- }
- if (!data->bSspShutdown)
- if (atomic_read(&data->aSensorEnable) & (1 << uChangedSensor)) {
- s32 dMsDelay = get_msdelay(dSensorDelay);
- memcpy(&uBuf[0], &dMsDelay, 4);
- send_instruction(data, REMOVE_SENSOR, uChangedSensor, uBuf, 4);
- }
- data->aiCheckStatus[uChangedSensor] = NO_SENSOR_STATE;
- return 0;
- }
- /*************************************************************************/
- /* ssp Sysfs */
- /*************************************************************************/
- static ssize_t show_enable_irq(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- ssp_dbg("[SSP]: %s - %d\n", __func__, !data->bSspShutdown);
- return sprintf(buf, "%d\n", !data->bSspShutdown);
- }
- static ssize_t set_enable_irq(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- u8 dTemp;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtou8(buf, 10, &dTemp) < 0)
- return -1;
- pr_info("[SSP] %s - %d start\n", __func__, dTemp);
- if (dTemp) {
- reset_mcu(data);
- enable_debug_timer(data);
- } else if (!dTemp) {
- disable_debug_timer(data);
- ssp_enable(data, 0);
- } else
- pr_err("[SSP] %s - invalid value\n", __func__);
- pr_info("[SSP] %s - %d end\n", __func__, dTemp);
- return size;
- }
- static ssize_t show_sensors_enable(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- pr_debug("[SSP]: %s - cur_enable = %d\n", __func__,
- atomic_read(&data->aSensorEnable));
- return sprintf(buf, "%9u\n", atomic_read(&data->aSensorEnable));
- }
- static ssize_t set_sensors_enable(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dTemp;
- int iRet;
- unsigned int uNewEnable = 0, uChangedSensor = 0;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dTemp) < 0)
- return -EINVAL;
- uNewEnable = (unsigned int)dTemp;
- ssp_dbg("[SSP]: %s - new_enable = %u, old_enable = %u\n", __func__,
- uNewEnable, atomic_read(&data->aSensorEnable));
- if ((uNewEnable != atomic_read(&data->aSensorEnable)) &&
- !(data->uSensorState & (uNewEnable - atomic_read(&data->aSensorEnable)))) {
- pr_info("[SSP] %s - %u is not connected(sensortate: 0x%x)\n",
- __func__, uNewEnable - atomic_read(&data->aSensorEnable), data->uSensorState);
- return -EINVAL;
- }
- if (uNewEnable == atomic_read(&data->aSensorEnable))
- return size;
- for (uChangedSensor = 0; uChangedSensor < SENSOR_MAX; uChangedSensor++) {
- if ((atomic_read(&data->aSensorEnable) & (1 << uChangedSensor))
- != (uNewEnable & (1 << uChangedSensor))) {
- if (!(uNewEnable & (1 << uChangedSensor))) {
- ssp_remove_sensor(data, uChangedSensor,
- uNewEnable); /* disable */
- } else { /* Change to ADD_SENSOR_STATE from KitKat */
- if (data->aiCheckStatus[uChangedSensor] == INITIALIZATION_STATE) {
- if (uChangedSensor == ACCELEROMETER_SENSOR) {
- accel_open_calibration(data);
- iRet = set_accel_cal(data);
- if (iRet < 0)
- pr_err("[SSP]: %s - set_accel_cal failed %d\n", __func__, iRet);
- }
- else if (uChangedSensor == GYROSCOPE_SENSOR) {
- gyro_open_calibration(data);
- iRet = set_gyro_cal(data);
- if (iRet < 0)
- pr_err("[SSP]: %s - set_gyro_cal failed %d\n", __func__, iRet);
- }
- #if defined(CONFIG_SENSORS_SSP_BMP182)
- else if (uChangedSensor == PRESSURE_SENSOR)
- pressure_open_calibration(data);
- #endif
- else if (uChangedSensor == PROXIMITY_SENSOR) {
- proximity_open_lcd_ldi(data);
- proximity_open_calibration(data);
- set_proximity_threshold(data, data->uProxHiThresh, data->uProxLoThresh);
- }
- }
- data->aiCheckStatus[uChangedSensor] = ADD_SENSOR_STATE;
- enable_sensor(data, uChangedSensor, data->adDelayBuf[uChangedSensor]);
- }
- break;
- }
- }
- atomic_set(&data->aSensorEnable, uNewEnable);
- return size;
- }
- static ssize_t set_flush(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dTemp;
- u8 sensor_type = 0;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dTemp) < 0)
- return -EINVAL;
- sensor_type = (u8)dTemp;
- if (!(atomic_read(&data->aSensorEnable) & (1 << sensor_type)))
- return -EINVAL;
- if (flush(data, sensor_type) < 0) {
- pr_err("[SSP] ssp returns error for flush(%x)", sensor_type);
- return -EINVAL;
- }
- return size;
- }
- static ssize_t show_acc_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n", data->adDelayBuf[ACCELEROMETER_SENSOR]);
- }
- static ssize_t set_acc_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -EINVAL;
- if ((atomic_read(&data->aSensorEnable) & (1 << ORIENTATION_SENSOR)) &&
- (data->adDelayBuf[ORIENTATION_SENSOR] < dNewDelay))
- data->adDelayBuf[ACCELEROMETER_SENSOR] = dNewDelay;
- else
- change_sensor_delay(data, ACCELEROMETER_SENSOR, dNewDelay);
- return size;
- }
- static ssize_t show_gyro_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n", data->adDelayBuf[GYROSCOPE_SENSOR]);
- }
- static ssize_t set_gyro_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -EINVAL;
- change_sensor_delay(data, GYROSCOPE_SENSOR, dNewDelay);
- return size;
- }
- static ssize_t show_mag_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n", data->adDelayBuf[GEOMAGNETIC_SENSOR]);
- }
- static ssize_t set_mag_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -EINVAL;
- change_sensor_delay(data, GEOMAGNETIC_SENSOR, dNewDelay);
- return size;
- }
- static ssize_t show_uncal_mag_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n", data->adDelayBuf[GEOMAGNETIC_UNCALIB_SENSOR]);
- }
- static ssize_t set_uncal_mag_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -EINVAL;
- change_sensor_delay(data, GEOMAGNETIC_UNCALIB_SENSOR, dNewDelay);
- return size;
- }
- static ssize_t show_rot_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n", data->adDelayBuf[ROTATION_VECTOR]);
- }
- static ssize_t set_rot_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -EINVAL;
- change_sensor_delay(data, ROTATION_VECTOR, dNewDelay);
- return size;
- }
- static ssize_t show_game_rot_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n", data->adDelayBuf[GAME_ROTATION_VECTOR]);
- }
- static ssize_t set_game_rot_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -EINVAL;
- change_sensor_delay(data, GAME_ROTATION_VECTOR, dNewDelay);
- return size;
- }
- static ssize_t show_step_det_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n",
- data->adDelayBuf[STEP_DETECTOR]);
- }
- static ssize_t set_step_det_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -1;
- change_sensor_delay(data, STEP_DETECTOR, dNewDelay);
- return size;
- }
- static ssize_t show_sig_motion_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n",
- data->adDelayBuf[SIG_MOTION_SENSOR]);
- }
- static ssize_t set_sig_motion_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -1;
- change_sensor_delay(data, SIG_MOTION_SENSOR, dNewDelay);
- return size;
- }
- static ssize_t show_step_cnt_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n",
- data->adDelayBuf[STEP_COUNTER]);
- }
- static ssize_t set_step_cnt_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -1;
- change_sensor_delay(data, STEP_COUNTER, dNewDelay);
- return size;
- }
- static ssize_t show_uncalib_gyro_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n", data->adDelayBuf[GYRO_UNCALIB_SENSOR]);
- }
- static ssize_t set_uncalib_gyro_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -EINVAL;
- change_sensor_delay(data, GYRO_UNCALIB_SENSOR, dNewDelay);
- return size;
- }
- #ifdef CONFIG_SENSORS_SSP_BMP182
- static ssize_t show_pressure_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n", data->adDelayBuf[PRESSURE_SENSOR]);
- }
- static ssize_t set_pressure_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -EINVAL;
- change_sensor_delay(data, PRESSURE_SENSOR, dNewDelay);
- return size;
- }
- #endif
- #if defined(CONFIG_SENSORS_SSP_TMG399X) || defined(CONFIG_SENSORS_SSP_MAX88921) || \
- defined(CONFIG_SENSORS_SSP_MAX88920)
- static ssize_t show_gesture_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n", data->adDelayBuf[GESTURE_SENSOR]);
- }
- static ssize_t set_gesture_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -EINVAL;
- change_sensor_delay(data, GESTURE_SENSOR, dNewDelay);
- return size;
- }
- #endif
- static ssize_t show_light_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n", data->adDelayBuf[LIGHT_SENSOR]);
- }
- static ssize_t set_light_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -EINVAL;
- change_sensor_delay(data, LIGHT_SENSOR, dNewDelay);
- return size;
- }
- static ssize_t show_prox_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n", data->adDelayBuf[PROXIMITY_SENSOR]);
- }
- static ssize_t set_prox_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -EINVAL;
- change_sensor_delay(data, PROXIMITY_SENSOR, dNewDelay);
- return size;
- }
- #ifdef CONFIG_SENSORS_SSP_UVIS25
- static ssize_t show_uv_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n", data->adDelayBuf[UV_SENSOR]);
- }
- static ssize_t set_uv_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -EINVAL;
- pr_info("[SSP] %s - %lld\n", __func__, dNewDelay);
- change_sensor_delay(data, UV_SENSOR, dNewDelay);
- return size;
- }
- #endif
- #ifdef CONFIG_SENSORS_SSP_SHTC1
- static ssize_t show_temp_humi_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- return sprintf(buf, "%lld\n",
- data->adDelayBuf[TEMPERATURE_HUMIDITY_SENSOR]);
- }
- static ssize_t set_temp_humi_delay(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
- {
- int64_t dNewDelay;
- struct ssp_data *data = dev_get_drvdata(dev);
- if (kstrtoll(buf, 10, &dNewDelay) < 0)
- return -EINVAL;
- change_sensor_delay(data, TEMPERATURE_HUMIDITY_SENSOR, dNewDelay);
- return size;
- }
- #endif
- ssize_t ssp_sensorhub_voicel_pcmdump_show(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
- struct ssp_data *data = dev_get_drvdata(dev);
- int status = ssp_sensorhub_pcm_dump(data->hub_data);
- return sprintf(buf, "%s\n", (status ? "OK" : "NG"));
- }
- static DEVICE_ATTR(voice_pcmdump, S_IRUGO, ssp_sensorhub_voicel_pcmdump_show, NULL);
- static struct device_attribute *voice_attrs[] = {
- &dev_attr_voice_pcmdump,
- NULL,
- };
- static void initialize_voice_sysfs(struct ssp_data *data)
- {
- sensors_register(data->voice_device, data, voice_attrs, "ssp_voice");
- }
- static void remove_voice_sysfs(struct ssp_data *data)
- {
- sensors_unregister(data->voice_device, voice_attrs);
- }
- static DEVICE_ATTR(mcu_rev, S_IRUGO, mcu_revision_show, NULL);
- static DEVICE_ATTR(mcu_name, S_IRUGO, mcu_model_name_show, NULL);
- static DEVICE_ATTR(mcu_update, S_IRUGO, mcu_update_kernel_bin_show, NULL);
- static DEVICE_ATTR(mcu_update2, S_IRUGO,
- mcu_update_kernel_crashed_bin_show, NULL);
- static DEVICE_ATTR(mcu_update_ums, S_IRUGO, mcu_update_ums_bin_show, NULL);
- static DEVICE_ATTR(mcu_reset, S_IRUGO, mcu_reset_show, NULL);
- static DEVICE_ATTR(mcu_dump, S_IRUGO, mcu_dump_show, NULL);
- static DEVICE_ATTR(mcu_test, S_IRUGO | S_IWUSR | S_IWGRP,
- mcu_factorytest_show, mcu_factorytest_store);
- static DEVICE_ATTR(mcu_sleep_test, S_IRUGO | S_IWUSR | S_IWGRP,
- mcu_sleep_factorytest_show, mcu_sleep_factorytest_store);
- static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR | S_IWGRP,
- show_sensors_enable, set_sensors_enable);
- static DEVICE_ATTR(enable_irq, S_IRUGO | S_IWUSR | S_IWGRP,
- show_enable_irq, set_enable_irq);
- static DEVICE_ATTR(rot_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_rot_delay, set_rot_delay);
- static DEVICE_ATTR(game_rot_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_game_rot_delay, set_game_rot_delay);
- static DEVICE_ATTR(step_det_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_step_det_delay, set_step_det_delay);
- #ifdef CONFIG_SENSORS_SSP_BMP182
- static DEVICE_ATTR(pressure_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_pressure_delay, set_pressure_delay);
- #endif
- static DEVICE_ATTR(accel_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_acc_delay, set_acc_delay);
- static DEVICE_ATTR(gyro_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_gyro_delay, set_gyro_delay);
- static DEVICE_ATTR(ssp_flush, S_IWUSR | S_IWGRP,
- NULL, set_flush);
- static struct device_attribute dev_attr_mag_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_mag_delay, set_mag_delay);
- static struct device_attribute dev_attr_uncal_mag_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_uncal_mag_delay, set_uncal_mag_delay);
- #if defined(CONFIG_SENSORS_SSP_TMG399X) || defined(CONFIG_SENSORS_SSP_MAX88921) || \
- defined(CONFIG_SENSORS_SSP_MAX88920)
- static struct device_attribute dev_attr_gesture_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_gesture_delay, set_gesture_delay);
- #endif
- static struct device_attribute dev_attr_light_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_light_delay, set_light_delay);
- static struct device_attribute dev_attr_prox_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_prox_delay, set_prox_delay);
- #ifdef CONFIG_SENSORS_SSP_UVIS25
- static struct device_attribute dev_attr_uv_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_uv_delay, set_uv_delay);
- #endif
- #ifdef CONFIG_SENSORS_SSP_SHTC1
- static struct device_attribute dev_attr_temp_humi_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_temp_humi_delay, set_temp_humi_delay);
- #endif
- static struct device_attribute dev_attr_sig_motion_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_sig_motion_delay, set_sig_motion_delay);
- static struct device_attribute dev_attr_uncalib_gyro_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_uncalib_gyro_delay, set_uncalib_gyro_delay);
- static struct device_attribute dev_attr_step_cnt_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_step_cnt_delay, set_step_cnt_delay);
- static struct device_attribute *mcu_attrs[] = {
- &dev_attr_enable,
- &dev_attr_mcu_rev,
- &dev_attr_mcu_name,
- &dev_attr_mcu_test,
- &dev_attr_mcu_reset,
- &dev_attr_mcu_dump,
- &dev_attr_mcu_update,
- &dev_attr_mcu_update2,
- &dev_attr_mcu_update_ums,
- &dev_attr_mcu_sleep_test,
- &dev_attr_enable_irq,
- &dev_attr_accel_poll_delay,
- &dev_attr_gyro_poll_delay,
- &dev_attr_rot_poll_delay,
- &dev_attr_game_rot_poll_delay,
- &dev_attr_step_det_poll_delay,
- #ifdef CONFIG_SENSORS_SSP_BMP182
- &dev_attr_pressure_poll_delay,
- #endif
- &dev_attr_ssp_flush,
- NULL,
- };
- static long ssp_batch_ioctl(struct file *file, unsigned int cmd,
- unsigned long arg)
- {
- struct ssp_data *data
- = container_of(file->private_data,
- struct ssp_data, batch_io_device);
- struct batch_config batch;
- void __user *argp = (void __user *)arg;
- int retries = 2;
- int ret = 0;
- int sensor_type, ms_delay;
- int timeout_ms = 0;
- u8 uBuf[9];
- sensor_type = (cmd & 0xFF);
- if ((cmd >> 8 & 0xFF) != BATCH_IOCTL_MAGIC) {
- pr_err("[SSP] Invalid BATCH CMD %x", cmd);
- return -EINVAL;
- }
- while (retries--) {
- ret = copy_from_user(&batch, argp, sizeof(batch));
- if (likely(!ret))
- break;
- }
- if (unlikely(ret)) {
- pr_err("[SSP] batch ioctl err(%d)", ret);
- return -EINVAL;
- }
- ms_delay = get_msdelay(batch.delay);
- timeout_ms = div_s64(batch.timeout, 1000000);
- memcpy(&uBuf[0], &ms_delay, 4);
- memcpy(&uBuf[4], &timeout_ms, 4);
- uBuf[8] = batch.flag;
- if (batch.timeout){ /* add or dry */
- if(!(batch.flag & SENSORS_BATCH_DRY_RUN)) { /* real batch, NOT DRY, change delay */
- ret = 1;
- /* if sensor is not running state, enable will be called.
- MCU return fail when receive chage delay inst during NO_SENSOR STATE */
- if (data->aiCheckStatus[sensor_type] == RUNNING_SENSOR_STATE) {
- ret = send_instruction_sync(data, CHANGE_DELAY, sensor_type, uBuf, 9);
- }
- if (ret > 0) { // ret 1 is success
- data->batchOptBuf[sensor_type] = (u8)batch.flag;
- data->batchLatencyBuf[sensor_type] = timeout_ms;
- data->adDelayBuf[sensor_type] = batch.delay;
- }
- } else { /* real batch, DRY RUN */
- ret = send_instruction_sync(data, CHANGE_DELAY, sensor_type, uBuf, 9);
- if (ret > 0) { // ret 1 is success
- data->batchOptBuf[sensor_type] = (u8)batch.flag;
- data->batchLatencyBuf[sensor_type] = timeout_ms;
- data->adDelayBuf[sensor_type] = batch.delay;
- }
- }
- } else { /* remove batch or normal change delay, remove or add will be called. */
- if (!(batch.flag & SENSORS_BATCH_DRY_RUN)) { /* no batch, NOT DRY, change delay */
- data->batchOptBuf[sensor_type] = 0;
- data->batchLatencyBuf[sensor_type] = 0;
- data->adDelayBuf[sensor_type] = batch.delay;
- if (data->aiCheckStatus[sensor_type] == RUNNING_SENSOR_STATE) {
- send_instruction(data, CHANGE_DELAY, sensor_type, uBuf, 9);
- }
- }
- }
- pr_info("[SSP] batch %d: delay %lld, timeout %lld, flag %d, ret %d",
- sensor_type, batch.delay, batch.timeout, batch.flag, ret);
- if (!batch.timeout)
- return 0;
- if (ret <= 0)
- return -EINVAL;
- else
- return 0;
- }
- static struct file_operations ssp_batch_fops = {
- .owner = THIS_MODULE,
- .open = nonseekable_open,
- .unlocked_ioctl = ssp_batch_ioctl,
- };
- static void initialize_mcu_factorytest(struct ssp_data *data)
- {
- sensors_register(data->mcu_device, data, mcu_attrs, "ssp_sensor");
- }
- static void remove_mcu_factorytest(struct ssp_data *data)
- {
- sensors_unregister(data->mcu_device, mcu_attrs);
- }
- int initialize_sysfs(struct ssp_data *data)
- {
- #if defined(CONFIG_SENSORS_SSP_TMG399X) || defined(CONFIG_SENSORS_SSP_MAX88921) || \
- defined(CONFIG_SENSORS_SSP_MAX88920)
- if (device_create_file(&data->gesture_input_dev->dev,
- &dev_attr_gesture_poll_delay))
- goto err_gesture_input_dev;
- #endif
- if (device_create_file(&data->light_input_dev->dev,
- &dev_attr_light_poll_delay))
- goto err_light_input_dev;
- if (device_create_file(&data->prox_input_dev->dev,
- &dev_attr_prox_poll_delay))
- goto err_prox_input_dev;
- #ifdef CONFIG_SENSORS_SSP_UVIS25
- if (device_create_file(&data->uv_input_dev->dev,
- &dev_attr_uv_poll_delay))
- goto err_uv_input_dev;
- #endif
- #ifdef CONFIG_SENSORS_SSP_SHTC1
- if (device_create_file(&data->temp_humi_input_dev->dev,
- &dev_attr_temp_humi_poll_delay))
- goto err_temp_humi_input_dev;
- #endif
- if (device_create_file(&data->mag_input_dev->dev,
- &dev_attr_mag_poll_delay))
- goto err_mag_input_dev;
- if (device_create_file(&data->uncal_mag_input_dev->dev,
- &dev_attr_uncal_mag_poll_delay))
- goto err_uncal_mag_input_dev;
- if (device_create_file(&data->sig_motion_input_dev->dev,
- &dev_attr_sig_motion_poll_delay))
- goto err_sig_motion_input_dev;
- if (device_create_file(&data->uncalib_gyro_input_dev->dev,
- &dev_attr_uncalib_gyro_poll_delay))
- goto err_uncalib_gyro_input_dev;
- if (device_create_file(&data->step_cnt_input_dev->dev,
- &dev_attr_step_cnt_poll_delay))
- goto err_step_cnt_input_dev;
- data->batch_io_device.minor = MISC_DYNAMIC_MINOR;
- data->batch_io_device.name = "batch_io";
- data->batch_io_device.fops = &ssp_batch_fops;
- if (misc_register(&data->batch_io_device))
- goto err_batch_io_dev;
- initialize_accel_factorytest(data);
- initialize_gyro_factorytest(data);
- initialize_prox_factorytest(data);
- initialize_light_factorytest(data);
- #ifdef CONFIG_SENSORS_SSP_BMP182
- initialize_pressure_factorytest(data);
- #endif
- initialize_magnetic_factorytest(data);
- #ifdef CONFIG_SENSORS_SSP_UVIS25
- initialize_uv_factorytest(data);
- #endif
- initialize_mcu_factorytest(data);
- #if defined(CONFIG_SENSORS_SSP_TMG399X) || defined(CONFIG_SENSORS_SSP_MAX88921) || \
- defined(CONFIG_SENSORS_SSP_MAX88920)
- initialize_gesture_factorytest(data);
- #endif
- #ifdef CONFIG_SENSORS_SSP_SHTC1
- initialize_temphumidity_factorytest(data);
- #endif
- #ifdef CONFIG_SENSORS_SSP_MOBEAM
- initialize_mobeam(data);
- #endif
- /*snamy.jeong_0630 voice dump & data*/
- initialize_voice_sysfs(data);
- return SUCCESS;
- err_batch_io_dev:
- device_remove_file(&data->step_cnt_input_dev->dev,
- &dev_attr_step_cnt_poll_delay);
- err_step_cnt_input_dev:
- device_remove_file(&data->uncalib_gyro_input_dev->dev,
- &dev_attr_uncalib_gyro_poll_delay);
- err_uncalib_gyro_input_dev:
- device_remove_file(&data->sig_motion_input_dev->dev,
- &dev_attr_sig_motion_poll_delay);
- err_sig_motion_input_dev:
- device_remove_file(&data->uncal_mag_input_dev->dev,
- &dev_attr_uncal_mag_poll_delay);
- err_uncal_mag_input_dev:
- device_remove_file(&data->mag_input_dev->dev,
- &dev_attr_mag_poll_delay);
- err_mag_input_dev:
- #ifdef CONFIG_SENSORS_SSP_SHTC1
- device_remove_file(&data->temp_humi_input_dev->dev,
- &dev_attr_temp_humi_poll_delay);
- err_temp_humi_input_dev:
- #endif
- #ifdef CONFIG_SENSORS_SSP_UVIS25
- device_remove_file(&data->uv_input_dev->dev,
- &dev_attr_uv_poll_delay);
- err_uv_input_dev:
- #endif
- device_remove_file(&data->prox_input_dev->dev,
- &dev_attr_prox_poll_delay);
- err_prox_input_dev:
- device_remove_file(&data->light_input_dev->dev,
- &dev_attr_light_poll_delay);
- err_light_input_dev:
- #if defined(CONFIG_SENSORS_SSP_TMG399X) || defined(CONFIG_SENSORS_SSP_MAX88921) || \
- defined(CONFIG_SENSORS_SSP_MAX88920)
- device_remove_file(&data->gesture_input_dev->dev,
- &dev_attr_gesture_poll_delay);
- err_gesture_input_dev:
- #endif
- pr_err("[SSP] error init sysfs");
- return ERROR;
- }
- void remove_sysfs(struct ssp_data *data)
- {
- #if defined(CONFIG_SENSORS_SSP_TMG399X) || defined(CONFIG_SENSORS_SSP_MAX88921) || \
- defined(CONFIG_SENSORS_SSP_MAX88920)
- device_remove_file(&data->gesture_input_dev->dev,
- &dev_attr_gesture_poll_delay);
- #endif
- device_remove_file(&data->light_input_dev->dev,
- &dev_attr_light_poll_delay);
- device_remove_file(&data->prox_input_dev->dev,
- &dev_attr_prox_poll_delay);
- #ifdef CONFIG_SENSORS_SSP_SHTC1
- device_remove_file(&data->temp_humi_input_dev->dev,
- &dev_attr_temp_humi_poll_delay);
- #endif
- #ifdef CONFIG_SENSORS_SSP_UVIS25
- device_remove_file(&data->uv_input_dev->dev,
- &dev_attr_uv_poll_delay);
- #endif
- device_remove_file(&data->mag_input_dev->dev,
- &dev_attr_mag_poll_delay);
- device_remove_file(&data->uncal_mag_input_dev->dev,
- &dev_attr_uncal_mag_poll_delay);
- device_remove_file(&data->sig_motion_input_dev->dev,
- &dev_attr_sig_motion_poll_delay);
- device_remove_file(&data->uncalib_gyro_input_dev->dev,
- &dev_attr_uncalib_gyro_poll_delay);
- device_remove_file(&data->step_cnt_input_dev->dev,
- &dev_attr_step_cnt_poll_delay);
- ssp_batch_fops.unlocked_ioctl = NULL;
- misc_deregister(&data->batch_io_device);
- remove_accel_factorytest(data);
- remove_gyro_factorytest(data);
- remove_prox_factorytest(data);
- remove_light_factorytest(data);
- #ifdef CONFIG_SENSORS_SSP_BMP182
- remove_pressure_factorytest(data);
- #endif
- remove_magnetic_factorytest(data);
- #ifdef CONFIG_SENSORS_SSP_UVIS25
- remove_uv_factorytest(data);
- #endif
- remove_mcu_factorytest(data);
- #if defined(CONFIG_SENSORS_SSP_TMG399X) || defined(CONFIG_SENSORS_SSP_MAX88921) || \
- defined(CONFIG_SENSORS_SSP_MAX88920)
- remove_gesture_factorytest(data);
- #endif
- #ifdef CONFIG_SENSORS_SSP_SHTC1
- remove_temphumidity_factorytest(data);
- #endif
- #ifdef CONFIG_SENSORS_SSP_MOBEAM
- remove_mobeam(data);
- #endif
- /*snamy.jeong_0630 voice dump & data*/
- remove_voice_sysfs(data);
- destroy_sensor_class();
- }
|