akm09911.c 72 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778
  1. /*
  2. * Copyright(C)2014 MediaTek Inc.
  3. * Modification based on code covered by the below mentioned copyright
  4. * and/or permission notice(S).
  5. */
  6. /* akm09911.c - akm09911 compass driver
  7. *
  8. *
  9. * This software is licensed under the terms of the GNU General Public
  10. * License version 2, as published by the Free Software Foundation, and
  11. * may be copied, distributed, and modified under those terms.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. */
  19. #include "cust_mag.h"
  20. #include "akm09911.h"
  21. #include "mag.h"
  22. #define DEBUG 0
  23. #define AKM09911_DEV_NAME "akm09911"
  24. #define DRIVER_VERSION "1.0.1"
  25. #define AKM09911_DEBUG 1
  26. #define AKM09911_RETRY_COUNT 10
  27. #define AKM09911_DEFAULT_DELAY 100
  28. #if AKM09911_DEBUG
  29. #define MAGN_TAG "[AKM09911] "
  30. #define MAGN_ERR(fmt, args...) pr_err(MAGN_TAG fmt, ##args)
  31. #define MAGN_LOG(fmt, args...) pr_debug(MAGN_TAG fmt, ##args)
  32. #else
  33. #define MAGN_TAG
  34. #define MAGN_ERR(fmt, args...) do {} while (0)
  35. #define MAGN_LOG(fmt, args...) do {} while (0)
  36. #endif
  37. /* Addresses to scan -- protected by sense_data_mutex */
  38. static char sense_data[SENSOR_DATA_SIZE];
  39. static struct mutex sense_data_mutex;
  40. /* calibration msensor and orientation data */
  41. static int sensor_data[CALIBRATION_DATA_SIZE];
  42. static struct mutex sensor_data_mutex;
  43. /* static DECLARE_WAIT_QUEUE_HEAD(data_ready_wq); */
  44. static DECLARE_WAIT_QUEUE_HEAD(open_wq);
  45. static short akmd_delay = AKM09911_DEFAULT_DELAY;
  46. static atomic_t open_flag = ATOMIC_INIT(0);
  47. static atomic_t m_flag = ATOMIC_INIT(0);
  48. static atomic_t o_flag = ATOMIC_INIT(0);
  49. static int factory_mode;
  50. static int mEnabled;
  51. static int akm09911_init_flag;
  52. static struct i2c_client *this_client;
  53. /*----------------------------------------------------------------------------*/
  54. static const struct i2c_device_id akm09911_i2c_id[] = {{AKM09911_DEV_NAME, 0}, {} };
  55. /* Maintain cust info here */
  56. struct mag_hw mag_cust;
  57. static struct mag_hw *hw = &mag_cust;
  58. /* For driver get cust info */
  59. struct mag_hw *get_cust_mag(void)
  60. {
  61. return &mag_cust;
  62. }
  63. /*----------------------------------------------------------------------------*/
  64. static int akm09911_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id);
  65. static int akm09911_i2c_remove(struct i2c_client *client);
  66. static int akm09911_i2c_detect(struct i2c_client *client, struct i2c_board_info *info);
  67. static int akm09911_suspend(struct i2c_client *client, pm_message_t msg);
  68. static int akm09911_resume(struct i2c_client *client);
  69. static int akm09911_local_init(void);
  70. static int akm09911_remove(void);
  71. static struct mag_init_info akm09911_init_info = {
  72. .name = "akm09911",
  73. .init = akm09911_local_init,
  74. .uninit = akm09911_remove,
  75. };
  76. /*----------------------------------------------------------------------------*/
  77. enum {
  78. AMK_FUN_DEBUG = 0x01,
  79. AMK_DATA_DEBUG = 0X02,
  80. AMK_HWM_DEBUG = 0X04,
  81. AMK_CTR_DEBUG = 0X08,
  82. AMK_I2C_DEBUG = 0x10,
  83. } AMK_TRC;
  84. /*----------------------------------------------------------------------------*/
  85. struct akm09911_i2c_data {
  86. struct i2c_client *client;
  87. struct mag_hw *hw;
  88. atomic_t layout;
  89. atomic_t trace;
  90. struct hwmsen_convert cvt;
  91. };
  92. /*----------------------------------------------------------------------------*/
  93. #ifdef CONFIG_OF
  94. static const struct of_device_id mag_of_match[] = {
  95. {.compatible = "mediatek,msensor"},
  96. {},
  97. };
  98. #endif
  99. static struct i2c_driver akm09911_i2c_driver = {
  100. .driver = {
  101. .name = AKM09911_DEV_NAME,
  102. #ifdef CONFIG_OF
  103. .of_match_table = mag_of_match,
  104. #endif
  105. },
  106. .probe = akm09911_i2c_probe,
  107. .remove = akm09911_i2c_remove,
  108. .detect = akm09911_i2c_detect,
  109. .suspend = akm09911_suspend,
  110. .resume = akm09911_resume,
  111. .id_table = akm09911_i2c_id,
  112. };
  113. /*----------------------------------------------------------------------------*/
  114. static atomic_t dev_open_count;
  115. /*----------------------------------------------------------------------------*/
  116. static DEFINE_MUTEX(akm09911_i2c_mutex);
  117. static void akm09911_power(struct mag_hw *hw, unsigned int on)
  118. {
  119. }
  120. static long AKI2C_RxData(char *rxData, int length)
  121. {
  122. uint8_t loop_i;
  123. #if DEBUG
  124. int i;
  125. struct i2c_client *client = this_client;
  126. struct akm09911_i2c_data *data = i2c_get_clientdata(client);
  127. char addr = rxData[0];
  128. #endif
  129. /* Caller should check parameter validity.*/
  130. if ((rxData == NULL) || (length < 1))
  131. return -EINVAL;
  132. mutex_lock(&akm09911_i2c_mutex);
  133. for (loop_i = 0; loop_i < AKM09911_RETRY_COUNT; loop_i++) {
  134. this_client->addr = this_client->addr & I2C_MASK_FLAG;
  135. this_client->addr = this_client->addr | I2C_WR_FLAG;
  136. if (i2c_master_send(this_client, (const char *)rxData, ((length<<0X08) | 0X01)))
  137. break;
  138. mdelay(10);
  139. }
  140. if (loop_i >= AKM09911_RETRY_COUNT) {
  141. mutex_unlock(&akm09911_i2c_mutex);
  142. MAG_ERR("%s retry over %d\n", __func__, AKM09911_RETRY_COUNT);
  143. return -EIO;
  144. }
  145. mutex_unlock(&akm09911_i2c_mutex);
  146. #if DEBUG
  147. if (atomic_read(&data->trace) & AMK_I2C_DEBUG) {
  148. MAGN_LOG("RxData: len=%02x, addr=%02x\n data=", length, addr);
  149. for (i = 0; i < length; i++)
  150. MAGN_LOG(" %02x", rxData[i]);
  151. MAGN_LOG("\n");
  152. }
  153. #endif
  154. return 0;
  155. }
  156. static long AKI2C_TxData(char *txData, int length)
  157. {
  158. uint8_t loop_i;
  159. #if DEBUG
  160. int i;
  161. struct i2c_client *client = this_client;
  162. struct akm09911_i2c_data *data = i2c_get_clientdata(client);
  163. #endif
  164. /* Caller should check parameter validity.*/
  165. if ((txData == NULL) || (length < 2))
  166. return -EINVAL;
  167. mutex_lock(&akm09911_i2c_mutex);
  168. this_client->addr = this_client->addr & I2C_MASK_FLAG;
  169. for (loop_i = 0; loop_i < AKM09911_RETRY_COUNT; loop_i++) {
  170. if (i2c_master_send(this_client, (const char *)txData, length) > 0)
  171. break;
  172. mdelay(10);
  173. }
  174. if (loop_i >= AKM09911_RETRY_COUNT) {
  175. mutex_unlock(&akm09911_i2c_mutex);
  176. MAG_ERR("%s retry over %d\n", __func__, AKM09911_RETRY_COUNT);
  177. return -EIO;
  178. }
  179. mutex_unlock(&akm09911_i2c_mutex);
  180. #if DEBUG
  181. if (atomic_read(&data->trace) & AMK_I2C_DEBUG) {
  182. MAGN_LOG("TxData: len=%02x, addr=%02x\n data=", length, txData[0]);
  183. for (i = 0; i < (length-1); i++)
  184. MAGN_LOG(" %02x", txData[i + 1]);
  185. MAGN_LOG("\n");
  186. }
  187. #endif
  188. return 0;
  189. }
  190. static long AKECS_SetMode_SngMeasure(void)
  191. {
  192. char buffer[2];
  193. #ifdef AKM_Device_AK8963
  194. buffer[0] = AK8963_REG_CNTL1;
  195. buffer[1] = AK8963_MODE_SNG_MEASURE;
  196. #else
  197. /* Set measure mode */
  198. buffer[0] = AK09911_REG_CNTL2;
  199. buffer[1] = AK09911_MODE_SNG_MEASURE;
  200. #endif
  201. /* Set data */
  202. return AKI2C_TxData(buffer, 2);
  203. }
  204. static long AKECS_SetMode_SelfTest(void)
  205. {
  206. char buffer[2];
  207. #ifdef AKM_Device_AK8963
  208. buffer[0] = AK8963_REG_CNTL1;
  209. buffer[1] = AK8963_MODE_SELF_TEST;
  210. #else
  211. /* Set measure mode */
  212. buffer[0] = AK09911_REG_CNTL2;
  213. buffer[1] = AK09911_MODE_SELF_TEST;
  214. /* Set data */
  215. #endif
  216. return AKI2C_TxData(buffer, 2);
  217. }
  218. static long AKECS_SetMode_FUSEAccess(void)
  219. {
  220. char buffer[2];
  221. #ifdef AKM_Device_AK8963
  222. buffer[0] = AK8963_REG_CNTL1;
  223. buffer[1] = AK8963_MODE_FUSE_ACCESS;
  224. #else
  225. /* Set measure mode */
  226. buffer[0] = AK09911_REG_CNTL2;
  227. buffer[1] = AK09911_MODE_FUSE_ACCESS;
  228. /* Set data */
  229. #endif
  230. return AKI2C_TxData(buffer, 2);
  231. }
  232. static int AKECS_SetMode_PowerDown(void)
  233. {
  234. char buffer[2];
  235. #ifdef AKM_Device_AK8963
  236. buffer[0] = AK8963_REG_CNTL1;
  237. buffer[1] = AK8963_MODE_POWERDOWN;
  238. #else
  239. /* Set powerdown mode */
  240. buffer[0] = AK09911_REG_CNTL2;
  241. buffer[1] = AK09911_MODE_POWERDOWN;
  242. /* Set data */
  243. #endif
  244. return AKI2C_TxData(buffer, 2);
  245. }
  246. static long AKECS_Reset(int hard)
  247. {
  248. unsigned char buffer[2];
  249. long err = 0;
  250. if (hard != 0) {
  251. /*TODO change to board setting*/
  252. /* gpio_set_value(akm->rstn, 0); */
  253. udelay(5);
  254. /* gpio_set_value(akm->rstn, 1); */
  255. } else {
  256. /* Set measure mode */
  257. #ifdef AKM_Device_AK8963
  258. buffer[0] = AK8963_REG_CNTL2;
  259. buffer[1] = 0x01;
  260. #else
  261. buffer[0] = AK09911_REG_CNTL3;
  262. buffer[1] = 0x01;
  263. #endif
  264. err = AKI2C_TxData(buffer, 2);
  265. if (err < 0)
  266. MAGN_LOG("%s: Can not set SRST bit.", __func__);
  267. else
  268. MAGN_LOG("Soft reset is done.");
  269. }
  270. /* Device will be accessible 300 us after */
  271. udelay(300); /* 100 */
  272. return err;
  273. }
  274. static long AKECS_SetMode(char mode)
  275. {
  276. long ret;
  277. switch (mode & 0x1F) {
  278. case AK09911_MODE_SNG_MEASURE:
  279. ret = AKECS_SetMode_SngMeasure();
  280. break;
  281. case AK09911_MODE_SELF_TEST:
  282. case AK8963_MODE_SELF_TEST:
  283. ret = AKECS_SetMode_SelfTest();
  284. break;
  285. case AK09911_MODE_FUSE_ACCESS:
  286. case AK8963_MODE_FUSE_ACCESS:
  287. ret = AKECS_SetMode_FUSEAccess();
  288. break;
  289. case AK09911_MODE_POWERDOWN:
  290. ret = AKECS_SetMode_PowerDown();
  291. break;
  292. default:
  293. MAGN_LOG("%s: Unknown mode(%d)", __func__, mode);
  294. return -EINVAL;
  295. }
  296. /* wait at least 100us after changing mode */
  297. udelay(100);
  298. return ret;
  299. }
  300. static int AKECS_CheckDevice(void)
  301. {
  302. char buffer[2];
  303. int ret;
  304. MAGN_LOG(" AKM check device id");
  305. /* Set measure mode */
  306. #ifdef AKM_Device_AK8963
  307. buffer[0] = AK8963_REG_WIA;
  308. #else
  309. buffer[0] = AK09911_REG_WIA1;
  310. #endif
  311. /* Read data */
  312. ret = AKI2C_RxData(buffer, 1);
  313. MAGN_LOG(" AKM check device id = %x", buffer[0]);
  314. MAGN_LOG("ret = %d", ret);
  315. if (ret < 0)
  316. return ret;
  317. /* Check read data */
  318. if (buffer[0] != 0x48)
  319. return -ENXIO;
  320. return 0;
  321. }
  322. /* Daemon application save the data */
  323. static void AKECS_SaveData(int *buf)
  324. {
  325. #if DEBUG
  326. struct i2c_client *client = this_client;
  327. struct akm09911_i2c_data *data = i2c_get_clientdata(client);
  328. #endif
  329. mutex_lock(&sensor_data_mutex);
  330. memcpy(sensor_data, buf, sizeof(sensor_data));
  331. mutex_unlock(&sensor_data_mutex);
  332. #if DEBUG
  333. if (atomic_read(&data->trace) & AMK_HWM_DEBUG) {
  334. MAGN_LOG("Get daemon data[0-11]: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n",
  335. sensor_data[0], sensor_data[1], sensor_data[2], sensor_data[3],
  336. sensor_data[4], sensor_data[5], sensor_data[6], sensor_data[7],
  337. sensor_data[8], sensor_data[9], sensor_data[10], sensor_data[11]);
  338. MAGN_LOG("Get daemon data[12-25]: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d!\n",
  339. sensor_data[12], sensor_data[13], sensor_data[14], sensor_data[15],
  340. sensor_data[16], sensor_data[17], sensor_data[18], sensor_data[19],
  341. sensor_data[20], sensor_data[21], sensor_data[22], sensor_data[23],
  342. sensor_data[24], sensor_data[25]);
  343. }
  344. #endif
  345. }
  346. /* M-sensor daemon application have set the sng mode */
  347. static long AKECS_GetData(char *rbuf, int size)
  348. {
  349. char temp;
  350. int loop_i, ret;
  351. #if DEBUG
  352. struct i2c_client *client = this_client;
  353. struct akm09911_i2c_data *data = i2c_get_clientdata(client);
  354. #endif
  355. if (size < SENSOR_DATA_SIZE) {
  356. MAG_ERR("buff size is too small %d!\n", size);
  357. return -1;
  358. }
  359. memset(rbuf, 0, SENSOR_DATA_SIZE);
  360. #ifdef AKM_Device_AK8963
  361. rbuf[0] = AK8963_REG_ST1;
  362. #else
  363. rbuf[0] = AK09911_REG_ST1;
  364. #endif
  365. for (loop_i = 0; loop_i < AKM09911_RETRY_COUNT; loop_i++) {
  366. ret = AKI2C_RxData(rbuf, 1);
  367. if (ret) {
  368. MAG_ERR("read ST1 resigster failed!\n");
  369. return -1;
  370. }
  371. if ((rbuf[0] & 0x01) == 0x01)
  372. break;
  373. mdelay(2);
  374. #ifdef AKM_Device_AK8963
  375. rbuf[0] = AK8963_REG_ST1;
  376. #else
  377. rbuf[0] = AK09911_REG_ST1;
  378. #endif
  379. }
  380. if (loop_i >= AKM09911_RETRY_COUNT) {
  381. MAG_ERR("Data read retry larger the max count!\n");
  382. if (0 == factory_mode)
  383. /* if return we can not get data at factory mode */
  384. return -1;
  385. }
  386. temp = rbuf[0];
  387. #ifdef AKM_Device_AK8963
  388. rbuf[1] = AK8963_REG_HXL;
  389. ret = AKI2C_RxData(&rbuf[1], SENSOR_DATA_SIZE - 2);
  390. #else
  391. rbuf[1] = AK09911_REG_HXL;
  392. ret = AKI2C_RxData(&rbuf[1], SENSOR_DATA_SIZE - 1);
  393. #endif
  394. if (ret < 0) {
  395. MAG_ERR("AKM8975 akm8975_work_func: I2C failed\n");
  396. return -1;
  397. }
  398. rbuf[0] = temp;
  399. #ifdef AKM_Device_AK8963
  400. rbuf[8] = rbuf[7];
  401. rbuf[7] = 0;
  402. #endif
  403. mutex_lock(&sense_data_mutex);
  404. memcpy(sense_data, rbuf, sizeof(sense_data));
  405. mutex_unlock(&sense_data_mutex);
  406. #if DEBUG
  407. if (atomic_read(&data->trace) & AMK_DATA_DEBUG) {
  408. MAGN_LOG("Get device data: %d, %d, %d, %d , %d, %d, %d, %d!\n",
  409. sense_data[0], sense_data[1], sense_data[2], sense_data[3],
  410. sense_data[4], sense_data[5], sense_data[6], sense_data[7]);
  411. }
  412. #endif
  413. return 0;
  414. }
  415. /* Get Msensor Raw data */
  416. static int AKECS_GetRawData(char *rbuf, int size)
  417. {
  418. char strbuf[SENSOR_DATA_SIZE];
  419. s16 data[3];
  420. if ((atomic_read(&open_flag) == 0) || (factory_mode == 1)) {
  421. AKECS_SetMode_SngMeasure();
  422. mdelay(10);
  423. }
  424. AKECS_GetData(strbuf, SENSOR_DATA_SIZE);
  425. data[0] = (s16)(strbuf[1] | (strbuf[2] << 8));
  426. data[1] = (s16)(strbuf[3] | (strbuf[4] << 8));
  427. data[2] = (s16)(strbuf[5] | (strbuf[6] << 8));
  428. sprintf(rbuf, "%x %x %x", data[0], data[1], data[2]);
  429. return 0;
  430. }
  431. static int AKECS_GetOpenStatus(void)
  432. {
  433. wait_event_interruptible(open_wq, (atomic_read(&open_flag) != 0));
  434. return atomic_read(&open_flag);
  435. }
  436. static int AKECS_GetCloseStatus(void)
  437. {
  438. wait_event_interruptible(open_wq, (atomic_read(&open_flag) <= 0));
  439. return atomic_read(&open_flag);
  440. }
  441. /*----------------------------------------------------------------------------*/
  442. static int akm09911_ReadChipInfo(char *buf, int bufsize)
  443. {
  444. if ((!buf) || (bufsize <= AKM09911_BUFSIZE - 1))
  445. return -1;
  446. if (!this_client) {
  447. *buf = 0;
  448. return -2;
  449. }
  450. sprintf(buf, "akm09911 Chip");
  451. return 0;
  452. }
  453. /*----------------------------shipment test------------------------------------------------*/
  454. /*!
  455. @return If @a testdata is in the range of between @a lolimit and @a hilimit,
  456. the return value is 1, otherwise -1.
  457. @param[in] testno A pointer to a text string.
  458. @param[in] testname A pointer to a text string.
  459. @param[in] testdata A data to be tested.
  460. @param[in] lolimit The maximum allowable value of @a testdata.
  461. @param[in] hilimit The minimum allowable value of @a testdata.
  462. @param[in,out] pf_total
  463. */
  464. int TEST_DATA(const char testno[], const char testname[], const int testdata,
  465. const int lolimit, const int hilimit, int *pf_total)
  466. {
  467. int pf; /* Pass;1, Fail;-1 */
  468. if ((testno == NULL) && (strncmp(testname, "START", 5) == 0)) {
  469. MAGN_LOG("--------------------------------------------------------------------\n");
  470. MAGN_LOG(" Test No. Test Name Fail Test Data [ Low High]\n");
  471. MAGN_LOG("--------------------------------------------------------------------\n");
  472. pf = 1;
  473. } else if ((testno == NULL) && (strncmp(testname, "END", 3) == 0)) {
  474. MAGN_LOG("--------------------------------------------------------------------\n");
  475. if (*pf_total == 1)
  476. MAGN_LOG("Factory shipment test was passed.\n\n");
  477. else
  478. MAGN_LOG("Factory shipment test was failed.\n\n");
  479. pf = 1;
  480. } else {
  481. if ((lolimit <= testdata) && (testdata <= hilimit))
  482. pf = 1;
  483. else
  484. pf = -1;
  485. /* display result */
  486. MAGN_LOG(" %7s %-10s %c %9d [%9d %9d]\n",
  487. testno, testname, ((pf == 1) ? ('.') : ('F')), testdata,
  488. lolimit, hilimit);
  489. }
  490. /* Pass/Fail check */
  491. if (*pf_total != 0) {
  492. if ((*pf_total == 1) && (pf == 1))
  493. *pf_total = 1; /* Pass */
  494. else
  495. *pf_total = -1; /* Fail */
  496. }
  497. return pf;
  498. }
  499. int FST_AK8963(void)
  500. {
  501. int pf_total; /* p/f flag for this subtest */
  502. char i2cData[16];
  503. int hdata[3];
  504. int asax;
  505. int asay;
  506. int asaz;
  507. /* *********************************************** */
  508. /* Reset Test Result */
  509. /* *********************************************** */
  510. pf_total = 1;
  511. /* *********************************************** */
  512. /* Step1 */
  513. /* *********************************************** */
  514. /* Set to PowerDown mode */
  515. /* if (AKECS_SetMode(AK8963_MODE_POWERDOWN) < 0) { */
  516. /* MAGN_LOG("%s:%d Error.\n", __FUNCTION__, __LINE__); */
  517. /* return 0; */
  518. /* } */
  519. AKECS_Reset(0);
  520. mdelay(1);
  521. /* When the serial interface is SPI, */
  522. /* write "00011011" to I2CDIS register(to disable I2C,). */
  523. if (CSPEC_SPI_USE == 1) {
  524. i2cData[0] = AK8963_REG_I2CDIS;
  525. i2cData[1] = 0x1B;
  526. if (AKI2C_TxData(i2cData, 2) < 0) {
  527. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  528. return 0;
  529. }
  530. }
  531. /* Read values from WIA to ASTC. */
  532. i2cData[0] = AK8963_REG_WIA;
  533. if (AKI2C_RxData(i2cData, 7) < 0) {
  534. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  535. return 0;
  536. }
  537. /* TEST */
  538. TEST_DATA(TLIMIT_NO_RST_WIA, TLIMIT_TN_RST_WIA, (int)i2cData[0], TLIMIT_LO_RST_WIA,
  539. TLIMIT_HI_RST_WIA, &pf_total);
  540. TEST_DATA(TLIMIT_NO_RST_INFO, TLIMIT_TN_RST_INFO, (int)i2cData[1], TLIMIT_LO_RST_INFO,
  541. TLIMIT_HI_RST_INFO, &pf_total);
  542. TEST_DATA(TLIMIT_NO_RST_ST1, TLIMIT_TN_RST_ST1, (int)i2cData[2], TLIMIT_LO_RST_ST1,
  543. TLIMIT_HI_RST_ST1, &pf_total);
  544. TEST_DATA(TLIMIT_NO_RST_HXL, TLIMIT_TN_RST_HXL, (int)i2cData[3], TLIMIT_LO_RST_HXL,
  545. TLIMIT_HI_RST_HXL, &pf_total);
  546. TEST_DATA(TLIMIT_NO_RST_HXH, TLIMIT_TN_RST_HXH, (int)i2cData[4], TLIMIT_LO_RST_HXH,
  547. TLIMIT_HI_RST_HXH, &pf_total);
  548. TEST_DATA(TLIMIT_NO_RST_HYL, TLIMIT_TN_RST_HYL, (int)i2cData[5], TLIMIT_LO_RST_HYL,
  549. TLIMIT_HI_RST_HYL, &pf_total);
  550. TEST_DATA(TLIMIT_NO_RST_HYH, TLIMIT_TN_RST_HYH, (int)i2cData[6], TLIMIT_LO_RST_HYH,
  551. TLIMIT_HI_RST_HYH, &pf_total);
  552. /* our i2c only most can read 8 byte at one time , */
  553. i2cData[7] = AK8963_REG_HZL;
  554. if (AKI2C_RxData((i2cData+7), 6) < 0) {
  555. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  556. return 0;
  557. }
  558. TEST_DATA(TLIMIT_NO_RST_HZL, TLIMIT_TN_RST_HZL, (int)i2cData[7], TLIMIT_LO_RST_HZL,
  559. TLIMIT_HI_RST_HZL, &pf_total);
  560. TEST_DATA(TLIMIT_NO_RST_HZH, TLIMIT_TN_RST_HZH, (int)i2cData[8], TLIMIT_LO_RST_HZH,
  561. TLIMIT_HI_RST_HZH, &pf_total);
  562. TEST_DATA(TLIMIT_NO_RST_ST2, TLIMIT_TN_RST_ST2, (int)i2cData[9], TLIMIT_LO_RST_ST2,
  563. TLIMIT_HI_RST_ST2, &pf_total);
  564. TEST_DATA(TLIMIT_NO_RST_CNTL, TLIMIT_TN_RST_CNTL, (int)i2cData[10], TLIMIT_LO_RST_CNTL,
  565. TLIMIT_HI_RST_CNTL, &pf_total);
  566. /* i2cData[11] is BLANK. */
  567. TEST_DATA(TLIMIT_NO_RST_ASTC, TLIMIT_TN_RST_ASTC, (int)i2cData[12], TLIMIT_LO_RST_ASTC,
  568. TLIMIT_HI_RST_ASTC, &pf_total);
  569. /* Read values from I2CDIS. */
  570. i2cData[0] = AK8963_REG_I2CDIS;
  571. if (AKI2C_RxData(i2cData, 1) < 0) {
  572. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  573. return 0;
  574. }
  575. if (CSPEC_SPI_USE == 1)
  576. TEST_DATA(TLIMIT_NO_RST_I2CDIS, TLIMIT_TN_RST_I2CDIS, (int)i2cData[0], TLIMIT_LO_RST_I2CDIS_USESPI,
  577. TLIMIT_HI_RST_I2CDIS_USESPI, &pf_total);
  578. else
  579. TEST_DATA(TLIMIT_NO_RST_I2CDIS, TLIMIT_TN_RST_I2CDIS, (int)i2cData[0], TLIMIT_LO_RST_I2CDIS_USEI2C,
  580. TLIMIT_HI_RST_I2CDIS_USEI2C, &pf_total);
  581. /* Set to FUSE ROM access mode */
  582. if (AKECS_SetMode(AK8963_MODE_FUSE_ACCESS) < 0) {
  583. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  584. return 0;
  585. }
  586. /* Read values from ASAX to ASAZ */
  587. i2cData[0] = AK8963_FUSE_ASAX;
  588. if (AKI2C_RxData(i2cData, 3) < 0) {
  589. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  590. return 0;
  591. }
  592. asax = (int)i2cData[0];
  593. asay = (int)i2cData[1];
  594. asaz = (int)i2cData[2];
  595. /* TEST */
  596. TEST_DATA(TLIMIT_NO_ASAX, TLIMIT_TN_ASAX, asax, TLIMIT_LO_ASAX, TLIMIT_HI_ASAX, &pf_total);
  597. TEST_DATA(TLIMIT_NO_ASAY, TLIMIT_TN_ASAY, asay, TLIMIT_LO_ASAY, TLIMIT_HI_ASAY, &pf_total);
  598. TEST_DATA(TLIMIT_NO_ASAZ, TLIMIT_TN_ASAZ, asaz, TLIMIT_LO_ASAZ, TLIMIT_HI_ASAZ, &pf_total);
  599. /* Read values. CNTL */
  600. i2cData[0] = AK8963_REG_CNTL1;
  601. if (AKI2C_RxData(i2cData, 1) < 0) {
  602. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  603. return 0;
  604. }
  605. /* Set to PowerDown mode */
  606. if (AKECS_SetMode(AK8963_MODE_POWERDOWN) < 0) {
  607. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  608. return 0;
  609. }
  610. /* TEST */
  611. TEST_DATA(TLIMIT_NO_WR_CNTL, TLIMIT_TN_WR_CNTL, (int)i2cData[0], TLIMIT_LO_WR_CNTL,
  612. TLIMIT_HI_WR_CNTL, &pf_total);
  613. /* *********************************************** */
  614. /* Step2 */
  615. /* *********************************************** */
  616. /* Set to SNG measurement pattern (Set CNTL register) */
  617. if (AKECS_SetMode(AK8963_MODE_SNG_MEASURE) < 0) {
  618. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  619. return 0;
  620. }
  621. /* Wait for DRDY pin changes to HIGH. */
  622. mdelay(10);
  623. /* Get measurement data from AK8963 */
  624. /* ST1 + (HXL + HXH) + (HYL + HYH) + (HZL + HZH) + ST2 */
  625. /* = 1 + (1 + 1) + (1 + 1) + (1 + 1) + 1 = 8 bytes */
  626. if (AKECS_GetData(i2cData, SENSOR_DATA_SIZE) < 0) {
  627. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  628. return 0;
  629. }
  630. hdata[0] = (s16)(i2cData[1] | (i2cData[2] << 8));
  631. hdata[1] = (s16)(i2cData[3] | (i2cData[4] << 8));
  632. hdata[2] = (s16)(i2cData[5] | (i2cData[6] << 8));
  633. /* AK8963 @ 14 BIT */
  634. hdata[0] <<= 2;
  635. hdata[1] <<= 2;
  636. hdata[2] <<= 2;
  637. /* TEST */
  638. TEST_DATA(TLIMIT_NO_SNG_ST1, TLIMIT_TN_SNG_ST1, (int)i2cData[0], TLIMIT_LO_SNG_ST1,
  639. TLIMIT_HI_SNG_ST1, &pf_total);
  640. TEST_DATA(TLIMIT_NO_SNG_HX, TLIMIT_TN_SNG_HX, hdata[0], TLIMIT_LO_SNG_HX, TLIMIT_HI_SNG_HX, &pf_total);
  641. TEST_DATA(TLIMIT_NO_SNG_HY, TLIMIT_TN_SNG_HY, hdata[1], TLIMIT_LO_SNG_HY, TLIMIT_HI_SNG_HY, &pf_total);
  642. TEST_DATA(TLIMIT_NO_SNG_HZ, TLIMIT_TN_SNG_HZ, hdata[2], TLIMIT_LO_SNG_HZ, TLIMIT_HI_SNG_HZ, &pf_total);
  643. TEST_DATA(TLIMIT_NO_SNG_ST2, TLIMIT_TN_SNG_ST2, (int)i2cData[8], TLIMIT_LO_SNG_ST2,
  644. TLIMIT_HI_SNG_ST2, &pf_total);
  645. /* Generate magnetic field for self-test (Set ASTC register) */
  646. i2cData[0] = AK8963_REG_ASTC;
  647. i2cData[1] = 0x40;
  648. if (AKI2C_TxData(i2cData, 2) < 0) {
  649. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  650. return 0;
  651. }
  652. /* Set to Self-test mode (Set CNTL register) */
  653. if (AKECS_SetMode(AK8963_MODE_SELF_TEST) < 0) {
  654. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  655. return 0;
  656. }
  657. /* Wait for DRDY pin changes to HIGH. */
  658. mdelay(10);
  659. /* Get measurement data from AK8963 */
  660. /* ST1 + (HXL + HXH) + (HYL + HYH) + (HZL + HZH) + ST2 */
  661. /* = 1 + (1 + 1) + (1 + 1) + (1 + 1) + 1 = 8Byte */
  662. if (AKECS_GetData(i2cData, SENSOR_DATA_SIZE) < 0) {
  663. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  664. return 0;
  665. }
  666. /* TEST */
  667. TEST_DATA(TLIMIT_NO_SLF_ST1, TLIMIT_TN_SLF_ST1, (int)i2cData[0], TLIMIT_LO_SLF_ST1,
  668. TLIMIT_HI_SLF_ST1, &pf_total);
  669. hdata[0] = (s16)(i2cData[1] | (i2cData[2] << 8));
  670. hdata[1] = (s16)(i2cData[3] | (i2cData[4] << 8));
  671. hdata[2] = (s16)(i2cData[5] | (i2cData[6] << 8));
  672. /* AK8963 @ 14 BIT */
  673. hdata[0] <<= 2;
  674. hdata[1] <<= 2;
  675. hdata[2] <<= 2;
  676. MAGN_LOG("hdata[0] = %d\n", hdata[0]);
  677. MAGN_LOG("asax = %d\n", asax);
  678. TEST_DATA(
  679. TLIMIT_NO_SLF_RVHX,
  680. TLIMIT_TN_SLF_RVHX,
  681. (hdata[0])*((asax - 128)/2/128 + 1),
  682. TLIMIT_LO_SLF_RVHX,
  683. TLIMIT_HI_SLF_RVHX,
  684. &pf_total
  685. );
  686. TEST_DATA(
  687. TLIMIT_NO_SLF_RVHY,
  688. TLIMIT_TN_SLF_RVHY,
  689. (hdata[1])*((asay - 128)/2/128 + 1),
  690. TLIMIT_LO_SLF_RVHY,
  691. TLIMIT_HI_SLF_RVHY,
  692. &pf_total
  693. );
  694. TEST_DATA(
  695. TLIMIT_NO_SLF_RVHZ,
  696. TLIMIT_TN_SLF_RVHZ,
  697. (hdata[2])*((asaz - 128)/2/128 + 1),
  698. TLIMIT_LO_SLF_RVHZ,
  699. TLIMIT_HI_SLF_RVHZ,
  700. &pf_total
  701. );
  702. /* TEST */
  703. TEST_DATA(TLIMIT_NO_SLF_ST2, TLIMIT_TN_SLF_ST2, (int)i2cData[8], TLIMIT_LO_SLF_ST2,
  704. TLIMIT_HI_SLF_ST2, &pf_total);
  705. /* Set to Normal mode for self-test. */
  706. i2cData[0] = AK8963_REG_ASTC;
  707. i2cData[1] = 0x00;
  708. if (AKI2C_TxData(i2cData, 2) < 0) {
  709. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  710. return 0;
  711. }
  712. MAGN_LOG("pf_total = %d\n", pf_total);
  713. return pf_total;
  714. }
  715. /*!
  716. Execute "Onboard Function Test" (NOT includes "START" and "END" command).
  717. @retval 1 The test is passed successfully.
  718. @retval -1 The test is failed.
  719. @retval 0 The test is aborted by kind of system error.
  720. */
  721. int FST_AK09911(void)
  722. {
  723. int pf_total; /* p/f flag for this subtest */
  724. char i2cData[16];
  725. int hdata[3];
  726. int asax;
  727. int asay;
  728. int asaz;
  729. /* *********************************************** */
  730. /* Reset Test Result */
  731. /* *********************************************** */
  732. pf_total = 1;
  733. /* *********************************************** */
  734. /* Step1 */
  735. /* *********************************************** */
  736. /* Reset device. */
  737. if (AKECS_Reset(0) < 0) {
  738. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  739. return 0;
  740. }
  741. /* Read values from WIA. */
  742. i2cData[0] = AK09911_REG_WIA1;
  743. if (AKI2C_RxData(i2cData, 2) < 0) {
  744. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  745. return 0;
  746. }
  747. /* TEST */
  748. TEST_DATA(TLIMIT_NO_RST_WIA1_09911, TLIMIT_TN_RST_WIA1_09911, (int)i2cData[0],
  749. TLIMIT_LO_RST_WIA1_09911, TLIMIT_HI_RST_WIA1_09911, &pf_total);
  750. TEST_DATA(TLIMIT_NO_RST_WIA2_09911, TLIMIT_TN_RST_WIA2_09911, (int)i2cData[1],
  751. TLIMIT_LO_RST_WIA2_09911, TLIMIT_HI_RST_WIA2_09911, &pf_total);
  752. /* Set to FUSE ROM access mode */
  753. if (AKECS_SetMode(AK09911_MODE_FUSE_ACCESS) < 0) {
  754. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  755. return 0;
  756. }
  757. /* Read values from ASAX to ASAZ */
  758. i2cData[0] = AK09911_FUSE_ASAX;
  759. if (AKI2C_RxData(i2cData, 3) < 0) {
  760. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  761. return 0;
  762. }
  763. asax = (int)i2cData[0];
  764. asay = (int)i2cData[1];
  765. asaz = (int)i2cData[2];
  766. /* TEST */
  767. TEST_DATA(TLIMIT_NO_ASAX_09911, TLIMIT_TN_ASAX_09911, asax, TLIMIT_LO_ASAX_09911,
  768. TLIMIT_HI_ASAX_09911, &pf_total);
  769. TEST_DATA(TLIMIT_NO_ASAY_09911, TLIMIT_TN_ASAY_09911, asay, TLIMIT_LO_ASAY_09911,
  770. TLIMIT_HI_ASAY_09911, &pf_total);
  771. TEST_DATA(TLIMIT_NO_ASAZ_09911, TLIMIT_TN_ASAZ_09911, asaz, TLIMIT_LO_ASAZ_09911,
  772. TLIMIT_HI_ASAZ_09911, &pf_total);
  773. /* Set to PowerDown mode */
  774. if (AKECS_SetMode(AK09911_MODE_POWERDOWN) < 0) {
  775. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  776. return 0;
  777. }
  778. /* *********************************************** */
  779. /* Step2 */
  780. /* *********************************************** */
  781. /* Set to SNG measurement pattern (Set CNTL register) */
  782. if (AKECS_SetMode(AK09911_MODE_SNG_MEASURE) < 0) {
  783. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  784. return 0;
  785. }
  786. /* Wait for DRDY pin changes to HIGH. */
  787. /* usleep(AKM_MEASURE_TIME_US); */
  788. /* Get measurement data from AK09911 */
  789. /* ST1 + (HXL + HXH) + (HYL + HYH) + (HZL + HZH) + TEMP + ST2 */
  790. /* = 1 + (1 + 1) + (1 + 1) + (1 + 1) + 1 + 1 = 9yte */
  791. /* if (AKD_GetMagneticData(i2cData) != AKD_SUCCESS) { */
  792. if (AKECS_GetData(i2cData, SENSOR_DATA_SIZE) < 0) {
  793. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  794. return 0;
  795. }
  796. /* hdata[0] = (int)((((uint)(i2cData[2]))<<8)+(uint)(i2cData[1])); */
  797. /* hdata[1] = (int)((((uint)(i2cData[4]))<<8)+(uint)(i2cData[3])); */
  798. /* hdata[2] = (int)((((uint)(i2cData[6]))<<8)+(uint)(i2cData[5])); */
  799. hdata[0] = (s16)(i2cData[1] | (i2cData[2] << 8));
  800. hdata[1] = (s16)(i2cData[3] | (i2cData[4] << 8));
  801. hdata[2] = (s16)(i2cData[5] | (i2cData[6] << 8));
  802. /* TEST */
  803. i2cData[0] &= 0x7F;
  804. TEST_DATA(TLIMIT_NO_SNG_ST1_09911, TLIMIT_TN_SNG_ST1_09911, (int)i2cData[0], TLIMIT_LO_SNG_ST1_09911,
  805. TLIMIT_HI_SNG_ST1_09911, &pf_total);
  806. /* TEST */
  807. TEST_DATA(TLIMIT_NO_SNG_HX_09911, TLIMIT_TN_SNG_HX_09911, hdata[0], TLIMIT_LO_SNG_HX_09911,
  808. TLIMIT_HI_SNG_HX_09911, &pf_total);
  809. TEST_DATA(TLIMIT_NO_SNG_HY_09911, TLIMIT_TN_SNG_HY_09911, hdata[1], TLIMIT_LO_SNG_HY_09911,
  810. TLIMIT_HI_SNG_HY_09911, &pf_total);
  811. TEST_DATA(TLIMIT_NO_SNG_HZ_09911, TLIMIT_TN_SNG_HZ_09911, hdata[2], TLIMIT_LO_SNG_HZ_09911,
  812. TLIMIT_HI_SNG_HZ_09911, &pf_total);
  813. TEST_DATA(TLIMIT_NO_SNG_ST2_09911, TLIMIT_TN_SNG_ST2_09911, (int)i2cData[8], TLIMIT_LO_SNG_ST2_09911,
  814. TLIMIT_HI_SNG_ST2_09911, &pf_total);
  815. /* Set to Self-test mode (Set CNTL register) */
  816. if (AKECS_SetMode(AK09911_MODE_SELF_TEST) < 0) {
  817. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  818. return 0;
  819. }
  820. /* Wait for DRDY pin changes to HIGH. */
  821. /* usleep(AKM_MEASURE_TIME_US); */
  822. /* Get measurement data from AK09911 */
  823. /* ST1 + (HXL + HXH) + (HYL + HYH) + (HZL + HZH) + TEMP + ST2 */
  824. /* = 1 + (1 + 1) + (1 + 1) + (1 + 1) + 1 + 1 = 9byte */
  825. /* if (AKD_GetMagneticData(i2cData) != AKD_SUCCESS) { */
  826. if (AKECS_GetData(i2cData, SENSOR_DATA_SIZE) < 0) {
  827. MAGN_LOG("%s:%d Error.\n", __func__, __LINE__);
  828. return 0;
  829. }
  830. /* TEST */
  831. i2cData[0] &= 0x7F;
  832. TEST_DATA(TLIMIT_NO_SLF_ST1_09911, TLIMIT_TN_SLF_ST1_09911, (int)i2cData[0], TLIMIT_LO_SLF_ST1_09911,
  833. TLIMIT_HI_SLF_ST1_09911, &pf_total);
  834. /* hdata[0] = (int)((((uint)(i2cData[2]))<<8)+(uint)(i2cData[1])); */
  835. /* hdata[1] = (int)((((uint)(i2cData[4]))<<8)+(uint)(i2cData[3])); */
  836. /* hdata[2] = (int)((((uint)(i2cData[6]))<<8)+(uint)(i2cData[5])); */
  837. hdata[0] = (s16)(i2cData[1] | (i2cData[2] << 8));
  838. hdata[1] = (s16)(i2cData[3] | (i2cData[4] << 8));
  839. hdata[2] = (s16)(i2cData[5] | (i2cData[6] << 8));
  840. /* TEST */
  841. TEST_DATA(
  842. TLIMIT_NO_SLF_RVHX_09911,
  843. TLIMIT_TN_SLF_RVHX_09911,
  844. (hdata[0])*(asax/128 + 1),
  845. TLIMIT_LO_SLF_RVHX_09911,
  846. TLIMIT_HI_SLF_RVHX_09911,
  847. &pf_total
  848. );
  849. TEST_DATA(
  850. TLIMIT_NO_SLF_RVHY_09911,
  851. TLIMIT_TN_SLF_RVHY_09911,
  852. (hdata[1])*(asay/128 + 1),
  853. TLIMIT_LO_SLF_RVHY_09911,
  854. TLIMIT_HI_SLF_RVHY_09911,
  855. &pf_total
  856. );
  857. TEST_DATA(
  858. TLIMIT_NO_SLF_RVHZ_09911,
  859. TLIMIT_TN_SLF_RVHZ_09911,
  860. (hdata[2])*(asaz/128 + 1),
  861. TLIMIT_LO_SLF_RVHZ_09911,
  862. TLIMIT_HI_SLF_RVHZ_09911,
  863. &pf_total
  864. );
  865. TEST_DATA(
  866. TLIMIT_NO_SLF_ST2_09911,
  867. TLIMIT_TN_SLF_ST2_09911,
  868. (int)i2cData[8],
  869. TLIMIT_LO_SLF_ST2_09911,
  870. TLIMIT_HI_SLF_ST2_09911,
  871. &pf_total
  872. );
  873. return pf_total;
  874. }
  875. /*!
  876. Execute "Onboard Function Test" (includes "START" and "END" command).
  877. @retval 1 The test is passed successfully.
  878. @retval -1 The test is failed.
  879. @retval 0 The test is aborted by kind of system error.
  880. */
  881. int FctShipmntTestProcess_Body(void)
  882. {
  883. int pf_total = 1;
  884. /* *********************************************** */
  885. /* Reset Test Result */
  886. /* *********************************************** */
  887. TEST_DATA(NULL, "START", 0, 0, 0, &pf_total);
  888. /* *********************************************** */
  889. /* Step 1 to 2 */
  890. /* *********************************************** */
  891. #ifdef AKM_Device_AK8963
  892. pf_total = FST_AK8963();
  893. #else
  894. pf_total = FST_AK09911();
  895. #endif
  896. /* *********************************************** */
  897. /* Judge Test Result */
  898. /* *********************************************** */
  899. TEST_DATA(NULL, "END", 0, 0, 0, &pf_total);
  900. return pf_total;
  901. }
  902. static ssize_t store_shipment_test(struct device_driver *ddri, const char *buf, size_t count)
  903. {
  904. /* struct i2c_client *client = this_client; */
  905. /* struct akm09911_i2c_data *data = i2c_get_clientdata(client); */
  906. /* int layout = 0; */
  907. return count;
  908. }
  909. static ssize_t show_shipment_test(struct device_driver *ddri, char *buf)
  910. {
  911. char result[10];
  912. int res = 0;
  913. res = FctShipmntTestProcess_Body();
  914. if (1 == res) {
  915. MAGN_LOG("shipment_test pass\n");
  916. strcpy(result, "y");
  917. } else if (-1 == res) {
  918. MAGN_LOG("shipment_test fail\n");
  919. strcpy(result, "n");
  920. } else {
  921. MAGN_LOG("shipment_test NaN\n");
  922. strcpy(result, "NaN");
  923. }
  924. return sprintf(buf, "%s\n", result);
  925. }
  926. static ssize_t show_daemon_name(struct device_driver *ddri, char *buf)
  927. {
  928. char strbuf[AKM09911_BUFSIZE];
  929. sprintf(strbuf, "akmd09911");
  930. return sprintf(buf, "%s", strbuf);
  931. }
  932. static ssize_t show_chipinfo_value(struct device_driver *ddri, char *buf)
  933. {
  934. char strbuf[AKM09911_BUFSIZE];
  935. akm09911_ReadChipInfo(strbuf, AKM09911_BUFSIZE);
  936. return sprintf(buf, "%s\n", strbuf);
  937. }
  938. /*----------------------------------------------------------------------------*/
  939. static ssize_t show_sensordata_value(struct device_driver *ddri, char *buf)
  940. {
  941. char sensordata[SENSOR_DATA_SIZE];
  942. char strbuf[AKM09911_BUFSIZE];
  943. if (atomic_read(&open_flag) == 0) {
  944. AKECS_SetMode_SngMeasure();
  945. mdelay(10);
  946. AKECS_GetData(sensordata, SENSOR_DATA_SIZE);
  947. } else {
  948. mutex_lock(&sense_data_mutex);
  949. memcpy(sensordata, sense_data, sizeof(sensordata));
  950. mutex_unlock(&sense_data_mutex);
  951. }
  952. sprintf(strbuf, "%d %d %d %d %d %d %d %d %d\n", sensordata[0], sensordata[1], sensordata[2],
  953. sensordata[3], sensordata[4], sensordata[5], sensordata[6], sensordata[7], sensordata[8]);
  954. return sprintf(buf, "%s\n", strbuf);
  955. }
  956. /*----------------------------------------------------------------------------*/
  957. static ssize_t show_posturedata_value(struct device_driver *ddri, char *buf)
  958. {
  959. short tmp[3];
  960. char strbuf[AKM09911_BUFSIZE];
  961. tmp[0] = sensor_data[13] * CONVERT_O / CONVERT_O_DIV;
  962. tmp[1] = sensor_data[14] * CONVERT_O / CONVERT_O_DIV;
  963. tmp[2] = sensor_data[15] * CONVERT_O / CONVERT_O_DIV;
  964. sprintf(strbuf, "%d, %d, %d\n", tmp[0], tmp[1], tmp[2]);
  965. return sprintf(buf, "%s\n", strbuf);
  966. }
  967. /*----------------------------------------------------------------------------*/
  968. static ssize_t show_layout_value(struct device_driver *ddri, char *buf)
  969. {
  970. struct i2c_client *client = this_client;
  971. struct akm09911_i2c_data *data = i2c_get_clientdata(client);
  972. return sprintf(buf, "(%d, %d)\n[%+2d %+2d %+2d]\n[%+2d %+2d %+2d]\n",
  973. data->hw->direction, atomic_read(&data->layout), data->cvt.sign[0], data->cvt.sign[1],
  974. data->cvt.sign[2], data->cvt.map[0], data->cvt.map[1], data->cvt.map[2]);
  975. }
  976. /*----------------------------------------------------------------------------*/
  977. static ssize_t store_layout_value(struct device_driver *ddri, const char *buf, size_t count)
  978. {
  979. struct i2c_client *client = this_client;
  980. struct akm09911_i2c_data *data = i2c_get_clientdata(client);
  981. int layout = 0;
  982. int ret = 0;
  983. ret = kstrtoint(buf, 10, &layout);
  984. if (ret != 0) {
  985. atomic_set(&data->layout, layout);
  986. if (!hwmsen_get_convert(layout, &data->cvt))
  987. MAG_ERR("HWMSEN_GET_CONVERT function error!\r\n");
  988. else if (!hwmsen_get_convert(data->hw->direction, &data->cvt))
  989. MAG_ERR("invalid layout: %d, restore to %d\n", layout, data->hw->direction);
  990. else {
  991. MAG_ERR("invalid layout: (%d, %d)\n", layout, data->hw->direction);
  992. hwmsen_get_convert(0, &data->cvt);
  993. }
  994. } else
  995. MAG_ERR("invalid format = '%s'\n", buf);
  996. return count;
  997. }
  998. /*----------------------------------------------------------------------------*/
  999. static ssize_t show_status_value(struct device_driver *ddri, char *buf)
  1000. {
  1001. struct i2c_client *client = this_client;
  1002. struct akm09911_i2c_data *data = i2c_get_clientdata(client);
  1003. ssize_t len = 0;
  1004. if (data->hw)
  1005. len += snprintf(buf+len, PAGE_SIZE-len, "CUST: %d %d (%d %d)\n",
  1006. data->hw->i2c_num, data->hw->direction, data->hw->power_id, data->hw->power_vol);
  1007. else
  1008. len += snprintf(buf+len, PAGE_SIZE-len, "CUST: NULL\n");
  1009. len += snprintf(buf+len, PAGE_SIZE-len, "OPEN: %d\n", atomic_read(&dev_open_count));
  1010. return len;
  1011. }
  1012. /*----------------------------------------------------------------------------*/
  1013. static ssize_t show_trace_value(struct device_driver *ddri, char *buf)
  1014. {
  1015. ssize_t res;
  1016. struct akm09911_i2c_data *obj = i2c_get_clientdata(this_client);
  1017. if (NULL == obj) {
  1018. MAG_ERR("akm09911_i2c_data is null!!\n");
  1019. return 0;
  1020. }
  1021. res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace));
  1022. return res;
  1023. }
  1024. /*----------------------------------------------------------------------------*/
  1025. static ssize_t store_trace_value(struct device_driver *ddri, const char *buf, size_t count)
  1026. {
  1027. struct akm09911_i2c_data *obj = i2c_get_clientdata(this_client);
  1028. int trace;
  1029. if (NULL == obj) {
  1030. MAG_ERR("akm09911_i2c_data is null!!\n");
  1031. return 0;
  1032. }
  1033. if (1 == sscanf(buf, "0x%x", &trace))
  1034. atomic_set(&obj->trace, trace);
  1035. else
  1036. MAG_ERR("invalid content: '%s', length = %zu\n", buf, count);
  1037. return count;
  1038. }
  1039. static ssize_t show_chip_orientation(struct device_driver *ddri, char *buf)
  1040. {
  1041. ssize_t _tLength = 0;
  1042. struct mag_hw *_ptAccelHw = hw;
  1043. MAGN_LOG("[%s] default direction: %d\n", __func__, _ptAccelHw->direction);
  1044. _tLength = snprintf(buf, PAGE_SIZE, "default direction = %d\n", _ptAccelHw->direction);
  1045. return _tLength;
  1046. }
  1047. static ssize_t store_chip_orientation(struct device_driver *ddri, const char *buf, size_t tCount)
  1048. {
  1049. int _nDirection = 0;
  1050. int ret = 0;
  1051. struct akm09911_i2c_data *_pt_i2c_obj = i2c_get_clientdata(this_client);
  1052. if (NULL == _pt_i2c_obj)
  1053. return 0;
  1054. ret = kstrtoint(buf, 10, &_nDirection);
  1055. if (ret != 0) {
  1056. if (hwmsen_get_convert(_nDirection, &_pt_i2c_obj->cvt))
  1057. MAG_ERR("ERR: fail to set direction\n");
  1058. }
  1059. MAGN_LOG("[%s] set direction: %d\n", __func__, _nDirection);
  1060. return tCount;
  1061. }
  1062. static ssize_t show_power_status(struct device_driver *ddri, char *buf)
  1063. {
  1064. ssize_t res = 0;
  1065. u8 uData = AK09911_REG_CNTL2;
  1066. struct akm09911_i2c_data *obj = i2c_get_clientdata(this_client);
  1067. if (obj == NULL) {
  1068. MAG_ERR("i2c_data obj is null!!\n");
  1069. return 0;
  1070. }
  1071. AKI2C_RxData(&uData, 1);
  1072. res = snprintf(buf, PAGE_SIZE, "0x%04X\n", uData);
  1073. return res;
  1074. }
  1075. static ssize_t show_regiter_map(struct device_driver *ddri, char *buf)
  1076. {
  1077. u8 _bIndex = 0;
  1078. u8 _baRegMap[] = {0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
  1079. 0x30, 0x31, 0x32, 0x33, 0x60, 0x61, 0x62};
  1080. /* u8 _baRegValue[20]; */
  1081. ssize_t _tLength = 0;
  1082. char tmp[2] = {0};
  1083. for (_bIndex = 0; _bIndex < 20; _bIndex++) {
  1084. tmp[0] = _baRegMap[_bIndex];
  1085. AKI2C_RxData(tmp, 1);
  1086. _tLength += snprintf((buf + _tLength), (PAGE_SIZE - _tLength), "Reg[0x%02X]: 0x%02X\n",
  1087. _baRegMap[_bIndex], tmp[0]);
  1088. }
  1089. return _tLength;
  1090. }
  1091. /*----------------------------------------------------------------------------*/
  1092. static DRIVER_ATTR(daemon, S_IRUGO, show_daemon_name, NULL);
  1093. static DRIVER_ATTR(shipmenttest, S_IRUGO | S_IWUSR, show_shipment_test, store_shipment_test);
  1094. static DRIVER_ATTR(chipinfo, S_IRUGO, show_chipinfo_value, NULL);
  1095. static DRIVER_ATTR(sensordata, S_IRUGO, show_sensordata_value, NULL);
  1096. static DRIVER_ATTR(posturedata, S_IRUGO, show_posturedata_value, NULL);
  1097. static DRIVER_ATTR(layout, S_IRUGO | S_IWUSR, show_layout_value, store_layout_value);
  1098. static DRIVER_ATTR(status, S_IRUGO, show_status_value, NULL);
  1099. static DRIVER_ATTR(trace, S_IRUGO | S_IWUSR, show_trace_value, store_trace_value);
  1100. static DRIVER_ATTR(orientation, S_IWUSR | S_IRUGO, show_chip_orientation, store_chip_orientation);
  1101. static DRIVER_ATTR(power, S_IRUGO, show_power_status, NULL);
  1102. static DRIVER_ATTR(regmap, S_IRUGO, show_regiter_map, NULL);
  1103. /*----------------------------------------------------------------------------*/
  1104. static struct driver_attribute *akm09911_attr_list[] = {
  1105. &driver_attr_daemon,
  1106. &driver_attr_shipmenttest,
  1107. &driver_attr_chipinfo,
  1108. &driver_attr_sensordata,
  1109. &driver_attr_posturedata,
  1110. &driver_attr_layout,
  1111. &driver_attr_status,
  1112. &driver_attr_trace,
  1113. &driver_attr_orientation,
  1114. &driver_attr_power,
  1115. &driver_attr_regmap,
  1116. };
  1117. /*----------------------------------------------------------------------------*/
  1118. static int akm09911_create_attr(struct device_driver *driver)
  1119. {
  1120. int idx, err = 0;
  1121. int num = (int)(sizeof(akm09911_attr_list)/sizeof(akm09911_attr_list[0]));
  1122. if (driver == NULL)
  1123. return -EINVAL;
  1124. for (idx = 0; idx < num; idx++) {
  1125. err = driver_create_file(driver, akm09911_attr_list[idx]);
  1126. if (err) {
  1127. MAG_ERR("driver_create_file (%s) = %d\n", akm09911_attr_list[idx]->attr.name, err);
  1128. break;
  1129. }
  1130. }
  1131. return err;
  1132. }
  1133. /*----------------------------------------------------------------------------*/
  1134. static int akm09911_delete_attr(struct device_driver *driver)
  1135. {
  1136. int idx , err = 0;
  1137. int num = (int)(sizeof(akm09911_attr_list)/sizeof(akm09911_attr_list[0]));
  1138. if (driver == NULL)
  1139. return -EINVAL;
  1140. for (idx = 0; idx < num; idx++)
  1141. driver_remove_file(driver, akm09911_attr_list[idx]);
  1142. return err;
  1143. }
  1144. /*----------------------------------------------------------------------------*/
  1145. static int akm09911_open(struct inode *inode, struct file *file)
  1146. {
  1147. struct akm09911_i2c_data *obj = i2c_get_clientdata(this_client);
  1148. int ret = -1;
  1149. if (atomic_read(&obj->trace) & AMK_CTR_DEBUG)
  1150. MAGN_LOG("Open device node:akm09911\n");
  1151. ret = nonseekable_open(inode, file);
  1152. return ret;
  1153. }
  1154. /*----------------------------------------------------------------------------*/
  1155. static int akm09911_release(struct inode *inode, struct file *file)
  1156. {
  1157. struct akm09911_i2c_data *obj = i2c_get_clientdata(this_client);
  1158. atomic_dec(&dev_open_count);
  1159. if (atomic_read(&obj->trace) & AMK_CTR_DEBUG)
  1160. MAGN_LOG("Release device node:akm09911\n");
  1161. return 0;
  1162. }
  1163. /*----------------------------------------------------------------------------*/
  1164. /* static int akm09911_ioctl(struct inode *inode, struct file *file, unsigned int cmd,unsigned long arg) */
  1165. static long akm09911_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  1166. {
  1167. void __user *argp = (void __user *)arg;
  1168. /* NOTE: In this function the size of "char" should be 1-byte. */
  1169. char sData[SENSOR_DATA_SIZE];/* for GETDATA */
  1170. char rwbuf[RWBUF_SIZE]; /* for READ/WRITE */
  1171. char buff[AKM09911_BUFSIZE]; /* for chip information */
  1172. char mode; /* for SET_MODE*/
  1173. int value[26]; /* for SET_YPR */
  1174. int64_t delay[3]; /* for GET_DELAY */
  1175. int status; /* for OPEN/CLOSE_STATUS */
  1176. long ret = -1; /* Return value. */
  1177. int layout;
  1178. struct i2c_client *client = this_client;
  1179. struct akm09911_i2c_data *data = i2c_get_clientdata(client);
  1180. struct hwm_sensor_data *osensor_data;
  1181. uint32_t enable;
  1182. /* These two buffers are initialized at start up.
  1183. After that, the value is not changed */
  1184. unsigned char sense_info[AKM_SENSOR_INFO_SIZE];
  1185. unsigned char sense_conf[AKM_SENSOR_CONF_SIZE];
  1186. /* MAG_ERR("akm09911 cmd:0x%x\n", cmd); */
  1187. switch (cmd) {
  1188. case ECS_IOCTL_WRITE:
  1189. /* AKMFUNC("ECS_IOCTL_WRITE"); */
  1190. if (argp == NULL) {
  1191. MAGN_LOG("invalid argument.");
  1192. return -EINVAL;
  1193. }
  1194. if (copy_from_user(rwbuf, argp, sizeof(rwbuf))) {
  1195. MAGN_LOG("copy_from_user failed.");
  1196. return -EFAULT;
  1197. }
  1198. if ((rwbuf[0] < 2) || (rwbuf[0] > (RWBUF_SIZE-1))) {
  1199. MAGN_LOG("invalid argument.");
  1200. return -EINVAL;
  1201. }
  1202. ret = AKI2C_TxData(&rwbuf[1], rwbuf[0]);
  1203. if (ret < 0)
  1204. return ret;
  1205. break;
  1206. case ECS_IOCTL_RESET:
  1207. ret = AKECS_Reset(0); /* sw: 0, hw: 1 */
  1208. if (ret < 0)
  1209. return ret;
  1210. break;
  1211. case ECS_IOCTL_READ:
  1212. if (argp == NULL) {
  1213. MAGN_LOG("invalid argument.");
  1214. return -EINVAL;
  1215. }
  1216. if (copy_from_user(rwbuf, argp, sizeof(rwbuf))) {
  1217. MAGN_LOG("copy_from_user failed.");
  1218. return -EFAULT;
  1219. }
  1220. if ((rwbuf[0] < 1) || (rwbuf[0] > (RWBUF_SIZE-1))) {
  1221. MAGN_LOG("invalid argument.");
  1222. return -EINVAL;
  1223. }
  1224. ret = AKI2C_RxData(&rwbuf[1], rwbuf[0]);
  1225. if (ret < 0)
  1226. return ret;
  1227. if (copy_to_user(argp, rwbuf, rwbuf[0]+1)) {
  1228. MAGN_LOG("copy_to_user failed.");
  1229. return -EFAULT;
  1230. }
  1231. break;
  1232. case ECS_IOCTL_GET_INFO:
  1233. #ifdef AKM_Device_AK8963
  1234. sense_info[0] = AK8963_REG_WIA;
  1235. #else
  1236. sense_info[0] = AK09911_REG_WIA1;
  1237. #endif
  1238. ret = AKI2C_RxData(sense_info, AKM_SENSOR_INFO_SIZE);
  1239. if (ret < 0)
  1240. return ret;
  1241. if (copy_to_user(argp, sense_info, AKM_SENSOR_INFO_SIZE)) {
  1242. MAGN_LOG("copy_to_user failed.");
  1243. return -EFAULT;
  1244. }
  1245. break;
  1246. case ECS_IOCTL_GET_CONF:
  1247. /* Set FUSE access mode */
  1248. #ifdef AKM_Device_AK8963
  1249. ret = AKECS_SetMode(AK8963_MODE_FUSE_ACCESS);
  1250. #else
  1251. ret = AKECS_SetMode(AK09911_MODE_FUSE_ACCESS);
  1252. #endif
  1253. if (ret < 0)
  1254. return ret;
  1255. #ifdef AKM_Device_AK8963
  1256. sense_conf[0] = AK8963_FUSE_ASAX;
  1257. #else
  1258. sense_conf[0] = AK09911_FUSE_ASAX;
  1259. #endif
  1260. ret = AKI2C_RxData(sense_conf, AKM_SENSOR_CONF_SIZE);
  1261. if (ret < 0)
  1262. return ret;
  1263. if (copy_to_user(argp, sense_conf, AKM_SENSOR_CONF_SIZE)) {
  1264. MAGN_LOG("copy_to_user failed.");
  1265. return -EFAULT;
  1266. }
  1267. #ifdef AKM_Device_AK8963
  1268. ret = AKECS_SetMode(AK8963_MODE_POWERDOWN);
  1269. #else
  1270. ret = AKECS_SetMode(AK09911_MODE_POWERDOWN);
  1271. #endif
  1272. if (ret < 0)
  1273. return ret;
  1274. break;
  1275. case ECS_IOCTL_SET_MODE:
  1276. /* AKMFUNC("ECS_IOCTL_SET_MODE"); */
  1277. if (argp == NULL) {
  1278. MAGN_LOG("invalid argument.");
  1279. return -EINVAL;
  1280. }
  1281. if (copy_from_user(&mode, argp, sizeof(mode))) {
  1282. MAGN_LOG("copy_from_user failed.");
  1283. return -EFAULT;
  1284. }
  1285. ret = AKECS_SetMode(mode); /* MATCH command from AKMD PART */
  1286. if (ret < 0)
  1287. return ret;
  1288. break;
  1289. case ECS_IOCTL_GETDATA:
  1290. /* AKMFUNC("ECS_IOCTL_GETDATA"); */
  1291. ret = AKECS_GetData(sData, SENSOR_DATA_SIZE);
  1292. if (ret < 0)
  1293. return ret;
  1294. if (copy_to_user(argp, sData, sizeof(sData))) {
  1295. MAGN_LOG("copy_to_user failed.");
  1296. return -EFAULT;
  1297. }
  1298. break;
  1299. case ECS_IOCTL_SET_YPR_09911:
  1300. /* AKMFUNC("ECS_IOCTL_SET_YPR"); */
  1301. if (argp == NULL) {
  1302. MAGN_LOG("invalid argument.");
  1303. return -EINVAL;
  1304. }
  1305. if (copy_from_user(value, argp, sizeof(value))) {
  1306. MAGN_LOG("copy_from_user failed.");
  1307. return -EFAULT;
  1308. }
  1309. AKECS_SaveData(value);
  1310. break;
  1311. case ECS_IOCTL_GET_OPEN_STATUS:
  1312. /* AKMFUNC("IOCTL_GET_OPEN_STATUS"); */
  1313. status = AKECS_GetOpenStatus();
  1314. /* MAGN_LOG("AKECS_GetOpenStatus returned (%d)", status); */
  1315. if (copy_to_user(argp, &status, sizeof(status))) {
  1316. MAGN_LOG("copy_to_user failed.");
  1317. return -EFAULT;
  1318. }
  1319. break;
  1320. case ECS_IOCTL_GET_CLOSE_STATUS:
  1321. /* AKMFUNC("IOCTL_GET_CLOSE_STATUS"); */
  1322. status = AKECS_GetCloseStatus();
  1323. /* MAGN_LOG("AKECS_GetCloseStatus returned (%d)", status); */
  1324. if (copy_to_user(argp, &status, sizeof(status))) {
  1325. MAGN_LOG("copy_to_user failed.");
  1326. return -EFAULT;
  1327. }
  1328. break;
  1329. case ECS_IOCTL_GET_OSENSOR_STATUS:
  1330. /* AKMFUNC("ECS_IOCTL_GET_OSENSOR_STATUS"); */
  1331. status = atomic_read(&o_flag);
  1332. if (copy_to_user(argp, &status, sizeof(status))) {
  1333. MAGN_LOG("copy_to_user failed.");
  1334. return -EFAULT;
  1335. }
  1336. break;
  1337. case ECS_IOCTL_GET_DELAY_09911:
  1338. /* AKMFUNC("IOCTL_GET_DELAY"); */
  1339. delay[0] = (int)akmd_delay * 1000000;
  1340. delay[1] = (int)akmd_delay * 1000000;
  1341. delay[2] = (int)akmd_delay * 1000000;
  1342. if (copy_to_user(argp, delay, sizeof(delay))) {
  1343. MAGN_LOG("copy_to_user failed.");
  1344. return -EFAULT;
  1345. }
  1346. break;
  1347. case ECS_IOCTL_GET_LAYOUT_09911:
  1348. layout = atomic_read(&data->layout);
  1349. MAG_ERR("layout=%d\r\n", layout);
  1350. if (copy_to_user(argp, &layout, sizeof(char))) {
  1351. MAGN_LOG("copy_to_user failed.");
  1352. return -EFAULT;
  1353. }
  1354. break;
  1355. case MSENSOR_IOCTL_READ_CHIPINFO:
  1356. if (argp == NULL) {
  1357. MAG_ERR("IO parameter pointer is NULL!\r\n");
  1358. break;
  1359. }
  1360. akm09911_ReadChipInfo(buff, AKM09911_BUFSIZE);
  1361. if (copy_to_user(argp, buff, strlen(buff)+1))
  1362. return -EFAULT;
  1363. break;
  1364. case MSENSOR_IOCTL_READ_SENSORDATA:
  1365. if (argp == NULL) {
  1366. MAG_ERR("IO parameter pointer is NULL!\r\n");
  1367. break;
  1368. }
  1369. AKECS_GetRawData(buff, AKM09911_BUFSIZE);
  1370. if (copy_to_user(argp, buff, strlen(buff)+1))
  1371. return -EFAULT;
  1372. break;
  1373. case MSENSOR_IOCTL_SENSOR_ENABLE:
  1374. if (argp == NULL) {
  1375. MAG_ERR("IO parameter pointer is NULL!\r\n");
  1376. break;
  1377. }
  1378. if (copy_from_user(&enable, argp, sizeof(enable))) {
  1379. MAGN_LOG("copy_from_user failed.");
  1380. return -EFAULT;
  1381. }
  1382. MAGN_LOG("MSENSOR_IOCTL_SENSOR_ENABLE enable=%d!\r\n", enable);
  1383. factory_mode = 1;
  1384. if (1 == enable) {
  1385. atomic_set(&o_flag, 1);
  1386. atomic_set(&open_flag, 1);
  1387. } else {
  1388. atomic_set(&o_flag, 0);
  1389. if (atomic_read(&m_flag) == 0)
  1390. atomic_set(&open_flag, 0);
  1391. }
  1392. wake_up(&open_wq);
  1393. break;
  1394. case MSENSOR_IOCTL_READ_FACTORY_SENSORDATA:
  1395. if (argp == NULL) {
  1396. MAG_ERR("IO parameter pointer is NULL!\r\n");
  1397. break;
  1398. }
  1399. /* AKECS_GetRawData(buff, AKM09911_BUFSIZE); */
  1400. osensor_data = (struct hwm_sensor_data *)buff;
  1401. mutex_lock(&sensor_data_mutex);
  1402. osensor_data->values[0] = sensor_data[13] * CONVERT_O;
  1403. osensor_data->values[1] = sensor_data[14] * CONVERT_O;
  1404. osensor_data->values[2] = sensor_data[15] * CONVERT_O;
  1405. osensor_data->status = sensor_data[8];
  1406. osensor_data->value_divide = CONVERT_O_DIV;
  1407. mutex_unlock(&sensor_data_mutex);
  1408. sprintf(buff, "%x %x %x %x %x", osensor_data->values[0], osensor_data->values[1],
  1409. osensor_data->values[2], osensor_data->status, osensor_data->value_divide);
  1410. if (copy_to_user(argp, buff, strlen(buff)+1))
  1411. return -EFAULT;
  1412. break;
  1413. default:
  1414. MAG_ERR("%s not supported = 0x%04x", __func__, cmd);
  1415. return -ENOIOCTLCMD;
  1416. }
  1417. return 0;
  1418. }
  1419. #ifdef CONFIG_COMPAT
  1420. static long akm09911_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  1421. {
  1422. long ret;
  1423. void __user *arg32 = compat_ptr(arg);
  1424. if (!file->f_op || !file->f_op->unlocked_ioctl)
  1425. return -ENOTTY;
  1426. switch (cmd) {
  1427. case COMPAT_ECS_IOCTL_WRITE:
  1428. if (arg32 == NULL) {
  1429. MAGN_LOG("invalid argument.");
  1430. return -EINVAL;
  1431. }
  1432. ret = file->f_op->unlocked_ioctl(file, ECS_IOCTL_WRITE,
  1433. (unsigned long)arg32);
  1434. if (ret) {
  1435. MAGN_LOG("ECS_IOCTL_WRITE unlocked_ioctl failed.");
  1436. return ret;
  1437. }
  1438. break;
  1439. case COMPAT_ECS_IOCTL_RESET:
  1440. ret = file->f_op->unlocked_ioctl(file, ECS_IOCTL_RESET,
  1441. (unsigned long)arg32);
  1442. if (ret) {
  1443. MAGN_LOG("ECS_IOCTL_RESET unlocked_ioctl failed.");
  1444. return ret;
  1445. }
  1446. break;
  1447. case COMPAT_ECS_IOCTL_READ:
  1448. if (arg32 == NULL) {
  1449. MAGN_LOG("invalid argument.");
  1450. return -EINVAL;
  1451. }
  1452. ret = file->f_op->unlocked_ioctl(file, ECS_IOCTL_READ,
  1453. (unsigned long)arg32);
  1454. if (ret) {
  1455. MAGN_LOG("ECS_IOCTL_WRITE unlocked_ioctl failed.");
  1456. return ret;
  1457. }
  1458. break;
  1459. case COMPAT_ECS_IOCTL_GET_INFO:
  1460. if (arg32 == NULL) {
  1461. MAGN_LOG("invalid argument.");
  1462. return -EINVAL;
  1463. }
  1464. ret = file->f_op->unlocked_ioctl(file, ECS_IOCTL_GET_INFO,
  1465. (unsigned long)(arg32));
  1466. if (ret) {
  1467. MAGN_LOG("ECS_IOCTL_GET_INFO unlocked_ioctl failed.");
  1468. return ret;
  1469. }
  1470. break;
  1471. case COMPAT_ECS_IOCTL_GET_CONF:
  1472. if (arg32 == NULL) {
  1473. MAGN_LOG("invalid argument.");
  1474. return -EINVAL;
  1475. }
  1476. ret = file->f_op->unlocked_ioctl(file, ECS_IOCTL_GET_CONF,
  1477. (unsigned long)(arg32));
  1478. if (ret) {
  1479. MAGN_LOG("ECS_IOCTL_GET_CONF unlocked_ioctl failed.");
  1480. return ret;
  1481. }
  1482. break;
  1483. case COMPAT_ECS_IOCTL_SET_MODE:
  1484. if (arg32 == NULL) {
  1485. MAGN_LOG("invalid argument.");
  1486. return -EINVAL;
  1487. }
  1488. ret = file->f_op->unlocked_ioctl(file, ECS_IOCTL_SET_MODE,
  1489. (unsigned long)(arg32));
  1490. if (ret) {
  1491. MAGN_LOG("ECS_IOCTL_SET_MODE unlocked_ioctl failed.");
  1492. return ret;
  1493. }
  1494. break;
  1495. case COMPAT_ECS_IOCTL_GETDATA:
  1496. ret = file->f_op->unlocked_ioctl(file, ECS_IOCTL_GETDATA,
  1497. (unsigned long)(arg32));
  1498. if (ret) {
  1499. MAGN_LOG("ECS_IOCTL_GETDATA unlocked_ioctl failed.");
  1500. return ret;
  1501. }
  1502. break;
  1503. case COMPAT_ECS_IOCTL_SET_YPR_09911:
  1504. ret = file->f_op->unlocked_ioctl(file, ECS_IOCTL_SET_YPR_09911,
  1505. (unsigned long)(arg32));
  1506. if (ret) {
  1507. MAGN_LOG("ECS_IOCTL_SET_YPR_09911 unlocked_ioctl failed.");
  1508. return ret;
  1509. }
  1510. break;
  1511. case COMPAT_ECS_IOCTL_GET_OPEN_STATUS:
  1512. ret = file->f_op->unlocked_ioctl(file, ECS_IOCTL_GET_OPEN_STATUS,
  1513. (unsigned long)(arg32));
  1514. if (ret) {
  1515. MAGN_LOG("ECS_IOCTL_GET_OPEN_STATUS unlocked_ioctl failed.");
  1516. return ret;
  1517. }
  1518. break;
  1519. case COMPAT_ECS_IOCTL_GET_CLOSE_STATUS:
  1520. ret = file->f_op->unlocked_ioctl(file, ECS_IOCTL_GET_CLOSE_STATUS,
  1521. (unsigned long)(arg32));
  1522. if (ret) {
  1523. MAGN_LOG("ECS_IOCTL_GET_CLOSE_STATUS unlocked_ioctl failed.");
  1524. return ret;
  1525. }
  1526. break;
  1527. case COMPAT_ECS_IOCTL_GET_OSENSOR_STATUS:
  1528. ret = file->f_op->unlocked_ioctl(file, ECS_IOCTL_GET_OSENSOR_STATUS,
  1529. (unsigned long)(arg32));
  1530. if (ret) {
  1531. MAGN_LOG("ECS_IOCTL_GET_OSENSOR_STATUS unlocked_ioctl failed.");
  1532. return ret;
  1533. }
  1534. break;
  1535. case COMPAT_ECS_IOCTL_GET_DELAY_09911:
  1536. ret = file->f_op->unlocked_ioctl(file, ECS_IOCTL_GET_DELAY_09911,
  1537. (unsigned long)(arg32));
  1538. if (ret) {
  1539. MAGN_LOG("ECS_IOCTL_GET_DELAY_09911 unlocked_ioctl failed.");
  1540. return ret;
  1541. }
  1542. break;
  1543. case COMPAT_ECS_IOCTL_GET_LAYOUT_09911:
  1544. ret = file->f_op->unlocked_ioctl(file, ECS_IOCTL_GET_LAYOUT_09911,
  1545. (unsigned long)arg32);
  1546. if (ret) {
  1547. MAGN_LOG("ECS_IOCTL_GET_LAYOUT_09911 unlocked_ioctl failed.");
  1548. return ret;
  1549. }
  1550. break;
  1551. case COMPAT_MSENSOR_IOCTL_READ_CHIPINFO:
  1552. ret = file->f_op->unlocked_ioctl(file, MSENSOR_IOCTL_READ_CHIPINFO,
  1553. (unsigned long)arg32);
  1554. if (ret) {
  1555. MAGN_LOG("MSENSOR_IOCTL_READ_CHIPINFO unlocked_ioctl failed.");
  1556. return ret;
  1557. }
  1558. break;
  1559. case COMPAT_MSENSOR_IOCTL_READ_SENSORDATA:
  1560. ret = file->f_op->unlocked_ioctl(file, MSENSOR_IOCTL_READ_SENSORDATA,
  1561. (unsigned long)arg32);
  1562. if (ret) {
  1563. MAGN_LOG("MSENSOR_IOCTL_READ_SENSORDATA unlocked_ioctl failed.");
  1564. return ret;
  1565. }
  1566. break;
  1567. case COMPAT_MSENSOR_IOCTL_SENSOR_ENABLE:
  1568. if (arg32 == NULL) {
  1569. MAGN_LOG("invalid argument.");
  1570. return -EINVAL;
  1571. }
  1572. ret = file->f_op->unlocked_ioctl(file, MSENSOR_IOCTL_SENSOR_ENABLE,
  1573. (unsigned long)(arg32));
  1574. if (ret) {
  1575. MAGN_LOG("MSENSOR_IOCTL_SENSOR_ENABLE unlocked_ioctl failed.");
  1576. return ret;
  1577. }
  1578. break;
  1579. case COMPAT_MSENSOR_IOCTL_READ_FACTORY_SENSORDATA:
  1580. if (arg32 == NULL) {
  1581. MAGN_LOG("invalid argument.");
  1582. return -EINVAL;
  1583. }
  1584. ret = file->f_op->unlocked_ioctl(file, MSENSOR_IOCTL_READ_FACTORY_SENSORDATA,
  1585. (unsigned long)(arg32));
  1586. if (ret) {
  1587. MAGN_LOG("MSENSOR_IOCTL_READ_FACTORY_SENSORDATA unlocked_ioctl failed.");
  1588. return ret;
  1589. }
  1590. break;
  1591. default:
  1592. MAGN_LOG("%s not supported = 0x%04x", __func__, cmd);
  1593. return -ENOIOCTLCMD;
  1594. }
  1595. return 0;
  1596. }
  1597. #endif
  1598. /*----------------------------------------------------------------------------*/
  1599. static const struct file_operations akm09911_fops = {
  1600. .owner = THIS_MODULE,
  1601. .open = akm09911_open,
  1602. .release = akm09911_release,
  1603. /* .unlocked_ioctl = akm09911_ioctl, */
  1604. .unlocked_ioctl = akm09911_unlocked_ioctl,
  1605. #ifdef CONFIG_COMPAT
  1606. .compat_ioctl = akm09911_compat_ioctl,
  1607. #endif
  1608. };
  1609. /*----------------------------------------------------------------------------*/
  1610. static struct miscdevice akm09911_device = {
  1611. .minor = MISC_DYNAMIC_MINOR,
  1612. .name = "msensor",
  1613. .fops = &akm09911_fops,
  1614. };
  1615. /*----------------------------------------------------------------------------*/
  1616. int akm09911_operate(void *self, uint32_t command, void *buff_in, int size_in,
  1617. void *buff_out, int size_out, int *actualout)
  1618. {
  1619. int err = 0;
  1620. int value;
  1621. struct hwm_sensor_data *msensor_data;
  1622. #if DEBUG
  1623. struct i2c_client *client = this_client;
  1624. struct akm09911_i2c_data *data = i2c_get_clientdata(client);
  1625. #endif
  1626. #if DEBUG
  1627. if (atomic_read(&data->trace) & AMK_FUN_DEBUG)
  1628. AKMFUNC("akm09911_operate");
  1629. #endif
  1630. switch (command) {
  1631. case SENSOR_DELAY:
  1632. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  1633. MAG_ERR("Set delay parameter error!\n");
  1634. err = -EINVAL;
  1635. } else {
  1636. value = *(int *)buff_in;
  1637. if (value <= 10)
  1638. value = 10;
  1639. akmd_delay = value;
  1640. }
  1641. break;
  1642. case SENSOR_ENABLE:
  1643. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  1644. MAG_ERR("Enable sensor parameter error!\n");
  1645. err = -EINVAL;
  1646. } else {
  1647. value = *(int *)buff_in;
  1648. if (value == 1) {
  1649. atomic_set(&m_flag, 1);
  1650. atomic_set(&open_flag, 1);
  1651. } else {
  1652. atomic_set(&m_flag, 0);
  1653. if ((atomic_read(&o_flag) == 0))
  1654. atomic_set(&open_flag, 0);
  1655. }
  1656. wake_up(&open_wq);
  1657. /* TODO: turn device into standby or normal mode */
  1658. }
  1659. break;
  1660. case SENSOR_GET_DATA:
  1661. if ((buff_out == NULL) || (size_out < sizeof(struct hwm_sensor_data))) {
  1662. MAG_ERR("get sensor data parameter error!\n");
  1663. err = -EINVAL;
  1664. } else {
  1665. msensor_data = (struct hwm_sensor_data *)buff_out;
  1666. mutex_lock(&sensor_data_mutex);
  1667. msensor_data->values[0] = sensor_data[5] * CONVERT_M;
  1668. msensor_data->values[1] = sensor_data[6] * CONVERT_M;
  1669. msensor_data->values[2] = sensor_data[7] * CONVERT_M;
  1670. msensor_data->status = sensor_data[8];
  1671. msensor_data->value_divide = CONVERT_M_DIV;
  1672. mutex_unlock(&sensor_data_mutex);
  1673. #if DEBUG
  1674. if (atomic_read(&data->trace) & AMK_HWM_DEBUG) {
  1675. MAGN_LOG("Hwm get m-sensor data: %d, %d, %d. divide %d, status %d!\n",
  1676. msensor_data->values[0], msensor_data->values[1], msensor_data->values[2],
  1677. msensor_data->value_divide, msensor_data->status);
  1678. }
  1679. #endif
  1680. }
  1681. break;
  1682. default:
  1683. MAG_ERR("msensor operate function no this parameter %d!\n", command);
  1684. err = -1;
  1685. break;
  1686. }
  1687. return err;
  1688. }
  1689. /*----------------------------------------------------------------------------*/
  1690. int akm09911_orientation_operate(void *self, uint32_t command, void *buff_in, int size_in,
  1691. void *buff_out, int size_out, int *actualout)
  1692. {
  1693. int err = 0;
  1694. int value;
  1695. struct hwm_sensor_data *osensor_data;
  1696. #if DEBUG
  1697. struct i2c_client *client = this_client;
  1698. struct akm09911_i2c_data *data = i2c_get_clientdata(client);
  1699. #endif
  1700. #if DEBUG
  1701. if (atomic_read(&data->trace) & AMK_FUN_DEBUG)
  1702. AKMFUNC("akm09911_orientation_operate");
  1703. #endif
  1704. switch (command) {
  1705. case SENSOR_DELAY:
  1706. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  1707. MAG_ERR("Set delay parameter error!\n");
  1708. err = -EINVAL;
  1709. } else {
  1710. value = *(int *)buff_in;
  1711. if (value <= 10)
  1712. value = 10;
  1713. akmd_delay = value;
  1714. }
  1715. break;
  1716. case SENSOR_ENABLE:
  1717. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  1718. MAG_ERR("Enable sensor parameter error!\n");
  1719. err = -EINVAL;
  1720. } else {
  1721. value = *(int *)buff_in;
  1722. if (mEnabled <= 0) {
  1723. if (value == 1) {
  1724. atomic_set(&o_flag, 1);
  1725. atomic_set(&open_flag, 1);
  1726. }
  1727. } else if (mEnabled == 1) {
  1728. if (!value) {
  1729. atomic_set(&o_flag, 0);
  1730. if (atomic_read(&m_flag) == 0)
  1731. atomic_set(&open_flag, 0);
  1732. }
  1733. }
  1734. if (value) {
  1735. mEnabled++;
  1736. if (mEnabled > 32767)
  1737. mEnabled = 32767;
  1738. } else {
  1739. mEnabled--;
  1740. if (mEnabled < 0)
  1741. mEnabled = 0;
  1742. }
  1743. wake_up(&open_wq);
  1744. }
  1745. break;
  1746. case SENSOR_GET_DATA:
  1747. if ((buff_out == NULL) || (size_out < sizeof(struct hwm_sensor_data))) {
  1748. MAG_ERR("get sensor data parameter error!\n");
  1749. err = -EINVAL;
  1750. } else {
  1751. osensor_data = (struct hwm_sensor_data *)buff_out;
  1752. mutex_lock(&sensor_data_mutex);
  1753. osensor_data->values[0] = sensor_data[13] * CONVERT_O;
  1754. osensor_data->values[1] = sensor_data[14] * CONVERT_O;
  1755. osensor_data->values[2] = sensor_data[15] * CONVERT_O;
  1756. osensor_data->status = sensor_data[8];
  1757. osensor_data->value_divide = CONVERT_O_DIV;
  1758. mutex_unlock(&sensor_data_mutex);
  1759. #if DEBUG
  1760. if (atomic_read(&data->trace) & AMK_HWM_DEBUG) {
  1761. MAGN_LOG("Hwm get o-sensor data: %d, %d, %d. divide %d, status %d!\n",
  1762. osensor_data->values[0], osensor_data->values[1], osensor_data->values[2],
  1763. osensor_data->value_divide, osensor_data->status);
  1764. }
  1765. #endif
  1766. }
  1767. break;
  1768. default:
  1769. MAG_ERR("gsensor operate function no this parameter %d!\n", command);
  1770. err = -1;
  1771. break;
  1772. }
  1773. return err;
  1774. }
  1775. #ifdef AKM_Pseudogyro
  1776. /*----------------------------------------------------------------------------*/
  1777. /*----------------------------------------------------------------------------*/
  1778. int akm09911_gyroscope_operate(void *self, uint32_t command, void *buff_in, int size_in,
  1779. void *buff_out, int size_out, int *actualout)
  1780. {
  1781. int err = 0;
  1782. int value;
  1783. struct hwm_sensor_data *gyrosensor_data;
  1784. #if DEBUG
  1785. struct i2c_client *client = this_client;
  1786. struct akm09911_i2c_data *data = i2c_get_clientdata(client);
  1787. #endif
  1788. #if DEBUG
  1789. if (atomic_read(&data->trace) & AMK_FUN_DEBUG)
  1790. AKMFUNC("akm09911_gyroscope_operate");
  1791. #endif
  1792. switch (command) {
  1793. case SENSOR_DELAY:
  1794. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  1795. MAG_ERR("Set delay parameter error!\n");
  1796. err = -EINVAL;
  1797. } else {
  1798. value = *(int *)buff_in;
  1799. akmd_delay = 10; /* fix to 100Hz */
  1800. }
  1801. break;
  1802. case SENSOR_ENABLE:
  1803. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  1804. MAG_ERR("Enable sensor parameter error!\n");
  1805. err = -EINVAL;
  1806. } else {
  1807. value = *(int *)buff_in;
  1808. if (mEnabled <= 0) {
  1809. if (value == 1) {
  1810. atomic_set(&o_flag, 1);
  1811. atomic_set(&open_flag, 1);
  1812. }
  1813. } else if (mEnabled == 1) {
  1814. if (!value) {
  1815. atomic_set(&o_flag, 0);
  1816. if (atomic_read(&m_flag) == 0)
  1817. atomic_set(&open_flag, 0);
  1818. }
  1819. }
  1820. if (value) {
  1821. mEnabled++;
  1822. if (mEnabled > 32767)
  1823. mEnabled = 32767;
  1824. } else {
  1825. mEnabled--;
  1826. if (mEnabled < 0)
  1827. mEnabled = 0;
  1828. }
  1829. wake_up(&open_wq);
  1830. }
  1831. break;
  1832. case SENSOR_GET_DATA:
  1833. if ((buff_out == NULL) || (size_out < sizeof(struct hwm_sensor_data))) {
  1834. MAG_ERR("get sensor data parameter error!\n");
  1835. err = -EINVAL;
  1836. } else {
  1837. gyrosensor_data = (struct hwm_sensor_data *)buff_out;
  1838. mutex_lock(&sensor_data_mutex);
  1839. gyrosensor_data->values[0] = sensor_data[9] * CONVERT_Q16;
  1840. gyrosensor_data->values[1] = sensor_data[10] * CONVERT_Q16;
  1841. gyrosensor_data->values[2] = sensor_data[11] * CONVERT_Q16;
  1842. gyrosensor_data->status = sensor_data[12];
  1843. gyrosensor_data->value_divide = CONVERT_Q16_DIV;
  1844. mutex_unlock(&sensor_data_mutex);
  1845. #if DEBUG
  1846. if (atomic_read(&data->trace) & AMK_HWM_DEBUG) {
  1847. MAGN_LOG("Hwm get gyro-sensor data: %d, %d, %d. divide %d, status %d!\n",
  1848. gyrosensor_data->values[0], gyrosensor_data->values[1], gyrosensor_data->values[2],
  1849. gyrosensor_data->value_divide, gyrosensor_data->status);
  1850. }
  1851. #endif
  1852. }
  1853. break;
  1854. default:
  1855. MAG_ERR("gyrosensor operate function no this parameter %d!\n", command);
  1856. err = -1;
  1857. break;
  1858. }
  1859. return err;
  1860. }
  1861. /*----------------------------------------------------------------------------*/
  1862. int akm09911_rotation_vector_operate(void *self, uint32_t command, void *buff_in, int size_in,
  1863. void *buff_out, int size_out, int *actualout)
  1864. {
  1865. int err = 0;
  1866. int value;
  1867. struct hwm_sensor_data *RV_data;
  1868. #if DEBUG
  1869. struct i2c_client *client = this_client;
  1870. struct akm09911_i2c_data *data = i2c_get_clientdata(client);
  1871. #endif
  1872. #if DEBUG
  1873. if (atomic_read(&data->trace) & AMK_FUN_DEBUG)
  1874. AKMFUNC("akm09911_rotation_vector_operate");
  1875. #endif
  1876. switch (command) {
  1877. case SENSOR_DELAY:
  1878. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  1879. MAG_ERR("Set delay parameter error!\n");
  1880. err = -EINVAL;
  1881. } else {
  1882. value = *(int *)buff_in;
  1883. akmd_delay = 10; /* fix to 100Hz */
  1884. }
  1885. break;
  1886. case SENSOR_ENABLE:
  1887. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  1888. MAG_ERR("Enable sensor parameter error!\n");
  1889. err = -EINVAL;
  1890. } else {
  1891. value = *(int *)buff_in;
  1892. if (mEnabled <= 0) {
  1893. if (value == 1) {
  1894. atomic_set(&o_flag, 1);
  1895. atomic_set(&open_flag, 1);
  1896. }
  1897. } else if (mEnabled == 1) {
  1898. if (!value) {
  1899. atomic_set(&o_flag, 0);
  1900. if ((atomic_read(&m_flag) == 0))
  1901. atomic_set(&open_flag, 0);
  1902. }
  1903. }
  1904. if (value) {
  1905. mEnabled++;
  1906. if (mEnabled > 32767)
  1907. mEnabled = 32767;
  1908. } else {
  1909. mEnabled--;
  1910. if (mEnabled < 0)
  1911. mEnabled = 0;
  1912. }
  1913. wake_up(&open_wq);
  1914. }
  1915. break;
  1916. case SENSOR_GET_DATA:
  1917. if ((buff_out == NULL) || (size_out < sizeof(struct hwm_sensor_data))) {
  1918. MAG_ERR("get sensor data parameter error!\n");
  1919. err = -EINVAL;
  1920. } else {
  1921. RV_data = (struct hwm_sensor_data *)buff_out;
  1922. mutex_lock(&sensor_data_mutex);
  1923. RV_data->values[0] = sensor_data[22] * CONVERT_Q16;
  1924. RV_data->values[1] = sensor_data[23] * CONVERT_Q16;
  1925. RV_data->values[2] = sensor_data[24] * CONVERT_Q16;
  1926. RV_data->status = 0; /* sensor_data[19]; fix w-> 0 w */
  1927. RV_data->value_divide = CONVERT_Q16_DIV;
  1928. mutex_unlock(&sensor_data_mutex);
  1929. #if DEBUG
  1930. if (atomic_read(&data->trace) & AMK_HWM_DEBUG) {
  1931. MAGN_LOG("Hwm get rv-sensor data: %d, %d, %d. divide %d, status %d!\n",
  1932. RV_data->values[0], RV_data->values[1], RV_data->values[2],
  1933. RV_data->value_divide, RV_data->status);
  1934. }
  1935. #endif
  1936. }
  1937. break;
  1938. default:
  1939. MAG_ERR("RV operate function no this parameter %d!\n", command);
  1940. err = -1;
  1941. break;
  1942. }
  1943. return err;
  1944. }
  1945. /*----------------------------------------------------------------------------*/
  1946. int akm09911_gravity_operate(void *self, uint32_t command, void *buff_in, int size_in,
  1947. void *buff_out, int size_out, int *actualout)
  1948. {
  1949. int err = 0;
  1950. int value;
  1951. struct hwm_sensor_data *gravity_data;
  1952. #if DEBUG
  1953. struct i2c_client *client = this_client;
  1954. struct akm09911_i2c_data *data = i2c_get_clientdata(client);
  1955. #endif
  1956. #if DEBUG
  1957. if (atomic_read(&data->trace) & AMK_FUN_DEBUG)
  1958. AKMFUNC("akm09911_gravity_operate");
  1959. #endif
  1960. switch (command) {
  1961. case SENSOR_DELAY:
  1962. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  1963. MAG_ERR("Set delay parameter error!\n");
  1964. err = -EINVAL;
  1965. } else {
  1966. value = *(int *)buff_in;
  1967. if (value <= 10)
  1968. value = 10;
  1969. akmd_delay = value;
  1970. }
  1971. break;
  1972. case SENSOR_ENABLE:
  1973. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  1974. MAG_ERR("Enable sensor parameter error!\n");
  1975. err = -EINVAL;
  1976. } else {
  1977. value = *(int *)buff_in;
  1978. if (mEnabled <= 0) {
  1979. if (value == 1) {
  1980. atomic_set(&o_flag, 1);
  1981. atomic_set(&open_flag, 1);
  1982. }
  1983. } else if (mEnabled == 1) {
  1984. if (!value) {
  1985. atomic_set(&o_flag, 0);
  1986. if (atomic_read(&m_flag) == 0)
  1987. atomic_set(&open_flag, 0);
  1988. }
  1989. }
  1990. if (value) {
  1991. mEnabled++;
  1992. if (mEnabled > 32767)
  1993. mEnabled = 32767;
  1994. } else {
  1995. mEnabled--;
  1996. if (mEnabled < 0)
  1997. mEnabled = 0;
  1998. }
  1999. wake_up(&open_wq);
  2000. }
  2001. break;
  2002. case SENSOR_GET_DATA:
  2003. if ((buff_out == NULL) || (size_out < sizeof(struct hwm_sensor_data))) {
  2004. MAG_ERR("get sensor data parameter error!\n");
  2005. err = -EINVAL;
  2006. } else {
  2007. gravity_data = (struct hwm_sensor_data *)buff_out;
  2008. mutex_lock(&sensor_data_mutex);
  2009. gravity_data->values[0] = sensor_data[16] * CONVERT_Q16;
  2010. gravity_data->values[1] = sensor_data[17] * CONVERT_Q16;
  2011. gravity_data->values[2] = sensor_data[18] * CONVERT_Q16;
  2012. gravity_data->status = sensor_data[4];
  2013. gravity_data->value_divide = CONVERT_Q16_DIV;
  2014. mutex_unlock(&sensor_data_mutex);
  2015. #if DEBUG
  2016. if (atomic_read(&data->trace) & AMK_HWM_DEBUG) {
  2017. MAGN_LOG("Hwm get gravity-sensor data: %d, %d, %d. divide %d, status %d!\n",
  2018. gravity_data->values[0], gravity_data->values[1], gravity_data->values[2],
  2019. gravity_data->value_divide, gravity_data->status);
  2020. }
  2021. #endif
  2022. }
  2023. break;
  2024. default:
  2025. MAG_ERR("gravity operate function no this parameter %d!\n", command);
  2026. err = -1;
  2027. break;
  2028. }
  2029. return err;
  2030. }
  2031. /*----------------------------------------------------------------------------*/
  2032. int akm09911_linear_accelration_operate(void *self, uint32_t command, void *buff_in, int size_in,
  2033. void *buff_out, int size_out, int *actualout)
  2034. {
  2035. int err = 0;
  2036. int value;
  2037. struct hwm_sensor_data *LA_data;
  2038. #if DEBUG
  2039. struct i2c_client *client = this_client;
  2040. struct akm09911_i2c_data *data = i2c_get_clientdata(client);
  2041. #endif
  2042. #if DEBUG
  2043. if (atomic_read(&data->trace) & AMK_FUN_DEBUG)
  2044. AKMFUNC("akm09911_linear_accelration_operate");
  2045. #endif
  2046. switch (command) {
  2047. case SENSOR_DELAY:
  2048. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  2049. MAG_ERR("Set delay parameter error!\n");
  2050. err = -EINVAL;
  2051. } else {
  2052. value = *(int *)buff_in;
  2053. if (value <= 10)
  2054. value = 10;
  2055. akmd_delay = value;
  2056. }
  2057. break;
  2058. case SENSOR_ENABLE:
  2059. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  2060. MAG_ERR("Enable sensor parameter error!\n");
  2061. err = -EINVAL;
  2062. } else {
  2063. value = *(int *)buff_in;
  2064. if (mEnabled <= 0) {
  2065. if (value == 1) {
  2066. atomic_set(&o_flag, 1);
  2067. atomic_set(&open_flag, 1);
  2068. }
  2069. } else if (mEnabled == 1) {
  2070. if (!value) {
  2071. atomic_set(&o_flag, 0);
  2072. if ((atomic_read(&m_flag) == 0))
  2073. atomic_set(&open_flag, 0);
  2074. }
  2075. }
  2076. if (value) {
  2077. mEnabled++;
  2078. if (mEnabled > 32767)
  2079. mEnabled = 32767;
  2080. } else {
  2081. mEnabled--;
  2082. if (mEnabled < 0)
  2083. mEnabled = 0;
  2084. }
  2085. wake_up(&open_wq);
  2086. }
  2087. break;
  2088. case SENSOR_GET_DATA:
  2089. if ((buff_out == NULL) || (size_out < sizeof(struct hwm_sensor_data))) {
  2090. MAG_ERR("get sensor data parameter error!\n");
  2091. err = -EINVAL;
  2092. } else {
  2093. LA_data = (struct hwm_sensor_data *)buff_out;
  2094. mutex_lock(&sensor_data_mutex);
  2095. LA_data->values[0] = sensor_data[19] * CONVERT_Q16;
  2096. LA_data->values[1] = sensor_data[20] * CONVERT_Q16;
  2097. LA_data->values[2] = sensor_data[21] * CONVERT_Q16;
  2098. LA_data->status = sensor_data[4];
  2099. LA_data->value_divide = CONVERT_Q16_DIV;
  2100. mutex_unlock(&sensor_data_mutex);
  2101. #if DEBUG
  2102. if (atomic_read(&data->trace) & AMK_HWM_DEBUG) {
  2103. MAGN_LOG("Hwm get LA-sensor data: %d, %d, %d. divide %d, status %d!\n",
  2104. LA_data->values[0], LA_data->values[1], LA_data->values[2],
  2105. LA_data->value_divide, LA_data->status);
  2106. }
  2107. #endif
  2108. }
  2109. break;
  2110. default:
  2111. MAG_ERR("linear_accelration operate function no this parameter %d!\n", command);
  2112. err = -1;
  2113. break;
  2114. }
  2115. return err;
  2116. }
  2117. #endif
  2118. /*----------------------------------------------------------------------------*/
  2119. static int akm09911_suspend(struct i2c_client *client, pm_message_t msg)
  2120. {
  2121. struct akm09911_i2c_data *obj = i2c_get_clientdata(client);
  2122. if (msg.event == PM_EVENT_SUSPEND)
  2123. akm09911_power(obj->hw, 0);
  2124. return 0;
  2125. }
  2126. /*----------------------------------------------------------------------------*/
  2127. static int akm09911_resume(struct i2c_client *client)
  2128. {
  2129. struct akm09911_i2c_data *obj = i2c_get_clientdata(client);
  2130. akm09911_power(obj->hw, 1);
  2131. return 0;
  2132. }
  2133. /*----------------------------------------------------------------------------*/
  2134. static int akm09911_i2c_detect(struct i2c_client *client, struct i2c_board_info *info)
  2135. {
  2136. strcpy(info->type, AKM09911_DEV_NAME);
  2137. return 0;
  2138. }
  2139. static int akm09911_m_enable(int en)
  2140. {
  2141. int value = 0;
  2142. int err = 0;
  2143. value = en;
  2144. factory_mode = 1;
  2145. if (value == 1) {
  2146. atomic_set(&m_flag, 1);
  2147. atomic_set(&open_flag, 1);
  2148. err = AKECS_SetMode(AK09911_MODE_SNG_MEASURE);
  2149. if (err < 0) {
  2150. MAG_ERR("%s:AKECS_SetMode Error.\n", __func__);
  2151. return err;
  2152. }
  2153. } else {
  2154. atomic_set(&m_flag, 0);
  2155. if (atomic_read(&o_flag) == 0) {
  2156. atomic_set(&open_flag, 0);
  2157. err = AKECS_SetMode(AK09911_MODE_POWERDOWN);
  2158. if (err < 0) {
  2159. MAG_ERR("%s:AKECS_SetMode Error.\n", __func__);
  2160. return err;
  2161. }
  2162. }
  2163. }
  2164. wake_up(&open_wq);
  2165. return err;
  2166. }
  2167. static int akm09911_m_set_delay(u64 ns)
  2168. {
  2169. int value = 0;
  2170. value = (int)ns/1000/1000;
  2171. if (value <= 10)
  2172. akmd_delay = 10;
  2173. else
  2174. akmd_delay = value;
  2175. return 0;
  2176. }
  2177. static int akm09911_m_open_report_data(int open)
  2178. {
  2179. return 0;
  2180. }
  2181. static int akm09911_m_get_data(int *x , int *y, int *z, int *status)
  2182. {
  2183. mutex_lock(&sensor_data_mutex);
  2184. *x = sensor_data[5] * CONVERT_M;
  2185. *y = sensor_data[6] * CONVERT_M;
  2186. *z = sensor_data[7] * CONVERT_M;
  2187. *status = sensor_data[8];
  2188. mutex_unlock(&sensor_data_mutex);
  2189. return 0;
  2190. }
  2191. static int akm09911_o_enable(int en)
  2192. {
  2193. int value = 0;
  2194. int err = 0;
  2195. value = en;
  2196. if (value == 1) {
  2197. atomic_set(&o_flag, 1);
  2198. atomic_set(&open_flag, 1);
  2199. err = AKECS_SetMode(AK09911_MODE_SNG_MEASURE);
  2200. if (err < 0) {
  2201. MAG_ERR("%s:AKECS_SetMode Error.\n", __func__);
  2202. return err;
  2203. }
  2204. } else {
  2205. atomic_set(&o_flag, 0);
  2206. if (atomic_read(&m_flag) == 0) {
  2207. atomic_set(&open_flag, 0);
  2208. err = AKECS_SetMode(AK09911_MODE_POWERDOWN);
  2209. if (err < 0) {
  2210. MAG_ERR("%s:AKECS_SetMode Error.\n", __func__);
  2211. return err;
  2212. }
  2213. }
  2214. }
  2215. wake_up(&open_wq);
  2216. return err;
  2217. }
  2218. static int akm09911_o_set_delay(u64 ns)
  2219. {
  2220. int value = 0;
  2221. value = (int)ns/1000/1000;
  2222. if (value <= 10)
  2223. akmd_delay = 10;
  2224. else
  2225. akmd_delay = value;
  2226. return 0;
  2227. }
  2228. static int akm09911_o_open_report_data(int open)
  2229. {
  2230. return 0;
  2231. }
  2232. static int akm09911_o_get_data(int *x , int *y, int *z, int *status)
  2233. {
  2234. mutex_lock(&sensor_data_mutex);
  2235. *x = sensor_data[13] * CONVERT_M;
  2236. *y = sensor_data[14] * CONVERT_M;
  2237. *z = sensor_data[15] * CONVERT_M;
  2238. *status = sensor_data[8];
  2239. mutex_unlock(&sensor_data_mutex);
  2240. return 0;
  2241. }
  2242. /*----------------------------------------------------------------------------*/
  2243. static int akm09911_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
  2244. {
  2245. int err = 0;
  2246. struct i2c_client *new_client;
  2247. struct akm09911_i2c_data *data;
  2248. struct mag_control_path ctl = {0};
  2249. struct mag_data_path mag_data = {0};
  2250. MAGN_LOG("akm09911_i2c_probe\n");
  2251. data = kzalloc(sizeof(struct akm09911_i2c_data), GFP_KERNEL);
  2252. if (!data) {
  2253. err = -ENOMEM;
  2254. goto exit;
  2255. }
  2256. data->hw = hw;
  2257. atomic_set(&data->layout, data->hw->direction);
  2258. atomic_set(&data->trace, 0);
  2259. mutex_init(&sense_data_mutex);
  2260. mutex_init(&sensor_data_mutex);
  2261. /* init_waitqueue_head(&data_ready_wq); */
  2262. init_waitqueue_head(&open_wq);
  2263. data->client = client;
  2264. new_client = data->client;
  2265. i2c_set_clientdata(new_client, data);
  2266. this_client = new_client;
  2267. /* Check connection */
  2268. err = AKECS_CheckDevice();
  2269. if (err < 0) {
  2270. MAG_ERR("AKM09911 akm09911_probe: check device connect error\n");
  2271. goto exit_init_failed;
  2272. }
  2273. /* Register sysfs attribute */
  2274. err = akm09911_create_attr(&(akm09911_init_info.platform_diver_addr->driver));
  2275. if (err) {
  2276. MAG_ERR("create attribute err = %d\n", err);
  2277. goto exit_sysfs_create_group_failed;
  2278. }
  2279. err = misc_register(&akm09911_device);
  2280. if (err) {
  2281. MAG_ERR("akm09911_device register failed\n");
  2282. goto exit_misc_device_register_failed;
  2283. }
  2284. ctl.is_use_common_factory = false;
  2285. ctl.m_enable = akm09911_m_enable;
  2286. ctl.m_set_delay = akm09911_m_set_delay;
  2287. ctl.m_open_report_data = akm09911_m_open_report_data;
  2288. ctl.o_enable = akm09911_o_enable;
  2289. ctl.o_set_delay = akm09911_o_set_delay;
  2290. ctl.o_open_report_data = akm09911_o_open_report_data;
  2291. ctl.is_report_input_direct = false;
  2292. ctl.is_support_batch = data->hw->is_batch_supported;
  2293. err = mag_register_control_path(&ctl);
  2294. if (err) {
  2295. MAG_ERR("register mag control path err\n");
  2296. goto exit_kfree;
  2297. }
  2298. mag_data.div_m = CONVERT_M_DIV;
  2299. mag_data.div_o = CONVERT_O_DIV;
  2300. mag_data.get_data_o = akm09911_o_get_data;
  2301. mag_data.get_data_m = akm09911_m_get_data;
  2302. err = mag_register_data_path(&mag_data);
  2303. if (err) {
  2304. MAG_ERR("register data control path err\n");
  2305. goto exit_kfree;
  2306. }
  2307. MAG_ERR("%s: OK\n", __func__);
  2308. akm09911_init_flag = 1;
  2309. return 0;
  2310. exit_sysfs_create_group_failed:
  2311. exit_init_failed:
  2312. exit_misc_device_register_failed:
  2313. exit_kfree:
  2314. kfree(data);
  2315. exit:
  2316. MAG_ERR("%s: err = %d\n", __func__, err);
  2317. akm09911_init_flag = -1;
  2318. return err;
  2319. }
  2320. /*----------------------------------------------------------------------------*/
  2321. static int akm09911_i2c_remove(struct i2c_client *client)
  2322. {
  2323. int err;
  2324. err = akm09911_delete_attr(&(akm09911_init_info.platform_diver_addr->driver));
  2325. if (err)
  2326. MAG_ERR("akm09911_delete_attr fail: %d\n", err);
  2327. this_client = NULL;
  2328. i2c_unregister_device(client);
  2329. kfree(i2c_get_clientdata(client));
  2330. misc_deregister(&akm09911_device);
  2331. return 0;
  2332. }
  2333. /*----------------------------------------------------------------------------*/
  2334. static int akm09911_remove(void)
  2335. {
  2336. akm09911_power(hw, 0);
  2337. atomic_set(&dev_open_count, 0);
  2338. i2c_del_driver(&akm09911_i2c_driver);
  2339. return 0;
  2340. }
  2341. static int akm09911_local_init(void)
  2342. {
  2343. akm09911_power(hw, 1);
  2344. if (i2c_add_driver(&akm09911_i2c_driver)) {
  2345. MAG_ERR("i2c_add_driver error\n");
  2346. return -1;
  2347. }
  2348. if (-1 == akm09911_init_flag)
  2349. return -1;
  2350. return 0;
  2351. }
  2352. /*----------------------------------------------------------------------------*/
  2353. static int __init akm09911_init(void)
  2354. {
  2355. const char *name = "mediatek,akm09911";
  2356. hw = get_mag_dts_func(name, hw);
  2357. if (!hw)
  2358. MAGN_ERR("get dts info fail\n");
  2359. mag_driver_add(&akm09911_init_info);
  2360. return 0;
  2361. }
  2362. /*----------------------------------------------------------------------------*/
  2363. static void __exit akm09911_exit(void)
  2364. {
  2365. }
  2366. /*----------------------------------------------------------------------------*/
  2367. module_init(akm09911_init);
  2368. module_exit(akm09911_exit);
  2369. MODULE_AUTHOR("MTK");
  2370. MODULE_DESCRIPTION("AKM09911 compass driver");
  2371. MODULE_LICENSE("GPL");
  2372. MODULE_VERSION(DRIVER_VERSION);