ak09911c.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158
  1. /*
  2. * Copyright (C) 2013 Samsung Electronics. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License
  6. * version 2 as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful, but
  9. * WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. * General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program; if not, write to the Free Software
  15. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  16. * 02110-1301 USA
  17. */
  18. #include <linux/fs.h>
  19. #include <linux/uaccess.h>
  20. #include <linux/module.h>
  21. #include <linux/i2c.h>
  22. #include <linux/errno.h>
  23. #include <linux/input.h>
  24. #include <linux/workqueue.h>
  25. #include <linux/slab.h>
  26. #include <linux/delay.h>
  27. #include <linux/completion.h>
  28. #include <linux/gpio.h>
  29. #include <linux/of_gpio.h>
  30. #include <linux/regulator/consumer.h>
  31. #include "sensors_core.h"
  32. #include "ak09911c_reg.h"
  33. /* Rx buffer size. i.e ST,TMPS,H1X,H1Y,H1Z*/
  34. #define SENSOR_DATA_SIZE 9
  35. #define AK09911C_DEFAULT_DELAY 200000000LL
  36. #define AK09911C_DRDY_TIMEOUT_MS 100
  37. #define AK09911C_WIA1_VALUE 0x48
  38. #define AK09911C_WIA2_VALUE 0x05
  39. #define I2C_M_WR 0 /* for i2c Write */
  40. #define I2c_M_RD 1 /* for i2c Read */
  41. #define VENDOR_NAME "AKM"
  42. #define MODEL_NAME "AK09911C"
  43. #define MODULE_NAME "magnetic_sensor"
  44. #define AK09911C_TOP_LOWER_RIGHT 0
  45. #define AK09911C_TOP_LOWER_LEFT 1
  46. #define AK09911C_TOP_UPPER_LEFT 2
  47. #define AK09911C_TOP_UPPER_RIGHT 3
  48. #define AK09911C_BOTTOM_LOWER_RIGHT 4
  49. #define AK09911C_BOTTOM_LOWER_LEFT 5
  50. #define AK09911C_BOTTOM_UPPER_LEFT 6
  51. #define AK09911C_BOTTOM_UPPER_RIGHT 7
  52. struct ak09911c_v {
  53. union {
  54. s16 v[3];
  55. struct {
  56. s16 x;
  57. s16 y;
  58. s16 z;
  59. };
  60. };
  61. };
  62. struct ak09911c_p {
  63. struct i2c_client *client;
  64. struct input_dev *input;
  65. struct device *factory_device;
  66. struct ak09911c_v magdata;
  67. struct mutex lock;
  68. struct delayed_work work;
  69. atomic_t delay;
  70. atomic_t enable;
  71. u8 asa[3];
  72. u32 chip_pos;
  73. int m_rst_n;
  74. u64 timestamp;
  75. u64 old_timestamp;
  76. };
  77. static int ak09911c_i2c_read(struct i2c_client *client,
  78. unsigned char reg_addr, unsigned char *buf)
  79. {
  80. int ret;
  81. struct i2c_msg msg[2];
  82. msg[0].addr = client->addr;
  83. msg[0].flags = I2C_M_WR;
  84. msg[0].len = 1;
  85. msg[0].buf = &reg_addr;
  86. msg[1].addr = client->addr;
  87. msg[1].flags = I2C_M_RD;
  88. msg[1].len = 1;
  89. msg[1].buf = buf;
  90. ret = i2c_transfer(client->adapter, msg, 2);
  91. if (ret < 0) {
  92. pr_err("[SENSOR]: %s - i2c bus read error %d\n",
  93. __func__, ret);
  94. return ret;
  95. }
  96. return 0;
  97. }
  98. static int ak09911c_i2c_write(struct i2c_client *client,
  99. unsigned char reg_addr, unsigned char buf)
  100. {
  101. int ret;
  102. struct i2c_msg msg;
  103. unsigned char w_buf[2];
  104. w_buf[0] = reg_addr;
  105. w_buf[1] = buf;
  106. msg.addr = client->addr;
  107. msg.flags = I2C_M_WR;
  108. msg.len = 2;
  109. msg.buf = (char *)w_buf;
  110. ret = i2c_transfer(client->adapter, &msg, 1);
  111. if (ret < 0) {
  112. pr_err("[SENSOR]: %s - i2c bus write error %d\n",
  113. __func__, ret);
  114. return ret;
  115. }
  116. return 0;
  117. }
  118. static int ak09911c_i2c_read_block(struct i2c_client *client,
  119. unsigned char reg_addr, unsigned char *buf, unsigned char len)
  120. {
  121. #if defined(CONFIG_SEC_BERLUTI_PROJECT)
  122. int ret;
  123. struct i2c_msg msg[2];
  124. msg[0].addr = client->addr;
  125. msg[0].flags = I2C_M_WR;
  126. msg[0].len = 1;
  127. msg[0].buf = &reg_addr;
  128. msg[1].addr = client->addr;
  129. msg[1].flags = I2C_M_RD;
  130. msg[1].len = len;
  131. msg[1].buf = buf;
  132. ret = i2c_transfer(client->adapter, msg, 2);
  133. if (ret < 0) {
  134. pr_err("[SENSOR]: %s - i2c bus read error %d\n",
  135. __func__, ret);
  136. return ret;
  137. }
  138. return 0;
  139. #else
  140. int i, ret = 0;
  141. for (i = 0; i < len; i++)
  142. ret += ak09911c_i2c_read(client, reg_addr + i, &buf[i]);
  143. return ret;
  144. #endif
  145. }
  146. static int ak09911c_ecs_set_mode_power_down(struct ak09911c_p *data)
  147. {
  148. unsigned char reg;
  149. int ret;
  150. reg = AK09911C_MODE_POWERDOWN;
  151. ret = ak09911c_i2c_write(data->client, AK09911C_REG_CNTL2, reg);
  152. return ret;
  153. }
  154. static int ak09911c_ecs_set_mode(struct ak09911c_p *data, char mode)
  155. {
  156. u8 reg;
  157. int ret;
  158. switch (mode & 0x1F) {
  159. case AK09911C_MODE_SNG_MEASURE:
  160. reg = AK09911C_MODE_SNG_MEASURE;
  161. ret = ak09911c_i2c_write(data->client, AK09911C_REG_CNTL2, reg);
  162. break;
  163. case AK09911C_MODE_FUSE_ACCESS:
  164. reg = AK09911C_MODE_FUSE_ACCESS;
  165. ret = ak09911c_i2c_write(data->client, AK09911C_REG_CNTL2, reg);
  166. break;
  167. case AK09911C_MODE_POWERDOWN:
  168. reg = AK09911C_MODE_SNG_MEASURE;
  169. ret = ak09911c_ecs_set_mode_power_down(data);
  170. break;
  171. case AK09911C_MODE_SELF_TEST:
  172. reg = AK09911C_MODE_SELF_TEST;
  173. ret = ak09911c_i2c_write(data->client, AK09911C_REG_CNTL2, reg);
  174. break;
  175. default:
  176. return -EINVAL;
  177. }
  178. if (ret < 0)
  179. return ret;
  180. /* Wait at least 300us after changing mode. */
  181. udelay(100);
  182. return 0;
  183. }
  184. static int ak09911c_read_mag_xyz(struct ak09911c_p *data,
  185. struct ak09911c_v *mag)
  186. {
  187. u8 temp[SENSOR_DATA_SIZE] = {0, };
  188. int ret = 0, retries = 0;
  189. mutex_lock(&data->lock);
  190. ret = ak09911c_ecs_set_mode(data, AK09911C_MODE_SNG_MEASURE);
  191. if (ret < 0)
  192. goto exit_i2c_read_err;
  193. again:
  194. ret = ak09911c_i2c_read(data->client, AK09911C_REG_ST1, &temp[0]);
  195. if (ret < 0)
  196. goto exit_i2c_read_err;
  197. /* Check ST bit */
  198. if (!(temp[0] & 0x01)) {
  199. if ((retries++ < 5) && (temp[0] == 0)) {
  200. #if !defined(CONFIG_SEC_BERLUTI_PROJECT)
  201. mdelay(2);
  202. #endif
  203. goto again;
  204. } else {
  205. ret = -1;
  206. goto exit_i2c_read_fail;
  207. }
  208. }
  209. ret = ak09911c_i2c_read_block(data->client, AK09911C_REG_ST1 + 1,
  210. &temp[1], SENSOR_DATA_SIZE - 1);
  211. if (ret < 0)
  212. goto exit_i2c_read_err;
  213. #if 0
  214. /* Check ST2 bit */
  215. if ((temp[8] & 0x08)) {
  216. ret = -EAGAIN;
  217. goto exit_i2c_read_fail;
  218. }
  219. #endif
  220. mag->x = temp[1] | (temp[2] << 8);
  221. mag->y = temp[3] | (temp[4] << 8);
  222. mag->z = temp[5] | (temp[6] << 8);
  223. remap_sensor_data(mag->v, data->chip_pos);
  224. goto exit;
  225. exit_i2c_read_fail:
  226. exit_i2c_read_err:
  227. pr_err("[SENSOR]: %s - ST1 = %u, ST2 = %u\n",
  228. __func__, temp[0], temp[8]);
  229. exit:
  230. mutex_unlock(&data->lock);
  231. return ret;
  232. }
  233. static void ak09911c_work_func(struct work_struct *work)
  234. {
  235. int ret;
  236. struct ak09911c_v mag;
  237. struct timespec ts;
  238. int time_hi, time_lo;
  239. struct ak09911c_p *data = container_of((struct delayed_work *)work,
  240. struct ak09911c_p, work);
  241. unsigned long delay = nsecs_to_jiffies(atomic_read(&data->delay));
  242. unsigned long pdelay = atomic_read(&data->delay);
  243. get_monotonic_boottime(&ts);
  244. data->timestamp = ts.tv_sec * 1000000000ULL + ts.tv_nsec;
  245. ret = ak09911c_read_mag_xyz(data, &mag);
  246. if (ret >= 0) {
  247. if (data->old_timestamp != 0 &&
  248. ((data->timestamp - data->old_timestamp)*10 > (pdelay) * 18)) {
  249. u64 shift_timestamp = pdelay >> 1;
  250. u64 timestamp = 0ULL;
  251. for (timestamp = data->old_timestamp + pdelay; timestamp < data->timestamp - shift_timestamp; timestamp+=pdelay){
  252. time_hi = (int)((timestamp & TIME_HI_MASK) >> TIME_HI_SHIFT);
  253. time_lo = (int)(timestamp & TIME_LO_MASK);
  254. input_report_rel(data->input, REL_X, mag.x);
  255. input_report_rel(data->input, REL_Y, mag.y);
  256. input_report_rel(data->input, REL_Z, mag.z);
  257. input_report_rel(data->input, REL_RX, time_hi);
  258. input_report_rel(data->input, REL_RY, time_lo);
  259. input_sync(data->input);
  260. data->magdata = mag;
  261. }
  262. }
  263. time_hi = (int)((data->timestamp & TIME_HI_MASK) >> TIME_HI_SHIFT);
  264. time_lo = (int)(data->timestamp & TIME_LO_MASK);
  265. input_report_rel(data->input, REL_X, mag.x);
  266. input_report_rel(data->input, REL_Y, mag.y);
  267. input_report_rel(data->input, REL_Z, mag.z);
  268. input_report_rel(data->input, REL_RX, time_hi);
  269. input_report_rel(data->input, REL_RY, time_lo);
  270. input_sync(data->input);
  271. data->magdata = mag;
  272. data->old_timestamp = data->timestamp;
  273. }
  274. schedule_delayed_work(&data->work, delay);
  275. }
  276. static void ak09911c_set_enable(struct ak09911c_p *data, int enable)
  277. {
  278. int pre_enable = atomic_read(&data->enable);
  279. if (enable) {
  280. if (pre_enable == 0) {
  281. data->old_timestamp = 0LL;
  282. ak09911c_ecs_set_mode(data, AK09911C_MODE_SNG_MEASURE);
  283. schedule_delayed_work(&data->work,
  284. nsecs_to_jiffies(atomic_read(&data->delay)));
  285. atomic_set(&data->enable, 1);
  286. }
  287. } else {
  288. if (pre_enable == 1) {
  289. ak09911c_ecs_set_mode(data, AK09911C_MODE_POWERDOWN);
  290. cancel_delayed_work_sync(&data->work);
  291. atomic_set(&data->enable, 0);
  292. }
  293. }
  294. }
  295. static ssize_t ak09911c_enable_show(struct device *dev,
  296. struct device_attribute *attr, char *buf)
  297. {
  298. struct ak09911c_p *data = dev_get_drvdata(dev);
  299. return snprintf(buf, PAGE_SIZE, "%d\n", atomic_read(&data->enable));
  300. }
  301. static ssize_t ak09911c_enable_store(struct device *dev,
  302. struct device_attribute *attr, const char *buf, size_t size)
  303. {
  304. u8 enable;
  305. int ret;
  306. struct ak09911c_p *data = dev_get_drvdata(dev);
  307. ret = kstrtou8(buf, 2, &enable);
  308. if (ret) {
  309. pr_err("[SENSOR]: %s - Invalid Argument\n", __func__);
  310. return ret;
  311. }
  312. pr_info("[SENSOR]: %s - new_value = %u\n", __func__, enable);
  313. if ((enable == 0) || (enable == 1))
  314. ak09911c_set_enable(data, (int)enable);
  315. return size;
  316. }
  317. static ssize_t ak09911c_delay_show(struct device *dev,
  318. struct device_attribute *attr, char *buf)
  319. {
  320. struct ak09911c_p *data = dev_get_drvdata(dev);
  321. return snprintf(buf, PAGE_SIZE, "%d\n", atomic_read(&data->delay));
  322. }
  323. static ssize_t ak09911c_delay_store(struct device *dev,
  324. struct device_attribute *attr,
  325. const char *buf, size_t size)
  326. {
  327. int ret;
  328. int64_t delay;
  329. struct ak09911c_p *data = dev_get_drvdata(dev);
  330. ret = kstrtoll(buf, 10, &delay);
  331. if (ret) {
  332. pr_err("[SENSOR]: %s - Invalid Argument\n", __func__);
  333. return ret;
  334. }
  335. atomic_set(&data->delay, (int64_t)delay);
  336. pr_info("[SENSOR]: %s - poll_delay = %lld\n", __func__, delay);
  337. return size;
  338. }
  339. static DEVICE_ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  340. ak09911c_delay_show, ak09911c_delay_store);
  341. static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR | S_IWGRP,
  342. ak09911c_enable_show, ak09911c_enable_store);
  343. static struct attribute *ak09911c_attributes[] = {
  344. &dev_attr_poll_delay.attr,
  345. &dev_attr_enable.attr,
  346. NULL
  347. };
  348. static struct attribute_group ak09911c_attribute_group = {
  349. .attrs = ak09911c_attributes
  350. };
  351. static int ak09911c_selftest(struct ak09911c_p *data, int *dac_ret, int *sf)
  352. {
  353. u8 temp[6], reg;
  354. s16 x, y, z;
  355. int retry_count = 0;
  356. int ready_count = 0;
  357. int ret;
  358. retry:
  359. mutex_lock(&data->lock);
  360. /* power down */
  361. reg = AK09911C_MODE_POWERDOWN;
  362. *dac_ret = ak09911c_i2c_write(data->client, AK09911C_REG_CNTL2, reg);
  363. udelay(100);
  364. *dac_ret += ak09911c_i2c_read(data->client, AK09911C_REG_CNTL2, &reg);
  365. /* read device info */
  366. ak09911c_i2c_read_block(data->client, AK09911C_REG_WIA1, temp, 2);
  367. pr_info("[SENSOR]: %s - device id = 0x%x, info = 0x%x\n",
  368. __func__, temp[0], temp[1]);
  369. /* start self test */
  370. reg = AK09911C_MODE_SELF_TEST;
  371. ak09911c_i2c_write(data->client, AK09911C_REG_CNTL2, reg);
  372. /* wait for data ready */
  373. while (ready_count < 10) {
  374. msleep(20);
  375. ret = ak09911c_i2c_read(data->client, AK09911C_REG_ST1, &reg);
  376. if ((reg == 1) && (ret == 0))
  377. break;
  378. ready_count++;
  379. }
  380. ak09911c_i2c_read_block(data->client, AK09911C_REG_HXL,
  381. temp, sizeof(temp));
  382. mutex_unlock(&data->lock);
  383. x = temp[0] | (temp[1] << 8);
  384. y = temp[2] | (temp[3] << 8);
  385. z = temp[4] | (temp[5] << 8);
  386. /* Hadj = (H*(Asa+128))/128 */
  387. x = (x * (data->asa[0] + 128)) >> 7;
  388. y = (y * (data->asa[1] + 128)) >> 7;
  389. z = (z * (data->asa[2] + 128)) >> 7;
  390. pr_info("[SENSOR]: %s - self test x = %d, y = %d, z = %d\n",
  391. __func__, x, y, z);
  392. if ((x >= -30) && (x <= 30))
  393. pr_info("[SENSOR]: %s - x passed self test, -30<=x<=30\n",
  394. __func__);
  395. else
  396. pr_info("[SENSOR]: %s - x failed self test, -30<=x<=30\n",
  397. __func__);
  398. if ((y >= -30) && (y <= 30))
  399. pr_info("[SENSOR]: %s - y passed self test, -30<=y<=30\n",
  400. __func__);
  401. else
  402. pr_info("[SENSOR]: %s - y failed self test, -30<=y<=30\n",
  403. __func__);
  404. if ((z >= -400) && (z <= -50))
  405. pr_info("[SENSOR]: %s - z passed self test, -400<=z<=-50\n",
  406. __func__);
  407. else
  408. pr_info("[SENSOR]: %s - z failed self test, -400<=z<=-50\n",
  409. __func__);
  410. sf[0] = x;
  411. sf[1] = y;
  412. sf[2] = z;
  413. if (((x >= -30) && (x <= 30)) &&
  414. ((y >= -30) && (y <= 30)) &&
  415. ((z >= -400) && (z <= -50))) {
  416. pr_info("%s, Selftest is successful.\n", __func__);
  417. return 0;
  418. } else {
  419. if (retry_count < 5) {
  420. retry_count++;
  421. pr_warn("############################################");
  422. pr_warn("%s, retry_count=%d\n", __func__, retry_count);
  423. pr_warn("############################################");
  424. goto retry;
  425. } else {
  426. pr_err("[SENSOR]: %s - Selftest is failed.\n",
  427. __func__);
  428. return -1;
  429. }
  430. }
  431. }
  432. static ssize_t ak09911c_vendor_show(struct device *dev,
  433. struct device_attribute *attr, char *buf)
  434. {
  435. return snprintf(buf, PAGE_SIZE, "%s\n", VENDOR_NAME);
  436. }
  437. static ssize_t ak09911c_name_show(struct device *dev,
  438. struct device_attribute *attr, char *buf)
  439. {
  440. return snprintf(buf, PAGE_SIZE, "%s\n", MODEL_NAME);
  441. }
  442. static ssize_t ak09911c_get_asa(struct device *dev,
  443. struct device_attribute *attr, char *buf)
  444. {
  445. struct ak09911c_p *data = dev_get_drvdata(dev);
  446. return snprintf(buf, PAGE_SIZE, "%u,%u,%u\n",
  447. data->asa[0], data->asa[1], data->asa[2]);
  448. }
  449. static ssize_t ak09911c_get_selftest(struct device *dev,
  450. struct device_attribute *attr, char *buf)
  451. {
  452. int status, dac_ret = -1, adc_ret = -1;
  453. int sf_ret, sf[3] = {0,}, retries;
  454. struct ak09911c_v mag;
  455. struct ak09911c_p *data = dev_get_drvdata(dev);
  456. /* STATUS */
  457. if ((data->asa[0] == 0) | (data->asa[0] == 0xff)
  458. | (data->asa[1] == 0) | (data->asa[1] == 0xff)
  459. | (data->asa[2] == 0) | (data->asa[2] == 0xff))
  460. status = -1;
  461. else
  462. status = 0;
  463. if (atomic_read(&data->enable) == 1) {
  464. ak09911c_ecs_set_mode(data, AK09911C_MODE_POWERDOWN);
  465. cancel_delayed_work_sync(&data->work);
  466. }
  467. sf_ret = ak09911c_selftest(data, &dac_ret, sf);
  468. for (retries = 0; retries < 5; retries++) {
  469. if (ak09911c_read_mag_xyz(data, &mag) == 0) {
  470. if ((mag.x < 1600) && (mag.x > -1600)
  471. && (mag.y < 1600) && (mag.y > -1600)
  472. && (mag.z < 1600) && (mag.z > -1600))
  473. adc_ret = 0;
  474. else
  475. pr_err("[SENSOR]: %s adc specout %d, %d, %d\n",
  476. __func__, mag.x, mag.y, mag.z);
  477. break;
  478. }
  479. msleep(20);
  480. pr_err("[SENSOR]: %s - adc retries %d", __func__, retries);
  481. }
  482. if (atomic_read(&data->enable) == 1) {
  483. ak09911c_ecs_set_mode(data, AK09911C_MODE_SNG_MEASURE);
  484. schedule_delayed_work(&data->work,
  485. nsecs_to_jiffies(atomic_read(&data->delay)));
  486. }
  487. return snprintf(buf, PAGE_SIZE, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
  488. status, sf_ret, sf[0], sf[1], sf[2], dac_ret,
  489. adc_ret, mag.x, mag.y, mag.z);
  490. }
  491. static ssize_t ak09911c_check_registers(struct device *dev,
  492. struct device_attribute *attr, char *buf)
  493. {
  494. u8 temp[13], reg;
  495. struct ak09911c_p *data = dev_get_drvdata(dev);
  496. mutex_lock(&data->lock);
  497. /* power down */
  498. reg = AK09911C_MODE_POWERDOWN;
  499. ak09911c_i2c_write(data->client, AK09911C_REG_CNTL2, reg);
  500. /* get the value */
  501. ak09911c_i2c_read_block(data->client, AK09911C_REG_WIA1, temp, 13);
  502. mutex_unlock(&data->lock);
  503. return snprintf(buf, PAGE_SIZE,
  504. "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
  505. temp[0], temp[1], temp[2], temp[3], temp[4], temp[5],
  506. temp[6], temp[7], temp[8], temp[9], temp[10], temp[11],
  507. temp[12]);
  508. }
  509. static ssize_t ak09911c_check_cntl(struct device *dev,
  510. struct device_attribute *attr, char *buf)
  511. {
  512. u8 reg;
  513. int ret = 0;
  514. struct ak09911c_p *data = dev_get_drvdata(dev);
  515. mutex_lock(&data->lock);
  516. /* power down */
  517. reg = AK09911C_MODE_POWERDOWN;
  518. ret = ak09911c_i2c_write(data->client, AK09911C_REG_CNTL2, reg);
  519. udelay(100);
  520. ret += ak09911c_i2c_read(data->client, AK09911C_REG_CNTL2, &reg);
  521. mutex_unlock(&data->lock);
  522. return snprintf(buf, PAGE_SIZE, "%s\n",
  523. (((reg == AK09911C_MODE_POWERDOWN) &&
  524. (ret == 0)) ? "OK" : "NG"));
  525. }
  526. static ssize_t ak09911c_get_status(struct device *dev,
  527. struct device_attribute *attr, char *buf)
  528. {
  529. bool success;
  530. struct ak09911c_p *data = dev_get_drvdata(dev);
  531. if ((data->asa[0] == 0) | (data->asa[0] == 0xff)
  532. | (data->asa[1] == 0) | (data->asa[1] == 0xff)
  533. | (data->asa[2] == 0) | (data->asa[2] == 0xff))
  534. success = false;
  535. else
  536. success = true;
  537. return snprintf(buf, PAGE_SIZE, "%s\n", (success ? "OK" : "NG"));
  538. }
  539. static ssize_t ak09911c_adc(struct device *dev,
  540. struct device_attribute *attr, char *buf)
  541. {
  542. bool success = false;
  543. int ret;
  544. struct ak09911c_p *data = dev_get_drvdata(dev);
  545. struct ak09911c_v mag = data->magdata;
  546. if (atomic_read(&data->enable) == 1) {
  547. success = true;
  548. msleep(20);
  549. goto exit;
  550. }
  551. ret = ak09911c_read_mag_xyz(data, &mag);
  552. if (ret < 0)
  553. success = false;
  554. else
  555. success = true;
  556. data->magdata = mag;
  557. exit:
  558. return snprintf(buf, PAGE_SIZE, "%s,%d,%d,%d\n",
  559. (success ? "OK" : "NG"), mag.x, mag.y, mag.z);
  560. }
  561. static ssize_t ak09911c_raw_data_read(struct device *dev,
  562. struct device_attribute *attr, char *buf)
  563. {
  564. struct ak09911c_p *data = dev_get_drvdata(dev);
  565. struct ak09911c_v mag = data->magdata;
  566. if (atomic_read(&data->enable) == 1) {
  567. msleep(20);
  568. goto exit;
  569. }
  570. ak09911c_read_mag_xyz(data, &mag);
  571. data->magdata = mag;
  572. exit:
  573. return snprintf(buf, PAGE_SIZE, "%d,%d,%d\n", mag.x, mag.y, mag.z);
  574. }
  575. static DEVICE_ATTR(name, S_IRUGO, ak09911c_name_show, NULL);
  576. static DEVICE_ATTR(vendor, S_IRUGO, ak09911c_vendor_show, NULL);
  577. static DEVICE_ATTR(raw_data, S_IRUGO, ak09911c_raw_data_read, NULL);
  578. static DEVICE_ATTR(adc, S_IRUGO, ak09911c_adc, NULL);
  579. static DEVICE_ATTR(dac, S_IRUGO, ak09911c_check_cntl, NULL);
  580. static DEVICE_ATTR(chk_registers, S_IRUGO, ak09911c_check_registers, NULL);
  581. static DEVICE_ATTR(selftest, S_IRUGO, ak09911c_get_selftest, NULL);
  582. static DEVICE_ATTR(asa, S_IRUGO, ak09911c_get_asa, NULL);
  583. static DEVICE_ATTR(status, S_IRUGO, ak09911c_get_status, NULL);
  584. static struct device_attribute *sensor_attrs[] = {
  585. &dev_attr_name,
  586. &dev_attr_vendor,
  587. &dev_attr_raw_data,
  588. &dev_attr_adc,
  589. &dev_attr_dac,
  590. &dev_attr_chk_registers,
  591. &dev_attr_selftest,
  592. &dev_attr_asa,
  593. &dev_attr_status,
  594. NULL,
  595. };
  596. static int ak09911c_read_fuserom(struct ak09911c_p *data)
  597. {
  598. unsigned char reg;
  599. int ret;
  600. /* put into fuse access mode to read asa data */
  601. reg = AK09911C_MODE_FUSE_ACCESS;
  602. ret = ak09911c_i2c_write(data->client, AK09911C_REG_CNTL2, reg);
  603. if (ret < 0) {
  604. pr_err("[SENSOR]: %s - unable to enter fuse rom mode\n",
  605. __func__);
  606. goto exit_default_value;
  607. }
  608. ret = ak09911c_i2c_read_block(data->client, AK09911C_FUSE_ASAX,
  609. data->asa, sizeof(data->asa));
  610. if (ret < 0) {
  611. pr_err("[SENSOR]: %s - unable to load factory sensitivity "\
  612. "adjust values\n", __func__);
  613. goto exit_default_value;
  614. } else
  615. pr_info("[SENSOR]: %s - asa_x = %u, asa_y = %u, asa_z = %u\n",
  616. __func__, data->asa[0], data->asa[1], data->asa[2]);
  617. reg = AK09911C_MODE_POWERDOWN;
  618. ret = ak09911c_i2c_write(data->client, AK09911C_REG_CNTL2, reg);
  619. if (ret < 0)
  620. pr_err("[SENSOR] Error in setting power down mode\n");
  621. return 0;
  622. exit_default_value:
  623. data->asa[0] = 0;
  624. data->asa[1] = 0;
  625. data->asa[2] = 0;
  626. return ret;
  627. }
  628. static int ak09911c_check_device(struct ak09911c_p *data)
  629. {
  630. unsigned char reg, buf[2];
  631. int ret;
  632. ret = ak09911c_i2c_read_block(data->client, AK09911C_REG_WIA1, buf, 2);
  633. if (ret < 0) {
  634. pr_err("[SENSOR]: %s - unable to read AK09911C_REG_WIA1\n",
  635. __func__);
  636. return ret;
  637. }
  638. reg = AK09911C_MODE_POWERDOWN;
  639. ret = ak09911c_i2c_write(data->client, AK09911C_REG_CNTL2, reg);
  640. if (ret < 0) {
  641. pr_err("[SENSOR]: %s - Error in setting power down mode\n",
  642. __func__);
  643. return ret;
  644. }
  645. if ((buf[0] != AK09911C_WIA1_VALUE)
  646. || (buf[1] != AK09911C_WIA2_VALUE)) {
  647. pr_err("[SENSOR]: %s - The device is not AKM Compass. %u, %u",
  648. __func__, buf[0], buf[1]);
  649. return -ENXIO;
  650. }
  651. return 0;
  652. }
  653. static int ak09911c_setup_pin(struct ak09911c_p *data)
  654. {
  655. int ret;
  656. ret = gpio_request(data->m_rst_n, "M_RST_N");
  657. if (ret < 0) {
  658. pr_err("[SENSOR] %s - gpio %d request failed (%d)\n",
  659. __func__, data->m_rst_n, ret);
  660. goto exit;
  661. }
  662. ret = gpio_direction_output(data->m_rst_n, 1);
  663. if (ret < 0) {
  664. pr_err("[SENSOR]: %s - failed to set gpio %d as input (%d)\n",
  665. __func__, data->m_rst_n, ret);
  666. goto exit_reset_gpio;
  667. }
  668. gpio_set_value(data->m_rst_n, 0);
  669. udelay(10);
  670. gpio_set_value(data->m_rst_n, 1);
  671. udelay(100);
  672. goto exit;
  673. exit_reset_gpio:
  674. gpio_free(data->m_rst_n);
  675. exit:
  676. return ret;
  677. }
  678. static int ak09911c_input_init(struct ak09911c_p *data)
  679. {
  680. int ret = 0;
  681. struct input_dev *dev;
  682. dev = input_allocate_device();
  683. if (!dev)
  684. return -ENOMEM;
  685. dev->name = MODULE_NAME;
  686. dev->id.bustype = BUS_I2C;
  687. input_set_capability(dev, EV_REL, REL_X);
  688. input_set_capability(dev, EV_REL, REL_Y);
  689. input_set_capability(dev, EV_REL, REL_Z);
  690. input_set_capability(dev, EV_REL, REL_RX); /* time_hi */
  691. input_set_capability(dev, EV_REL, REL_RY); /* time_lo */
  692. input_set_drvdata(dev, data);
  693. ret = input_register_device(dev);
  694. if (ret < 0) {
  695. input_free_device(dev);
  696. return ret;
  697. }
  698. ret = sensors_create_symlink(&dev->dev.kobj, dev->name);
  699. if (ret < 0) {
  700. input_unregister_device(dev);
  701. return ret;
  702. }
  703. /* sysfs node creation */
  704. ret = sysfs_create_group(&dev->dev.kobj, &ak09911c_attribute_group);
  705. if (ret < 0) {
  706. sensors_remove_symlink(&data->input->dev.kobj,
  707. data->input->name);
  708. input_unregister_device(dev);
  709. return ret;
  710. }
  711. data->input = dev;
  712. return 0;
  713. }
  714. #if defined(CONFIG_MACH_FRESCONEOLTE_CTC)
  715. static void ak09911c_power_enable(int en)
  716. {
  717. int rc;
  718. static struct regulator* ldo15;
  719. static struct regulator* ldo19;
  720. static struct regulator* lvs1;
  721. printk(KERN_ERR "%s %s\n", __func__, (en) ? "on" : "off");
  722. if(!ldo15){
  723. ldo15 = regulator_get(NULL,"8226_l15");
  724. rc = regulator_set_voltage(ldo15,2800000,2800000);
  725. pr_info("[TMP] %s, %d\n", __func__, __LINE__);
  726. if (rc){
  727. printk(KERN_ERR "%s: ak09911c set_level failed (%d)\n",__func__, rc);
  728. }
  729. }
  730. if(!ldo19){
  731. ldo19 = regulator_get(NULL,"8226_l19");
  732. rc = regulator_set_voltage(ldo19,2850000,2850000);
  733. pr_info("[TMP] %s, %d\n", __func__, __LINE__);
  734. if (rc){
  735. printk(KERN_ERR "%s: ak09911c set_level failed (%d)\n",__func__, rc);
  736. }
  737. }
  738. if(!lvs1){
  739. lvs1 = regulator_get(NULL,"8226_lvs1");
  740. rc = regulator_set_voltage(ldo15,1800000,1800000);
  741. pr_info("[TMP] %s, %d\n", __func__, __LINE__);
  742. if (rc){
  743. printk(KERN_ERR "%s: ak09911c set_level failed (%d)\n",__func__, rc);
  744. }
  745. }
  746. if(en){
  747. rc = regulator_enable(ldo15);
  748. if (rc){
  749. printk(KERN_ERR "%s: ak09911c enable failed (%d)\n",__func__, rc);
  750. }
  751. rc = regulator_enable(ldo19);
  752. if (rc){
  753. printk(KERN_ERR "%s: ak09911c enable failed (%d)\n",__func__, rc);
  754. }
  755. rc = regulator_enable(lvs1);
  756. if (rc){
  757. printk(KERN_ERR "%s: ak09911c enable failed (%d)\n",__func__, rc);
  758. }
  759. }
  760. else{
  761. rc = regulator_disable(ldo15);
  762. if (rc){
  763. printk(KERN_ERR "%s: ak09911c disable failed (%d)\n",__func__, rc);
  764. }
  765. }
  766. return;
  767. }
  768. #elif defined(CONFIG_SEC_BERLUTI_PROJECT) || defined(CONFIG_MACH_CHAGALL_KDI)
  769. static void ak09911c_power_enable(struct device *dev, bool onoff)
  770. {
  771. struct regulator *ak09911c_vcc, *ak09911c_lvs1;
  772. ak09911c_vcc = devm_regulator_get(dev, "ak09911c-i2c-vcc");
  773. if (IS_ERR(ak09911c_vcc)) {
  774. pr_err("%s: cannot get ak09911c_vcc\n", __func__);
  775. return;
  776. }
  777. ak09911c_lvs1 = devm_regulator_get(dev, "ak09911c-i2c-lvs1");
  778. if (IS_ERR(ak09911c_lvs1)) {
  779. pr_err("%s: cannot get ak09911c_lvs1\n", __func__);
  780. devm_regulator_put(ak09911c_vcc);
  781. return;
  782. }
  783. if (onoff) {
  784. regulator_enable(ak09911c_vcc);
  785. regulator_enable(ak09911c_lvs1);
  786. } else {
  787. regulator_disable(ak09911c_lvs1);
  788. regulator_disable(ak09911c_vcc);
  789. }
  790. devm_regulator_put(ak09911c_vcc);
  791. devm_regulator_put(ak09911c_lvs1);
  792. return;
  793. }
  794. #endif
  795. static int ak09911c_parse_dt(struct ak09911c_p *data, struct device *dev)
  796. {
  797. struct device_node *dNode = dev->of_node;
  798. enum of_gpio_flags flags;
  799. if (dNode == NULL)
  800. return -ENODEV;
  801. data->m_rst_n = of_get_named_gpio_flags(dNode,
  802. "ak09911c-i2c,m_rst_n-gpio", 0, &flags);
  803. if (data->m_rst_n < 0) {
  804. pr_err("[SENSOR]: %s - m_rst_n error\n", __func__);
  805. return -ENODEV;
  806. }
  807. if (of_property_read_u32(dNode,
  808. "ak09911c-i2c,chip_pos", &data->chip_pos) < 0)
  809. #if defined(CONFIG_MACH_FRESCONEOLTE_CTC)
  810. data->chip_pos = AK09911C_TOP_UPPER_RIGHT;
  811. #else
  812. data->chip_pos = AK09911C_TOP_LOWER_RIGHT;
  813. #endif
  814. return 0;
  815. }
  816. static int ak09911c_probe(struct i2c_client *client,
  817. const struct i2c_device_id *id)
  818. {
  819. int ret = -ENODEV;
  820. struct ak09911c_p *data = NULL;
  821. pr_info("[SENSOR]: %s - Probe Start!\n", __func__);
  822. #if defined(CONFIG_MACH_FRESCONEOLTE_CTC)
  823. ak09911c_power_enable(1);
  824. mdelay(10);
  825. #elif defined(CONFIG_SEC_BERLUTI_PROJECT) || defined(CONFIG_MACH_CHAGALL_KDI)
  826. ak09911c_power_enable(&client->dev, 1);
  827. #endif
  828. #if defined(CONFIG_MACH_CHAGALL_KDI)
  829. mdelay(10);
  830. #endif
  831. if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
  832. pr_err("[SENSOR]: %s - i2c_check_functionality error\n",
  833. __func__);
  834. goto exit;
  835. }
  836. data = kzalloc(sizeof(struct ak09911c_p), GFP_KERNEL);
  837. if (data == NULL) {
  838. pr_err("[SENSOR]: %s - kzalloc error\n", __func__);
  839. ret = -ENOMEM;
  840. goto exit_kzalloc;
  841. }
  842. ret = ak09911c_parse_dt(data, &client->dev);
  843. if (ret < 0) {
  844. pr_err("[SENSOR]: %s - of_node error\n", __func__);
  845. ret = -ENODEV;
  846. goto exit_of_node;
  847. }
  848. ret = ak09911c_setup_pin(data);
  849. if (ret) {
  850. pr_err("[SENSOR]: %s - could not setup pin\n", __func__);
  851. goto exit_setup_pin;
  852. }
  853. i2c_set_clientdata(client, data);
  854. data->client = client;
  855. ret = ak09911c_check_device(data);
  856. if (ret < 0) {
  857. pr_err("[SENSOR]: %s - ak09911c_check_device fail"\
  858. "(err=%d)\n", __func__, ret);
  859. goto exit_set_mode_check_device;
  860. }
  861. /* input device init */
  862. ret = ak09911c_input_init(data);
  863. if (ret < 0)
  864. goto exit_input_init;
  865. sensors_register(data->factory_device, data, sensor_attrs, MODULE_NAME);
  866. /* workqueue init */
  867. INIT_DELAYED_WORK(&data->work, ak09911c_work_func);
  868. mutex_init(&data->lock);
  869. atomic_set(&data->delay, AK09911C_DEFAULT_DELAY);
  870. atomic_set(&data->enable, 0);
  871. ak09911c_read_fuserom(data);
  872. pr_info("[SENSOR]: %s - Probe done!(chip pos : %d)\n",
  873. __func__, data->chip_pos);
  874. return 0;
  875. exit_input_init:
  876. exit_set_mode_check_device:
  877. gpio_free(data->m_rst_n);
  878. exit_setup_pin:
  879. exit_of_node:
  880. kfree(data);
  881. exit_kzalloc:
  882. exit:
  883. pr_err("[SENSOR]: %s - Probe fail!\n", __func__);
  884. return ret;
  885. }
  886. static void ak09911c_shutdown(struct i2c_client *client)
  887. {
  888. struct ak09911c_p *data =
  889. (struct ak09911c_p *)i2c_get_clientdata(client);
  890. pr_info("[SENSOR]: %s\n", __func__);
  891. if (atomic_read(&data->enable) == 1) {
  892. ak09911c_ecs_set_mode(data, AK09911C_MODE_POWERDOWN);
  893. cancel_delayed_work_sync(&data->work);
  894. }
  895. }
  896. static int __devexit ak09911c_remove(struct i2c_client *client)
  897. {
  898. struct ak09911c_p *data =
  899. (struct ak09911c_p *)i2c_get_clientdata(client);
  900. if (atomic_read(&data->enable) == 1)
  901. ak09911c_set_enable(data, 0);
  902. gpio_free(data->m_rst_n);
  903. mutex_destroy(&data->lock);
  904. sensors_unregister(data->factory_device, sensor_attrs);
  905. sensors_remove_symlink(&data->input->dev.kobj, data->input->name);
  906. sysfs_remove_group(&data->input->dev.kobj, &ak09911c_attribute_group);
  907. input_unregister_device(data->input);
  908. kfree(data);
  909. return 0;
  910. }
  911. static int ak09911c_suspend(struct device *dev)
  912. {
  913. struct ak09911c_p *data = dev_get_drvdata(dev);
  914. if (atomic_read(&data->enable) == 1) {
  915. ak09911c_ecs_set_mode(data, AK09911C_MODE_POWERDOWN);
  916. cancel_delayed_work_sync(&data->work);
  917. }
  918. return 0;
  919. }
  920. static int ak09911c_resume(struct device *dev)
  921. {
  922. struct ak09911c_p *data = dev_get_drvdata(dev);
  923. if (atomic_read(&data->enable) == 1) {
  924. ak09911c_ecs_set_mode(data, AK09911C_MODE_SNG_MEASURE);
  925. schedule_delayed_work(&data->work,
  926. nsecs_to_jiffies(atomic_read(&data->delay)));
  927. }
  928. return 0;
  929. }
  930. static struct of_device_id ak09911c_match_table[] = {
  931. { .compatible = "ak09911c-i2c",},
  932. {},
  933. };
  934. static const struct i2c_device_id ak09911c_id[] = {
  935. { "ak09911c_match_table", 0 },
  936. { }
  937. };
  938. static const struct dev_pm_ops ak09911c_pm_ops = {
  939. .suspend = ak09911c_suspend,
  940. .resume = ak09911c_resume
  941. };
  942. static struct i2c_driver ak09911c_driver = {
  943. .driver = {
  944. .name = MODEL_NAME,
  945. .owner = THIS_MODULE,
  946. .of_match_table = ak09911c_match_table,
  947. .pm = &ak09911c_pm_ops
  948. },
  949. .probe = ak09911c_probe,
  950. .shutdown = ak09911c_shutdown,
  951. .remove = __devexit_p(ak09911c_remove),
  952. .id_table = ak09911c_id,
  953. };
  954. static int __init ak09911c_init(void)
  955. {
  956. printk(KERN_INFO" ak0911c_init \n");
  957. return i2c_add_driver(&ak09911c_driver);
  958. }
  959. static void __exit ak09911c_exit(void)
  960. {
  961. i2c_del_driver(&ak09911c_driver);
  962. }
  963. module_init(ak09911c_init);
  964. module_exit(ak09911c_exit);
  965. MODULE_DESCRIPTION("AK09911C compass driver");
  966. MODULE_AUTHOR("Samsung Electronics");
  967. MODULE_LICENSE("GPL");