aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/sensorhub/ssp_i2c.c
diff options
context:
space:
mode:
authorWolfgang Wiedmeyer <wolfgit@wiedmeyer.de>2017-02-23 14:36:24 +0100
committerDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2019-07-24 12:32:21 +0200
commitb09c0b051b24b989023f56061002fa3b32b8ae33 (patch)
treeefc679f9ae0dc5fc185a5112afa3826872bf9457 /drivers/sensorhub/ssp_i2c.c
parent0569a932e93c22b273cdd80e9b2e2fc1f138bcc5 (diff)
downloadkernel_samsung_smdk4412-b09c0b051b24b989023f56061002fa3b32b8ae33.tar.gz
kernel_samsung_smdk4412-b09c0b051b24b989023f56061002fa3b32b8ae33.tar.bz2
kernel_samsung_smdk4412-b09c0b051b24b989023f56061002fa3b32b8ae33.zip
drivers/sensorhub: update from GT-N7100_KK_Opensource_Update1 source drop
The import already includes the build fixes from this commit: commit 7055ffb Author: Dheeraj CVR <cvr.dheeraj@gmail.com> Date: 2014-12-22 12:55:48 +0530 drivers: sensorhub: fix compile Change-Id: Ice06c873e4f2fe50ccb1a4cac5ac761e4a872bd3 Signed-off-by: Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de>
Diffstat (limited to 'drivers/sensorhub/ssp_i2c.c')
-rw-r--r--drivers/sensorhub/ssp_i2c.c549
1 files changed, 0 insertions, 549 deletions
diff --git a/drivers/sensorhub/ssp_i2c.c b/drivers/sensorhub/ssp_i2c.c
deleted file mode 100644
index 695ad8dae34..00000000000
--- a/drivers/sensorhub/ssp_i2c.c
+++ /dev/null
@@ -1,549 +0,0 @@
-/*
- * 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"
-
-#define LIMIT_DELAY_CNT 200
-
-int waiting_wakeup_mcu(struct ssp_data *data)
-{
- int iDelaycnt = 0;
-
- while (!data->check_mcu_busy() && (iDelaycnt++ < LIMIT_DELAY_CNT)
- && (data->bSspShutdown == false))
- mdelay(5);
-
- if (iDelaycnt >= LIMIT_DELAY_CNT) {
- pr_err("[SSP]: %s - MCU Irq Timeout!!\n", __func__);
- data->uBusyCnt++;
- } else {
- data->uBusyCnt = 0;
- }
-
- iDelaycnt = 0;
- data->wakeup_mcu();
- while (data->check_mcu_ready() && (iDelaycnt++ < LIMIT_DELAY_CNT)
- && (data->bSspShutdown == false))
- mdelay(5);
-
- if (iDelaycnt >= LIMIT_DELAY_CNT) {
- pr_err("[SSP]: %s - MCU Wakeup Timeout!!\n", __func__);
- data->uTimeOutCnt++;
- } else {
- data->uTimeOutCnt = 0;
- }
-
- if (data->bSspShutdown == true)
- return FAIL;
-
- return SUCCESS;
-}
-
-int ssp_i2c_read(struct ssp_data *data, char *pTxData, u16 uTxLength,
- char *pRxData, u16 uRxLength, int iRetries)
-{
- int iRet = 0, iDiffTime = 0, iTimeTemp;
- struct timeval cur_time;
- struct i2c_client *client = data->client;
- struct i2c_msg msgs[] = {
- {
- .addr = client->addr,
- .flags = 0,
- .len = uTxLength,
- .buf = pTxData,
- },
- {
- .addr = client->addr,
- .flags = I2C_M_RD,
- .len = uRxLength,
- .buf = pRxData,
- },
- };
-
- do_gettimeofday(&cur_time);
- iTimeTemp = (int)cur_time.tv_sec;
- do {
- iRet = i2c_transfer(client->adapter, msgs, 2);
- if (iRet < 0) {
- do_gettimeofday(&cur_time);
- iDiffTime = (int)cur_time.tv_sec - iTimeTemp;
- iTimeTemp = (int)cur_time.tv_sec;
- if (iDiffTime >= 4) {
- pr_err("[SSP]: %s - i2c time out %d!\n",
- __func__, iDiffTime);
- break;
- }
- pr_err("[SSP]: %s - i2c transfer error %d! retry...\n",
- __func__, iRet);
- mdelay(10);
- } else {
- return SUCCESS;
- }
- } while (--iRetries);
-
- return ERROR;
-}
-
-int ssp_sleep_mode(struct ssp_data *data)
-{
- char chRxBuf = 0;
- char chTxBuf = MSG2SSP_AP_STATUS_SLEEP;
- int iRet = 0, iRetries = DEFAULT_RETRIES;
-
- if (waiting_wakeup_mcu(data) < 0)
- return ERROR;
-
- /* send to AP_STATUS_SLEEP */
- iRet = ssp_i2c_read(data, &chTxBuf, 1, &chRxBuf, 1, DEFAULT_RETRIES);
- if (iRet != SUCCESS) {
- pr_err("[SSP]: %s - MSG2SSP_AP_STATUS_SLEEP CMD fail %d\n",
- __func__, iRet);
- return ERROR;
- } else if (chRxBuf != MSG_ACK) {
- while (iRetries--) {
- mdelay(10);
- pr_err("[SSP]: %s - MSG2SSP_AP_STATUS_SLEEP CMD "
- "retry...\n", __func__);
- iRet = ssp_i2c_read(data, &chTxBuf, 1,
- &chRxBuf, 1, DEFAULT_RETRIES);
- if ((iRet == SUCCESS) && (chRxBuf == MSG_ACK))
- break;
- }
-
- if (iRetries < 0) {
- data->uInstFailCnt++;
- return FAIL;
- }
- }
-
- data->uInstFailCnt = 0;
- ssp_dbg("[SSP]: %s - MSG2SSP_AP_STATUS_SLEEP CMD\n", __func__);
-
- return SUCCESS;
-}
-
-int ssp_resume_mode(struct ssp_data *data)
-{
- char chRxBuf = 0;
- char chTxBuf = MSG2SSP_AP_STATUS_WAKEUP;
- int iRet = 0, iRetries = DEFAULT_RETRIES;
-
- if (waiting_wakeup_mcu(data) < 0)
- return ERROR;
-
- /* send to MSG2SSP_AP_STATUS_WAKEUP */
- iRet = ssp_i2c_read(data, &chTxBuf, 1, &chRxBuf, 1, DEFAULT_RETRIES);
- if (iRet != SUCCESS) {
- pr_err("[SSP]: %s - MSG2SSP_AP_STATUS_WAKEUP CMD fail %d\n",
- __func__, iRet);
- return ERROR;
- } else if (chRxBuf != MSG_ACK) {
- while (iRetries--) {
- mdelay(10);
- pr_err("[SSP]: %s - MSG2SSP_AP_STATUS_WAKEUP CMD "
- "retry...\n", __func__);
- iRet = ssp_i2c_read(data, &chTxBuf, 1, &chRxBuf, 1,
- DEFAULT_RETRIES);
- if ((iRet == SUCCESS) && (chRxBuf == MSG_ACK))
- break;
- }
-
- if (iRetries < 0) {
- data->uInstFailCnt++;
- return FAIL;
- }
- }
-
- data->uInstFailCnt = 0;
- ssp_dbg("[SSP]: %s - MSG2SSP_AP_STATUS_WAKEUP CMD\n", __func__);
-
- return SUCCESS;
-}
-
-int send_instruction(struct ssp_data *data, u8 uInst,
- u8 uSensorType, u8 *uSendBuf, u8 uLength)
-{
- char chTxbuf[uLength + 3];
- char chRxbuf = 0;
- int iRet = 0, iRetries = DEFAULT_RETRIES;
-
- if ((!(data->uSensorState & (1 << uSensorType)))
- && (uInst <= CHANGE_DELAY)) {
- pr_err("[SSP]: %s - Bypass Inst Skip! - %u\n",
- __func__, uSensorType);
- return FAIL;
- } else if ((!((data->uSensorState | 0xf0) & (1 << uSensorType)))
- && (uInst == FACTORY_MODE)) {
- pr_err("[SSP]: %s - Factory Inst Skip! - %u\n",
- __func__, uSensorType);
- return FAIL;
- }
-
- if (waiting_wakeup_mcu(data) < 0)
- return ERROR;
-
- chTxbuf[0] = MSG2SSP_SSM;
-
- switch (uInst) {
- case REMOVE_SENSOR:
- chTxbuf[1] = MSG2SSP_INST_BYPASS_SENSOR_REMOVE;
- break;
- case ADD_SENSOR:
- chTxbuf[1] = MSG2SSP_INST_BYPASS_SENSOR_ADD;
- break;
- case CHANGE_DELAY:
- chTxbuf[1] = MSG2SSP_INST_CHANGE_DELAY;
- break;
- case GO_SLEEP:
- chTxbuf[1] = MSG2SSP_AP_STATUS_SLEEP;
- break;
- case FACTORY_MODE:
- chTxbuf[1] = MSG2SSP_INST_SENSOR_SELFTEST;
- break;
- case REMOVE_LIBRARY:
- chTxbuf[1] = MSG2SSP_INST_LIBRARY_REMOVE;
- break;
- case ADD_LIBRARY:
- chTxbuf[1] = MSG2SSP_INST_LIBRARY_ADD;
- break;
- default:
- chTxbuf[1] = uInst;
- break;
- }
-
- chTxbuf[2] = uSensorType;
- memcpy(&chTxbuf[3], uSendBuf, uLength);
-
- iRet = ssp_i2c_read(data, &(chTxbuf[0]), uLength + 3, &chRxbuf, 1,
- DEFAULT_RETRIES);
- if (iRet != SUCCESS) {
- pr_err("[SSP]: %s - Instruction CMD Fail %d\n", __func__, iRet);
- return ERROR;
- } else if (chRxbuf != MSG_ACK) {
- while (iRetries--) {
- mdelay(10);
- pr_err("[SSP]: %s - Instruction CMD retry...\n",
- __func__);
- if (waiting_wakeup_mcu(data) < 0)
- return ERROR;
- iRet = ssp_i2c_read(data, &(chTxbuf[0]),
- uLength + 3, &chRxbuf, 1, DEFAULT_RETRIES);
- if ((iRet == SUCCESS) && (chRxbuf == MSG_ACK))
- break;
- }
-
- if (iRetries < 0) {
- data->uInstFailCnt++;
- return FAIL;
- }
- }
-
- data->uInstFailCnt = 0;
- ssp_dbg("[SSP]: %s - Inst = 0x%x, Sensor Type = 0x%x, "
- "data = %u, %u\n", __func__, chTxbuf[1], chTxbuf[2],
- chTxbuf[3], chTxbuf[4]);
- return SUCCESS;
-}
-
-int get_chipid(struct ssp_data *data)
-{
- int iRet;
-
- if (waiting_wakeup_mcu(data) < 0)
- return ERROR;
-
- /* read chip id */
- iRet = i2c_smbus_read_byte_data(data->client, MSG2SSP_AP_WHOAMI);
-
- return iRet;
-}
-
-int set_sensor_position(struct ssp_data *data)
-{
- char chTxBuf[5] = { 0, };
- char chRxData = 0;
- int iRet = 0;
-
- if (waiting_wakeup_mcu(data) < 0)
- return ERROR;
-
- chTxBuf[0] = MSG2SSP_AP_SENSOR_FORMATION;
-
- chTxBuf[1] = CONFIG_SENSORS_SSP_ACCELEROMETER_POSITION;
- chTxBuf[2] = CONFIG_SENSORS_SSP_GYROSCOPE_POSITION;
- chTxBuf[3] = CONFIG_SENSORS_SSP_MAGNETOMETER_POSITION;
- chTxBuf[4] = 0;
-
- pr_info("[SSP] Sensor Posision A : %u, G : %u, M: %u, P: %u\n",
- chTxBuf[1], chTxBuf[2], chTxBuf[3], chTxBuf[4]);
-
- iRet = ssp_i2c_read(data, chTxBuf, 5, &chRxData, 1, DEFAULT_RETRIES);
- if ((chRxData != MSG_ACK) || (iRet != SUCCESS)) {
- pr_err("[SSP]: %s - i2c fail %d\n", __func__, iRet);
- iRet = ERROR;
- }
-
- return iRet;
-}
-
-void set_proximity_threshold(struct ssp_data *data,
- unsigned char uData1, unsigned char uData2)
-{
- char chTxBuf[3] = { 0, };
- char chRxBuf = 0;
- int iRet = 0, iRetries = DEFAULT_RETRIES;
-
- if (waiting_wakeup_mcu(data) < 0)
- return;
-
- chTxBuf[0] = MSG2SSP_AP_SENSOR_PROXTHRESHOLD;
- chTxBuf[1] = uData1;
- chTxBuf[2] = uData2;
-
- iRet = ssp_i2c_read(data, chTxBuf, 3, &chRxBuf, 1, DEFAULT_RETRIES);
- if (iRet != SUCCESS) {
- pr_err("[SSP]: %s - SENSOR_PROXTHRESHOLD CMD fail %d\n",
- __func__, iRet);
- return;
- } else if (chRxBuf != MSG_ACK) {
- while (iRetries--) {
- mdelay(10);
- pr_err("[SSP]: %s - MSG2SSP_AP_SENSOR_PROXTHRESHOLD CMD"
- " retry...\n", __func__);
- iRet = ssp_i2c_read(data, chTxBuf, 3, &chRxBuf, 1,
- DEFAULT_RETRIES);
- if ((iRet == SUCCESS) && (chRxBuf == MSG_ACK))
- break;
- }
-
- if (iRetries < 0) {
- data->uInstFailCnt++;
- return;
- }
- }
-
- data->uInstFailCnt = 0;
- pr_info("[SSP]: Proximity Threshold - %u, %u\n", uData1, uData2);
-}
-
-void set_proximity_barcode_enable(struct ssp_data *data, bool bEnable)
-{
- char chTxBuf[2] = { 0, };
- char chRxBuf = 0;
- int iRet = 0, iRetries = DEFAULT_RETRIES;
-
- if (waiting_wakeup_mcu(data) < 0)
- return ;
-
- chTxBuf[0] = MSG2SSP_AP_SENSOR_BARCODE_EMUL;
- chTxBuf[1] = bEnable;
-
- data->bBarcodeEnabled = bEnable;
-
- iRet = ssp_i2c_read(data, chTxBuf, 2, &chRxBuf, 1, DEFAULT_RETRIES);
- if (iRet != SUCCESS) {
- pr_err("[SSP]: %s - SENSOR_BARCODE_EMUL CMD fail %d\n",
- __func__, iRet);
- return;
- } else if (chRxBuf != MSG_ACK) {
- while (iRetries--) {
- mdelay(10);
- pr_err("[SSP]: %s - MSG2SSP_AP_SENSOR_BARCODE_EMUL CMD "
- "retry...\n", __func__);
- iRet = ssp_i2c_read(data, chTxBuf, 2, &chRxBuf, 1,
- DEFAULT_RETRIES);
- if ((iRet == SUCCESS) && (chRxBuf == MSG_ACK))
- break;
- }
-
- if (iRetries < 0) {
- data->uInstFailCnt++;
- return;
- }
- }
-
- data->uInstFailCnt = 0;
- pr_info("[SSP] Proximity Barcode En : %u\n", bEnable);
-}
-
-unsigned int get_sensor_scanning_info(struct ssp_data *data)
-{
- char chTxBuf = MSG2SSP_AP_SENSOR_SCANNING;
- char chRxData[2] = {0,};
- int iRet = 0;
-
- if (waiting_wakeup_mcu(data) < 0)
- return ERROR;
-
- iRet = ssp_i2c_read(data, &chTxBuf, 1, chRxData, 2, DEFAULT_RETRIES);
- if (iRet != SUCCESS) {
- pr_err("[SSP]: %s - i2c failed %d\n", __func__, iRet);
- return 0;
- }
- return ((unsigned int)chRxData[0] << 8) | chRxData[1];
-}
-
-unsigned int get_firmware_rev(struct ssp_data *data)
-{
- char chTxData = MSG2SSP_AP_FIRMWARE_REV;
- char chRxBuf[3] = { 0, };
- unsigned int uRev = 99999;
- int iRet;
-
- if (waiting_wakeup_mcu(data) < 0)
- return ERROR;
-
- iRet = ssp_i2c_read(data, &chTxData, 1, chRxBuf, 3, DEFAULT_RETRIES);
- if (iRet != SUCCESS)
- pr_err("[SSP]: %s - i2c fail %d\n", __func__, iRet);
- else
- uRev = ((unsigned int)chRxBuf[0] << 16)
- | ((unsigned int)chRxBuf[1] << 8) | chRxBuf[2];
- return uRev;
-}
-
-int get_fuserom_data(struct ssp_data *data)
-{
- char chTxBuf[2] = { 0, };
- char chRxBuf[2] = { 0, };
- int iRet = 0;
- unsigned int uLength = 0;
-
- if (waiting_wakeup_mcu(data) < 0)
- return ERROR;
-
- chTxBuf[0] = MSG2SSP_AP_STT;
- chTxBuf[1] = MSG2SSP_AP_FUSEROM;
-
- /* chRxBuf is Two Byte because msg is large */
- iRet = ssp_i2c_read(data, chTxBuf, 2, chRxBuf, 2, DEFAULT_RETRIES);
- uLength = ((unsigned int)chRxBuf[0] << 8) + (unsigned int)chRxBuf[1];
-
- if (iRet != SUCCESS) {
- pr_err("[SSP]: %s - MSG2SSP_AP_STT - i2c fail %d\n",
- __func__, iRet);
- goto err_read_fuserom;
- } else if (uLength <= 0) {
- pr_err("[SSP]: %s - No ready data. length = %u\n",
- __func__, uLength);
- goto err_read_fuserom;
- } else {
- if (data->iLibraryLength != 0)
- kfree(data->pchLibraryBuf);
-
- data->iLibraryLength = (int)uLength;
- data->pchLibraryBuf =
- kzalloc((data->iLibraryLength * sizeof(char)), GFP_KERNEL);
-
- chTxBuf[0] = MSG2SSP_SRM;
- iRet = ssp_i2c_read(data, chTxBuf, 1, data->pchLibraryBuf,
- (u16)data->iLibraryLength, DEFAULT_RETRIES);
- if (iRet != SUCCESS) {
- pr_err("[SSP]: %s - Fail to receive SSP data %d\n",
- __func__, iRet);
- kfree(data->pchLibraryBuf);
- data->iLibraryLength = 0;
- goto err_read_fuserom;
- }
- }
-
- data->uFuseRomData[0] = data->pchLibraryBuf[0];
- data->uFuseRomData[1] = data->pchLibraryBuf[1];
- data->uFuseRomData[2] = data->pchLibraryBuf[2];
-
- pr_info("[SSP] FUSE ROM Data %d , %d, %d\n", data->uFuseRomData[0],
- data->uFuseRomData[1], data->uFuseRomData[2]);
-
- data->iLibraryLength = 0;
- kfree(data->pchLibraryBuf);
- return SUCCESS;
-
-err_read_fuserom:
- data->uFuseRomData[0] = 0;
- data->uFuseRomData[1] = 0;
- data->uFuseRomData[2] = 0;
-
- return FAIL;
-}
-
-static int ssp_receive_msg(struct ssp_data *data, u8 uLength)
-{
- char chTxBuf = 0;
- char *pchRcvDataFrame; /* SSP-AP Massage data buffer */
- int iRet = 0;
-
- if (uLength > 0) {
- pchRcvDataFrame = kzalloc((uLength * sizeof(char)), GFP_KERNEL);
- chTxBuf = MSG2SSP_SRM;
- iRet = ssp_i2c_read(data, &chTxBuf, 1, pchRcvDataFrame,
- (u16)uLength, 0);
- if (iRet != SUCCESS) {
- pr_err("[SSP]: %s - Fail to receive data %d\n",
- __func__, iRet);
- kfree(pchRcvDataFrame);
- return ERROR;
- }
- } else {
- pr_err("[SSP]: %s - No ready data. length = %d\n",
- __func__, uLength);
- return FAIL;
- }
-
- parse_dataframe(data, pchRcvDataFrame, uLength);
-
- kfree(pchRcvDataFrame);
- return uLength;
-}
-
-int select_irq_msg(struct ssp_data *data)
-{
- u8 chLength = 0;
- char chTxBuf = 0;
- char chRxBuf[2] = { 0, };
- int iRet = 0;
-
- chTxBuf = MSG2SSP_SSD;
- iRet = ssp_i2c_read(data, &chTxBuf, 1, chRxBuf, 2, 0);
-
- if (iRet != SUCCESS) {
- pr_err("[SSP]: %s - MSG2SSP_SSD error %d\n", __func__, iRet);
- return ERROR;
- } else {
- if (chRxBuf[0] == MSG2SSP_RTS) {
- chLength = (u8)chRxBuf[1];
- ssp_receive_msg(data, chLength);
- data->uSsdFailCnt = 0;
- }
-#ifdef CONFIG_SENSORS_SSP_SENSORHUB
- else if (chRxBuf[0] == MSG2SSP_STT) {
- pr_info("%s: MSG2SSP_STT irq", __func__);
- iRet = ssp_handle_sensorhub_large_data(data,
- (u8)chRxBuf[1]);
- if (iRet < 0) {
- pr_err("%s: ssp_handle_sensorhub_data(%d)",
- __func__, iRet);
- }
- data->uSsdFailCnt = 0;
- }
-#endif
- else {
- pr_err("[SSP]: %s - MSG2SSP_SSD Data fail "
- "[0]: 0x%x, [1]: 0x%x\n", __func__,
- chRxBuf[0], chRxBuf[1]);
- if ((chRxBuf[0] == 0) && (chRxBuf[1] == 0))
- data->uSsdFailCnt++;
- }
- }
- return SUCCESS;
-}