static ssize_t raw_data_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { char chTempbuf[9] = { 0 }; int iRet; int64_t dEnable; int iRetries = 50; struct ssp_data *data = dev_get_drvdata(dev); s32 dMsDelay = 20; memcpy(&chTempbuf[0], &dMsDelay, 4); memcpy(&chTempbuf[4], &data->batchLatencyBuf[GEOMAGNETIC_RAW], 4); chTempbuf[8] = data->batchOptBuf[GEOMAGNETIC_RAW]; iRet = kstrtoll(buf, 10, &dEnable); if (iRet < 0) return iRet; if (dEnable) { data->buf[GEOMAGNETIC_RAW].x = 0; data->buf[GEOMAGNETIC_RAW].y = 0; data->buf[GEOMAGNETIC_RAW].z = 0; send_instruction(data, ADD_SENSOR, GEOMAGNETIC_RAW, chTempbuf, 9); #if 0 do { msleep(20); if (check_data_spec(data) == SUCCESS) break; } while (--iRetries); #endif if (iRetries > 0) { pr_info("[SSP] %s - success, %d\n", __func__, iRetries); data->bGeomagneticRawEnabled = true; } else { pr_err("[SSP] %s - wait timeout, %d\n", __func__, iRetries); data->bGeomagneticRawEnabled = false; } } else { send_instruction(data, REMOVE_SENSOR, GEOMAGNETIC_RAW, chTempbuf, 4); data->bGeomagneticRawEnabled = false; } return size; }
static ssize_t adc_data_read(struct device *dev, struct device_attribute *attr, char *buf) { bool bSuccess = false; u8 chTempbuf[9] = { 0 }; s16 iSensorBuf[3] = {0, }; int iRetries = 10; struct ssp_data *data = dev_get_drvdata(dev); s32 dMsDelay = 20; memcpy(&chTempbuf[0], &dMsDelay, 4); memcpy(&chTempbuf[4], &data->batchLatencyBuf[GEOMAGNETIC_RAW], 4); chTempbuf[8] = data->batchOptBuf[GEOMAGNETIC_RAW]; data->buf[GEOMAGNETIC_SENSOR].x = 0; data->buf[GEOMAGNETIC_SENSOR].y = 0; data->buf[GEOMAGNETIC_SENSOR].z = 0; if (!(atomic_read(&data->aSensorEnable) & (1 << GEOMAGNETIC_SENSOR))) send_instruction(data, ADD_SENSOR, GEOMAGNETIC_SENSOR, chTempbuf, 9); do { msleep(60); if (check_data_spec(data) == SUCCESS) break; } while (--iRetries); if (iRetries > 0) bSuccess = true; iSensorBuf[0] = data->buf[GEOMAGNETIC_SENSOR].x; iSensorBuf[1] = data->buf[GEOMAGNETIC_SENSOR].y; iSensorBuf[2] = data->buf[GEOMAGNETIC_SENSOR].z; if (!(atomic_read(&data->aSensorEnable) & (1 << GEOMAGNETIC_SENSOR))) send_instruction(data, REMOVE_SENSOR, GEOMAGNETIC_SENSOR, chTempbuf, 4); pr_info("[SSP]: %s - x = %d, y = %d, z = %d\n", __func__, iSensorBuf[0], iSensorBuf[1], iSensorBuf[2]); return sprintf(buf, "%s,%d,%d,%d\n", (bSuccess ? "OK" : "NG"), iSensorBuf[0], iSensorBuf[1], iSensorBuf[2]); }
static ssize_t magnetic_get_selftest(struct device *dev, struct device_attribute *attr, char *buf) { s8 iResult[4] = {-1, -1, -1, -1}; char bufSelftset[22] = {0, }; char bufAdc[4] = {0, }; s16 iSF_X = 0, iSF_Y = 0, iSF_Z = 0; s16 iADC_X = 0, iADC_Y = 0, iADC_Z = 0; s32 dMsDelay = 20; int iRet = 0, iSpecOutRetries = 0; struct ssp_data *data = dev_get_drvdata(dev); struct ssp_msg *msg; pr_info("[SSP] %s in\n", __func__); /* STATUS */ if ((data->uFuseRomData[0] == 0) || (data->uFuseRomData[0] == 0xff) || (data->uFuseRomData[1] == 0) || (data->uFuseRomData[1] == 0xff) || (data->uFuseRomData[2] == 0) || (data->uFuseRomData[2] == 0xff)) iResult[0] = -1; else iResult[0] = 0; Retry_selftest: msg = kzalloc(sizeof(*msg), GFP_KERNEL); if (msg == NULL) { pr_err("[SSP] %s, failed to alloc memory for ssp_msg\n", __func__); goto exit; } msg->cmd = GEOMAGNETIC_FACTORY; msg->length = 22; msg->options = AP2HUB_READ; msg->buffer = bufSelftset; msg->free_buffer = 0; iRet = ssp_spi_sync(data, msg, 1000); if (iRet != SUCCESS) { pr_err("[SSP]: %s - Magnetic Selftest Timeout!! %d\n", __func__, iRet); goto exit; } /* read 6bytes data registers */ iSF_X = (s16)((bufSelftset[13] << 8) + bufSelftset[14]); iSF_Y = (s16)((bufSelftset[15] << 8) + bufSelftset[16]); iSF_Z = (s16)((bufSelftset[17] << 8) + bufSelftset[18]); /* DAC (store Cntl Register value to check power down) */ iResult[2] = bufSelftset[21]; iSF_X = (s16)(((iSF_X * data->uFuseRomData[0]) >> 7) + iSF_X); iSF_Y = (s16)(((iSF_Y * data->uFuseRomData[1]) >> 7) + iSF_Y); iSF_Z = (s16)(((iSF_Z * data->uFuseRomData[2]) >> 7) + iSF_Z); pr_info("[SSP] %s: self test x = %d, y = %d, z = %d\n", __func__, iSF_X, iSF_Y, iSF_Z); if ((iSF_X >= GM_SELFTEST_X_SPEC_MIN) && (iSF_X <= GM_SELFTEST_X_SPEC_MAX)) pr_info("[SSP] x passed self test, expect -30<=x<=30\n"); else pr_info("[SSP] x failed self test, expect -30<=x<=30\n"); if ((iSF_Y >= GM_SELFTEST_Y_SPEC_MIN) && (iSF_Y <= GM_SELFTEST_Y_SPEC_MAX)) pr_info("[SSP] y passed self test, expect -30<=y<=30\n"); else pr_info("[SSP] y failed self test, expect -30<=y<=30\n"); if ((iSF_Z >= GM_SELFTEST_Z_SPEC_MIN) && (iSF_Z <= GM_SELFTEST_Z_SPEC_MAX)) pr_info("[SSP] z passed self test, expect -400<=z<=-50\n"); else pr_info("[SSP] z failed self test, expect -400<=z<=-50\n"); /* SELFTEST */ if ((iSF_X >= GM_SELFTEST_X_SPEC_MIN) && (iSF_X <= GM_SELFTEST_X_SPEC_MAX) && (iSF_Y >= GM_SELFTEST_Y_SPEC_MIN) && (iSF_Y <= GM_SELFTEST_Y_SPEC_MAX) && (iSF_Z >= GM_SELFTEST_Z_SPEC_MIN) && (iSF_Z <= GM_SELFTEST_Z_SPEC_MAX)) iResult[1] = 0; if ((iResult[1] == -1) && (iSpecOutRetries++ < 5)) { pr_err("[SSP] %s, selftest spec out. Retry = %d", __func__, iSpecOutRetries); goto Retry_selftest; } iSpecOutRetries = 10; /* ADC */ memcpy(&bufAdc[0], &dMsDelay, 4); data->buf[GEOMAGNETIC_RAW].x = 0; data->buf[GEOMAGNETIC_RAW].y = 0; data->buf[GEOMAGNETIC_RAW].z = 0; if (!(atomic_read(&data->aSensorEnable) & (1 << GEOMAGNETIC_RAW))) send_instruction(data, ADD_SENSOR, GEOMAGNETIC_RAW, bufAdc, 4); do { msleep(60); if (check_data_spec(data) == SUCCESS) break; } while (--iSpecOutRetries); if (iSpecOutRetries > 0) iResult[3] = 0; iADC_X = data->buf[GEOMAGNETIC_RAW].x; iADC_Y = data->buf[GEOMAGNETIC_RAW].y; iADC_Z = data->buf[GEOMAGNETIC_RAW].z; if (!(atomic_read(&data->aSensorEnable) & (1 << GEOMAGNETIC_RAW))) send_instruction(data, REMOVE_SENSOR, GEOMAGNETIC_RAW, bufAdc, 4); pr_info("[SSP]: %s -adc, x = %d, y = %d, z = %d, retry = %d\n", __func__, iADC_X, iADC_Y, iADC_Z, iSpecOutRetries); exit: pr_info("[SSP] %s out. Result = %d %d %d %d\n", __func__, iResult[0], iResult[1], iResult[2], iResult[3]); return sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", iResult[0], iResult[1], iSF_X, iSF_Y, iSF_Z, iResult[2], iResult[3], iADC_X, iADC_Y, iADC_Z); }