bmp280.c 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758
  1. /* BOSCH Pressure Sensor Driver
  2. *
  3. * This software is licensed under the terms of the GNU General Public
  4. * License version 2, as published by the Free Software Foundation, and
  5. * may be copied, distributed, and modified under those terms.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. * History: V1.0 --- [2013.03.14]Driver creation
  13. * V1.1 --- [2013.07.03]Re-write I2C function to fix the bug that
  14. * i2c access error on MT6589 platform.
  15. * V1.2 --- [2013.07.04]Add self test function.
  16. * V1.3 --- [2013.07.04]Support new chip id 0x57 and 0x58.
  17. */
  18. #include <linux/interrupt.h>
  19. #include <linux/i2c.h>
  20. #include <linux/slab.h>
  21. #include <linux/irq.h>
  22. #include <linux/miscdevice.h>
  23. #include <linux/uaccess.h>
  24. #include <linux/delay.h>
  25. #include <linux/input.h>
  26. #include <linux/workqueue.h>
  27. #include <linux/kobject.h>
  28. #include <linux/platform_device.h>
  29. #include <linux/atomic.h>
  30. #include <linux/module.h>
  31. #include <linux/math64.h>
  32. #include <cust_baro.h>
  33. #include "bmp280.h"
  34. #include "barometer.h"
  35. /* #include <linux/hwmsen_helper.h> */
  36. /* #define POWER_NONE_MACRO MT65XX_POWER_NONE */
  37. /* sensor type */
  38. enum SENSOR_TYPE_ENUM {
  39. BMP280_TYPE = 0x0,
  40. INVALID_TYPE = 0xff
  41. };
  42. /* power mode */
  43. enum BMP_POWERMODE_ENUM {
  44. BMP_SUSPEND_MODE = 0x0,
  45. BMP_NORMAL_MODE,
  46. BMP_UNDEFINED_POWERMODE = 0xff
  47. };
  48. /* filter */
  49. enum BMP_FILTER_ENUM {
  50. BMP_FILTER_OFF = 0x0,
  51. BMP_FILTER_2,
  52. BMP_FILTER_4,
  53. BMP_FILTER_8,
  54. BMP_FILTER_16,
  55. BMP_UNDEFINED_FILTER = 0xff
  56. };
  57. /* oversampling */
  58. enum BMP_OVERSAMPLING_ENUM {
  59. BMP_OVERSAMPLING_SKIPPED = 0x0,
  60. BMP_OVERSAMPLING_1X,
  61. BMP_OVERSAMPLING_2X,
  62. BMP_OVERSAMPLING_4X,
  63. BMP_OVERSAMPLING_8X,
  64. BMP_OVERSAMPLING_16X,
  65. BMP_UNDEFINED_OVERSAMPLING = 0xff
  66. };
  67. /* trace */
  68. enum BAR_TRC {
  69. BAR_TRC_READ = 0x01,
  70. BAR_TRC_RAWDATA = 0x02,
  71. BAR_TRC_IOCTL = 0x04,
  72. BAR_TRC_FILTER = 0x08,
  73. };
  74. /* s/w filter */
  75. struct data_filter {
  76. u32 raw[C_MAX_FIR_LENGTH][BMP_DATA_NUM];
  77. int sum[BMP_DATA_NUM];
  78. int num;
  79. int idx;
  80. };
  81. /* bmp280 calibration */
  82. struct bmp280_calibration_data {
  83. BMP280_U16_t dig_T1;
  84. BMP280_S16_t dig_T2;
  85. BMP280_S16_t dig_T3;
  86. BMP280_U16_t dig_P1;
  87. BMP280_S16_t dig_P2;
  88. BMP280_S16_t dig_P3;
  89. BMP280_S16_t dig_P4;
  90. BMP280_S16_t dig_P5;
  91. BMP280_S16_t dig_P6;
  92. BMP280_S16_t dig_P7;
  93. BMP280_S16_t dig_P8;
  94. BMP280_S16_t dig_P9;
  95. };
  96. /* bmp i2c client data */
  97. struct bmp_i2c_data {
  98. struct i2c_client *client;
  99. struct baro_hw *hw;
  100. /* sensor info */
  101. u8 sensor_name[MAX_SENSOR_NAME];
  102. enum SENSOR_TYPE_ENUM sensor_type;
  103. enum BMP_POWERMODE_ENUM power_mode;
  104. u8 hw_filter;
  105. u8 oversampling_p;
  106. u8 oversampling_t;
  107. u32 last_temp_measurement;
  108. u32 temp_measurement_period;
  109. struct bmp280_calibration_data bmp280_cali;
  110. /* calculated temperature correction coefficient */
  111. s32 t_fine;
  112. /*misc*/
  113. struct mutex lock;
  114. atomic_t trace;
  115. atomic_t suspend;
  116. atomic_t filter;
  117. #if defined(CONFIG_BMP_LOWPASS)
  118. atomic_t firlen;
  119. atomic_t fir_en;
  120. struct data_filter fir;
  121. #endif
  122. };
  123. #define BAR_TAG "[barometer] "
  124. #define BAR_FUN(f) pr_debug(BAR_TAG"%s\n", __func__)
  125. #define BAR_ERR(fmt, args...) \
  126. pr_err(BAR_TAG"%s %d : "fmt, __func__, __LINE__, ##args)
  127. #define BAR_LOG(fmt, args...) pr_debug(BAR_TAG fmt, ##args)
  128. static struct i2c_driver bmp_i2c_driver;
  129. static struct bmp_i2c_data *obj_i2c_data;
  130. static const struct i2c_device_id bmp_i2c_id[] = {
  131. {BMP_DEV_NAME, 0},
  132. {}
  133. };
  134. /* Maintain cust info here */
  135. struct baro_hw baro_cust;
  136. static struct baro_hw *hw = &baro_cust;
  137. /* For baro driver get cust info */
  138. struct baro_hw *get_cust_baro(void)
  139. {
  140. return &baro_cust;
  141. }
  142. #ifdef CONFIG_MTK_LEGACY
  143. static struct i2c_board_info bmp_i2c_info __initdata = {
  144. I2C_BOARD_INFO(BMP_DEV_NAME, BMP280_I2C_ADDRESS)
  145. };
  146. #endif
  147. static int bmp_local_init(void);
  148. static int bmp_remove(void);
  149. static int bmp_init_flag = -1;
  150. static struct baro_init_info bmp_init_info = {
  151. .name = "bmp",
  152. .init = bmp_local_init,
  153. .uninit = bmp_remove,
  154. };
  155. /* I2C operation functions */
  156. static int bmp_i2c_read_block(struct i2c_client *client,
  157. u8 addr, u8 *data, u8 len)
  158. {
  159. u8 reg_addr = addr;
  160. u8 *rxbuf = data;
  161. u8 left = len;
  162. u8 retry;
  163. u8 offset = 0;
  164. struct i2c_msg msg[2] = {
  165. {
  166. .addr = client->addr,
  167. .flags = 0,
  168. .buf = &reg_addr,
  169. .len = 1,
  170. },
  171. {
  172. .addr = client->addr,
  173. .flags = I2C_M_RD,
  174. },
  175. };
  176. if (rxbuf == NULL)
  177. return -1;
  178. while (left > 0) {
  179. retry = 0;
  180. reg_addr = addr + offset;
  181. msg[1].buf = &rxbuf[offset];
  182. if (left > C_I2C_FIFO_SIZE) {
  183. msg[1].len = C_I2C_FIFO_SIZE;
  184. left -= C_I2C_FIFO_SIZE;
  185. offset += C_I2C_FIFO_SIZE;
  186. } else {
  187. msg[1].len = left;
  188. left = 0;
  189. }
  190. while (i2c_transfer(client->adapter, &msg[0], 2) != 2) {
  191. retry++;
  192. if (retry == 20) {
  193. BAR_ERR("i2c read register=%#x length=%d failed\n", addr + offset, len);
  194. return -EIO;
  195. }
  196. }
  197. }
  198. return 0;
  199. }
  200. static int bmp_i2c_write_block(struct i2c_client *client, u8 addr,
  201. u8 *data, u8 len)
  202. {
  203. u8 buffer[C_I2C_FIFO_SIZE];
  204. u8 *txbuf = data;
  205. u8 left = len;
  206. u8 offset = 0;
  207. u8 retry = 0;
  208. struct i2c_msg msg = {
  209. .addr = client->addr,
  210. .flags = 0,
  211. .buf = buffer,
  212. };
  213. if (txbuf == NULL)
  214. return -1;
  215. while (left > 0) {
  216. retry = 0;
  217. /* register address */
  218. buffer[0] = addr + offset;
  219. if (left > C_I2C_FIFO_SIZE) {
  220. memcpy(&buffer[1], &txbuf[offset], C_I2C_FIFO_SIZE - 1);
  221. msg.len = C_I2C_FIFO_SIZE;
  222. left -= C_I2C_FIFO_SIZE - 1;
  223. offset += C_I2C_FIFO_SIZE - 1;
  224. } else {
  225. memcpy(&buffer[1], &txbuf[offset], left);
  226. msg.len = left + 1;
  227. left = 0;
  228. }
  229. while (i2c_transfer(client->adapter, &msg, 1) != 1) {
  230. retry++;
  231. if (retry == 20) {
  232. BAR_ERR("i2c write register=%#x length=%d failed\n", buffer[0], len);
  233. return -EIO;
  234. }
  235. BAR_LOG("i2c write addr %#x, retry %d\n",
  236. buffer[0], retry);
  237. }
  238. }
  239. return 0;
  240. }
  241. static void bmp_power(struct baro_hw *hw, unsigned int on)
  242. {
  243. static unsigned int power_on;
  244. #if 0
  245. if (hw->power_id != POWER_NONE_MACRO) {/* have externel LDO */
  246. BAR_LOG("power %s\n", on ? "on" : "off");
  247. if (power_on == on) {/* power status not change */
  248. BAR_LOG("ignore power control: %d\n", on);
  249. } else if (on) {/* power on */
  250. if (!hwPowerOn(hw->power_id, hw->power_vol,
  251. BMP_DEV_NAME))
  252. BAR_ERR("power on failed\n");
  253. } else {/* power off */
  254. if (!hwPowerDown(hw->power_id, BMP_DEV_NAME))
  255. BAR_ERR("power off failed\n");
  256. }
  257. }
  258. #endif
  259. power_on = on;
  260. }
  261. /* get chip type */
  262. static int bmp_get_chip_type(struct i2c_client *client)
  263. {
  264. int err = 0;
  265. u8 chip_id = 0;
  266. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  267. BAR_FUN(f);
  268. err = bmp_i2c_read_block(client, BMP_CHIP_ID_REG, &chip_id, 0x01);
  269. if (err != 0)
  270. return err;
  271. switch (chip_id) {
  272. case BMP280_CHIP_ID1:
  273. case BMP280_CHIP_ID2:
  274. case BMP280_CHIP_ID3:
  275. obj->sensor_type = BMP280_TYPE;
  276. strcpy(obj->sensor_name, "bmp280");
  277. break;
  278. default:
  279. obj->sensor_type = INVALID_TYPE;
  280. strcpy(obj->sensor_name, "unknown sensor");
  281. break;
  282. }
  283. BAR_LOG("[%s]chip id = %#x, sensor name = %s\n", __func__,
  284. chip_id, obj->sensor_name);
  285. if (obj->sensor_type == INVALID_TYPE) {
  286. BAR_ERR("unknown pressure sensor\n");
  287. return -1;
  288. }
  289. return 0;
  290. }
  291. static int bmp_get_calibration_data(struct i2c_client *client)
  292. {
  293. struct bmp_i2c_data *obj =
  294. (struct bmp_i2c_data *)i2c_get_clientdata(client);
  295. int status = 0;
  296. if (obj->sensor_type == BMP280_TYPE) {
  297. u8 a_data_u8r[BMP280_CALIBRATION_DATA_LENGTH] = {0};
  298. status = bmp_i2c_read_block(client,
  299. BMP280_CALIBRATION_DATA_START,
  300. a_data_u8r,
  301. BMP280_CALIBRATION_DATA_LENGTH);
  302. if (status < 0)
  303. return status;
  304. obj->bmp280_cali.dig_T1 = (BMP280_U16_t)(((\
  305. (BMP280_U16_t)((unsigned char)a_data_u8r[1])) << \
  306. SHIFT_LEFT_8_POSITION) | a_data_u8r[0]);
  307. obj->bmp280_cali.dig_T2 = (BMP280_S16_t)(((\
  308. (BMP280_S16_t)((signed char)a_data_u8r[3])) << \
  309. SHIFT_LEFT_8_POSITION) | a_data_u8r[2]);
  310. obj->bmp280_cali.dig_T3 = (BMP280_S16_t)(((\
  311. (BMP280_S16_t)((signed char)a_data_u8r[5])) << \
  312. SHIFT_LEFT_8_POSITION) | a_data_u8r[4]);
  313. obj->bmp280_cali.dig_P1 = (BMP280_U16_t)(((\
  314. (BMP280_U16_t)((unsigned char)a_data_u8r[7])) << \
  315. SHIFT_LEFT_8_POSITION) | a_data_u8r[6]);
  316. obj->bmp280_cali.dig_P2 = (BMP280_S16_t)(((\
  317. (BMP280_S16_t)((signed char)a_data_u8r[9])) << \
  318. SHIFT_LEFT_8_POSITION) | a_data_u8r[8]);
  319. obj->bmp280_cali.dig_P3 = (BMP280_S16_t)(((\
  320. (BMP280_S16_t)((signed char)a_data_u8r[11])) << \
  321. SHIFT_LEFT_8_POSITION) | a_data_u8r[10]);
  322. obj->bmp280_cali.dig_P4 = (BMP280_S16_t)(((\
  323. (BMP280_S16_t)((signed char)a_data_u8r[13])) << \
  324. SHIFT_LEFT_8_POSITION) | a_data_u8r[12]);
  325. obj->bmp280_cali.dig_P5 = (BMP280_S16_t)(((\
  326. (BMP280_S16_t)((signed char)a_data_u8r[15])) << \
  327. SHIFT_LEFT_8_POSITION) | a_data_u8r[14]);
  328. obj->bmp280_cali.dig_P6 = (BMP280_S16_t)(((\
  329. (BMP280_S16_t)((signed char)a_data_u8r[17])) << \
  330. SHIFT_LEFT_8_POSITION) | a_data_u8r[16]);
  331. obj->bmp280_cali.dig_P7 = (BMP280_S16_t)(((\
  332. (BMP280_S16_t)((signed char)a_data_u8r[19])) << \
  333. SHIFT_LEFT_8_POSITION) | a_data_u8r[18]);
  334. obj->bmp280_cali.dig_P8 = (BMP280_S16_t)(((\
  335. (BMP280_S16_t)((signed char)a_data_u8r[21])) << \
  336. SHIFT_LEFT_8_POSITION) | a_data_u8r[20]);
  337. obj->bmp280_cali.dig_P9 = (BMP280_S16_t)(((\
  338. (BMP280_S16_t)((signed char)a_data_u8r[23])) << \
  339. SHIFT_LEFT_8_POSITION) | a_data_u8r[22]);
  340. }
  341. return 0;
  342. }
  343. static int bmp_set_powermode(struct i2c_client *client,
  344. enum BMP_POWERMODE_ENUM power_mode)
  345. {
  346. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  347. u8 err = 0, data = 0, actual_power_mode = 0;
  348. BAR_LOG("[%s] power_mode = %d, old power_mode = %d\n", __func__,
  349. power_mode, obj->power_mode);
  350. if (power_mode == obj->power_mode)
  351. return 0;
  352. mutex_lock(&obj->lock);
  353. if (obj->sensor_type == BMP280_TYPE) {/* BMP280 */
  354. if (power_mode == BMP_SUSPEND_MODE) {
  355. actual_power_mode = BMP280_SLEEP_MODE;
  356. } else if (power_mode == BMP_NORMAL_MODE) {
  357. actual_power_mode = BMP280_NORMAL_MODE;
  358. } else {
  359. err = -EINVAL;
  360. BAR_ERR("invalid power mode = %d\n", power_mode);
  361. mutex_unlock(&obj->lock);
  362. return err;
  363. }
  364. err = bmp_i2c_read_block(client,
  365. BMP280_CTRLMEAS_REG_MODE__REG, &data, 1);
  366. data = BMP_SET_BITSLICE(data,
  367. BMP280_CTRLMEAS_REG_MODE, actual_power_mode);
  368. err += bmp_i2c_write_block(client,
  369. BMP280_CTRLMEAS_REG_MODE__REG, &data, 1);
  370. }
  371. if (err < 0)
  372. BAR_ERR("set power mode failed, err = %d, sensor name = %s\n",
  373. err, obj->sensor_name);
  374. else
  375. obj->power_mode = power_mode;
  376. mutex_unlock(&obj->lock);
  377. return err;
  378. }
  379. static int bmp_set_filter(struct i2c_client *client,
  380. enum BMP_FILTER_ENUM filter)
  381. {
  382. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  383. u8 err = 0, data = 0, actual_filter = 0;
  384. BAR_LOG("[%s] hw filter = %d, old hw filter = %d\n", __func__,
  385. filter, obj->hw_filter);
  386. if (filter == obj->hw_filter)
  387. return 0;
  388. mutex_lock(&obj->lock);
  389. if (obj->sensor_type == BMP280_TYPE) {/* BMP280 */
  390. if (filter == BMP_FILTER_OFF)
  391. actual_filter = BMP280_FILTERCOEFF_OFF;
  392. else if (filter == BMP_FILTER_2)
  393. actual_filter = BMP280_FILTERCOEFF_2;
  394. else if (filter == BMP_FILTER_4)
  395. actual_filter = BMP280_FILTERCOEFF_4;
  396. else if (filter == BMP_FILTER_8)
  397. actual_filter = BMP280_FILTERCOEFF_8;
  398. else if (filter == BMP_FILTER_16)
  399. actual_filter = BMP280_FILTERCOEFF_16;
  400. else {
  401. err = -EINVAL;
  402. BAR_ERR("invalid hw filter = %d\n", filter);
  403. mutex_unlock(&obj->lock);
  404. return err;
  405. }
  406. err = bmp_i2c_read_block(client,
  407. BMP280_CONFIG_REG_FILTER__REG, &data, 1);
  408. data = BMP_SET_BITSLICE(data,
  409. BMP280_CONFIG_REG_FILTER, actual_filter);
  410. err += bmp_i2c_write_block(client,
  411. BMP280_CONFIG_REG_FILTER__REG, &data, 1);
  412. }
  413. if (err < 0)
  414. BAR_ERR("set hw filter failed, err = %d, sensor name = %s\n",
  415. err, obj->sensor_name);
  416. else
  417. obj->hw_filter = filter;
  418. mutex_unlock(&obj->lock);
  419. return err;
  420. }
  421. static int bmp_set_oversampling_p(struct i2c_client *client,
  422. enum BMP_OVERSAMPLING_ENUM oversampling_p)
  423. {
  424. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  425. u8 err = 0, data = 0, actual_oversampling_p = 0;
  426. BAR_LOG("[%s] oversampling_p = %d, old oversampling_p = %d\n", __func__,
  427. oversampling_p, obj->oversampling_p);
  428. if (oversampling_p == obj->oversampling_p)
  429. return 0;
  430. mutex_lock(&obj->lock);
  431. if (obj->sensor_type == BMP280_TYPE) {/* BMP280 */
  432. if (oversampling_p == BMP_OVERSAMPLING_SKIPPED)
  433. actual_oversampling_p = BMP280_OVERSAMPLING_SKIPPED;
  434. else if (oversampling_p == BMP_OVERSAMPLING_1X)
  435. actual_oversampling_p = BMP280_OVERSAMPLING_1X;
  436. else if (oversampling_p == BMP_OVERSAMPLING_2X)
  437. actual_oversampling_p = BMP280_OVERSAMPLING_2X;
  438. else if (oversampling_p == BMP_OVERSAMPLING_4X)
  439. actual_oversampling_p = BMP280_OVERSAMPLING_4X;
  440. else if (oversampling_p == BMP_OVERSAMPLING_8X)
  441. actual_oversampling_p = BMP280_OVERSAMPLING_8X;
  442. else if (oversampling_p == BMP_OVERSAMPLING_16X)
  443. actual_oversampling_p = BMP280_OVERSAMPLING_16X;
  444. else {
  445. err = -EINVAL;
  446. BAR_ERR("invalid oversampling_p = %d\n",
  447. oversampling_p);
  448. mutex_unlock(&obj->lock);
  449. return err;
  450. }
  451. err = bmp_i2c_read_block(client,
  452. BMP280_CTRLMEAS_REG_OSRSP__REG, &data, 1);
  453. data = BMP_SET_BITSLICE(data,
  454. BMP280_CTRLMEAS_REG_OSRSP, actual_oversampling_p);
  455. err += bmp_i2c_write_block(client,
  456. BMP280_CTRLMEAS_REG_OSRSP__REG, &data, 1);
  457. }
  458. if (err < 0)
  459. BAR_ERR("set pressure oversampling failed, err = %d,sensor name = %s\n", err, obj->sensor_name);
  460. else
  461. obj->oversampling_p = oversampling_p;
  462. mutex_unlock(&obj->lock);
  463. return err;
  464. }
  465. static int bmp_set_oversampling_t(struct i2c_client *client,
  466. enum BMP_OVERSAMPLING_ENUM oversampling_t)
  467. {
  468. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  469. u8 err = 0, data = 0, actual_oversampling_t = 0;
  470. BAR_LOG("[%s] oversampling_t = %d, old oversampling_t = %d\n", __func__,
  471. oversampling_t, obj->oversampling_t);
  472. if (oversampling_t == obj->oversampling_t)
  473. return 0;
  474. mutex_lock(&obj->lock);
  475. if (obj->sensor_type == BMP280_TYPE) {/* BMP280 */
  476. if (oversampling_t == BMP_OVERSAMPLING_SKIPPED)
  477. actual_oversampling_t = BMP280_OVERSAMPLING_SKIPPED;
  478. else if (oversampling_t == BMP_OVERSAMPLING_1X)
  479. actual_oversampling_t = BMP280_OVERSAMPLING_1X;
  480. else if (oversampling_t == BMP_OVERSAMPLING_2X)
  481. actual_oversampling_t = BMP280_OVERSAMPLING_2X;
  482. else if (oversampling_t == BMP_OVERSAMPLING_4X)
  483. actual_oversampling_t = BMP280_OVERSAMPLING_4X;
  484. else if (oversampling_t == BMP_OVERSAMPLING_8X)
  485. actual_oversampling_t = BMP280_OVERSAMPLING_8X;
  486. else if (oversampling_t == BMP_OVERSAMPLING_16X)
  487. actual_oversampling_t = BMP280_OVERSAMPLING_16X;
  488. else {
  489. err = -EINVAL;
  490. BAR_ERR("invalid oversampling_t = %d\n",
  491. oversampling_t);
  492. mutex_unlock(&obj->lock);
  493. return err;
  494. }
  495. err = bmp_i2c_read_block(client,
  496. BMP280_CTRLMEAS_REG_OSRST__REG, &data, 1);
  497. data = BMP_SET_BITSLICE(data,
  498. BMP280_CTRLMEAS_REG_OSRST, actual_oversampling_t);
  499. err += bmp_i2c_write_block(client,
  500. BMP280_CTRLMEAS_REG_OSRST__REG, &data, 1);
  501. }
  502. if (err < 0)
  503. BAR_ERR("set temperature oversampling failed, err = %d, sensor name = %s\n", err, obj->sensor_name);
  504. else
  505. obj->oversampling_t = oversampling_t;
  506. mutex_unlock(&obj->lock);
  507. return err;
  508. }
  509. static int bmp_read_raw_temperature(struct i2c_client *client,
  510. s32 *temperature)
  511. {
  512. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  513. s32 err = 0;
  514. if (NULL == client) {
  515. err = -EINVAL;
  516. return err;
  517. }
  518. mutex_lock(&obj->lock);
  519. if (obj->sensor_type == BMP280_TYPE) {/* BMP280 */
  520. unsigned char a_data_u8r[3] = {0};
  521. err = bmp_i2c_read_block(client,
  522. BMP280_TEMPERATURE_MSB_REG, a_data_u8r, 3);
  523. if (err < 0) {
  524. BAR_ERR("read raw temperature failed, err = %d\n", err);
  525. mutex_unlock(&obj->lock);
  526. return err;
  527. }
  528. *temperature = (BMP280_S32_t)(
  529. (((BMP280_U32_t)(a_data_u8r[0])) << SHIFT_LEFT_12_POSITION) |
  530. (((BMP280_U32_t)(a_data_u8r[1])) << SHIFT_LEFT_4_POSITION) |
  531. ((BMP280_U32_t)a_data_u8r[2] >> SHIFT_RIGHT_4_POSITION)
  532. );
  533. }
  534. obj->last_temp_measurement = jiffies;
  535. mutex_unlock(&obj->lock);
  536. return err;
  537. }
  538. static int bmp_read_raw_pressure(struct i2c_client *client, s32 *pressure)
  539. {
  540. struct bmp_i2c_data *priv = i2c_get_clientdata(client);
  541. s32 err = 0;
  542. if (NULL == client) {
  543. err = -EINVAL;
  544. return err;
  545. }
  546. mutex_lock(&priv->lock);
  547. if (priv->sensor_type == BMP280_TYPE) {/* BMP280 */
  548. unsigned char a_data_u8r[3] = {0};
  549. err = bmp_i2c_read_block(client,
  550. BMP280_PRESSURE_MSB_REG, a_data_u8r, 3);
  551. if (err < 0) {
  552. BAR_ERR("read raw pressure failed, err = %d\n", err);
  553. mutex_unlock(&priv->lock);
  554. return err;
  555. }
  556. *pressure = (BMP280_S32_t)(
  557. (((BMP280_U32_t)(a_data_u8r[0])) << SHIFT_LEFT_12_POSITION) |
  558. (((BMP280_U32_t)(a_data_u8r[1])) << SHIFT_LEFT_4_POSITION) |
  559. ((BMP280_U32_t)a_data_u8r[2] >> SHIFT_RIGHT_4_POSITION)
  560. );
  561. }
  562. #ifdef CONFIG_BMP_LOWPASS
  563. /*
  564. *Example: firlen = 16, filter buffer = [0] ... [15],
  565. *when 17th data come, replace [0] with this new data.
  566. *Then, average this filter buffer and report average value to upper layer.
  567. */
  568. if (atomic_read(&priv->filter)) {
  569. if (atomic_read(&priv->fir_en) &&
  570. !atomic_read(&priv->suspend)) {
  571. int idx, firlen = atomic_read(&priv->firlen);
  572. if (priv->fir.num < firlen) {
  573. priv->fir.raw[priv->fir.num][BMP_PRESSURE] =
  574. *pressure;
  575. priv->fir.sum[BMP_PRESSURE] += *pressure;
  576. if (atomic_read(&priv->trace) &
  577. BAR_TRC_FILTER) {
  578. BAR_LOG("add [%2d] [%5d] => [%5d]\n",
  579. priv->fir.num,
  580. priv->fir.raw
  581. [priv->fir.num][BMP_PRESSURE],
  582. priv->fir.sum[BMP_PRESSURE]);
  583. }
  584. priv->fir.num++;
  585. priv->fir.idx++;
  586. } else {
  587. idx = priv->fir.idx % firlen;
  588. priv->fir.sum[BMP_PRESSURE] -=
  589. priv->fir.raw[idx][BMP_PRESSURE];
  590. priv->fir.raw[idx][BMP_PRESSURE] = *pressure;
  591. priv->fir.sum[BMP_PRESSURE] += *pressure;
  592. priv->fir.idx++;
  593. *pressure = priv->fir.sum[BMP_PRESSURE]/firlen;
  594. if (atomic_read(&priv->trace) &
  595. BAR_TRC_FILTER) {
  596. BAR_LOG("add [%2d][%5d]=>[%5d]:[%5d]\n",
  597. idx,
  598. priv->fir.raw[idx][BMP_PRESSURE],
  599. priv->fir.sum[BMP_PRESSURE],
  600. *pressure);
  601. }
  602. }
  603. }
  604. }
  605. #endif
  606. mutex_unlock(&priv->lock);
  607. return err;
  608. }
  609. /*
  610. *get compensated temperature
  611. *unit:10 degrees centigrade
  612. */
  613. static int bmp_get_temperature(struct i2c_client *client,
  614. char *buf, int bufsize)
  615. {
  616. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  617. int status;
  618. s32 utemp = 0;/* uncompensated temperature */
  619. s32 temperature = 0;
  620. if (NULL == buf)
  621. return -1;
  622. if (NULL == client) {
  623. *buf = 0;
  624. return -2;
  625. }
  626. status = bmp_read_raw_temperature(client, &utemp);
  627. if (status != 0)
  628. return status;
  629. if (obj->sensor_type == BMP280_TYPE) {/* BMP280 */
  630. BMP280_S32_t v_x1_u32r = 0;
  631. BMP280_S32_t v_x2_u32r = 0;
  632. v_x1_u32r = ((((utemp >> 3) - ((BMP280_S32_t)
  633. obj->bmp280_cali.dig_T1 << 1))) *
  634. ((BMP280_S32_t)obj->bmp280_cali.dig_T2)) >> 11;
  635. v_x2_u32r = (((
  636. ((utemp >> 4) - ((BMP280_S32_t)obj->bmp280_cali.dig_T1))
  637. *
  638. ((utemp >> 4) - ((BMP280_S32_t)obj->bmp280_cali.dig_T1))
  639. ) >> 12) *
  640. ((BMP280_S32_t)obj->bmp280_cali.dig_T3)) >> 14;
  641. mutex_lock(&obj->lock);
  642. obj->t_fine = v_x1_u32r + v_x2_u32r;
  643. mutex_unlock(&obj->lock);
  644. temperature = (obj->t_fine * 5 + 128) >> 8;
  645. }
  646. sprintf(buf, "%08x", temperature);
  647. if (atomic_read(&obj->trace) & BAR_TRC_IOCTL)
  648. BAR_LOG("compensated temperature value: %s\n", buf);
  649. return status;
  650. }
  651. /*
  652. *get compensated pressure
  653. *unit: hectopascal(hPa)
  654. */
  655. static int bmp_get_pressure(struct i2c_client *client, char *buf, int bufsize)
  656. {
  657. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  658. int status;
  659. s32 temperature = 0, upressure = 0, pressure = 0;
  660. char temp_buf[BMP_BUFSIZE];
  661. if (NULL == buf)
  662. return -1;
  663. if (NULL == client) {
  664. *buf = 0;
  665. return -2;
  666. }
  667. /* update the ambient temperature according to the given meas. period */
  668. if (time_before((unsigned long)(obj->last_temp_measurement +
  669. obj->temp_measurement_period), jiffies)) {
  670. status = bmp_get_temperature(client,
  671. temp_buf, BMP_BUFSIZE);/* update t_fine */
  672. if (status != 0)
  673. goto exit;
  674. if (sscanf(temp_buf, "%x", &temperature) != 1)
  675. BAR_ERR("sscanf parsing fail\n");
  676. }
  677. status = bmp_read_raw_pressure(client, &upressure);
  678. if (status != 0)
  679. goto exit;
  680. if (obj->sensor_type == BMP280_TYPE) {/* BMP280 */
  681. BMP280_S64_t v_x1_u32r = 0;
  682. BMP280_S64_t v_x2_u32r = 0;
  683. BMP280_S64_t p = 0;
  684. v_x1_u32r = ((BMP280_S64_t)obj->t_fine) - 128000;
  685. v_x2_u32r = v_x1_u32r * v_x1_u32r *
  686. (BMP280_S64_t)obj->bmp280_cali.dig_P6;
  687. v_x2_u32r = v_x2_u32r + ((v_x1_u32r *
  688. (BMP280_S64_t)obj->bmp280_cali.dig_P5) << 17);
  689. v_x2_u32r = v_x2_u32r +
  690. (((BMP280_S64_t)obj->bmp280_cali.dig_P4) << 35);
  691. v_x1_u32r = ((v_x1_u32r * v_x1_u32r *
  692. (BMP280_S64_t)obj->bmp280_cali.dig_P3) >> 8) +
  693. ((v_x1_u32r * (BMP280_S64_t)obj->bmp280_cali.dig_P2)
  694. << 12);
  695. v_x1_u32r = (((((BMP280_S64_t)1) << 47) + v_x1_u32r)) *
  696. ((BMP280_S64_t)obj->bmp280_cali.dig_P1) >> 33;
  697. if (v_x1_u32r == 0)
  698. /* Avoid exception caused by division by zero */
  699. return -1;
  700. p = 1048576 - upressure;
  701. p = div64_s64(((p << 31) - v_x2_u32r) * 3125, v_x1_u32r);
  702. v_x1_u32r = (((BMP280_S64_t)obj->bmp280_cali.dig_P9) *
  703. (p >> 13) * (p >> 13)) >> 25;
  704. v_x2_u32r = (((BMP280_S64_t)obj->bmp280_cali.dig_P8) *
  705. p) >> 19;
  706. p = ((p + v_x1_u32r + v_x2_u32r) >> 8) +
  707. (((BMP280_S64_t)obj->bmp280_cali.dig_P7) << 4);
  708. pressure = (BMP280_U32_t)p / 256;
  709. }
  710. sprintf(buf, "%08x", pressure);
  711. if (atomic_read(&obj->trace) & BAR_TRC_IOCTL)
  712. BAR_LOG("compensated pressure value: %s\n", buf);
  713. exit:
  714. return status;
  715. }
  716. /* bmp setting initialization */
  717. static int bmp_init_client(struct i2c_client *client)
  718. {
  719. int err = 0;
  720. BAR_FUN();
  721. err = bmp_get_chip_type(client);
  722. if (err < 0) {
  723. BAR_ERR("get chip type failed, err = %d\n", err);
  724. return err;
  725. }
  726. err = bmp_get_calibration_data(client);
  727. if (err < 0) {
  728. BAR_ERR("get calibration data failed, err = %d\n", err);
  729. return err;
  730. }
  731. err = bmp_set_powermode(client, BMP_SUSPEND_MODE);
  732. if (err < 0) {
  733. BAR_ERR("set power mode failed, err = %d\n", err);
  734. return err;
  735. }
  736. err = bmp_set_filter(client, BMP_FILTER_8);
  737. if (err < 0) {
  738. BAR_ERR("set hw filter failed, err = %d\n", err);
  739. return err;
  740. }
  741. err = bmp_set_oversampling_p(client, BMP_OVERSAMPLING_8X);
  742. if (err < 0) {
  743. BAR_ERR("set pressure oversampling failed, err = %d\n", err);
  744. return err;
  745. }
  746. err = bmp_set_oversampling_t(client, BMP_OVERSAMPLING_1X);
  747. if (err < 0) {
  748. BAR_ERR("set temperature oversampling failed, err = %d\n", err);
  749. return err;
  750. }
  751. return 0;
  752. }
  753. static int bmp280_verify_i2c_disable_switch(struct bmp_i2c_data *obj)
  754. {
  755. int err = 0;
  756. u8 reg_val = 0xFF;
  757. err = bmp_i2c_read_block(obj->client,
  758. BMP280_I2C_DISABLE_SWITCH, &reg_val, 1);
  759. if (err < 0) {
  760. err = -EIO;
  761. BAR_ERR("bus read failed\n");
  762. return err;
  763. }
  764. if (reg_val == 0x00) {
  765. BAR_LOG("bmp280 i2c interface is available\n");
  766. return 0;/* OK */
  767. }
  768. BAR_ERR("verification of i2c interface is failure\n");
  769. return -1;/* Failure */
  770. }
  771. static int bmp_check_calib_param(struct bmp_i2c_data *obj)
  772. {
  773. struct bmp280_calibration_data *cali = &(obj->bmp280_cali);
  774. /* verify that not all calibration parameters are 0 */
  775. if (cali->dig_T1 == 0 && cali->dig_T2 == 0 && cali->dig_T3 == 0
  776. && cali->dig_P1 == 0 && cali->dig_P2 == 0
  777. && cali->dig_P3 == 0 && cali->dig_P4 == 0
  778. && cali->dig_P5 == 0 && cali->dig_P6 == 0
  779. && cali->dig_P7 == 0 && cali->dig_P8 == 0
  780. && cali->dig_P9 == 0) {
  781. BAR_ERR("all calibration parameters are zero\n");
  782. return -2;
  783. }
  784. /* verify whether all the calibration parameters are within range */
  785. if (cali->dig_T1 < 19000 || cali->dig_T1 > 35000)
  786. return -3;
  787. else if (cali->dig_T2 < 22000 || cali->dig_T2 > 30000)
  788. return -4;
  789. else if (cali->dig_T3 < -3000 || cali->dig_T3 > -1000)
  790. return -5;
  791. else if (cali->dig_P1 < 30000 || cali->dig_P1 > 42000)
  792. return -6;
  793. else if (cali->dig_P2 < -12970 || cali->dig_P2 > -8000)
  794. return -7;
  795. else if (cali->dig_P3 < -5000 || cali->dig_P3 > 8000)
  796. return -8;
  797. else if (cali->dig_P4 < -10000 || cali->dig_P4 > 18000)
  798. return -9;
  799. else if (cali->dig_P5 < -500 || cali->dig_P5 > 1100)
  800. return -10;
  801. else if (cali->dig_P6 < -1000 || cali->dig_P6 > 1000)
  802. return -11;
  803. else if (cali->dig_P7 < -32768 || cali->dig_P7 > 32767)
  804. return -12;
  805. else if (cali->dig_P8 < -30000 || cali->dig_P8 > 10000)
  806. return -13;
  807. else if (cali->dig_P9 < -10000 || cali->dig_P9 > 30000)
  808. return -14;
  809. BAR_LOG("calibration parameters are OK\n");
  810. return 0;
  811. }
  812. static int bmp_check_pt(struct bmp_i2c_data *obj)
  813. {
  814. int err = 0;
  815. int temperature;
  816. int pressure;
  817. char t[BMP_BUFSIZE] = "", p[BMP_BUFSIZE] = "";
  818. err = bmp_set_powermode(obj->client, BMP_NORMAL_MODE);
  819. if (err < 0) {
  820. BAR_ERR("set power mode failed, err = %d\n", err);
  821. return -15;
  822. }
  823. mdelay(50);
  824. /* check ut and t */
  825. bmp_get_temperature(obj->client, t, BMP_BUFSIZE);
  826. if (sscanf(t, "%x", &temperature) != 1)
  827. BAR_ERR("sscanf parsing fail\n");
  828. if (temperature <= -40*100 || temperature >= 85*100) {
  829. BAR_ERR("temperature value is out of range:%d*0.01degree\n",
  830. temperature);
  831. return -16;
  832. }
  833. /* check up and p */
  834. bmp_get_pressure(obj->client, p, BMP_BUFSIZE);
  835. if (sscanf(p, "%x", &pressure) != 1)
  836. BAR_ERR("sscanf parsing fail\n");
  837. if (pressure <= 800*100 || pressure >= 1100*100) {
  838. BAR_ERR("pressure value is out of range:%d Pa\n",
  839. pressure);
  840. return -17;
  841. }
  842. BAR_LOG("bmp280 temperature and pressure values are OK\n");
  843. return 0;
  844. }
  845. static int bmp_do_selftest(struct bmp_i2c_data *obj)
  846. {
  847. int err = 0;
  848. /* 0: failed, 1: success */
  849. u8 selftest;
  850. err = bmp280_verify_i2c_disable_switch(obj);
  851. if (err) {
  852. selftest = 0;
  853. BAR_ERR("bmp280_verify_i2c_disable_switch:err=%d\n", err);
  854. goto exit;
  855. }
  856. err = bmp_check_calib_param(obj);
  857. if (err) {
  858. selftest = 0;
  859. BAR_ERR("bmp_check_calib_param:err=%d\n", err);
  860. goto exit;
  861. }
  862. err = bmp_check_pt(obj);
  863. if (err) {
  864. selftest = 0;
  865. BAR_ERR("bmp_check_pt:err=%d\n", err);
  866. goto exit;
  867. }
  868. /* selftest is OK */
  869. selftest = 1;
  870. BAR_LOG("bmp280 self test is OK\n");
  871. exit:
  872. return selftest;
  873. }
  874. static ssize_t show_chipinfo_value(struct device_driver *ddri, char *buf)
  875. {
  876. struct bmp_i2c_data *obj = obj_i2c_data;
  877. if (NULL == obj) {
  878. BAR_ERR("bmp i2c data pointer is null\n");
  879. return 0;
  880. }
  881. return snprintf(buf, PAGE_SIZE, "%s\n", obj->sensor_name);
  882. }
  883. static ssize_t show_sensordata_value(struct device_driver *ddri, char *buf)
  884. {
  885. struct bmp_i2c_data *obj = obj_i2c_data;
  886. char strbuf[BMP_BUFSIZE] = "";
  887. if (NULL == obj) {
  888. BAR_ERR("bmp i2c data pointer is null\n");
  889. return 0;
  890. }
  891. bmp_get_pressure(obj->client, strbuf, BMP_BUFSIZE);
  892. return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
  893. }
  894. static ssize_t show_trace_value(struct device_driver *ddri, char *buf)
  895. {
  896. ssize_t res;
  897. struct bmp_i2c_data *obj = obj_i2c_data;
  898. if (obj == NULL) {
  899. BAR_ERR("bmp i2c data pointer is null\n");
  900. return 0;
  901. }
  902. res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace));
  903. return res;
  904. }
  905. static ssize_t store_trace_value(struct device_driver *ddri, const char *buf,
  906. size_t count)
  907. {
  908. struct bmp_i2c_data *obj = obj_i2c_data;
  909. int trace;
  910. if (obj == NULL) {
  911. BAR_ERR("i2c_data obj is null\n");
  912. return 0;
  913. }
  914. if (1 == sscanf(buf, "0x%x", &trace))
  915. atomic_set(&obj->trace, trace);
  916. else
  917. BAR_ERR("invalid content: '%s', length = %d\n", buf, (int)count);
  918. return count;
  919. }
  920. static ssize_t show_status_value(struct device_driver *ddri, char *buf)
  921. {
  922. ssize_t len = 0;
  923. struct bmp_i2c_data *obj = obj_i2c_data;
  924. if (obj == NULL) {
  925. BAR_ERR("bmp i2c data pointer is null\n");
  926. return 0;
  927. }
  928. if (obj->hw)
  929. len += snprintf(buf+len, PAGE_SIZE-len, "CUST: %d %d (%d %d)\n",
  930. obj->hw->i2c_num,
  931. obj->hw->direction,
  932. obj->hw->power_id,
  933. obj->hw->power_vol);
  934. else
  935. len += snprintf(buf+len, PAGE_SIZE-len, "CUST: NULL\n");
  936. len += snprintf(buf+len, PAGE_SIZE-len, "i2c addr:%#x,ver:%s\n",
  937. obj->client->addr, BMP_DRIVER_VERSION);
  938. return len;
  939. }
  940. static ssize_t show_power_mode_value(struct device_driver *ddri, char *buf)
  941. {
  942. ssize_t len = 0;
  943. struct bmp_i2c_data *obj = obj_i2c_data;
  944. if (obj == NULL) {
  945. BAR_ERR("bmp i2c data pointer is null\n");
  946. return 0;
  947. }
  948. len += snprintf(buf+len, PAGE_SIZE-len, "%s mode\n",
  949. obj->power_mode == BMP_NORMAL_MODE ? "normal" : "suspend");
  950. return len;
  951. }
  952. static ssize_t store_power_mode_value(struct device_driver *ddri,
  953. const char *buf, size_t count)
  954. {
  955. struct bmp_i2c_data *obj = obj_i2c_data;
  956. unsigned long power_mode;
  957. int err;
  958. if (obj == NULL) {
  959. BAR_ERR("bmp i2c data pointer is null\n");
  960. return 0;
  961. }
  962. err = kstrtoul(buf, 10, &power_mode);
  963. if (err == 0) {
  964. err = bmp_set_powermode(obj->client,
  965. (enum BMP_POWERMODE_ENUM)(!!(power_mode)));
  966. if (err)
  967. return err;
  968. return count;
  969. }
  970. return err;
  971. }
  972. static ssize_t show_selftest_value(struct device_driver *ddri, char *buf)
  973. {
  974. struct bmp_i2c_data *obj = obj_i2c_data;
  975. if (NULL == obj) {
  976. BAR_ERR("bmp i2c data pointer is null\n");
  977. return 0;
  978. }
  979. return snprintf(buf, PAGE_SIZE, "%d\n", bmp_do_selftest(obj));
  980. }
  981. static DRIVER_ATTR(chipinfo, S_IRUGO, show_chipinfo_value, NULL);
  982. static DRIVER_ATTR(sensordata, S_IRUGO, show_sensordata_value, NULL);
  983. static DRIVER_ATTR(trace, S_IWUSR | S_IRUGO,
  984. show_trace_value, store_trace_value);
  985. static DRIVER_ATTR(status, S_IRUGO, show_status_value, NULL);
  986. static DRIVER_ATTR(powermode, S_IWUSR | S_IRUGO,
  987. show_power_mode_value, store_power_mode_value);
  988. static DRIVER_ATTR(selftest, S_IRUGO, show_selftest_value, NULL);
  989. static struct driver_attribute *bmp_attr_list[] = {
  990. &driver_attr_chipinfo, /* chip information*/
  991. &driver_attr_sensordata,/* dump sensor data*/
  992. &driver_attr_trace, /* trace log*/
  993. &driver_attr_status, /* cust setting */
  994. &driver_attr_powermode, /* power mode */
  995. &driver_attr_selftest, /* self test */
  996. };
  997. static int bmp_create_attr(struct device_driver *driver)
  998. {
  999. int idx, err = 0;
  1000. int num = (int)(sizeof(bmp_attr_list)/sizeof(bmp_attr_list[0]));
  1001. if (NULL == driver)
  1002. return -EINVAL;
  1003. for (idx = 0; idx < num; idx++) {
  1004. err = driver_create_file(driver, bmp_attr_list[idx]);
  1005. if (err) {
  1006. BAR_ERR("driver_create_file (%s) = %d\n",
  1007. bmp_attr_list[idx]->attr.name, err);
  1008. break;
  1009. }
  1010. }
  1011. return err;
  1012. }
  1013. static int bmp_delete_attr(struct device_driver *driver)
  1014. {
  1015. int idx, err = 0;
  1016. int num = (int)(sizeof(bmp_attr_list)/sizeof(bmp_attr_list[0]));
  1017. if (NULL == driver)
  1018. return -EINVAL;
  1019. for (idx = 0; idx < num; idx++)
  1020. driver_remove_file(driver, bmp_attr_list[idx]);
  1021. return err;
  1022. }
  1023. #ifdef CONFIG_ID_TEMPERATURE
  1024. int temperature_operate(void *self, uint32_t command, void *buff_in,
  1025. int size_in, void *buff_out, int size_out, int *actualout)
  1026. {
  1027. int err = 0;
  1028. int value;
  1029. struct bmp_i2c_data *priv = (struct bmp_i2c_data *)self;
  1030. hwm_sensor_data *temperature_data;
  1031. char buff[BMP_BUFSIZE];
  1032. switch (command) {
  1033. case SENSOR_DELAY:
  1034. /* under construction */
  1035. break;
  1036. case SENSOR_ENABLE:
  1037. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  1038. BAR_ERR("enable sensor parameter error\n");
  1039. err = -EINVAL;
  1040. } else {
  1041. /* value:[0--->suspend, 1--->normal] */
  1042. value = *(int *)buff_in;
  1043. BAR_LOG("sensor enable/disable command: %s\n",
  1044. value ? "enable" : "disable");
  1045. err = bmp_set_powermode(priv->client,
  1046. (enum BMP_POWERMODE_ENUM)(!!value));
  1047. if (err)
  1048. BAR_ERR("set power mode failed, err = %d\n", err);
  1049. }
  1050. break;
  1051. case SENSOR_GET_DATA:
  1052. if ((buff_out == NULL) ||
  1053. (size_out < sizeof(hwm_sensor_data))) {
  1054. BAR_ERR("get sensor data parameter error\n");
  1055. err = -EINVAL;
  1056. } else {
  1057. temperature_data = (hwm_sensor_data *)buff_out;
  1058. err = bmp_get_temperature(priv->client, buff, BMP_BUFSIZE);
  1059. if (err) {
  1060. BAR_ERR("get compensated temperature value failed,err = %d\n", err);
  1061. return -1;
  1062. }
  1063. if (sscanf(buff, "%x", &temperature_data->values[0]) != 1)
  1064. BAR_ERR("sscanf parsing fail\n");
  1065. temperature_data->values[1] = temperature_data->values[2] = 0;
  1066. temperature_data->status = SENSOR_STATUS_ACCURACY_HIGH;
  1067. temperature_data->value_divide = 100;
  1068. }
  1069. break;
  1070. default:
  1071. BAR_ERR("temperature operate function no this parameter %d\n",
  1072. command);
  1073. err = -1;
  1074. break;
  1075. }
  1076. return err;
  1077. }
  1078. #endif/* CONFIG_ID_TEMPERATURE */
  1079. static int bmp_open(struct inode *inode, struct file *file)
  1080. {
  1081. file->private_data = obj_i2c_data;
  1082. if (file->private_data == NULL) {
  1083. BAR_ERR("null pointer\n");
  1084. return -EINVAL;
  1085. }
  1086. return nonseekable_open(inode, file);
  1087. }
  1088. static int bmp_release(struct inode *inode, struct file *file)
  1089. {
  1090. file->private_data = NULL;
  1091. return 0;
  1092. }
  1093. static long bmp_unlocked_ioctl(struct file *file, unsigned int cmd,
  1094. unsigned long arg)
  1095. {
  1096. struct bmp_i2c_data *obj = (struct bmp_i2c_data *)file->private_data;
  1097. struct i2c_client *client = obj->client;
  1098. char strbuf[BMP_BUFSIZE];
  1099. u32 dat = 0;
  1100. void __user *data;
  1101. int err = 0;
  1102. if (_IOC_DIR(cmd) & _IOC_READ)
  1103. err = !access_ok(VERIFY_WRITE,
  1104. (void __user *)arg, _IOC_SIZE(cmd));
  1105. else if (_IOC_DIR(cmd) & _IOC_WRITE)
  1106. err = !access_ok(VERIFY_READ,
  1107. (void __user *)arg, _IOC_SIZE(cmd));
  1108. if (err) {
  1109. BAR_ERR("access error: %08X, (%2d, %2d)\n",
  1110. cmd, _IOC_DIR(cmd), _IOC_SIZE(cmd));
  1111. return -EFAULT;
  1112. }
  1113. switch (cmd) {
  1114. case BAROMETER_IOCTL_INIT:
  1115. bmp_init_client(client);
  1116. err = bmp_set_powermode(client, BMP_NORMAL_MODE);
  1117. if (err) {
  1118. err = -EFAULT;
  1119. break;
  1120. }
  1121. break;
  1122. case BAROMETER_IOCTL_READ_CHIPINFO:
  1123. data = (void __user *) arg;
  1124. if (NULL == data) {
  1125. err = -EINVAL;
  1126. break;
  1127. }
  1128. strcpy(strbuf, obj->sensor_name);
  1129. if (copy_to_user(data, strbuf, strlen(strbuf)+1)) {
  1130. err = -EFAULT;
  1131. break;
  1132. }
  1133. break;
  1134. case BAROMETER_GET_PRESS_DATA:
  1135. data = (void __user *) arg;
  1136. if (NULL == data) {
  1137. err = -EINVAL;
  1138. break;
  1139. }
  1140. bmp_get_pressure(client, strbuf, BMP_BUFSIZE);
  1141. if (sscanf(strbuf, "%x", &dat) != 1)
  1142. BAR_ERR("sscanf parsing fail\n");
  1143. if (copy_to_user(data, &dat, sizeof(dat))) {
  1144. err = -EFAULT;
  1145. break;
  1146. }
  1147. break;
  1148. case BAROMETER_GET_TEMP_DATA:
  1149. data = (void __user *) arg;
  1150. if (NULL == data) {
  1151. err = -EINVAL;
  1152. break;
  1153. }
  1154. bmp_get_temperature(client, strbuf, BMP_BUFSIZE);
  1155. if (sscanf(strbuf, "%x", &dat) != 1)
  1156. BAR_ERR("sscanf parsing fail\n");
  1157. if (copy_to_user(data, &dat, sizeof(dat))) {
  1158. err = -EFAULT;
  1159. break;
  1160. }
  1161. break;
  1162. default:
  1163. BAR_ERR("unknown IOCTL: 0x%08x\n", cmd);
  1164. err = -ENOIOCTLCMD;
  1165. break;
  1166. }
  1167. return err;
  1168. }
  1169. #if IS_ENABLED(CONFIG_COMPAT)
  1170. static long compat_bmp_unlocked_ioctl(struct file *filp, unsigned int cmd,
  1171. unsigned long arg)
  1172. {
  1173. BAR_FUN();
  1174. if (!filp->f_op || !filp->f_op->unlocked_ioctl) {
  1175. BAR_ERR("compat_ion_ioctl file has no f_op or no f_op->unlocked_ioctl.\n");
  1176. return -ENOTTY;
  1177. }
  1178. switch (cmd) {
  1179. case COMPAT_BAROMETER_IOCTL_INIT:
  1180. case COMPAT_BAROMETER_IOCTL_READ_CHIPINFO:
  1181. case COMPAT_BAROMETER_GET_PRESS_DATA:
  1182. case COMPAT_BAROMETER_GET_TEMP_DATA: {
  1183. BAR_LOG("compat_ion_ioctl : BAROMETER_IOCTL_XXX command is 0x%x\n", cmd);
  1184. return filp->f_op->unlocked_ioctl(filp, cmd,
  1185. (unsigned long)compat_ptr(arg));
  1186. }
  1187. default:
  1188. BAR_ERR("compat_ion_ioctl : No such command!! 0x%x\n", cmd);
  1189. return -ENOIOCTLCMD;
  1190. }
  1191. }
  1192. #endif
  1193. /*----------------------------------------------------------------------------*/
  1194. static const struct file_operations bmp_fops = {
  1195. .owner = THIS_MODULE,
  1196. .open = bmp_open,
  1197. .release = bmp_release,
  1198. .unlocked_ioctl = bmp_unlocked_ioctl,
  1199. #if IS_ENABLED(CONFIG_COMPAT)
  1200. .compat_ioctl = compat_bmp_unlocked_ioctl,
  1201. #endif
  1202. };
  1203. static struct miscdevice bmp_device = {
  1204. .minor = MISC_DYNAMIC_MINOR,
  1205. .name = "barometer",
  1206. .fops = &bmp_fops,
  1207. };
  1208. static int bmp_suspend(struct i2c_client *client, pm_message_t msg)
  1209. {
  1210. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  1211. int err = 0;
  1212. BAR_FUN();
  1213. if (msg.event == PM_EVENT_SUSPEND) {
  1214. if (NULL == obj) {
  1215. BAR_ERR("null pointer\n");
  1216. return -EINVAL;
  1217. }
  1218. atomic_set(&obj->suspend, 1);
  1219. err = bmp_set_powermode(obj->client, BMP_SUSPEND_MODE);
  1220. if (err) {
  1221. BAR_ERR("bmp set suspend mode failed, err = %d\n", err);
  1222. return err;
  1223. }
  1224. bmp_power(obj->hw, 0);
  1225. }
  1226. return err;
  1227. }
  1228. static int bmp_resume(struct i2c_client *client)
  1229. {
  1230. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  1231. int err;
  1232. BAR_FUN();
  1233. if (NULL == obj) {
  1234. BAR_ERR("null pointer\n");
  1235. return -EINVAL;
  1236. }
  1237. bmp_power(obj->hw, 1);
  1238. err = bmp_init_client(obj->client);
  1239. if (err) {
  1240. BAR_ERR("initialize client fail\n");
  1241. return err;
  1242. }
  1243. err = bmp_set_powermode(obj->client, BMP_NORMAL_MODE);
  1244. if (err) {
  1245. BAR_ERR("bmp set normal mode failed, err = %d\n", err);
  1246. return err;
  1247. }
  1248. #ifdef CONFIG_BMP_LOWPASS
  1249. memset(&obj->fir, 0x00, sizeof(obj->fir));
  1250. #endif
  1251. atomic_set(&obj->suspend, 0);
  1252. return 0;
  1253. }
  1254. static int bmp_i2c_detect(struct i2c_client *client,
  1255. struct i2c_board_info *info)
  1256. {
  1257. strcpy(info->type, BMP_DEV_NAME);
  1258. return 0;
  1259. }
  1260. static int bmp_open_report_data(int open)
  1261. {
  1262. /* should queuq work to report event if is_report_input_direct=true */
  1263. return 0;
  1264. }
  1265. static int bmp_enable_nodata(int en)
  1266. {
  1267. int res = 0;
  1268. int retry = 0;
  1269. bool power = false;
  1270. if (1 == en)
  1271. power = true;
  1272. if (0 == en)
  1273. power = false;
  1274. for (retry = 0; retry < 3; retry++) {
  1275. res = bmp_set_powermode(obj_i2c_data->client, (enum BMP_POWERMODE_ENUM)(!!power));
  1276. if (res == 0) {
  1277. BAR_LOG("bmp_set_powermode done\n");
  1278. break;
  1279. }
  1280. BAR_ERR("bmp_set_powermode fail\n");
  1281. }
  1282. if (res != 0) {
  1283. BAR_ERR("bmp_set_powermode fail!\n");
  1284. return -1;
  1285. }
  1286. BAR_LOG("bmp_set_powermode OK!\n");
  1287. return 0;
  1288. }
  1289. static int bmp_set_delay(u64 ns)
  1290. {
  1291. return 0;
  1292. }
  1293. static int bmp_get_data(int *value, int *status)
  1294. {
  1295. char buff[BMP_BUFSIZE];
  1296. int err = 0;
  1297. err = bmp_get_pressure(obj_i2c_data->client, buff, BMP_BUFSIZE);
  1298. if (err) {
  1299. BAR_ERR("get compensated pressure value failed, err = %d\n", err);
  1300. return -1;
  1301. }
  1302. if (sscanf(buff, "%x", value) != 1)
  1303. BAR_ERR("sscanf parsing fail\n");
  1304. *status = SENSOR_STATUS_ACCURACY_MEDIUM;
  1305. return 0;
  1306. }
  1307. static int bmp_i2c_probe(struct i2c_client *client,
  1308. const struct i2c_device_id *id)
  1309. {
  1310. struct bmp_i2c_data *obj;
  1311. struct baro_control_path ctl = {0};
  1312. struct baro_data_path data = {0};
  1313. #ifdef CONFIG_ID_TEMPERATURE
  1314. struct hwmsen_object sobj_t;
  1315. #endif
  1316. int err = 0;
  1317. BAR_FUN();
  1318. obj = kzalloc(sizeof(*obj), GFP_KERNEL);
  1319. if (!obj) {
  1320. err = -ENOMEM;
  1321. goto exit;
  1322. }
  1323. obj->hw = get_cust_baro();
  1324. obj_i2c_data = obj;
  1325. obj->client = client;
  1326. i2c_set_clientdata(client, obj);
  1327. atomic_set(&obj->trace, 0);
  1328. atomic_set(&obj->suspend, 0);
  1329. obj->power_mode = BMP_UNDEFINED_POWERMODE;
  1330. obj->hw_filter = BMP_UNDEFINED_FILTER;
  1331. obj->oversampling_p = BMP_UNDEFINED_OVERSAMPLING;
  1332. obj->oversampling_t = BMP_UNDEFINED_OVERSAMPLING;
  1333. obj->last_temp_measurement = 0;
  1334. obj->temp_measurement_period = 1*HZ;/* temperature update period:1s */
  1335. mutex_init(&obj->lock);
  1336. #ifdef CONFIG_BMP_LOWPASS
  1337. if (obj->hw->firlen > C_MAX_FIR_LENGTH)
  1338. atomic_set(&obj->firlen, C_MAX_FIR_LENGTH);
  1339. else
  1340. atomic_set(&obj->firlen, obj->hw->firlen);
  1341. if (atomic_read(&obj->firlen) > 0)
  1342. atomic_set(&obj->fir_en, 1);
  1343. #endif
  1344. err = bmp_init_client(client);
  1345. if (err)
  1346. goto exit_init_client_failed;
  1347. err = misc_register(&bmp_device);
  1348. if (err) {
  1349. BAR_ERR("misc device register failed, err = %d\n", err);
  1350. goto exit_misc_device_register_failed;
  1351. }
  1352. err = bmp_create_attr(&(bmp_init_info.platform_diver_addr->driver));
  1353. if (err) {
  1354. BAR_ERR("create attribute failed, err = %d\n", err);
  1355. goto exit_create_attr_failed;
  1356. }
  1357. ctl.is_use_common_factory = false;
  1358. ctl.open_report_data = bmp_open_report_data;
  1359. ctl.enable_nodata = bmp_enable_nodata;
  1360. ctl.set_delay = bmp_set_delay;
  1361. ctl.is_report_input_direct = false;
  1362. ctl.is_support_batch = obj->hw->is_batch_supported;
  1363. err = baro_register_control_path(&ctl);
  1364. if (err) {
  1365. BAR_ERR("register baro control path err\n");
  1366. goto exit_hwmsen_attach_pressure_failed;
  1367. }
  1368. data.get_data = bmp_get_data;
  1369. data.vender_div = 100;
  1370. err = baro_register_data_path(&data);
  1371. if (err) {
  1372. BAR_ERR("baro_register_data_path failed, err = %d\n", err);
  1373. goto exit_hwmsen_attach_pressure_failed;
  1374. }
  1375. err = batch_register_support_info(ID_PRESSURE, obj->hw->is_batch_supported, data.vender_div, 0);
  1376. if (err) {
  1377. BAR_ERR("register baro batch support err = %d\n", err);
  1378. goto exit_hwmsen_attach_pressure_failed;
  1379. }
  1380. #ifdef CONFIG_ID_TEMPERATURE
  1381. sobj_t.self = obj;
  1382. sobj_t.polling = 1;
  1383. sobj_t.sensor_operate = temperature_operate;
  1384. err = hwmsen_attach(ID_TEMPRERATURE, &sobj_t);
  1385. if (err) {
  1386. BAR_ERR("hwmsen attach failed, err = %d\n", err);
  1387. goto exit_hwmsen_attach_temperature_failed;
  1388. }
  1389. #endif/* CONFIG_ID_TEMPERATURE */
  1390. bmp_init_flag = 0;
  1391. BAR_LOG("%s: OK\n", __func__);
  1392. return 0;
  1393. #ifdef CONFIG_ID_TEMPERATURE
  1394. exit_hwmsen_attach_temperature_failed:
  1395. hwmsen_detach(ID_PRESSURE);
  1396. #endif/* CONFIG_ID_TEMPERATURE */
  1397. exit_hwmsen_attach_pressure_failed:
  1398. bmp_delete_attr(&(bmp_init_info.platform_diver_addr->driver));
  1399. exit_create_attr_failed:
  1400. misc_deregister(&bmp_device);
  1401. exit_misc_device_register_failed:
  1402. exit_init_client_failed:
  1403. kfree(obj);
  1404. exit:
  1405. BAR_ERR("err = %d\n", err);
  1406. bmp_init_flag = -1;
  1407. return err;
  1408. }
  1409. static int bmp_i2c_remove(struct i2c_client *client)
  1410. {
  1411. int err = 0;
  1412. err = hwmsen_detach(ID_PRESSURE);
  1413. if (err)
  1414. BAR_ERR("hwmsen_detach ID_PRESSURE failed, err = %d\n", err);
  1415. #ifdef CONFIG_ID_TEMPERATURE
  1416. err = hwmsen_detach(ID_TEMPRERATURE);
  1417. if (err)
  1418. BAR_ERR("hwmsen_detach ID_TEMPRERATURE failed, err = %d\n",
  1419. err);
  1420. #endif
  1421. err = bmp_delete_attr(&(bmp_init_info.platform_diver_addr->driver));
  1422. if (err)
  1423. BAR_ERR("bmp_delete_attr failed, err = %d\n", err);
  1424. err = misc_deregister(&bmp_device);
  1425. if (err)
  1426. BAR_ERR("misc_deregister failed, err = %d\n", err);
  1427. obj_i2c_data = NULL;
  1428. i2c_unregister_device(client);
  1429. kfree(i2c_get_clientdata(client));
  1430. return 0;
  1431. }
  1432. static int bmp_remove(void)
  1433. {
  1434. struct baro_hw *hw = get_cust_baro();
  1435. BAR_FUN();
  1436. bmp_power(hw, 0);
  1437. i2c_del_driver(&bmp_i2c_driver);
  1438. return 0;
  1439. }
  1440. static int bmp_local_init(void)
  1441. {
  1442. struct baro_hw *hw = get_cust_baro();
  1443. /* pr_debug("fwq loccal init+++\n"); */
  1444. bmp_power(hw, 1);
  1445. if (i2c_add_driver(&bmp_i2c_driver)) {
  1446. BAR_ERR("add driver error\n");
  1447. return -1;
  1448. }
  1449. if (-1 == bmp_init_flag)
  1450. return -1;
  1451. /* pr_debug("fwq loccal init---\n"); */
  1452. return 0;
  1453. }
  1454. #ifdef CONFIG_OF
  1455. static const struct of_device_id baro_of_match[] = {
  1456. {.compatible = "mediatek,PRESSURE"},
  1457. {},
  1458. };
  1459. #endif
  1460. static struct i2c_driver bmp_i2c_driver = {
  1461. .driver = {
  1462. .owner = THIS_MODULE,
  1463. .name = BMP_DEV_NAME,
  1464. #ifdef CONFIG_OF
  1465. .of_match_table = baro_of_match,
  1466. #endif
  1467. },
  1468. .probe = bmp_i2c_probe,
  1469. .remove = bmp_i2c_remove,
  1470. .detect = bmp_i2c_detect,
  1471. .suspend = bmp_suspend,
  1472. .resume = bmp_resume,
  1473. .id_table = bmp_i2c_id,
  1474. };
  1475. static int __init bmp_init(void)
  1476. {
  1477. const char *name = "mediatek,bmp280new";
  1478. hw = get_baro_dts_func(name, hw);
  1479. if (!hw)
  1480. BAR_ERR("get cust_baro dts info fail\n");
  1481. BAR_FUN();
  1482. #ifdef CONFIG_MTK_LEGACY
  1483. i2c_register_board_info(hw->i2c_num, &bmp_i2c_info, 1);
  1484. #endif
  1485. baro_driver_add(&bmp_init_info);
  1486. return 0;
  1487. }
  1488. static void __exit bmp_exit(void)
  1489. {
  1490. BAR_FUN();
  1491. }
  1492. module_init(bmp_init);
  1493. module_exit(bmp_exit);
  1494. MODULE_LICENSE("GPLv2");
  1495. MODULE_DESCRIPTION("BMP280 I2C Driver");
  1496. MODULE_AUTHOR("deliang.tao@bosch-sensortec.com");
  1497. MODULE_VERSION(BMP_DRIVER_VERSION);