123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763 |
- /*
- * 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"
- /*************************************************************************/
- /* SSP data delay function */
- /*************************************************************************/
- unsigned int get_msdelay(int64_t dDelayRate)
- {
- if (dDelayRate >= SENSOR_NS_DELAY_NORMAL)
- return SENSOR_MS_DELAY_NORMAL;
- else if (dDelayRate >= SENSOR_NS_DELAY_UI)
- return SENSOR_MS_DELAY_UI;
- else if (dDelayRate >= SENSOR_NS_DELAY_GAME)
- return SENSOR_MS_DELAY_GAME;
- else
- return SENSOR_MS_DELAY_FASTEST;
- }
- unsigned int get_delay_cmd(u8 uDelayRate)
- {
- if (uDelayRate >= SENSOR_MS_DELAY_NORMAL)
- return SENSOR_CMD_DELAY_NORMAL;
- else if (uDelayRate >= SENSOR_MS_DELAY_UI)
- return SENSOR_CMD_DELAY_UI;
- else if (uDelayRate >= SENSOR_MS_DELAY_GAME)
- return SENSOR_CMD_DELAY_GAME;
- else
- return SENSOR_CMD_DELAY_FASTEST;
- }
- static void enable_sensor(struct ssp_data *data,
- int iSensorType, int64_t dNewDelay)
- {
- u8 uBuf[2];
- unsigned int uNewEnable = 0;
- int64_t dTempDelay = data->adDelayBuf[iSensorType];
- data->adDelayBuf[iSensorType] = dNewDelay;
- switch (data->aiCheckStatus[iSensorType]) {
- case ADD_SENSOR_STATE:
- pr_info("[SSP]: %s - add %u, New = %lldns\n",
- __func__, 1 << iSensorType, dNewDelay);
- uBuf[1] = (u8)get_msdelay(dNewDelay);
- uBuf[0] = (u8)get_delay_cmd(uBuf[1]);
- if (send_instruction(data, ADD_SENSOR, iSensorType, uBuf, 2)
- != SUCCESS) {
- uNewEnable =
- (unsigned int)atomic_read(&data->aSensorEnable)
- & (~(unsigned int)(1 << iSensorType));
- atomic_set(&data->aSensorEnable, uNewEnable);
- data->aiCheckStatus[iSensorType] = NO_SENSOR_STATE;
- data->uMissSensorCnt++;
- break;
- }
- data->aiCheckStatus[iSensorType] = RUNNING_SENSOR_STATE;
- if (iSensorType == PROXIMITY_SENSOR && !(data->bSspShutdown)) {
- proximity_open_lcd_ldi(data);
- proximity_open_calibration(data);
- 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_info("[SSP]: %s - Change %u, New = %lldns\n",
- __func__, 1 << iSensorType, dNewDelay);
- uBuf[1] = (u8)get_msdelay(dNewDelay);
- uBuf[0] = (u8)get_delay_cmd(uBuf[1]);
- send_instruction(data, CHANGE_DELAY, iSensorType, uBuf, 2);
- break;
- default:
- break;
- /* data->aiCheckStatus[iSensorType] = ADD_SENSOR_STATE;*/
- }
- }
- static void change_sensor_delay(struct ssp_data *data,
- int iSensorType, int64_t dNewDelay)
- {
- u8 uBuf[2];
- int64_t dTempDelay = data->adDelayBuf[iSensorType];
- data->adDelayBuf[iSensorType] = dNewDelay;
- switch (data->aiCheckStatus[iSensorType]) {
- case RUNNING_SENSOR_STATE:
- if (get_msdelay(dTempDelay)
- == get_msdelay(data->adDelayBuf[iSensorType]))
- break;
- pr_info("[SSP]: %s - Change %u, New = %lldns\n",
- __func__, 1 << iSensorType, dNewDelay);
- uBuf[1] = (u8)get_msdelay(dNewDelay);
- uBuf[0] = (u8)get_delay_cmd(uBuf[1]);
- send_instruction(data, CHANGE_DELAY, iSensorType, uBuf, 2);
- break;
- default:
- break;
- }
- }
- /*************************************************************************/
- /* SSP data enable function */
- /*************************************************************************/
- static int ssp_remove_sensor(struct ssp_data *data,
- unsigned int uChangedSensor, unsigned int uNewEnable)
- {
- u8 uBuf[2];
- int64_t dSensorDelay = data->adDelayBuf[uChangedSensor];
- ssp_dbg("[SSP]: %s - remove sensor = %d, current state = %d\n",
- __func__, (1 << uChangedSensor), uNewEnable);
- data->adDelayBuf[uChangedSensor] = DEFUALT_POLLING_DELAY;
- 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;
- }
- } else if (uChangedSensor == GEOMAGNETIC_SENSOR) {
- if (mag_store_hwoffset(data))
- pr_err("mag_store_hwoffset success\n");
- }
- if (atomic_read(&data->aSensorEnable) & (1 << uChangedSensor)) {
- uBuf[1] = (u8)get_msdelay(dSensorDelay);
- uBuf[0] = (u8)get_delay_cmd(uBuf[1]);
- send_instruction(data, REMOVE_SENSOR, uChangedSensor, uBuf, 2);
- }
- 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);
- ssp_dbg("[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;
- unsigned int uNewEnable = 0, uChangedSensor = 0;
- int iRet;
- 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))
- 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 {
- if (data->aiCheckStatus[uChangedSensor] == INITIALIZATION_STATE) {
- switch (uChangedSensor) {
- case ACCELEROMETER_SENSOR:
- accel_open_calibration(data);
- break;
- case GYROSCOPE_SENSOR:
- gyro_open_calibration(data);
- break;
- case PRESSURE_SENSOR:
- pressure_open_calibration(data);
- break;
- case PROXIMITY_SENSOR:
- proximity_open_lcd_ldi(data);
- proximity_open_calibration(data);
- break;
- case GEOMAGNETIC_SENSOR:
- iRet = mag_open_hwoffset(data);
- if (iRet < 0)
- pr_err("[SSP]: %s - mag_open_hw_offset"
- " failed, %d\n", __func__, iRet);
- iRet = set_hw_offset(data);
- if (iRet < 0) {
- pr_err("[SSP]: %s - set_hw_offset failed\n",
- __func__);
- }
- break;
- default:
- break;
- }
- }
- 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;
- input_report_rel(data->meta_input_dev, REL_DIAL, META_DATA_FLUSH_COMPLETE);
- input_report_rel(data->meta_input_dev, REL_HWHEEL, sensor_type + 1);
- input_sync(data->meta_input_dev);
- pr_info("[SSP] flush %d", sensor_type);
- 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_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;
- }
- 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;
- }
- 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;
- }
- 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;
- }
- 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_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_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 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_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(ssp_flush, S_IWUSR | S_IWGRP, NULL, set_flush);
- static struct device_attribute dev_attr_accel_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_acc_delay, set_acc_delay);
- static struct device_attribute dev_attr_gyro_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_gyro_delay, set_gyro_delay);
- 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_pressure_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_pressure_delay, set_pressure_delay);
- static struct device_attribute dev_attr_gesture_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_gesture_delay, set_gesture_delay);
- 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);
- 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);
- 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_step_det_poll_delay
- = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
- show_step_det_delay, set_step_det_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_update,
- &dev_attr_mcu_update2,
- &dev_attr_mcu_update_ums,
- &dev_attr_mcu_sleep_test,
- &dev_attr_enable_irq,
- &dev_attr_ssp_flush,
- NULL,
- };
- 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 (device_create_file(&data->acc_input_dev->dev,
- &dev_attr_accel_poll_delay))
- goto err_acc_input_dev;
- if (device_create_file(&data->gyro_input_dev->dev,
- &dev_attr_gyro_poll_delay))
- goto err_gyro_input_dev;
- if (device_create_file(&data->pressure_input_dev->dev,
- &dev_attr_pressure_poll_delay))
- goto err_pressure_input_dev;
- if (device_create_file(&data->gesture_input_dev->dev,
- &dev_attr_gesture_poll_delay))
- goto err_gesture_input_dev;
- 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;
- if (device_create_file(&data->temp_humi_input_dev->dev,
- &dev_attr_temp_humi_poll_delay))
- goto err_temp_humi_input_dev;
- if (device_create_file(&data->mag_input_dev->dev,
- &dev_attr_mag_poll_delay))
- goto err_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->step_det_input_dev->dev,
- &dev_attr_step_det_poll_delay))
- goto err_step_det_input_dev;
- if (device_create_file(&data->step_cnt_input_dev->dev,
- &dev_attr_step_cnt_poll_delay))
- goto err_step_cnt_input_dev;
- initialize_accel_factorytest(data);
- initialize_gyro_factorytest(data);
- initialize_prox_factorytest(data);
- initialize_light_factorytest(data);
- initialize_pressure_factorytest(data);
- initialize_magnetic_factorytest(data);
- initialize_mcu_factorytest(data);
- #ifdef CONFIG_SENSORS_SSP_MAX88920
- initialize_gesture_factorytest(data);
- #endif
- #ifdef CONFIG_SENSORS_SSP_SHTC1
- initialize_temphumidity_factorytest(data);
- #endif
- return SUCCESS;
- err_step_cnt_input_dev:
- device_remove_file(&data->step_det_input_dev->dev,
- &dev_attr_step_det_poll_delay);
- err_step_det_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->mag_input_dev->dev,
- &dev_attr_mag_poll_delay);
- err_mag_input_dev:
- device_remove_file(&data->temp_humi_input_dev->dev,
- &dev_attr_temp_humi_poll_delay);
- err_temp_humi_input_dev:
- 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:
- device_remove_file(&data->pressure_input_dev->dev,
- &dev_attr_pressure_poll_delay);
- err_pressure_input_dev:
- device_remove_file(&data->gyro_input_dev->dev,
- &dev_attr_gyro_poll_delay);
- err_gesture_input_dev:
- device_remove_file(&data->gesture_input_dev->dev,
- &dev_attr_gesture_poll_delay);
- err_gyro_input_dev:
- device_remove_file(&data->acc_input_dev->dev,
- &dev_attr_accel_poll_delay);
- err_acc_input_dev:
- return ERROR;
- }
- void remove_sysfs(struct ssp_data *data)
- {
- device_remove_file(&data->acc_input_dev->dev,
- &dev_attr_accel_poll_delay);
- device_remove_file(&data->gyro_input_dev->dev,
- &dev_attr_gyro_poll_delay);
- device_remove_file(&data->pressure_input_dev->dev,
- &dev_attr_pressure_poll_delay);
- device_remove_file(&data->gesture_input_dev->dev,
- &dev_attr_gesture_poll_delay);
- 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);
- device_remove_file(&data->temp_humi_input_dev->dev,
- &dev_attr_temp_humi_poll_delay);
- device_remove_file(&data->mag_input_dev->dev,
- &dev_attr_mag_poll_delay);
- device_remove_file(&data->sig_motion_input_dev->dev,
- &dev_attr_sig_motion_poll_delay);
- device_remove_file(&data->step_det_input_dev->dev,
- &dev_attr_step_det_poll_delay);
- device_remove_file(&data->step_cnt_input_dev->dev,
- &dev_attr_step_cnt_poll_delay);
- remove_accel_factorytest(data);
- remove_gyro_factorytest(data);
- remove_prox_factorytest(data);
- remove_light_factorytest(data);
- remove_pressure_factorytest(data);
- remove_magnetic_factorytest(data);
- remove_mcu_factorytest(data);
- #ifdef CONFIG_SENSORS_SSP_MAX88920
- remove_gesture_factorytest(data);
- #endif
- #ifdef CONFIG_SENSORS_SSP_SHTC1
- remove_temphumidity_factorytest(data);
- #endif
- destroy_sensor_class();
- }
|