bmp180.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410
  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.02.18]Driver creation
  13. * V1.1 --- [2013.03.14]Instead late_resume, use resume to make sure
  14. * driver resume is ealier than processes resume.
  15. * V1.2 --- [2013.03.26]Re-write i2c function to fix the bug that
  16. * i2c access error on MT6589 platform.
  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 <linux/hwmsensor.h>
  34. #include <linux/hwmsen_dev.h>
  35. #include <linux/sensors_io.h>
  36. #include "bmp180.h"
  37. #include <linux/hwmsen_helper.h>
  38. #include <linux/batch.h>
  39. #include <mach/mt_typedefs.h>
  40. #include <mach/mt_gpio.h>
  41. #include <mach/mt_pm_ldo.h>
  42. #include <barometer.h>
  43. #define POWER_NONE_MACRO MT65XX_POWER_NONE
  44. #define CONFIG_ID_TEMPERATURE 0
  45. static DEFINE_MUTEX(bmp180_i2c_mutex);
  46. static DEFINE_MUTEX(bmp180_op_mutex);
  47. /* sensor type */
  48. enum SENSOR_TYPE_ENUM {
  49. BMP180_TYPE = 0x0,
  50. INVALID_TYPE = 0xff
  51. };
  52. /* power mode */
  53. enum BMP_POWERMODE_ENUM {
  54. BMP_SUSPEND_MODE = 0x0,
  55. BMP_NORMAL_MODE,
  56. BMP_UNDEFINED_POWERMODE = 0xff
  57. };
  58. /* oversampling */
  59. enum BMP_OVERSAMPLING_ENUM {
  60. BMP_OVERSAMPLING_SKIPPED = 0x0,
  61. BMP_OVERSAMPLING_1X,
  62. BMP_OVERSAMPLING_2X,
  63. BMP_OVERSAMPLING_4X,
  64. BMP_OVERSAMPLING_8X,
  65. BMP_OVERSAMPLING_16X,
  66. BMP_UNDEFINED_OVERSAMPLING = 0xff
  67. };
  68. /* trace */
  69. enum BAR_TRC {
  70. BAR_TRC_READ = 0x01,
  71. BAR_TRC_RAWDATA = 0x02,
  72. BAR_TRC_IOCTL = 0x04,
  73. BAR_TRC_FILTER = 0x08,
  74. };
  75. /* s/w filter */
  76. struct data_filter {
  77. u32 raw[C_MAX_FIR_LENGTH][BMP_DATA_NUM];
  78. int sum[BMP_DATA_NUM];
  79. int num;
  80. int idx;
  81. };
  82. /* bmp180 calibration */
  83. struct bmp180_calibration_data {
  84. s16 AC1, AC2, AC3;
  85. u16 AC4, AC5, AC6;
  86. s16 B1, B2;
  87. s16 MB, MC, MD;
  88. };
  89. /* bmp i2c client data */
  90. struct bmp_i2c_data {
  91. struct i2c_client *client;
  92. struct baro_hw *hw;
  93. /* sensor info */
  94. u8 sensor_name[MAX_SENSOR_NAME];
  95. enum SENSOR_TYPE_ENUM sensor_type;
  96. enum BMP_POWERMODE_ENUM power_mode;
  97. u8 oversampling_p;
  98. u32 last_temp_measurement;
  99. u32 temp_measurement_period;
  100. union {
  101. struct bmp180_calibration_data bmp180_cali;
  102. };
  103. /* calculated temperature correction coefficient */
  104. s32 t_fine;
  105. /*misc */
  106. atomic_t trace;
  107. atomic_t suspend;
  108. atomic_t filter;
  109. #if defined(CONFIG_BMP_LOWPASS)
  110. atomic_t firlen;
  111. atomic_t fir_en;
  112. struct data_filter fir;
  113. #endif
  114. };
  115. #define BAR_TAG "[barometer] "
  116. #define BAR_FUN(f) pr_debug(BAR_TAG"%s\n", __func__)
  117. #define BAR_ERR(fmt, args...) \
  118. pr_err(BAR_TAG"%s %d : "fmt, __func__, __LINE__, ##args)
  119. #define BAR_LOG(fmt, args...) pr_debug(BAR_TAG fmt, ##args)
  120. static struct i2c_driver bmp_i2c_driver;
  121. static struct bmp_i2c_data *obj_i2c_data;
  122. static const struct i2c_device_id bmp_i2c_id[] = {
  123. {BMP_DEV_NAME, 0},
  124. {}
  125. };
  126. static struct i2c_board_info bmp_i2c_info __initdata = {
  127. I2C_BOARD_INFO(BMP_DEV_NAME, BMP180_I2C_ADDRESS)
  128. };
  129. static int bmp180_local_init(void);
  130. static int bmp180_remove(void);
  131. static int bmp180_init_flag = -1;
  132. static struct baro_init_info bmp180_init_info = {
  133. .name = "bmp180",
  134. .init = bmp180_local_init,
  135. .uninit = bmp180_remove,
  136. };
  137. /* I2C operation functions */
  138. static int bmp_i2c_read_block(struct i2c_client *client, u8 addr, u8 *data, u8 len)
  139. {
  140. u8 beg = addr;
  141. int err;
  142. struct i2c_msg msgs[2] = { {0}, {0} };
  143. mutex_lock(&bmp180_i2c_mutex);
  144. msgs[0].addr = client->addr;
  145. msgs[0].flags = 0;
  146. msgs[0].len = 1;
  147. msgs[0].buf = &beg;
  148. msgs[1].addr = client->addr;
  149. msgs[1].flags = I2C_M_RD;
  150. msgs[1].len = len;
  151. msgs[1].buf = data;
  152. if (!client) {
  153. mutex_unlock(&bmp180_i2c_mutex);
  154. return -EINVAL;
  155. } else if (len > C_I2C_FIFO_SIZE) {
  156. BAR_ERR(" length %d exceeds %d\n", len, C_I2C_FIFO_SIZE);
  157. mutex_unlock(&bmp180_i2c_mutex);
  158. return -EINVAL;
  159. }
  160. err = i2c_transfer(client->adapter, msgs, sizeof(msgs) / sizeof(msgs[0]));
  161. if (err != 2) {
  162. BAR_ERR("i2c_transfer error: (%d %p %d) %d\n", addr, data, len, err);
  163. err = -EIO;
  164. } else {
  165. err = 0;
  166. }
  167. mutex_unlock(&bmp180_i2c_mutex);
  168. return err;
  169. }
  170. static int bmp_i2c_write_block(struct i2c_client *client, u8 addr, u8 *data, u8 len)
  171. { /*because address also occupies one byte, the maximum length for write is 7 bytes */
  172. int err, idx, num;
  173. char buf[C_I2C_FIFO_SIZE];
  174. err = 0;
  175. mutex_lock(&bmp180_i2c_mutex);
  176. if (!client) {
  177. mutex_unlock(&bmp180_i2c_mutex);
  178. return -EINVAL;
  179. } else if (len >= C_I2C_FIFO_SIZE) {
  180. BAR_ERR(" length %d exceeds %d\n", len, C_I2C_FIFO_SIZE);
  181. mutex_unlock(&bmp180_i2c_mutex);
  182. return -EINVAL;
  183. }
  184. num = 0;
  185. buf[num++] = addr;
  186. for (idx = 0; idx < len; idx++)
  187. buf[num++] = data[idx];
  188. err = i2c_master_send(client, buf, num);
  189. if (err < 0) {
  190. BAR_ERR("send command error!!\n");
  191. mutex_unlock(&bmp180_i2c_mutex);
  192. return -EFAULT;
  193. }
  194. mutex_unlock(&bmp180_i2c_mutex);
  195. return err;
  196. }
  197. static void bmp_power(struct baro_hw *hw, unsigned int on)
  198. {
  199. static unsigned int power_on;
  200. if (hw->power_id != POWER_NONE_MACRO) { /* have externel LDO */
  201. BAR_LOG("power %s\n", on ? "on" : "off");
  202. if (power_on == on) { /* power status not change */
  203. BAR_LOG("ignore power control: %d\n", on);
  204. } else if (on) { /* power on */
  205. if (!hwPowerOn(hw->power_id, hw->power_vol, BMP_DEV_NAME))
  206. BAR_ERR("power on failed\n");
  207. } else { /* power off */
  208. if (!hwPowerDown(hw->power_id, BMP_DEV_NAME))
  209. BAR_ERR("power off failed\n");
  210. }
  211. }
  212. power_on = on;
  213. }
  214. /* get chip type */
  215. static int bmp_get_chip_type(struct i2c_client *client)
  216. {
  217. int err = 0;
  218. u8 chip_id = 0;
  219. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  220. BAR_FUN(f);
  221. err = bmp_i2c_read_block(client, BMP_CHIP_ID_REG, &chip_id, 0x01);
  222. if (err != 0)
  223. return err;
  224. switch (chip_id) {
  225. case BMP180_CHIP_ID:
  226. obj->sensor_type = BMP180_TYPE;
  227. strcpy(obj->sensor_name, "bmp180");
  228. break;
  229. default:
  230. obj->sensor_type = INVALID_TYPE;
  231. strcpy(obj->sensor_name, "unknown sensor");
  232. break;
  233. }
  234. BAR_LOG("[%s]chip id = %#x, sensor name = %s\n", __func__, chip_id, obj->sensor_name);
  235. if (obj->sensor_type == INVALID_TYPE) {
  236. BAR_ERR("unknown pressure sensor\n");
  237. return -1;
  238. }
  239. return 0;
  240. }
  241. static int bmp_get_calibration_data(struct i2c_client *client)
  242. {
  243. struct bmp_i2c_data *obj = (struct bmp_i2c_data *)i2c_get_clientdata(client);
  244. int status = 0;
  245. int i = 0;
  246. if (obj->sensor_type == BMP180_TYPE) {
  247. u8 tmp[2] = { 0 };
  248. u16 cali_data[BMP180_CALIBRATION_DATA_LENGTH] = { 0 };
  249. for (i = 0; i < 11; i++) {
  250. status =
  251. bmp_i2c_read_block(client, (BMP180_CALIBRATION_DATA_START + (i * 2)),
  252. (u8 *) &cali_data[i], 0x02);
  253. if (status < 0)
  254. return status;
  255. /* cali_data[i] = tmp[0]|(tmp[1]>>8); */
  256. BAR_LOG("[%s] read data = 0x%x, 0x%x, i = %d\n", __func__, tmp[0], tmp[1],
  257. i);
  258. BAR_LOG("[%s] read address = 0x%x\n", __func__,
  259. (BMP180_CALIBRATION_DATA_START + (i * 2)));
  260. }
  261. obj->bmp180_cali.AC1 = be16_to_cpu(cali_data[0]);
  262. obj->bmp180_cali.AC2 = be16_to_cpu(cali_data[1]);
  263. obj->bmp180_cali.AC3 = be16_to_cpu(cali_data[2]);
  264. obj->bmp180_cali.AC4 = be16_to_cpu(cali_data[3]);
  265. obj->bmp180_cali.AC5 = be16_to_cpu(cali_data[4]);
  266. obj->bmp180_cali.AC6 = be16_to_cpu(cali_data[5]);
  267. obj->bmp180_cali.B1 = be16_to_cpu(cali_data[6]);
  268. obj->bmp180_cali.B2 = be16_to_cpu(cali_data[7]);
  269. obj->bmp180_cali.MB = be16_to_cpu(cali_data[8]);
  270. obj->bmp180_cali.MC = be16_to_cpu(cali_data[9]);
  271. obj->bmp180_cali.MD = be16_to_cpu(cali_data[10]);
  272. }
  273. return 0;
  274. }
  275. static int bmp_set_powermode(struct i2c_client *client, enum BMP_POWERMODE_ENUM power_mode)
  276. {
  277. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  278. u8 err = 0;
  279. BAR_LOG("[%s] power_mode = %d, old power_mode = %d\n", __func__,
  280. power_mode, obj->power_mode);
  281. if (power_mode == obj->power_mode)
  282. return 0;
  283. mutex_lock(&bmp180_op_mutex);
  284. if (obj->sensor_type == BMP180_TYPE) { /* BMP180 */
  285. /* BMP180 only support forced mode */
  286. BAR_LOG("%s doesn't support hw power mode setting,only has forced mode\n", obj->sensor_name);
  287. }
  288. if (err < 0)
  289. BAR_ERR("set power mode failed, err = %d, sensor name = %s\n",
  290. err, obj->sensor_name);
  291. else
  292. obj->power_mode = power_mode;
  293. mutex_unlock(&bmp180_op_mutex);
  294. return err;
  295. }
  296. static int bmp_set_oversampling_p(struct i2c_client *client,
  297. enum BMP_OVERSAMPLING_ENUM oversampling_p)
  298. {
  299. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  300. u8 err = 0, data = 0, actual_oversampling_p = 0;
  301. BAR_LOG("[%s] oversampling_p = %d, old oversampling_p = %d\n", __func__, oversampling_p,
  302. obj->oversampling_p);
  303. if (oversampling_p == obj->oversampling_p)
  304. return 0;
  305. if (obj->sensor_type == BMP180_TYPE) { /* BMP180 */
  306. if (oversampling_p == BMP_OVERSAMPLING_1X)
  307. actual_oversampling_p = BMP180_OVERSAMPLING_1X;
  308. else if (oversampling_p == BMP_OVERSAMPLING_2X)
  309. actual_oversampling_p = BMP180_OVERSAMPLING_2X;
  310. else if (oversampling_p == BMP_OVERSAMPLING_4X)
  311. actual_oversampling_p = BMP180_OVERSAMPLING_4X;
  312. else if (oversampling_p == BMP_OVERSAMPLING_8X)
  313. actual_oversampling_p = BMP180_OVERSAMPLING_8X;
  314. else {
  315. err = -EINVAL;
  316. BAR_ERR("invalid oversampling_p = %d\n", oversampling_p);
  317. return err;
  318. }
  319. err = bmp_i2c_read_block(client, BMP180_CTRLMEAS_REG_OSRSP__REG, &data, 1);
  320. data = BMP_SET_BITSLICE(data, BMP180_CTRLMEAS_REG_OSRSP, actual_oversampling_p);
  321. err += bmp_i2c_write_block(client, BMP180_CTRLMEAS_REG_OSRSP__REG, &data, 1);
  322. }
  323. if (err < 0)
  324. BAR_ERR("set pressure oversampling failed, err = %d, sensor name = %s\n", err,
  325. obj->sensor_name);
  326. else
  327. obj->oversampling_p = oversampling_p;
  328. return err;
  329. }
  330. static int bmp_read_raw_temperature(struct i2c_client *client, s32 *temperature)
  331. {
  332. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  333. s32 err = 0;
  334. u16 tmp;
  335. u8 data;
  336. if (NULL == client) {
  337. err = -EINVAL;
  338. return err;
  339. }
  340. mutex_lock(&bmp180_op_mutex);
  341. if (obj->sensor_type == BMP180_TYPE) { /* BMP180 */
  342. data = BMP180_TEMP_MEASUREMENT;
  343. err += bmp_i2c_write_block(client, BMP180_CTRLMEAS_REG_MC__REG, &data, 1);
  344. if (err < 0) {
  345. BAR_ERR("start measure temperature failed, err = %d\n", err);
  346. mutex_unlock(&bmp180_op_mutex);
  347. return err;
  348. }
  349. /* wait for the end of conversion */
  350. msleep(bmp_i2c_read_block(client, BMP180_CONVERSION_REGISTER_MSB, (u8 *) &tmp,
  351. sizeof(tmp));
  352. if (err < 0) {
  353. BAR_ERR("read raw temperature failed, err = %d\n", err);
  354. mutex_unlock(&bmp180_op_mutex);
  355. return err;
  356. }
  357. *temperature = be16_to_cpu(tmp);
  358. if (atomic_read(&obj->trace) & BAR_TRC_IOCTL)
  359. BAR_LOG("debug sensor raw temperature value: 0x%x\n", tmp);
  360. }
  361. mutex_unlock(&bmp180_op_mutex);
  362. obj->last_temp_measurement = jiffies;
  363. return err;
  364. }
  365. static int bmp_read_raw_pressure(struct i2c_client *client, s32 *pressure)
  366. {
  367. struct bmp_i2c_data *priv = i2c_get_clientdata(client);
  368. s32 err = 0;
  369. u32 tmp = 0;
  370. u8 data;
  371. if (NULL == client) {
  372. err = -EINVAL;
  373. return err;
  374. }
  375. mutex_lock(&bmp180_op_mutex);
  376. if (priv->sensor_type == BMP180_TYPE) { /* BMP180 */
  377. data = BMP180_PRESSURE_MEASUREMENT + ((priv->oversampling_p - 1) << 6);
  378. err += bmp_i2c_write_block(client, BMP180_CTRLMEAS_REG_MC__REG, &data, 1);
  379. if (err < 0) {
  380. BAR_ERR("start measure pressure failed, err = %d\n", err);
  381. mutex_unlock(&bmp180_op_mutex);
  382. return err;
  383. }
  384. /* wait for the end of conversion */
  385. msleep(2 + (3 << (priv->oversampling_p - 1)));
  386. /* copy data into a u32 (4 bytes), but skip the first byte. */
  387. err = bmp_i2c_read_block(client,
  388. BMP180_CONVERSION_REGISTER_MSB, ((u8 *) &tmp) + 1, 3);
  389. if (err < 0) {
  390. BAR_ERR("read raw pressure failed, err = %d\n", err);
  391. mutex_unlock(&bmp180_op_mutex);
  392. return err;
  393. }
  394. *pressure = be32_to_cpu(tmp);
  395. *pressure >>= (8 - (priv->oversampling_p - 1));
  396. if (atomic_read(&priv->trace) & BAR_TRC_IOCTL)
  397. BAR_LOG("debug sensor raw pressure value: 0x%x\n", tmp);
  398. }
  399. mutex_unlock(&bmp180_op_mutex);
  400. #ifdef CONFIG_BMP_LOWPASS
  401. /*
  402. *Example: firlen = 16, filter buffer = [0] ... [15],
  403. *when 17th data come, replace [0] with this new data.
  404. *Then, average this filter buffer and report average value to upper layer.
  405. */
  406. if (atomic_read(&priv->filter)) {
  407. if (atomic_read(&priv->fir_en) && !atomic_read(&priv->suspend)) {
  408. int idx, firlen = atomic_read(&priv->firlen);
  409. if (priv->fir.num < firlen) {
  410. priv->fir.raw[priv->fir.num][BMP_PRESSURE] = *pressure;
  411. priv->fir.sum[BMP_PRESSURE] += *pressure;
  412. if (atomic_read(&priv->trace) & BAR_TRC_FILTER) {
  413. BAR_LOG("add [%2d] [%5d] => [%5d]\n",
  414. priv->fir.num,
  415. priv->fir.raw
  416. [priv->fir.num][BMP_PRESSURE],
  417. priv->fir.sum[BMP_PRESSURE]);
  418. }
  419. priv->fir.num++;
  420. priv->fir.idx++;
  421. } else {
  422. idx = priv->fir.idx % firlen;
  423. priv->fir.sum[BMP_PRESSURE] -= priv->fir.raw[idx][BMP_PRESSURE];
  424. priv->fir.raw[idx][BMP_PRESSURE] = *pressure;
  425. priv->fir.sum[BMP_PRESSURE] += *pressure;
  426. priv->fir.idx++;
  427. *pressure = priv->fir.sum[BMP_PRESSURE] / firlen;
  428. if (atomic_read(&priv->trace) & BAR_TRC_FILTER) {
  429. BAR_LOG("add [%2d][%5d]=>[%5d]:[%5d]\n", idx,
  430. priv->fir.raw[idx][BMP_PRESSURE],
  431. priv->fir.sum[BMP_PRESSURE], *pressure);
  432. }
  433. }
  434. }
  435. }
  436. #endif
  437. return err;
  438. }
  439. /*
  440. *get compensated temperature
  441. *unit:10 degrees centigrade
  442. */
  443. static int bmp_get_temperature(struct i2c_client *client, char *buf, int bufsize)
  444. {
  445. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  446. long x1, x2;
  447. int status;
  448. s32 utemp = 0; /* uncompensated temperature */
  449. s32 temperature = 0;
  450. if (NULL == buf)
  451. return -1;
  452. if (NULL == client) {
  453. *buf = 0;
  454. return -2;
  455. }
  456. status = bmp_read_raw_temperature(client, &utemp);
  457. if (status != 0)
  458. return status;
  459. if (obj->sensor_type == BMP180_TYPE) { /* BMP180 */
  460. BAR_LOG("pressure sensor type is right\n");
  461. x1 = ((utemp - obj->bmp180_cali.AC6) * obj->bmp180_cali.AC5) >> 15;
  462. x2 = (obj->bmp180_cali.MC << 11) / (x1 + obj->bmp180_cali.MD);
  463. mutex_lock(&bmp180_op_mutex);
  464. obj->t_fine = x1 + x2 - 4000;
  465. mutex_unlock(&bmp180_op_mutex);
  466. temperature = (x1 + x2 + 8) >> 4;
  467. }
  468. sprintf(buf, "%08x", temperature);
  469. if (atomic_read(&obj->trace) & BAR_TRC_IOCTL)
  470. BAR_LOG("compensated temperature value: %s\n", buf);
  471. return status;
  472. }
  473. /*
  474. *get compensated pressure
  475. *unit: hectopascal(hPa)
  476. */
  477. static int bmp_get_pressure(struct i2c_client *client, char *buf, int bufsize)
  478. {
  479. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  480. int status;
  481. s32 temperature = 0, upressure = 0, pressure = 0;
  482. char temp_buf[BMP_BUFSIZE];
  483. int err;
  484. if (NULL == buf)
  485. return -1;
  486. if (NULL == client) {
  487. *buf = 0;
  488. return -2;
  489. }
  490. /* update the ambient temperature according to the given meas. period */
  491. if (time_before(obj->last_temp_measurement + obj->temp_measurement_peiiod, jiffies)) {
  492. status = bmp_get_temperature(client, temp_buf, BMP_BUFSIZE); /* update t_fine */
  493. if (status != 0)
  494. goto exit;
  495. err = kstrtoint(temp_buf, 10, &temperature);
  496. if (err)
  497. goto exit;
  498. }
  499. status = bmp_read_raw_pressure(client, &upressure);
  500. if (status != 0)
  501. goto exit;
  502. if (obj->sensor_type == BMP180_TYPE) { /* BMP180 */
  503. s32 x1, x2, x3, b3;
  504. u32 b4, b7;
  505. s32 p;
  506. x1 = (obj->t_fine * obj->t_fine) >> 12;
  507. x1 *= obj->bmp180_cali.B2;
  508. x1 >>= 11;
  509. x2 = obj->bmp180_cali.AC2 * obj->t_fine;
  510. x2 >>= 11;
  511. x3 = x1 + x2;
  512. b3 = (((((s32) obj->bmp180_cali.AC1) * 4 + x3)
  513. << (obj->oversampling_p - 1)) + 2);
  514. b3 >>= 2;
  515. x1 = (obj->bmp180_cali.AC3 * obj->t_fine) >> 13;
  516. x2 = (obj->bmp180_cali.B1 * ((obj->t_fine * obj->t_fine) >> 12))
  517. >> 16;
  518. x3 = (x1 + x2 + 2) >> 2;
  519. b4 = (obj->bmp180_cali.AC4 * (u32) (x3 + 32768)) >> 15;
  520. b7 = ((u32) upressure - b3) * (50000 >> (obj->oversampling_p - 1));
  521. p = ((b7 < 0x80000000) ? ((b7 << 1) / b4) : ((b7 / b4) * 2));
  522. x1 = p >> 8;
  523. x1 *= x1;
  524. x1 = (x1 * 3038) >> 16;
  525. x2 = (-7357 * p) >> 16;
  526. p += (x1 + x2 + 3791) >> 4;
  527. pressure = p;
  528. }
  529. sprintf(buf, "%08x", pressure);
  530. if (atomic_read(&obj->trace) & BAR_TRC_IOCTL)
  531. BAR_LOG("compensated pressure value: %s\n", buf);
  532. exit:
  533. return status;
  534. }
  535. /* bmp setting initialization */
  536. static int bmp_init_client(struct i2c_client *client)
  537. {
  538. int err = 0;
  539. BAR_FUN();
  540. err = bmp_get_chip_type(client);
  541. if (err < 0) {
  542. BAR_ERR("get chip type failed, err = %d\n", err);
  543. return err;
  544. }
  545. err = bmp_get_calibration_data(client);
  546. if (err < 0) {
  547. BAR_ERR("get calibration data failed, err = %d\n", err);
  548. return err;
  549. }
  550. err = bmp_set_powermode(client, BMP_SUSPEND_MODE);
  551. if (err < 0) {
  552. BAR_ERR("set power mode failed, err = %d\n", err);
  553. return err;
  554. }
  555. err = bmp_set_oversampling_p(client, BMP_OVERSAMPLING_8X);
  556. if (err < 0) {
  557. BAR_ERR("set pressure oversampling failed, err = %d\n", err);
  558. return err;
  559. }
  560. return 0;
  561. }
  562. static ssize_t show_chipinfo_value(struct device_driver *ddri, char *buf)
  563. {
  564. struct bmp_i2c_data *obj = obj_i2c_data;
  565. if (NULL == obj) {
  566. BAR_ERR("bmp i2c data pointer is null\n");
  567. return 0;
  568. }
  569. return snprintf(buf, PAGE_SIZE, "%s\n", obj->sensor_name);
  570. }
  571. static ssize_t show_sensordata_value(struct device_driver *ddri, char *buf)
  572. {
  573. struct bmp_i2c_data *obj = obj_i2c_data;
  574. char strbuf[BMP_BUFSIZE] = "";
  575. if (NULL == obj) {
  576. BAR_ERR("bmp i2c data pointer is null\n");
  577. return 0;
  578. }
  579. bmp_get_pressure(obj->client, strbuf, BMP_BUFSIZE);
  580. return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
  581. }
  582. static ssize_t show_trace_value(struct device_driver *ddri, char *buf)
  583. {
  584. ssize_t res;
  585. struct bmp_i2c_data *obj = obj_i2c_data;
  586. if (obj == NULL) {
  587. BAR_ERR("bmp i2c data pointer is null\n");
  588. return 0;
  589. }
  590. res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace));
  591. return res;
  592. }
  593. static ssize_t store_trace_value(struct device_driver *ddri, const char *buf, size_t count)
  594. {
  595. struct bmp_i2c_data *obj = obj_i2c_data;
  596. int trace;
  597. if (obj == NULL) {
  598. BAR_ERR("i2c_data obj is null\n");
  599. return 0;
  600. }
  601. if (1 == sscanf(buf, "0x%x", &trace))
  602. atomic_set(&obj->trace, trace);
  603. else
  604. BAR_ERR("invalid content: '%s', length = %d\n", buf, (int)count);
  605. return count;
  606. }
  607. static ssize_t show_status_value(struct device_driver *ddri, char *buf)
  608. {
  609. ssize_t len = 0;
  610. struct bmp_i2c_data *obj = obj_i2c_data;
  611. if (obj == NULL) {
  612. BAR_ERR("bmp i2c data pointer is null\n");
  613. return 0;
  614. }
  615. if (obj->hw)
  616. len += snprintf(buf + len, PAGE_SIZE - len, "CUST: %d %d (%d %d)\n",
  617. obj->hw->i2c_num,
  618. obj->hw->direction, obj->hw->power_id, obj->hw->power_vol);
  619. else
  620. len += snprintf(buf + len, PAGE_SIZE - len, "CUST: NULL\n");
  621. len += snprintf(buf + len, PAGE_SIZE - len, "i2c addr:%#x,ver:%s\n",
  622. obj->client->addr, BMP_DRIVER_VERSION);
  623. return len;
  624. }
  625. static ssize_t show_power_mode_value(struct device_driver *ddri, char *buf)
  626. {
  627. ssize_t len = 0;
  628. struct bmp_i2c_data *obj = obj_i2c_data;
  629. if (obj == NULL) {
  630. BAR_ERR("bmp i2c data pointer is null\n");
  631. return 0;
  632. }
  633. len += snprintf(buf + len, PAGE_SIZE - len, "%s mode\n",
  634. obj->power_mode == BMP_NORMAL_MODE ? "normal" : "suspend");
  635. return len;
  636. }
  637. static ssize_t store_power_mode_value(struct device_driver *ddri, const char *buf, size_t count)
  638. {
  639. struct bmp_i2c_data *obj = obj_i2c_data;
  640. unsigned long power_mode;
  641. int err;
  642. if (obj == NULL) {
  643. BAR_ERR("bmp i2c data pointer is null\n");
  644. return 0;
  645. }
  646. err = kstrtoul(buf, 10, &power_mode);
  647. if (err == 0) {
  648. err = bmp_set_powermode(obj->client, (enum BMP_POWERMODE_ENUM)(!!(power_mode)));
  649. if (err)
  650. return err;
  651. return count;
  652. }
  653. return err;
  654. }
  655. static DRIVER_ATTR(chipinfo, S_IRUGO, show_chipinfo_value, NULL);
  656. static DRIVER_ATTR(sensordata, S_IRUGO, show_sensordata_value, NULL);
  657. static DRIVER_ATTR(trace, S_IWUSR | S_IRUGO, show_trace_value, store_trace_value);
  658. static DRIVER_ATTR(status, S_IRUGO, show_status_value, NULL);
  659. static DRIVER_ATTR(powermode, S_IWUSR | S_IRUGO, show_power_mode_value, store_power_mode_value);
  660. static struct driver_attribute *bmp_attr_list[] = {
  661. &driver_attr_chipinfo, /* chip information */
  662. &driver_attr_sensordata, /* dump sensor data */
  663. &driver_attr_trace, /* trace log */
  664. &driver_attr_status, /* cust setting */
  665. &driver_attr_powermode, /* power mode */
  666. };
  667. static int bmp_create_attr(struct device_driver *driver)
  668. {
  669. int idx, err = 0;
  670. int num = (int)(sizeof(bmp_attr_list) / sizeof(bmp_attr_list[0]));
  671. if (NULL == driver)
  672. return -EINVAL;
  673. for (idx = 0; idx < num; idx++) {
  674. err = driver_create_file(driver, bmp_attr_list[idx]);
  675. if (err) {
  676. BAR_ERR("driver_create_file (%s) = %d\n",
  677. bmp_attr_list[idx]->attr.name, err);
  678. break;
  679. }
  680. }
  681. return err;
  682. }
  683. static int bmp_delete_attr(struct device_driver *driver)
  684. {
  685. int idx, err = 0;
  686. int num = (int)(sizeof(bmp_attr_list) / sizeof(bmp_attr_list[0]));
  687. if (NULL == driver)
  688. return -EINVAL;
  689. for (idx = 0; idx < num; idx++)
  690. driver_remove_file(driver, bmp_attr_list[idx]);
  691. return err;
  692. }
  693. int barometer_operate(void *self, uint32_t command, void *buff_in, int size_in,
  694. void *buff_out, int size_out, int *actualout)
  695. {
  696. int err = 0;
  697. int value;
  698. struct bmp_i2c_data *priv = (struct bmp_i2c_data *)self;
  699. hwm_sensor_data *barometer_data;
  700. char buff[BMP_BUFSIZE];
  701. switch (command) {
  702. case SENSOR_DELAY:
  703. /* under construction */
  704. break;
  705. case SENSOR_ENABLE:
  706. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  707. BAR_ERR("enable sensor parameter error\n");
  708. err = -EINVAL;
  709. } else {
  710. mutex_lock(&bmp180_op_mutex);
  711. /* value:[0--->suspend, 1--->normal] */
  712. value = *(int *)buff_in;
  713. BAR_LOG("sensor enable/disable command: %s\n",
  714. value ? "enable" : "disable");
  715. err = bmp_set_powermode(priv->client, (enum BMP_POWERMODE_ENUM)(!!value));
  716. if (err)
  717. BAR_ERR("set power mode failed, err = %d\n", err);
  718. #ifdef CONFIG_BMP_LOWPASS
  719. /* clear filter buffer */
  720. if (value == 0)
  721. memset(&(priv->fir), 0, sizeof(struct data_filter));
  722. #endif
  723. mutex_unlock(&bmp180_op_mutex);
  724. }
  725. break;
  726. case SENSOR_GET_DATA:
  727. if ((buff_out == NULL) || (size_out < sizeof(hwm_sensor_data))) {
  728. BAR_ERR("get sensor data parameter error\n");
  729. err = -EINVAL;
  730. } else {
  731. mutex_lock(&bmp180_op_mutex);
  732. barometer_data = (hwm_sensor_data *) buff_out;
  733. err = bmp_get_pressure(priv->client, buff, BMP_BUFSIZE);
  734. if (err) {
  735. BAR_ERR("get compensated pressure value failed," "err = %d\n", err);
  736. return -1;
  737. }
  738. err = kstrtoint(buff, 10, &barometer_data->values[0]);
  739. if (err)
  740. return -1;
  741. barometer_data->values[1] = barometer_data->values[2] = 0;
  742. barometer_data->status = SENSOR_STATUS_ACCURACY_HIGH;
  743. barometer_data->value_divide = 100;
  744. mutex_unlock(&bmp180_op_mutex);
  745. }
  746. break;
  747. default:
  748. BAR_ERR("barometer operate function no this parameter %d\n", command);
  749. err = -1;
  750. break;
  751. }
  752. return err;
  753. }
  754. #ifdef CONFIG_ID_TEMPERATURE
  755. int temperature_operate(void *self, uint32_t command, void *buff_in,
  756. int size_in, void *buff_out, int size_out, int *actualout)
  757. {
  758. int err = 0;
  759. int value;
  760. struct bmp_i2c_data *priv = (struct bmp_i2c_data *)self;
  761. hwm_sensor_data *temperature_data;
  762. char buff[BMP_BUFSIZE];
  763. switch (command) {
  764. case SENSOR_DELAY:
  765. /* under construction */
  766. break;
  767. case SENSOR_ENABLE:
  768. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  769. BAR_ERR("enable sensor parameter error\n");
  770. err = -EINVAL;
  771. } else {
  772. mutex_lock(&bmp180_op_mutex);
  773. /* value:[0--->suspend, 1--->normal] */
  774. value = *(int *)buff_in;
  775. BAR_LOG("sensor enable/disable command: %s\n",
  776. value ? "enable" : "disable");
  777. err = bmp_set_powermode(priv->client, (enum BMP_POWERMODE_ENUM)(!!value));
  778. if (err)
  779. BAR_ERR("set power mode failed, err = %d\n", err);
  780. mutex_unlock(&bmp180_op_mutex);
  781. }
  782. break;
  783. case SENSOR_GET_DATA:
  784. if ((buff_out == NULL) || (size_out < sizeof(hwm_sensor_data))) {
  785. BAR_ERR("get sensor data parameter error\n");
  786. err = -EINVAL;
  787. } else {
  788. mutex_lock(&bmp180_op_mutex);
  789. temperature_data = (hwm_sensor_data *) buff_out;
  790. err = bmp_get_temperature(priv->client, buff, BMP_BUFSIZE);
  791. if (err) {
  792. BAR_ERR("get compensated temperature value failed,err = %d\n", err);
  793. return -1;
  794. }
  795. err = kstrtoint(buff, 10, &temperature_data->values[0]);
  796. if (err)
  797. return -1;
  798. temperature_data->values[1] = temperature_data->values[2] = 0;
  799. temperature_data->status = SENSOR_STATUS_ACCURACY_HIGH;
  800. temperature_data->value_divide = 100;
  801. mutex_unlock(&bmp180_op_mutex);
  802. }
  803. break;
  804. default:
  805. BAR_ERR("temperature operate function no this parameter %d\n", command);
  806. err = -1;
  807. break;
  808. }
  809. return err;
  810. }
  811. #endif /* CONFIG_ID_TEMPERATURE */
  812. static int bmp_open(struct inode *inode, struct file *file)
  813. {
  814. file->private_data = obj_i2c_data;
  815. if (file->private_data == NULL) {
  816. BAR_ERR("null pointer\n");
  817. return -EINVAL;
  818. }
  819. return nonseekable_open(inode, file);
  820. }
  821. static int bmp_release(struct inode *inode, struct file *file)
  822. {
  823. file->private_data = NULL;
  824. return 0;
  825. }
  826. static long bmp_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  827. {
  828. struct bmp_i2c_data *obj = (struct bmp_i2c_data *)file->private_data;
  829. struct i2c_client *client = obj->client;
  830. char strbuf[BMP_BUFSIZE];
  831. u32 dat = 0;
  832. void __user *data;
  833. int err = 0;
  834. if (_IOC_DIR(cmd) & _IOC_READ)
  835. err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
  836. else if (_IOC_DIR(cmd) & _IOC_WRITE)
  837. err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
  838. if (err) {
  839. BAR_ERR("access error: %08X, (%2d, %2d)\n", cmd, _IOC_DIR(cmd), _IOC_SIZE(cmd));
  840. return -EFAULT;
  841. }
  842. switch (cmd) {
  843. case BAROMETER_IOCTL_INIT:
  844. bmp_init_client(client);
  845. err = bmp_set_powermode(client, BMP_NORMAL_MODE);
  846. if (err) {
  847. err = -EFAULT;
  848. break;
  849. }
  850. break;
  851. case BAROMETER_IOCTL_READ_CHIPINFO:
  852. data = (void __user *)arg;
  853. if (NULL == data) {
  854. err = -EINVAL;
  855. break;
  856. }
  857. strcpy(strbuf, obj->sensor_name);
  858. if (copy_to_user(data, strbuf, strlen(strbuf) + 1)) {
  859. err = -EFAULT;
  860. break;
  861. }
  862. break;
  863. case BAROMETER_GET_PRESS_DATA:
  864. data = (void __user *)arg;
  865. if (NULL == data) {
  866. err = -EINVAL;
  867. break;
  868. }
  869. bmp_get_pressure(client, strbuf, BMP_BUFSIZE);
  870. err = kstrtoint(strbuf, 10, &dat);
  871. if (err)
  872. break;
  873. if (copy_to_user(data, &dat, sizeof(dat))) {
  874. err = -EFAULT;
  875. break;
  876. }
  877. break;
  878. case BAROMETER_GET_TEMP_DATA:
  879. data = (void __user *)arg;
  880. if (NULL == data) {
  881. err = -EINVAL;
  882. break;
  883. }
  884. bmp_get_temperature(client, strbuf, BMP_BUFSIZE);
  885. err = kstrtoint(strbuf, 10, &dat);
  886. if (err)
  887. break;
  888. if (copy_to_user(data, &dat, sizeof(dat))) {
  889. err = -EFAULT;
  890. break;
  891. }
  892. break;
  893. default:
  894. BAR_ERR("unknown IOCTL: 0x%08x\n", cmd);
  895. err = -ENOIOCTLCMD;
  896. break;
  897. }
  898. return err;
  899. }
  900. static const struct file_operations bmp_fops = {
  901. .owner = THIS_MODULE,
  902. .open = bmp_open,
  903. .release = bmp_release,
  904. .unlocked_ioctl = bmp_unlocked_ioctl,
  905. };
  906. static struct miscdevice bmp_device = {
  907. .minor = MISC_DYNAMIC_MINOR,
  908. .name = "barometer",
  909. .fops = &bmp_fops,
  910. };
  911. static int bmp_suspend(struct i2c_client *client, pm_message_t msg)
  912. {
  913. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  914. int err = 0;
  915. BAR_FUN();
  916. mutex_lock(&bmp180_op_mutex);
  917. if (msg.event == PM_EVENT_SUSPEND) {
  918. if (NULL == obj) {
  919. BAR_ERR("null pointer\n");
  920. mutex_unlock(&bmp180_op_mutex);
  921. return -EINVAL;
  922. }
  923. atomic_set(&obj->suspend, 1);
  924. err = bmp_set_powermode(obj->client, BMP_SUSPEND_MODE);
  925. if (err) {
  926. BAR_ERR("bmp set suspend mode failed, err = %d\n", err);
  927. mutex_unlock(&bmp180_op_mutex);
  928. return err;
  929. }
  930. bmp_power(obj->hw, 0);
  931. }
  932. mutex_unlock(&bmp180_op_mutex);
  933. return err;
  934. }
  935. static int bmp_resume(struct i2c_client *client)
  936. {
  937. struct bmp_i2c_data *obj = i2c_get_clientdata(client);
  938. int err;
  939. BAR_FUN();
  940. mutex_lock(&bmp180_op_mutex);
  941. if (NULL == obj) {
  942. BAR_ERR("null pointer\n");
  943. mutex_unlock(&bmp180_op_mutex);
  944. return -EINVAL;
  945. }
  946. bmp_power(obj->hw, 1);
  947. err = bmp_init_client(obj->client);
  948. if (err) {
  949. BAR_ERR("initialize client fail\n");
  950. mutex_unlock(&bmp180_op_mutex);
  951. return err;
  952. }
  953. #ifdef CONFIG_BMP_LOWPASS
  954. memset(&obj->fir, 0x00, sizeof(obj->fir));
  955. #endif
  956. atomic_set(&obj->suspend, 0);
  957. mutex_unlock(&bmp180_op_mutex);
  958. return 0;
  959. }
  960. static int bmp_i2c_detect(struct i2c_client *client, struct i2c_board_info *info)
  961. {
  962. strcpy(info->type, BMP_DEV_NAME);
  963. return 0;
  964. }
  965. /* if use this typ of enable , Gsensor should report inputEvent(x, y, z ,stats, div) to HAL */
  966. static int bmp180_open_report_data(int open)
  967. {
  968. /* should queuq work to report event if is_report_input_direct=true */
  969. return 0;
  970. }
  971. /* if use this typ of enable , Gsensor only enabled but not report inputEvent to HAL */
  972. static int bmp180_enable_nodata(int en)
  973. {
  974. int res = 0;
  975. int retry = 0;
  976. bool power = false;
  977. if (1 == en)
  978. power = true;
  979. if (0 == en)
  980. power = false;
  981. for (retry = 0; retry < 3; retry++) {
  982. res = bmp_set_powermode(obj_i2c_data->client, (enum BMP_POWERMODE_ENUM)(!!power));
  983. if (res == 0) {
  984. BAR_LOG("bmp_set_powermode done\n");
  985. break;
  986. }
  987. BAR_ERR("bmp_set_powermode fail\n");
  988. }
  989. if (res != 0) {
  990. BAR_ERR("bmp_set_powermode fail!\n");
  991. return -1;
  992. }
  993. BAR_LOG("bmp_set_powermode OK!\n");
  994. return 0;
  995. }
  996. static int bmp180_set_delay(u64 ns)
  997. {
  998. return 0;
  999. }
  1000. static int bmp180_get_data(int *value, int *status)
  1001. {
  1002. char buff[BMP_BUFSIZE];
  1003. int err = 0;
  1004. err = bmp_get_pressure(obj_i2c_data->client, buff, BMP_BUFSIZE);
  1005. if (err) {
  1006. BAR_ERR("get compensated pressure value failed," "err = %d\n", err);
  1007. return -1;
  1008. }
  1009. err = kstrtoint(buff, 10, value);
  1010. if (err)
  1011. return err;
  1012. *status = SENSOR_STATUS_ACCURACY_MEDIUM;
  1013. return 0;
  1014. }
  1015. static int bmp_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
  1016. {
  1017. struct bmp_i2c_data *obj;
  1018. #ifdef CONFIG_ID_TEMPERATURE
  1019. struct hwmsen_object sobj_t;
  1020. #endif
  1021. struct baro_control_path ctl = { 0 };
  1022. struct baro_data_path data = { 0 };
  1023. int err = 0;
  1024. BAR_FUN();
  1025. obj = kzalloc(sizeof(*obj), GFP_KERNEL);
  1026. if (!obj) {
  1027. err = -ENOMEM;
  1028. goto exit;
  1029. }
  1030. obj->hw = get_cust_baro_hw();
  1031. obj_i2c_data = obj;
  1032. obj->client = client;
  1033. i2c_set_clientdata(client, obj);
  1034. atomic_set(&obj->trace, 0);
  1035. atomic_set(&obj->suspend, 0);
  1036. obj->power_mode = BMP_UNDEFINED_POWERMODE;
  1037. obj->oversampling_p = BMP_UNDEFINED_OVERSAMPLING;
  1038. obj->last_temp_measurement = 0;
  1039. obj->temp_measurement_period = 1 * HZ; /* temperature update period:1s */
  1040. #ifdef CONFIG_BMP_LOWPASS
  1041. if (obj->hw->firlen > C_MAX_FIR_LENGTH)
  1042. atomic_set(&obj->firlen, C_MAX_FIR_LENGTH);
  1043. else
  1044. atomic_set(&obj->firlen, obj->hw->firlen);
  1045. if (atomic_read(&obj->firlen) > 0)
  1046. atomic_set(&obj->fir_en, 1);
  1047. #endif
  1048. err = bmp_init_client(client);
  1049. if (err)
  1050. goto exit_init_client_failed;
  1051. err = misc_register(&bmp_device);
  1052. if (err) {
  1053. BAR_ERR("misc device register failed, err = %d\n", err);
  1054. goto exit_misc_device_register_failed;
  1055. }
  1056. ctl.is_use_common_factory = false;
  1057. err = bmp_create_attr(&(bmp180_init_info.platform_diver_addr->driver));
  1058. if (err) {
  1059. BAR_ERR("create attribute failed, err = %d\n", err);
  1060. goto exit_create_attr_failed;
  1061. }
  1062. ctl.open_report_data = bmp180_open_report_data;
  1063. ctl.enable_nodata = bmp180_enable_nodata;
  1064. ctl.set_delay = bmp180_set_delay;
  1065. ctl.is_report_input_direct = false;
  1066. ctl.is_support_batch = obj->hw->is_batch_supported;
  1067. err = baro_register_control_path(&ctl);
  1068. if (err) {
  1069. BAR_ERR("register baro control path err\n");
  1070. goto exit_hwmsen_attach_pressure_failed;
  1071. }
  1072. data.get_data = bmp180_get_data;
  1073. data.vender_div = 100;
  1074. err = baro_register_data_path(&data);
  1075. if (err) {
  1076. BAR_ERR("baro_register_data_path failed, err = %d\n", err);
  1077. goto exit_hwmsen_attach_pressure_failed;
  1078. }
  1079. err =
  1080. batch_register_support_info(ID_PRESSURE, obj->hw->is_batch_supported, data.vender_div,
  1081. 0);
  1082. if (err) {
  1083. BAR_ERR("register baro batch support err = %d\n", err);
  1084. goto exit_hwmsen_attach_pressure_failed;
  1085. }
  1086. #ifdef CONFIG_ID_TEMPERATURE
  1087. sobj_t.self = obj;
  1088. sobj_t.polling = 1;
  1089. sobj_t.sensor_operate = temperature_operate;
  1090. err = hwmsen_attach(ID_TEMPRERATURE, &sobj_t);
  1091. if (err) {
  1092. BAR_ERR("hwmsen attach failed, err = %d\n", err);
  1093. goto exit_hwmsen_attach_temperature_failed;
  1094. }
  1095. #endif /* CONFIG_ID_TEMPERATURE */
  1096. bmp180_init_flag = 0;
  1097. BAR_LOG("%s: OK\n", __func__);
  1098. return 0;
  1099. #ifdef CONFIG_ID_TEMPERATURE
  1100. exit_hwmsen_attach_temperature_failed:
  1101. hwmsen_detach(ID_TEMPRERATURE);
  1102. #endif /* CONFIG_ID_TEMPERATURE */
  1103. exit_hwmsen_attach_pressure_failed:
  1104. bmp_delete_attr(&(bmp180_init_info.platform_diver_addr->driver));
  1105. exit_create_attr_failed:
  1106. misc_deregister(&bmp_device);
  1107. exit_misc_device_register_failed:
  1108. exit_init_client_failed:
  1109. kfree(obj);
  1110. exit:
  1111. BAR_ERR("err = %d\n", err);
  1112. bmp180_init_flag = -1;
  1113. return err;
  1114. }
  1115. static int bmp_i2c_remove(struct i2c_client *client)
  1116. {
  1117. int err = 0;
  1118. err = hwmsen_detach(ID_PRESSURE);
  1119. if (err)
  1120. BAR_ERR("hwmsen_detach ID_PRESSURE failed, err = %d\n", err);
  1121. #ifdef CONFIG_ID_TEMPERATURE
  1122. err = hwmsen_detach(ID_TEMPRERATURE);
  1123. if (err)
  1124. BAR_ERR("hwmsen_detach ID_TEMPRERATURE failed, err = %d\n", err);
  1125. #endif
  1126. err = bmp_delete_attr(&(bmp180_init_info.platform_diver_addr->driver));
  1127. if (err)
  1128. BAR_ERR("bmp_delete_attr failed, err = %d\n", err);
  1129. err = misc_deregister(&bmp_device);
  1130. if (err)
  1131. BAR_ERR("misc_deregister failed, err = %d\n", err);
  1132. obj_i2c_data = NULL;
  1133. i2c_unregister_device(client);
  1134. kfree(i2c_get_clientdata(client));
  1135. return 0;
  1136. }
  1137. static struct i2c_driver bmp_i2c_driver = {
  1138. .driver = {
  1139. .owner = THIS_MODULE,
  1140. .name = BMP_DEV_NAME,
  1141. },
  1142. .probe = bmp_i2c_probe,
  1143. .remove = bmp_i2c_remove,
  1144. .detect = bmp_i2c_detect,
  1145. .suspend = bmp_suspend,
  1146. .resume = bmp_resume,
  1147. .id_table = bmp_i2c_id,
  1148. };
  1149. static int bmp180_remove(void)
  1150. {
  1151. struct baro_hw *hw = get_cust_baro_hw();
  1152. BAR_FUN();
  1153. bmp_power(hw, 0);
  1154. i2c_del_driver(&bmp_i2c_driver);
  1155. return 0;
  1156. }
  1157. static int bmp180_local_init(void)
  1158. {
  1159. struct baro_hw *hw = get_cust_baro_hw();
  1160. /* printk("fwq loccal init+++\n"); */
  1161. bmp_power(hw, 1);
  1162. if (i2c_add_driver(&bmp_i2c_driver)) {
  1163. BAR_ERR("add driver error\n");
  1164. return -1;
  1165. }
  1166. if (-1 == bmp180_init_flag)
  1167. return -1;
  1168. /* printk("fwq loccal init---\n"); */
  1169. return 0;
  1170. }
  1171. static int __init bmp_init(void)
  1172. {
  1173. struct baro_hw *hw = get_cust_baro_hw();
  1174. BAR_FUN();
  1175. i2c_register_board_info(hw->i2c_num, &bmp_i2c_info, 1);
  1176. baro_driver_add(&bmp180_init_info);
  1177. return 0;
  1178. }
  1179. static void __exit bmp_exit(void)
  1180. {
  1181. BAR_FUN();
  1182. }
  1183. module_init(bmp_init);
  1184. module_exit(bmp_exit);
  1185. MODULE_LICENSE("GPLv2");
  1186. MODULE_DESCRIPTION("BMP180 I2C Driver");
  1187. MODULE_AUTHOR("deliang.tao@bosch-sensortec.com");
  1188. MODULE_VERSION(BMP_DRIVER_VERSION);