ltr303.c 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128
  1. /*
  2. *
  3. * Author: MingHsien Hsieh <minghsien.hsieh@mediatek.com>
  4. *
  5. * This software is licensed under the terms of the GNU General Public
  6. * License version 2, as published by the Free Software Foundation, and
  7. * may be copied, distributed, and modified under those terms.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. */
  15. #include <linux/interrupt.h>
  16. #include <linux/i2c.h>
  17. #include <linux/slab.h>
  18. #include <linux/irq.h>
  19. #include <linux/gpio.h>
  20. #include <linux/miscdevice.h>
  21. #include <asm/uaccess.h>
  22. #include <linux/delay.h>
  23. #include <linux/input.h>
  24. #include <linux/workqueue.h>
  25. #include <linux/kobject.h>
  26. #include <linux/platform_device.h>
  27. #include <asm/atomic.h>
  28. #include <asm/io.h>
  29. #include <linux/of.h>
  30. #include <linux/of_address.h>
  31. #include <linux/of_irq.h>
  32. #include "batch.h"
  33. #include "upmu_sw.h"
  34. #include "upmu_common.h"
  35. #include "cust_alsps.h"
  36. #include <sensors_io.h>
  37. #include "ltr303.h"
  38. #include "alsps.h"
  39. #undef CUSTOM_KERNEL_SENSORHUB
  40. #ifdef CUSTOM_KERNEL_SENSORHUB
  41. #include <SCP_sensorHub.h>
  42. #endif
  43. /******************************************************************************
  44. * configuration
  45. *******************************************************************************/
  46. /*----------------------------------------------------------------------------*/
  47. #define LTR303_DEV_NAME "ltr303"
  48. #define POWER_NONE_MACRO MT65XX_POWER_NONE
  49. #define GN_MTK_BSP_PS_DYNAMIC_CALI
  50. // #define APS_DEBUG_ENABLE
  51. /*----------------------------------------------------------------------------*/
  52. #define APS_TAG "[LTR303] "
  53. #ifdef APS_DEBUG_ENABLE
  54. #define APS_FUN(f) printk(KERN_ERR APS_TAG"%s\n", __FUNCTION__)
  55. #define APS_ERR(fmt, args...) printk(KERN_ERR APS_TAG"%s %d : "fmt, __FUNCTION__, __LINE__, ##args)
  56. #define APS_ERR_ST(f) printk(KERN_ERR APS_TAG"%s %d : ", __FUNCTION__, __LINE__)
  57. #define APS_LOG(fmt, args...) printk(KERN_ERR APS_TAG fmt, ##args)
  58. #define APS_DBG(fmt, args...) printk(KERN_ERR APS_TAG fmt, ##args)
  59. #else
  60. #define APS_FUN(f)
  61. #define APS_ERR(fmt, args...) //printk(KERN_ERR APS_TAG"%s %d : "fmt, __FUNCTION__, __LINE__, ##args)
  62. #define APS_ERR_ST(f)
  63. #define APS_LOG(fmt, args...) //printk(KERN_ERR APS_TAG fmt, ##args)
  64. #define APS_DBG(fmt, args...)
  65. #endif
  66. /*----------------------------------------------------------------------------*/
  67. static struct i2c_client *ltr303_i2c_client = NULL;
  68. /* Maintain alsps cust info here */
  69. struct alsps_hw alsps_cust;
  70. static struct alsps_hw *hw = &alsps_cust;
  71. struct platform_device *alspsPltFmDev;
  72. static bool readenable=true;
  73. /*----------------------------------------------------------------------------*/
  74. static const struct i2c_device_id ltr303_i2c_id[] = {{LTR303_DEV_NAME,0},{}};
  75. //static struct i2c_board_info __initdata i2c_ltr303={ I2C_BOARD_INFO(LTR303_DEV_NAME, 0x23)};
  76. static unsigned long long int_top_time;
  77. /*the adapter id & i2c address will be available in customization*/
  78. //static struct i2c_board_info __initdata i2c_ltr303={ I2C_BOARD_INFO(LTR303_DEV_NAME, 0x23)};
  79. //static unsigned short ltr303_force[] = {0x00, 0x46, I2C_CLIENT_END, I2C_CLIENT_END};
  80. //static const unsigned short *const ltr303_forces[] = { ltr303_force, NULL };
  81. //static struct i2c_client_address_data ltr303_addr_data = { .forces = ltr303_forces,};
  82. /*----------------------------------------------------------------------------*/
  83. static int ltr303_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id);
  84. static int ltr303_i2c_remove(struct i2c_client *client);
  85. //static int ltr303_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info);
  86. /*----------------------------------------------------------------------------*/
  87. static int ltr303_i2c_suspend(struct i2c_client *client, pm_message_t msg);
  88. static int ltr303_i2c_resume(struct i2c_client *client);
  89. static int ltr303_init_device(void);
  90. static int ltr303_ps_enable(int gainrange);
  91. static int dynamic_calibrate=0;
  92. //static int ps_trigger_high = 800;
  93. //static int ps_trigger_low = 760;
  94. static int ps_gainrange = 0;
  95. static int als_gainrange = 0;
  96. static int final_prox_val , prox_val;
  97. static int final_lux_val;
  98. static int ltr303_remove(void);
  99. static int ltr303_local_init(void);
  100. static int ltr303_init_flag =-1; // 0<==>OK -1 <==> fail
  101. static struct alsps_init_info ltr303_init_info = {
  102. .name = "ltr303",
  103. .init = ltr303_local_init,
  104. .uninit = ltr303_remove,
  105. };
  106. /*----------------------------------------------------------------------------*/
  107. static DEFINE_MUTEX(read_lock);
  108. /*----------------------------------------------------------------------------*/
  109. static int ltr303_als_read(int gainrange);
  110. static int ltr303_ps_read(void);
  111. /*----------------------------------------------------------------------------*/
  112. typedef enum {
  113. CMC_BIT_ALS = 1,
  114. CMC_BIT_PS = 2,
  115. } CMC_BIT;
  116. /*----------------------------------------------------------------------------*/
  117. struct ltr303_i2c_addr { /*define a series of i2c slave address*/
  118. u8 write_addr;
  119. u8 ps_thd; /*PS INT threshold*/
  120. };
  121. /*----------------------------------------------------------------------------*/
  122. struct ltr303_priv {
  123. struct alsps_hw *hw;
  124. struct i2c_client *client;
  125. struct work_struct eint_work;
  126. struct mutex lock;
  127. /*i2c address group*/
  128. struct ltr303_i2c_addr addr;
  129. /*misc*/
  130. u16 als_modulus;
  131. atomic_t i2c_retry;
  132. atomic_t als_debounce; /*debounce time after enabling als*/
  133. atomic_t als_deb_on; /*indicates if the debounce is on*/
  134. atomic_t als_deb_end; /*the jiffies representing the end of debounce*/
  135. atomic_t ps_mask; /*mask ps: always return far away*/
  136. atomic_t ps_debounce; /*debounce time after enabling ps*/
  137. atomic_t ps_deb_on; /*indicates if the debounce is on*/
  138. atomic_t ps_deb_end; /*the jiffies representing the end of debounce*/
  139. atomic_t ps_suspend;
  140. atomic_t als_suspend;
  141. atomic_t trace;
  142. atomic_t init_done;
  143. struct device_node *irq_node;
  144. int irq;
  145. /*data*/
  146. u16 als;
  147. u16 ps;
  148. u8 _align;
  149. u16 als_level_num;
  150. u16 als_value_num;
  151. u32 als_level[C_CUST_ALS_LEVEL-1];
  152. u32 als_value[C_CUST_ALS_LEVEL];
  153. atomic_t als_cmd_val; /*the cmd value can't be read, stored in ram*/
  154. atomic_t ps_cmd_val; /*the cmd value can't be read, stored in ram*/
  155. atomic_t ps_thd_val; /*the cmd value can't be read, stored in ram*/
  156. atomic_t ps_thd_val_high; /*the cmd value can't be read, stored in ram*/
  157. atomic_t ps_thd_val_low; /*the cmd value can't be read, stored in ram*/
  158. ulong enable; /*enable mask*/
  159. ulong pending_intr; /*pending interrupt*/
  160. /*early suspend*/
  161. #if defined(CONFIG_HAS_EARLYSUSPEND)
  162. struct early_suspend early_drv;
  163. #endif
  164. };
  165. struct PS_CALI_DATA_STRUCT
  166. {
  167. int close;
  168. int far_away;
  169. int valid;
  170. } ;
  171. static int intr_flag_value = 0;
  172. static struct ltr303_priv *ltr303_obj = NULL;
  173. #ifdef CONFIG_OF
  174. static const struct of_device_id alsps_of_match[] = {
  175. { .compatible = "mediatek,alsps", },
  176. {},
  177. };
  178. #endif
  179. static struct i2c_driver ltr303_i2c_driver = {
  180. .probe = ltr303_i2c_probe,
  181. .remove = ltr303_i2c_remove,
  182. .suspend = ltr303_i2c_suspend,
  183. .resume = ltr303_i2c_resume,
  184. .id_table = ltr303_i2c_id,
  185. .driver = {
  186. .name = LTR303_DEV_NAME,
  187. #ifdef CONFIG_OF
  188. .of_match_table = alsps_of_match,
  189. #endif
  190. },
  191. };
  192. /*
  193. * #########
  194. * ## I2C ##
  195. * #########
  196. */
  197. /*----------------------------------------------------------------------------*/
  198. // I2C Read
  199. static int ltr303_i2c_read_reg(u8 regnum)
  200. {
  201. u8 buffer[1],reg_value[1];
  202. int res = 0;
  203. mutex_lock(&read_lock);
  204. buffer[0]= regnum;
  205. res = i2c_master_send(ltr303_obj->client, buffer, 0x1);
  206. if(res <= 0) {
  207. APS_ERR("read reg send res = %d\n",res);
  208. return res;
  209. }
  210. res = i2c_master_recv(ltr303_obj->client, reg_value, 0x1);
  211. if(res <= 0)
  212. {
  213. APS_ERR("read reg recv res = %d\n",res);
  214. return res;
  215. }
  216. mutex_unlock(&read_lock);
  217. return reg_value[0];
  218. }
  219. /*----------------------------------------------------------------------------*/
  220. // I2C Write
  221. static int ltr303_i2c_write_reg(u8 regnum, u8 value)
  222. {
  223. u8 databuf[2];
  224. int res = 0;
  225. databuf[0] = regnum;
  226. databuf[1] = value;
  227. res = i2c_master_send(ltr303_obj->client, databuf, 0x2);
  228. if (res < 0)
  229. {
  230. APS_ERR("wirte reg send res = %d\n",res);
  231. return res;
  232. }
  233. else
  234. return 0;
  235. }
  236. /*----------------------------------------------------------------------------*/
  237. #ifdef GN_MTK_BSP_PS_DYNAMIC_CALI
  238. static ssize_t ltr303_dynamic_calibrate(void)
  239. {
  240. int i=0;
  241. int data;
  242. int data_total=0;
  243. ssize_t len = 0;
  244. int noise = 0;
  245. int count = 5;
  246. int max = 0;
  247. int error = 0;
  248. int ps_thd_val_low;
  249. int ps_thd_val_high ;
  250. struct ltr303_priv *obj = ltr303_obj;
  251. if(!ltr303_obj)
  252. {
  253. APS_ERR("ltr303_obj is null!!\n");
  254. return -1;
  255. }
  256. msleep(15);
  257. for (i = 0; i < count; i++) {
  258. msleep(15);
  259. data=ltr303_ps_read();
  260. if (data < 0) {
  261. i--;
  262. continue;
  263. }
  264. if(data & 0x8000){
  265. noise = 0;
  266. break;
  267. }else{
  268. noise=data;
  269. }
  270. data_total+=data;
  271. if (max++ > 100) {
  272. return len;
  273. }
  274. }
  275. noise=data_total/count;
  276. dynamic_calibrate = noise;
  277. if(noise < 100){
  278. atomic_set(&obj->ps_thd_val_high, noise+100);
  279. atomic_set(&obj->ps_thd_val_low, noise+50);
  280. }else if(noise < 200){
  281. atomic_set(&obj->ps_thd_val_high, noise+150);
  282. atomic_set(&obj->ps_thd_val_low, noise+60);
  283. }else if(noise < 300){
  284. atomic_set(&obj->ps_thd_val_high, noise+150);
  285. atomic_set(&obj->ps_thd_val_low, noise+60);
  286. }else if(noise < 400){
  287. atomic_set(&obj->ps_thd_val_high, noise+150);
  288. atomic_set(&obj->ps_thd_val_low, noise+60);
  289. }else if(noise < 600){
  290. atomic_set(&obj->ps_thd_val_high, noise+180);
  291. atomic_set(&obj->ps_thd_val_low, noise+90);
  292. }else if(noise < 1000){
  293. atomic_set(&obj->ps_thd_val_high, noise+300);
  294. atomic_set(&obj->ps_thd_val_low, noise+180);
  295. }else if(noise < 1250){
  296. atomic_set(&obj->ps_thd_val_high, noise+400);
  297. atomic_set(&obj->ps_thd_val_low, noise+300);
  298. }
  299. else{
  300. atomic_set(&obj->ps_thd_val_high, 1450);
  301. atomic_set(&obj->ps_thd_val_low, 1000);
  302. APS_ERR("ltr558 the proximity sensor structure is error\n");
  303. }
  304. ps_thd_val_low = atomic_read(&obj->ps_thd_val_low);
  305. ps_thd_val_high = atomic_read(&obj->ps_thd_val_high);
  306. APS_DBG("LTR-55X ps_thd_val_high=%d, ps_thd_val_low=%d\n.",ps_thd_val_high,ps_thd_val_low);
  307. error = ltr303_i2c_write_reg(LTR303_PS_THRES_UP_0, ps_thd_val_high & 0xff);
  308. if(error<0)
  309. {
  310. APS_LOG("ltr303_ps_enable setting LTR303_PS_THRES_UP_0 error \n");
  311. return error;
  312. }
  313. error = ltr303_i2c_write_reg(LTR303_PS_THRES_UP_1, (ps_thd_val_high>>8) & 0X07);
  314. if(error<0)
  315. {
  316. APS_LOG("ltr303_ps_enable setting LTR303_PS_THRES_UP_1 error \n");
  317. return error;
  318. }
  319. error = ltr303_i2c_write_reg(LTR303_PS_THRES_LOW_0, 0x0);
  320. if(error<0)
  321. {
  322. APS_LOG("ltr303_ps_enable setting LTR303_PS_THRES_LOW_0 error \n");
  323. return error;
  324. }
  325. error = ltr303_i2c_write_reg(LTR303_PS_THRES_LOW_1, 0x0);
  326. if(error<0)
  327. {
  328. APS_LOG("ltr303_ps_enable setting LTR303_PS_THRES_LOW_1 error \n");
  329. return error;
  330. }
  331. return 0;
  332. }
  333. #endif
  334. /*----------------------------------------------------------------------------*/
  335. static ssize_t ltr303_show_als(struct device_driver *ddri, char *buf)
  336. {
  337. int res;
  338. if(!ltr303_obj)
  339. {
  340. APS_ERR("ltr303_obj is null!!\n");
  341. return 0;
  342. }
  343. res = ltr303_als_read(als_gainrange);
  344. return snprintf(buf, PAGE_SIZE, "0x%04X\n", res);
  345. }
  346. /*----------------------------------------------------------------------------*/
  347. static ssize_t ltr303_show_ps(struct device_driver *ddri, char *buf)
  348. {
  349. int res;
  350. if(!ltr303_obj)
  351. {
  352. APS_ERR("ltr303_obj is null!!\n");
  353. return 0;
  354. }
  355. res = ltr303_ps_read();
  356. return snprintf(buf, PAGE_SIZE, "0x%04X\n", res);
  357. }
  358. /*----------------------------------------------------------------------------*/
  359. static ssize_t ltr303_show_status(struct device_driver *ddri, char *buf)
  360. {
  361. ssize_t len = 0;
  362. if(!ltr303_obj)
  363. {
  364. APS_ERR("ltr303_obj is null!!\n");
  365. return 0;
  366. }
  367. if(ltr303_obj->hw)
  368. {
  369. len += snprintf(buf+len, PAGE_SIZE-len, "CUST: %d, (%d %d)\n",
  370. ltr303_obj->hw->i2c_num, ltr303_obj->hw->power_id, ltr303_obj->hw->power_vol);
  371. }
  372. else
  373. {
  374. len += snprintf(buf+len, PAGE_SIZE-len, "CUST: NULL\n");
  375. }
  376. len += snprintf(buf+len, PAGE_SIZE-len, "MISC: %d %d\n", atomic_read(&ltr303_obj->als_suspend), atomic_read(&ltr303_obj->ps_suspend));
  377. return len;
  378. }
  379. /*----------------------------------------------------------------------------*/
  380. /*
  381. static ssize_t ltr303_store_status(struct device_driver *ddri, char *buf, size_t count)
  382. {
  383. int status1,ret;
  384. if(!ltr303_obj)
  385. {
  386. APS_ERR("ltr303_obj is null!!\n");
  387. return 0;
  388. }
  389. if(1 == sscanf(buf, "%d ", &status1))
  390. {
  391. ret=ltr303_ps_enable(ps_gainrange);
  392. APS_DBG("iret= %d, ps_gainrange = %d\n", ret, ps_gainrange);
  393. }
  394. else
  395. {
  396. APS_DBG("invalid content: '%s', length = %ld\n", buf, count);
  397. }
  398. return count;
  399. }
  400. */
  401. /*----------------------------------------------------------------------------*/
  402. static ssize_t ltr303_show_reg(struct device_driver *ddri, char *buf)
  403. {
  404. int i,len=0;
  405. int reg[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,
  406. 0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x97,0x98,0x99,0x9a,0x9e};
  407. for(i=0;i<27;i++)
  408. {
  409. len += snprintf(buf+len, PAGE_SIZE-len, "reg:0x%04X value: 0x%04X\n", reg[i],ltr303_i2c_read_reg(reg[i]));
  410. }
  411. return len;
  412. }
  413. /*----------------------------------------------------------------------------*/
  414. /*
  415. static ssize_t ltr303_store_reg(struct device_driver *ddri, char *buf, size_t count)
  416. {
  417. int ret,value;
  418. u32 reg;
  419. if(!ltr303_obj)
  420. {
  421. APS_ERR("ltr303_obj is null!!\n");
  422. return 0;
  423. }
  424. if(2 == sscanf(buf, "%x %x ", &reg,&value))
  425. {
  426. APS_DBG("before write reg: %x, reg_value = %x write value=%x\n", reg,ltr303_i2c_read_reg(reg),value);
  427. ret=ltr303_i2c_write_reg(reg,value);
  428. APS_DBG("after write reg: %x, reg_value = %x\n", reg,ltr303_i2c_read_reg(reg));
  429. }
  430. else
  431. {
  432. APS_DBG("invalid content: '%s', length = %ld\n", buf, count);
  433. }
  434. return count;
  435. }
  436. */
  437. /*----------------------------------------------------------------------------*/
  438. static DRIVER_ATTR(als,S_IWUSR | S_IRUGO,ltr303_show_als,NULL);
  439. static DRIVER_ATTR(ps,S_IWUSR | S_IRUGO,ltr303_show_ps,NULL);
  440. static DRIVER_ATTR(status,S_IWUSR | S_IRUGO,ltr303_show_status,NULL);
  441. static DRIVER_ATTR(reg,S_IWUSR | S_IRUGO,ltr303_show_reg,NULL);
  442. /*----------------------------------------------------------------------------*/
  443. static struct driver_attribute *ltr303_attr_list[] = {
  444. &driver_attr_als,
  445. &driver_attr_ps,
  446. &driver_attr_status,
  447. &driver_attr_reg,
  448. };
  449. /*----------------------------------------------------------------------------*/
  450. static int ltr303_create_attr(struct device_driver *driver)
  451. {
  452. int idx, err = 0;
  453. int num = (int)(sizeof(ltr303_attr_list)/sizeof(ltr303_attr_list[0]));
  454. if (driver == NULL)
  455. {
  456. return -EINVAL;
  457. }
  458. for(idx = 0; idx < num; idx++)
  459. {
  460. if(0 != (err = driver_create_file(driver, ltr303_attr_list[idx])))
  461. {
  462. APS_ERR("driver_create_file (%s) = %d\n", ltr303_attr_list[idx]->attr.name, err);
  463. break;
  464. }
  465. }
  466. return err;
  467. }
  468. /*----------------------------------------------------------------------------*/
  469. static int ltr303_delete_attr(struct device_driver *driver)
  470. {
  471. int idx ,err = 0;
  472. int num = (int)(sizeof(ltr303_attr_list)/sizeof(ltr303_attr_list[0]));
  473. if (!driver)
  474. return -EINVAL;
  475. for (idx = 0; idx < num; idx++)
  476. {
  477. driver_remove_file(driver, ltr303_attr_list[idx]);
  478. }
  479. return err;
  480. }
  481. /*
  482. * ###############
  483. * ## PS CONFIG ##
  484. * ###############
  485. */
  486. /*----------------------------------------------------------------------------*/
  487. static int ltr303_ps_enable(int gainrange)
  488. {
  489. int res;
  490. int data;
  491. int error;
  492. int setgain;
  493. APS_LOG("ltr303_ps_enable() ...start!\n");
  494. readenable =true;
  495. switch (gainrange) {
  496. case PS_RANGE16:
  497. setgain = MODE_PS_ON_Gain16;
  498. break;
  499. case PS_RANGE32:
  500. setgain = MODE_PS_ON_Gain32;
  501. break;
  502. case PS_RANGE64:
  503. setgain = MODE_PS_ON_Gain64;
  504. break;
  505. default:
  506. setgain = MODE_PS_ON_Gain16;
  507. break;
  508. }
  509. res = ltr303_init_device();
  510. if (res < 0)
  511. {
  512. APS_ERR("ltr303_init_devicet: %d\n", res);
  513. goto EXIT_ERR;
  514. }
  515. APS_LOG("LTR303_PS setgain = %d!\n",setgain);
  516. error = ltr303_i2c_write_reg(LTR303_PS_CONTR, setgain);
  517. if(error<0)
  518. {
  519. APS_LOG("ltr303_ps_enable() error1\n");
  520. return error;
  521. }
  522. data = ltr303_i2c_read_reg(LTR303_PS_CONTR);
  523. #ifdef GN_MTK_BSP_PS_DYNAMIC_CALI
  524. if (data & 0x02) {
  525. if (ltr303_dynamic_calibrate() < 0)
  526. return -1;
  527. }
  528. #endif
  529. APS_LOG("ltr303_ps_enable ...OK!\n");
  530. return error;
  531. EXIT_ERR:
  532. APS_ERR("set thres: %d\n", res);
  533. return res;
  534. }
  535. /*----------------------------------------------------------------------------*/
  536. // Put PS into Standby mode
  537. static int ltr303_ps_disable(void)
  538. {
  539. int error;
  540. struct ltr303_priv *obj = ltr303_obj;
  541. readenable =false;
  542. error = ltr303_i2c_write_reg(LTR303_PS_CONTR, MODE_PS_StdBy);
  543. if(error<0)
  544. APS_LOG("ltr303_ps_disable ...ERROR\n");
  545. else
  546. APS_LOG("ltr303_ps_disable ...OK\n");
  547. if(0 == obj->hw->polling_mode_ps)
  548. {
  549. cancel_work_sync(&obj->eint_work);
  550. }
  551. return error;
  552. }
  553. /*----------------------------------------------------------------------------*/
  554. static int ltr303_ps_read(void)
  555. {
  556. int psval_lo, psval_hi, psdata;
  557. psval_lo = ltr303_i2c_read_reg(LTR303_PS_DATA_0);
  558. APS_DBG("ps_rawdata_psval_lo = %d\n", psval_lo);
  559. if (psval_lo < 0){
  560. APS_DBG("psval_lo error\n");
  561. psdata = psval_lo;
  562. goto out;
  563. }
  564. psval_hi = ltr303_i2c_read_reg(LTR303_PS_DATA_1);
  565. APS_DBG("ps_rawdata_psval_hi = %d\n", psval_hi);
  566. if (psval_hi < 0){
  567. APS_DBG("psval_hi error\n");
  568. psdata = psval_hi;
  569. goto out;
  570. }
  571. psdata = ((psval_hi & 7)* 256) + psval_lo;
  572. //psdata = ((psval_hi&0x7)<<8) + psval_lo;
  573. APS_DBG("ps_rawdata = %d\n", psdata);
  574. prox_val = psdata;
  575. out:
  576. final_prox_val = psdata;
  577. return psdata;
  578. }
  579. /*
  580. * ################
  581. * ## ALS CONFIG ##
  582. * ################
  583. */
  584. /*----------------------------------------------------------------------------*/
  585. static int ltr303_als_enable(int gainrange)
  586. {
  587. int error;
  588. APS_LOG("gainrange = %d\n",gainrange);
  589. readenable =true;
  590. switch (gainrange)
  591. {
  592. case ALS_RANGE_64K:
  593. error = ltr303_i2c_write_reg(LTR303_ALS_CONTR, MODE_ALS_ON_Range1);
  594. break;
  595. case ALS_RANGE_32K:
  596. error = ltr303_i2c_write_reg(LTR303_ALS_CONTR, MODE_ALS_ON_Range2);
  597. break;
  598. case ALS_RANGE_16K:
  599. error = ltr303_i2c_write_reg(LTR303_ALS_CONTR, MODE_ALS_ON_Range3);
  600. break;
  601. case ALS_RANGE_8K:
  602. error = ltr303_i2c_write_reg(LTR303_ALS_CONTR, MODE_ALS_ON_Range4);
  603. break;
  604. case ALS_RANGE_1300:
  605. error = ltr303_i2c_write_reg(LTR303_ALS_CONTR, MODE_ALS_ON_Range5);
  606. break;
  607. case ALS_RANGE_600:
  608. error = ltr303_i2c_write_reg(LTR303_ALS_CONTR, MODE_ALS_ON_Range6);
  609. break;
  610. default:
  611. error = ltr303_i2c_write_reg(LTR303_ALS_CONTR, MODE_ALS_ON_Range1);
  612. APS_LOG("proxmy sensor gainrange %d!\n", gainrange);
  613. break;
  614. }
  615. if(error<0)
  616. APS_LOG("ltr303_als_enable ...ERROR\n");
  617. else
  618. APS_LOG("ltr303_als_enable ...OK\n");
  619. mdelay(WAKEUP_DELAY);
  620. ltr303_i2c_read_reg(LTR303_ALS_CONTR);
  621. return error;
  622. }
  623. /*----------------------------------------------------------------------------*/
  624. // Put ALS into Standby mode
  625. static int ltr303_als_disable(void)
  626. {
  627. int error;
  628. readenable =false;
  629. error = ltr303_i2c_write_reg(LTR303_ALS_CONTR, MODE_ALS_StdBy);
  630. if(error<0)
  631. APS_LOG("ltr303_als_disable ...ERROR\n");
  632. else
  633. APS_LOG("ltr303_als_disable ...OK\n");
  634. return error;
  635. }
  636. /*----------------------------------------------------------------------------*/
  637. static int ltr303_als_read(int gainrange)
  638. {
  639. int alsval_ch0_lo, alsval_ch0_hi, alsval_ch0;
  640. int alsval_ch1_lo, alsval_ch1_hi, alsval_ch1;
  641. int luxdata_int = -1;
  642. int ratio;
  643. alsval_ch1_lo = ltr303_i2c_read_reg(LTR303_ALS_DATA_CH1_0);
  644. alsval_ch1_hi = ltr303_i2c_read_reg(LTR303_ALS_DATA_CH1_1);
  645. alsval_ch1 = (alsval_ch1_hi * 256) + alsval_ch1_lo;
  646. APS_DBG("alsval_ch1_lo = %d,alsval_ch1_hi=%d,alsval_ch1=%d\n",alsval_ch1_lo,alsval_ch1_hi,alsval_ch1);
  647. alsval_ch0_lo = ltr303_i2c_read_reg(LTR303_ALS_DATA_CH0_0);
  648. alsval_ch0_hi = ltr303_i2c_read_reg(LTR303_ALS_DATA_CH0_1);
  649. alsval_ch0 = (alsval_ch0_hi * 256) + alsval_ch0_lo;
  650. APS_DBG("alsval_ch0_lo = %d,alsval_ch0_hi=%d,alsval_ch0=%d\n",alsval_ch0_lo,alsval_ch0_hi,alsval_ch0);
  651. if((alsval_ch1==0)||(alsval_ch0==0))
  652. {
  653. luxdata_int = 0;
  654. goto err;
  655. }
  656. ratio = (alsval_ch1*100) /(alsval_ch0+alsval_ch1);
  657. APS_DBG("ratio = %d gainrange = %d\n",ratio,gainrange);
  658. if (ratio < 45){
  659. luxdata_int = (((17743 * alsval_ch0)+(11059 * alsval_ch1)))/10000;
  660. }
  661. else if ((ratio < 64) && (ratio >= 45)){
  662. luxdata_int = (((42785 * alsval_ch0)-(19548 * alsval_ch1)))/10000;
  663. }
  664. else if ((ratio <= 100) && (ratio >= 64)) {
  665. luxdata_int = (((5926 * alsval_ch0)+(1185 * alsval_ch1)))/10000;
  666. }
  667. else {
  668. luxdata_int = 0;
  669. }
  670. APS_DBG("als_value_lux = %d\n", luxdata_int);
  671. return luxdata_int;
  672. err:
  673. final_lux_val = luxdata_int;
  674. APS_DBG("err als_value_lux = 0x%x\n", luxdata_int);
  675. return luxdata_int;
  676. }
  677. /*-----------------------------------------------------------------------------*/
  678. void ltr303_eint_func(void)
  679. {
  680. struct ltr303_priv *obj = ltr303_obj;
  681. APS_FUN();
  682. if(!obj)
  683. {
  684. return;
  685. }
  686. int_top_time = sched_clock();
  687. schedule_work(&obj->eint_work);
  688. }
  689. /*----------------------------------------------------------------------------*/
  690. #if defined(CONFIG_OF)
  691. static irqreturn_t ltr303_eint_handler(int irq, void *desc)
  692. {
  693. ltr303_eint_func();
  694. disable_irq_nosync(ltr303_obj->irq);
  695. return IRQ_HANDLED;
  696. }
  697. #endif
  698. /*----------------------------------------------------------------------------*/
  699. int ltr303_setup_eint(struct i2c_client *client)
  700. {
  701. int ret;
  702. struct pinctrl * pinctrl;
  703. struct pinctrl_state * pins_default;
  704. struct pinctrl_state * pins_cfg;
  705. u32 ints[2] = {0,0};
  706. APS_FUN();
  707. alspsPltFmDev = get_alsps_platformdev();
  708. /* gpio setting */
  709. pinctrl = devm_pinctrl_get(&alspsPltFmDev->dev);
  710. if (IS_ERR(pinctrl)) {
  711. ret = PTR_ERR(pinctrl);
  712. APS_ERR("Cannot find alsps pinctrl!\n");
  713. return ret;
  714. }
  715. pins_default = pinctrl_lookup_state(pinctrl, "pin_default");
  716. if (IS_ERR(pins_default)) {
  717. ret = PTR_ERR(pins_default);
  718. APS_ERR("Cannot find alsps pinctrl default!\n");
  719. }
  720. pins_cfg = pinctrl_lookup_state(pinctrl, "pin_cfg");
  721. if (IS_ERR(pins_cfg)) {
  722. ret = PTR_ERR(pins_cfg);
  723. APS_ERR("Cannot find alsps pinctrl pin_cfg!\n");
  724. return ret;
  725. }
  726. pinctrl_select_state(pinctrl, pins_cfg);
  727. /* eint request */
  728. if (ltr303_obj->irq_node) {
  729. of_property_read_u32_array(ltr303_obj->irq_node, "debounce", ints, ARRAY_SIZE(ints));
  730. gpio_request(ints[0], "p-sensor");
  731. gpio_set_debounce(ints[0], ints[1]);
  732. APS_LOG("ints[0] = %d, ints[1] = %d!!\n", ints[0], ints[1]);
  733. ltr303_obj->irq = irq_of_parse_and_map(ltr303_obj->irq_node, 0);
  734. APS_LOG("ltr303_obj->irq = %d\n", ltr303_obj->irq);
  735. if (!ltr303_obj->irq) {
  736. APS_ERR("irq_of_parse_and_map fail!!\n");
  737. return -EINVAL;
  738. }
  739. if (request_irq(ltr303_obj->irq, ltr303_eint_handler, IRQF_TRIGGER_NONE, "mediatek,ltr303", NULL)) {
  740. APS_ERR("IRQ LINE NOT AVAILABLE!!\n");
  741. return -EINVAL;
  742. }
  743. // enable_irq(ltr303_obj->irq);
  744. } else {
  745. APS_ERR("null irq node!!\n");
  746. return -EINVAL;
  747. }
  748. return 0;
  749. }
  750. /*----------------------------------------------------------------------------*/
  751. static void ltr303_power(struct alsps_hw *hw, unsigned int on)
  752. {
  753. /*TODO:power on*/
  754. static unsigned int power_on = 0;
  755. /*
  756. if(hw->power_id != POWER_NONE_MACRO)
  757. {
  758. if(power_on == on)
  759. {
  760. APS_LOG("ignore power control: %d\n", on);
  761. }
  762. else if(on)
  763. {
  764. if(!hwPowerOn(hw->power_id, hw->power_vol, "LTR303"))
  765. {
  766. APS_ERR("power on fails!!\n");
  767. }
  768. }
  769. else
  770. {
  771. if(!hwPowerDown(hw->power_id, "LTR303"))
  772. {
  773. APS_ERR("power off fail!!\n");
  774. }
  775. }
  776. }*/
  777. power_on = on;
  778. }
  779. /*----------------------------------------------------------------------------*/
  780. static int ltr303_check_and_clear_intr(struct i2c_client *client)
  781. {
  782. int res = 0;
  783. int intp,intl;
  784. u8 buffer[2];
  785. u8 temp;
  786. APS_FUN();
  787. buffer[0] = LTR303_ALS_PS_STATUS;
  788. res = i2c_master_send(client, buffer, 0x1);
  789. if(res <= 0)
  790. {
  791. goto EXIT_ERR;
  792. }
  793. res = i2c_master_recv(client, buffer, 0x1);
  794. if(res <= 0)
  795. {
  796. goto EXIT_ERR;
  797. }
  798. temp = buffer[0];
  799. res = 1;
  800. intp = 0;
  801. intl = 0;
  802. if(0 != (buffer[0] & 0x02))
  803. {
  804. res = 0;
  805. intp = 1;
  806. }
  807. if(0 != (buffer[0] & 0x08))
  808. {
  809. res = 0;
  810. intl = 1;
  811. }
  812. if(0 == res)
  813. {
  814. if((1 == intp) && (0 == intl))
  815. {
  816. buffer[1] = buffer[0] & 0xfD;
  817. }
  818. else if((0 == intp) && (1 == intl))
  819. {
  820. buffer[1] = buffer[0] & 0xf7;
  821. }
  822. else
  823. {
  824. buffer[1] = buffer[0] & 0xf5;
  825. }
  826. buffer[0] = LTR303_ALS_PS_STATUS ;
  827. res = i2c_master_send(client, buffer, 0x2);
  828. if(res <= 0)
  829. {
  830. goto EXIT_ERR;
  831. }
  832. else
  833. {
  834. res = 0;
  835. }
  836. }
  837. return res;
  838. EXIT_ERR:
  839. APS_ERR("ltr303_check_and_clear_intr fail\n");
  840. return 1;
  841. }
  842. /*----------------------------------------------------------------------------*/
  843. static int ltr303_check_intr(struct i2c_client *client)
  844. {
  845. int res,intp,intl;
  846. u8 buffer[2];
  847. APS_FUN();
  848. buffer[0] = LTR303_ALS_PS_STATUS;
  849. res = i2c_master_send(client, buffer, 0x1);
  850. if(res <= 0)
  851. {
  852. goto EXIT_ERR;
  853. }
  854. res = i2c_master_recv(client, buffer, 0x1);
  855. if(res <= 0)
  856. {
  857. goto EXIT_ERR;
  858. }
  859. res = 1;
  860. intp = 0;
  861. intl = 0;
  862. if(0 != (buffer[0] & 0x02))
  863. {
  864. res = 0; //Ps int
  865. intp = 1;
  866. }
  867. if(0 != (buffer[0] & 0x08))
  868. {
  869. res = 0;
  870. intl = 1;
  871. }
  872. return res;
  873. EXIT_ERR:
  874. APS_ERR("ltr303_check_intr fail\n");
  875. return 1;
  876. }
  877. /*----------------------------------------------------------------------------*/
  878. static int ltr303_clear_intr(struct i2c_client *client)
  879. {
  880. int res;
  881. u8 buffer[2];
  882. APS_FUN();
  883. buffer[0] = LTR303_ALS_PS_STATUS;
  884. res = i2c_master_send(client, buffer, 0x1);
  885. if(res <= 0)
  886. {
  887. goto EXIT_ERR;
  888. }
  889. res = i2c_master_recv(client, buffer, 0x1);
  890. if(res <= 0)
  891. {
  892. goto EXIT_ERR;
  893. }
  894. APS_DBG("buffer[0] = %d \n",buffer[0]);
  895. buffer[1] = buffer[0] & 0x01;
  896. buffer[0] = LTR303_ALS_PS_STATUS ;
  897. res = i2c_master_send(client, buffer, 0x2);
  898. if(res <= 0)
  899. {
  900. goto EXIT_ERR;
  901. }
  902. else
  903. {
  904. res = 0;
  905. }
  906. return res;
  907. EXIT_ERR:
  908. APS_ERR("ltr303_check_and_clear_intr fail\n");
  909. return 1;
  910. }
  911. /*----------------------------------------------------------------------------*/
  912. static int ltr303_init_device(void)
  913. {
  914. int res;
  915. int error = 0;
  916. u8 databuf[2];
  917. struct ltr303_priv *obj = ltr303_obj;
  918. struct i2c_client *client = ltr303_obj->client;
  919. ps_gainrange = PS_RANGE16;
  920. als_gainrange = ALS_RANGE_1300;
  921. APS_FUN();
  922. error = ltr303_i2c_write_reg(LTR303_PS_LED, 0x11); // 0x1f=0001 1111;0x1b=0001 1011;0x1a=0001 1010;0x12=0001 0010;0x11=0001 0001;
  923. if(error<0)
  924. {
  925. APS_LOG("ltr303_ps_enable setting LTR303_PS_LED error...\n");
  926. return error;
  927. }
  928. error = ltr303_i2c_write_reg(LTR303_PS_N_PULSES, 0xa);
  929. if(error<0)
  930. {
  931. APS_LOG("ltr303_ps_enable setting LTR303_PS_N_PULSES error..\n");
  932. return error;
  933. }
  934. error = ltr303_i2c_write_reg(LTR303_PS_MEAS_RATE, 0x0);
  935. if(error<0)
  936. {
  937. APS_LOG("ltr303_ps_enable setting LTR303_PS_MEAS_RATE error\n");
  938. return error;
  939. }
  940. error = ltr303_i2c_write_reg(LTR303_ALS_MEAS_RATE, 0x02);
  941. if(error<0)
  942. {
  943. APS_LOG("ltr303_ps_enable setting LTR303_ALS_MEAS_RATE error.\n");
  944. return error;
  945. }
  946. /*for interrup work mode support */
  947. if(0 == obj->hw->polling_mode_ps)
  948. {
  949. databuf[0] = LTR303_INTERRUPT;
  950. databuf[1] = 0x01;
  951. res = i2c_master_send(client, databuf, 0x2);
  952. if(res <= 0)
  953. {
  954. APS_LOG("LTR303_INTERRUPT error: %x\n",res);
  955. return LTR303_ERR_I2C;
  956. }
  957. databuf[0] = LTR303_INTERRUPT_PERSIST;
  958. databuf[1] = 0x20;
  959. res = i2c_master_send(client, databuf, 0x2);
  960. if(res <= 0)
  961. {
  962. APS_LOG("LTR303_INTERRUPT_PERSIST error: %x\n",res);
  963. return LTR303_ERR_I2C;
  964. }
  965. }
  966. #ifndef GN_MTK_BSP_PS_DYNAMIC_CALI
  967. error = ltr303_i2c_write_reg(LTR303_PS_THRES_UP_0, ps_trigger_high & 0xff);
  968. if(error<0)
  969. {
  970. APS_LOG("ltr303_ps_enable setting LTR303_PS_THRES_UP_0 error \n");
  971. return error;
  972. }
  973. error = ltr303_i2c_write_reg(LTR303_PS_THRES_UP_1, (ps_trigger_high>>8) & 0X07);
  974. if(error<0)
  975. {
  976. APS_LOG("ltr303_ps_enable setting LTR303_PS_THRES_UP_1 error \n");
  977. return error;
  978. }
  979. error = ltr303_i2c_write_reg(LTR303_PS_THRES_LOW_0, 0x0);
  980. if(error<0)
  981. {
  982. APS_LOG("ltr303_ps_enable setting LTR303_PS_THRES_LOW_0 error \n");
  983. return error;
  984. }
  985. error = ltr303_i2c_write_reg(LTR303_PS_THRES_LOW_1, 0x0);
  986. if(error<0)
  987. {
  988. APS_LOG("ltr303_ps_enable setting LTR303_PS_THRES_LOW_1 error \n");
  989. return error;
  990. }
  991. #endif
  992. mdelay(WAKEUP_DELAY);
  993. return error;
  994. }
  995. /*----------------------------------------------------------------------------*/
  996. static int ltr303_devinit(void)
  997. {
  998. int res;
  999. u8 databuf[2];
  1000. u8 chip_id;
  1001. struct i2c_client *client = ltr303_obj->client;
  1002. mdelay(PON_DELAY);
  1003. /* check whether is the LT's sensor. */
  1004. chip_id = ltr303_i2c_read_reg(LTR303_PART_ID);
  1005. if(chip_id == 0xA0){
  1006. APS_LOG("LTR-303ALS is detected.\n");
  1007. }else if(chip_id == 0x80){
  1008. APS_LOG("LTR-558ALS is detected.\n");
  1009. }else{
  1010. APS_LOG("Detected LTR-303 chip_id %d error.\n",chip_id);
  1011. }
  1012. /*reset the sensor when first reading or writing.*/
  1013. databuf[0] = LTR303_ALS_CONTR;
  1014. databuf[1] = 0x00;
  1015. res = i2c_master_send(client, databuf, 0x2);
  1016. if(res <= 0)
  1017. {
  1018. goto EXIT_ERR;
  1019. return LTR303_ERR_I2C;
  1020. }
  1021. if((res = ltr303_setup_eint(client))!=0)
  1022. {
  1023. APS_ERR("setup eint: %d\n", res);
  1024. return res;
  1025. }
  1026. res = ltr303_init_device();
  1027. if (res < 0)
  1028. {
  1029. APS_ERR("ltr303_init_devicet: %d\n", res);
  1030. return res;
  1031. }
  1032. if((res = ltr303_check_and_clear_intr(client)))
  1033. {
  1034. APS_ERR("check/clear intr: %d\n", res);
  1035. // return res;
  1036. }
  1037. res = 0;
  1038. // enable_irq(ltr303_obj->irq);
  1039. EXIT_ERR:
  1040. APS_ERR("init dev: %d\n", res);
  1041. return res;
  1042. }
  1043. /*----------------------------------------------------------------------------*/
  1044. static int ltr303_get_als_value(struct ltr303_priv *obj, u16 als)
  1045. {
  1046. int idx;
  1047. int invalid = 0;
  1048. APS_DBG("als = %d\n",als);
  1049. for(idx = 0; idx < obj->als_level_num; idx++)
  1050. {
  1051. if(als < obj->hw->als_level[idx])
  1052. {
  1053. break;
  1054. }
  1055. }
  1056. if(idx >= obj->als_value_num)
  1057. {
  1058. APS_ERR("exceed range\n");
  1059. idx = obj->als_value_num - 1;
  1060. }
  1061. if(1 == atomic_read(&obj->als_deb_on))
  1062. {
  1063. unsigned long endt = atomic_read(&obj->als_deb_end);
  1064. if(time_after(jiffies, endt))
  1065. {
  1066. atomic_set(&obj->als_deb_on, 0);
  1067. }
  1068. if(1 == atomic_read(&obj->als_deb_on))
  1069. {
  1070. invalid = 1;
  1071. }
  1072. }
  1073. if(!invalid)
  1074. {
  1075. APS_DBG("xmwuwh ALS: %05d => %05d\n", als, obj->hw->als_value[idx]);
  1076. return obj->hw->als_value[idx];
  1077. }
  1078. else
  1079. {
  1080. APS_ERR("ALS: %05d => %05d (-1)\n", als, obj->hw->als_value[idx]);
  1081. return -1;
  1082. }
  1083. }
  1084. /*----------------------------------------------------------------------------*/
  1085. static int ltr303_get_ps_value(struct ltr303_priv *obj, u16 ps)
  1086. {
  1087. int val;
  1088. int invalid = 0;
  1089. static int val_temp = 1;
  1090. int ps_thd_val_high = atomic_read(&obj->ps_thd_val_high);
  1091. int ps_thd_val_low = atomic_read(&obj->ps_thd_val_low);
  1092. APS_DBG("ltr303_get_ps_value: - ps:%d ps_trigger_high:%d ps_trigger_low:%d\n",
  1093. ps,ps_thd_val_high,ps_thd_val_low);
  1094. if((ps > ps_thd_val_high))
  1095. {
  1096. val = 0; /*close*/
  1097. val_temp = 0;
  1098. intr_flag_value = 1;
  1099. } else if((ps < ps_thd_val_low)) {
  1100. val = 1; /*far away*/
  1101. val_temp = 1;
  1102. intr_flag_value = 0;
  1103. } else {
  1104. val = val_temp;
  1105. }
  1106. if(atomic_read(&obj->ps_suspend))
  1107. {
  1108. invalid = 1;
  1109. }
  1110. else if(1 == atomic_read(&obj->ps_deb_on))
  1111. {
  1112. unsigned long endt = atomic_read(&obj->ps_deb_end);
  1113. if(time_after(jiffies, endt))
  1114. {
  1115. atomic_set(&obj->ps_deb_on, 0);
  1116. }
  1117. if (1 == atomic_read(&obj->ps_deb_on))
  1118. {
  1119. invalid = 1;
  1120. }
  1121. }
  1122. else if (obj->als > 50000)
  1123. {
  1124. //invalid = 1;
  1125. APS_DBG("ligh too high will result to failt proximiy\n");
  1126. return 1; /*far away*/
  1127. }
  1128. if(!invalid)
  1129. {
  1130. APS_DBG("PS: %05d => %05d\n", ps, val);
  1131. return val;
  1132. }
  1133. else
  1134. {
  1135. return -1;
  1136. }
  1137. }
  1138. /*----------------------------------------------------------------------------*/
  1139. /*for interrup work mode support */
  1140. static void ltr303_eint_work(struct work_struct *work)
  1141. {
  1142. struct ltr303_priv *obj = (struct ltr303_priv *)container_of(work, struct ltr303_priv, eint_work);
  1143. int err;
  1144. struct hwm_sensor_data sensor_data;
  1145. int temp_noise=0;
  1146. u8 databuf[2];
  1147. int res = 0;
  1148. APS_FUN();
  1149. APS_LOG("ltr303 int top half time = %lld\n", int_top_time);
  1150. err = ltr303_check_intr(obj->client);
  1151. if(err < 0)
  1152. {
  1153. APS_ERR("ltr303_eint_work check intrs: %d\n", err);
  1154. }
  1155. else
  1156. {
  1157. obj->ps = ltr303_ps_read();
  1158. if(obj->ps < 0)
  1159. {
  1160. err = -1;
  1161. return;
  1162. }
  1163. APS_DBG("ltr303_eint_work rawdata ps=%d als_ch0=%d!\n",obj->ps,obj->als);
  1164. sensor_data.values[0] = ltr303_get_ps_value(obj, obj->ps);
  1165. sensor_data.value_divide = 1;
  1166. sensor_data.status = SENSOR_STATUS_ACCURACY_MEDIUM;
  1167. /*singal interrupt function add*/
  1168. //APS_DBG("intr_flag_value=%d,ps_thd_val_high=%d,ps_thd_val_low=%d\n",intr_flag_value,(atomic_read(&obj->ps_thd_val_high)),(atomic_read(&obj->ps_thd_val_low)));
  1169. if(intr_flag_value){
  1170. APS_DBG(" interrupt value ps will < ps_threshold_low");
  1171. databuf[0] = LTR303_PS_THRES_LOW_0;
  1172. databuf[1] = (u8)((atomic_read(&obj->ps_thd_val_low)) & 0x00FF);
  1173. res = i2c_master_send(obj->client, databuf, 0x2);
  1174. if(res <= 0)
  1175. {
  1176. return;
  1177. }
  1178. databuf[0] = LTR303_PS_THRES_LOW_1;
  1179. databuf[1] = (u8)(((atomic_read(&obj->ps_thd_val_low)) & 0xFF00) >> 8);
  1180. res = i2c_master_send(obj->client, databuf, 0x2);
  1181. if(res <= 0)
  1182. {
  1183. return;
  1184. }
  1185. databuf[0] = LTR303_PS_THRES_UP_0;
  1186. databuf[1] = (u8)(0x00FF);
  1187. res = i2c_master_send(obj->client, databuf, 0x2);
  1188. if(res <= 0)
  1189. {
  1190. return;
  1191. }
  1192. databuf[0] = LTR303_PS_THRES_UP_1;
  1193. databuf[1] = (u8)((0xFF00) >> 8);;
  1194. res = i2c_master_send(obj->client, databuf, 0x2);
  1195. if(res <= 0)
  1196. {
  1197. return;
  1198. }
  1199. }
  1200. else{
  1201. if(dynamic_calibrate > 50 && obj->ps < (dynamic_calibrate - 50)){
  1202. if(obj->ps < 100){
  1203. atomic_set(&obj->ps_thd_val_high, obj->ps+100);
  1204. atomic_set(&obj->ps_thd_val_low, obj->ps+50);
  1205. }else if(obj->ps < 200){
  1206. atomic_set(&obj->ps_thd_val_high, obj->ps+150);
  1207. atomic_set(&obj->ps_thd_val_low, obj->ps+60);
  1208. }else if(obj->ps < 300){
  1209. atomic_set(&obj->ps_thd_val_high, obj->ps+150);
  1210. atomic_set(&obj->ps_thd_val_low, obj->ps+60);
  1211. }else if(obj->ps < 400){
  1212. atomic_set(&obj->ps_thd_val_high, obj->ps+150);
  1213. atomic_set(&obj->ps_thd_val_low, obj->ps+60);
  1214. }else if(obj->ps < 600){
  1215. atomic_set(&obj->ps_thd_val_high, obj->ps+180);
  1216. atomic_set(&obj->ps_thd_val_low, obj->ps+90);
  1217. }else if(obj->ps < 1000){
  1218. atomic_set(&obj->ps_thd_val_high, obj->ps+300);
  1219. atomic_set(&obj->ps_thd_val_low, obj->ps+180);
  1220. }else if(obj->ps < 1250){
  1221. atomic_set(&obj->ps_thd_val_high, obj->ps+400);
  1222. atomic_set(&obj->ps_thd_val_low, obj->ps+300);
  1223. }else{
  1224. atomic_set(&obj->ps_thd_val_high, 1400);
  1225. atomic_set(&obj->ps_thd_val_low, 1000);
  1226. APS_ERR("ltr303 the proximity sensor structure is error\n");
  1227. }
  1228. dynamic_calibrate = obj->ps;
  1229. if(obj->ps > 50){
  1230. temp_noise = obj->ps - 50;
  1231. }else{
  1232. temp_noise = 0;
  1233. }
  1234. }
  1235. databuf[0] = LTR303_PS_THRES_LOW_0;
  1236. databuf[1] = (u8)(temp_noise & 0x00FF);//get the noise one time
  1237. res = i2c_master_send(obj->client, databuf, 0x2);
  1238. if(res <= 0)
  1239. {
  1240. return;
  1241. }
  1242. databuf[0] = LTR303_PS_THRES_LOW_1;
  1243. databuf[1] = (u8)((temp_noise & 0xFF00) >> 8);
  1244. res = i2c_master_send(obj->client, databuf, 0x2);
  1245. if(res <= 0)
  1246. {
  1247. return;
  1248. }
  1249. databuf[0] = LTR303_PS_THRES_UP_0;
  1250. databuf[1] = (u8)((atomic_read(&obj->ps_thd_val_high)) & 0x00FF);
  1251. res = i2c_master_send(obj->client, databuf, 0x2);
  1252. if(res <= 0)
  1253. {
  1254. return;
  1255. }
  1256. databuf[0] = LTR303_PS_THRES_UP_1;
  1257. databuf[1] = (u8)(((atomic_read(&obj->ps_thd_val_high)) & 0xFF00) >> 8);;
  1258. res = i2c_master_send(obj->client, databuf, 0x2);
  1259. APS_DBG("temp_noise=%d,ps_thd_val_high=%d,ps_thd_val_low=%d\n",temp_noise,(atomic_read(&obj->ps_thd_val_high)),(atomic_read(&obj->ps_thd_val_low)));
  1260. if(res <= 0)
  1261. {
  1262. return;
  1263. }
  1264. }
  1265. sensor_data.value_divide = 1;
  1266. sensor_data.status = SENSOR_STATUS_ACCURACY_MEDIUM;
  1267. //let up layer to know
  1268. if ((err = ps_report_interrupt_data(sensor_data.values[0]))) {
  1269. APS_ERR("call ps_report_interrupt_data fail = %d\n", err);
  1270. }
  1271. }
  1272. ltr303_clear_intr(obj->client);
  1273. #ifdef CONFIG_OF
  1274. enable_irq(obj->irq);
  1275. #endif
  1276. }
  1277. /******************************************************************************
  1278. * Function Configuration
  1279. ******************************************************************************/
  1280. static int ltr303_open(struct inode *inode, struct file *file)
  1281. {
  1282. file->private_data = ltr303_i2c_client;
  1283. if (!file->private_data)
  1284. {
  1285. APS_ERR("null pointer!!\n");
  1286. return -EINVAL;
  1287. }
  1288. return nonseekable_open(inode, file);
  1289. }
  1290. /*----------------------------------------------------------------------------*/
  1291. static int ltr303_release(struct inode *inode, struct file *file)
  1292. {
  1293. file->private_data = NULL;
  1294. return 0;
  1295. }
  1296. /*----------------------------------------------------------------------------*/
  1297. static long ltr303_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  1298. {
  1299. struct i2c_client *client = (struct i2c_client*)file->private_data;
  1300. struct ltr303_priv *obj = i2c_get_clientdata(client);
  1301. int err = 0;
  1302. void __user *ptr = (void __user*) arg;
  1303. int dat;
  1304. uint32_t enable;
  1305. APS_DBG("ltr303_unlocked_ioctl cmd= %d\n", cmd);
  1306. switch (cmd)
  1307. {
  1308. case ALSPS_SET_PS_MODE:
  1309. if(copy_from_user(&enable, ptr, sizeof(enable)))
  1310. {
  1311. err = -EFAULT;
  1312. goto err_out;
  1313. }
  1314. if(enable)
  1315. {
  1316. err = ltr303_ps_enable(ps_gainrange);
  1317. if(err < 0)
  1318. {
  1319. APS_ERR("enable ps fail: %d\n", err);
  1320. goto err_out;
  1321. }
  1322. set_bit(CMC_BIT_PS, &obj->enable);
  1323. }
  1324. else
  1325. {
  1326. err = ltr303_ps_disable();
  1327. if(err < 0)
  1328. {
  1329. APS_ERR("disable ps fail: %d\n", err);
  1330. goto err_out;
  1331. }
  1332. clear_bit(CMC_BIT_PS, &obj->enable);
  1333. }
  1334. break;
  1335. case ALSPS_GET_PS_MODE:
  1336. enable = test_bit(CMC_BIT_PS, &obj->enable) ? (1) : (0);
  1337. if(copy_to_user(ptr, &enable, sizeof(enable)))
  1338. {
  1339. err = -EFAULT;
  1340. goto err_out;
  1341. }
  1342. break;
  1343. case ALSPS_GET_PS_DATA:
  1344. APS_DBG("ALSPS_GET_PS_DATA\n");
  1345. obj->ps = ltr303_ps_read();
  1346. if(obj->ps < 0)
  1347. {
  1348. goto err_out;
  1349. }
  1350. dat = ltr303_get_ps_value(obj, obj->ps);
  1351. if(copy_to_user(ptr, &dat, sizeof(dat)))
  1352. {
  1353. err = -EFAULT;
  1354. goto err_out;
  1355. }
  1356. break;
  1357. case ALSPS_GET_PS_RAW_DATA:
  1358. #if 1
  1359. obj->ps = ltr303_ps_read();
  1360. if(obj->ps < 0)
  1361. {
  1362. goto err_out;
  1363. }
  1364. dat = obj->ps;
  1365. #endif
  1366. if(copy_to_user(ptr, &dat, sizeof(dat)))
  1367. {
  1368. err = -EFAULT;
  1369. goto err_out;
  1370. }
  1371. break;
  1372. case ALSPS_SET_ALS_MODE:
  1373. if(copy_from_user(&enable, ptr, sizeof(enable)))
  1374. {
  1375. err = -EFAULT;
  1376. goto err_out;
  1377. }
  1378. if(enable)
  1379. {
  1380. err = ltr303_als_enable(als_gainrange);
  1381. if(err < 0)
  1382. {
  1383. APS_ERR("enable als fail: %d\n", err);
  1384. goto err_out;
  1385. }
  1386. set_bit(CMC_BIT_ALS, &obj->enable);
  1387. }
  1388. else
  1389. {
  1390. err = ltr303_als_disable();
  1391. if(err < 0)
  1392. {
  1393. APS_ERR("disable als fail: %d\n", err);
  1394. goto err_out;
  1395. }
  1396. clear_bit(CMC_BIT_ALS, &obj->enable);
  1397. }
  1398. break;
  1399. case ALSPS_GET_ALS_MODE:
  1400. enable = test_bit(CMC_BIT_ALS, &obj->enable) ? (1) : (0);
  1401. if(copy_to_user(ptr, &enable, sizeof(enable)))
  1402. {
  1403. err = -EFAULT;
  1404. goto err_out;
  1405. }
  1406. break;
  1407. case ALSPS_GET_ALS_DATA:
  1408. obj->als = ltr303_als_read(als_gainrange);
  1409. if(obj->als < 0)
  1410. {
  1411. goto err_out;
  1412. }
  1413. dat = ltr303_get_als_value(obj, obj->als);
  1414. if(copy_to_user(ptr, &dat, sizeof(dat)))
  1415. {
  1416. err = -EFAULT;
  1417. goto err_out;
  1418. }
  1419. break;
  1420. case ALSPS_GET_ALS_RAW_DATA:
  1421. obj->als = ltr303_als_read(als_gainrange);
  1422. if(obj->als < 0)
  1423. {
  1424. goto err_out;
  1425. }
  1426. dat = obj->als;
  1427. if(copy_to_user(ptr, &dat, sizeof(dat)))
  1428. {
  1429. err = -EFAULT;
  1430. goto err_out;
  1431. }
  1432. break;
  1433. default:
  1434. APS_ERR("%s not supported = 0x%04x", __FUNCTION__, cmd);
  1435. err = -ENOIOCTLCMD;
  1436. break;
  1437. }
  1438. err_out:
  1439. return err;
  1440. }
  1441. /*----------------------------------------------------------------------------*/
  1442. static struct file_operations ltr303_fops = {
  1443. .owner = THIS_MODULE,
  1444. .open = ltr303_open,
  1445. .release = ltr303_release,
  1446. .unlocked_ioctl = ltr303_unlocked_ioctl,
  1447. };
  1448. /*----------------------------------------------------------------------------*/
  1449. static struct miscdevice ltr303_device = {
  1450. .minor = MISC_DYNAMIC_MINOR,
  1451. .name = "als_ps",
  1452. .fops = &ltr303_fops,
  1453. };
  1454. /*----------------------------------------------------------------------------*/
  1455. static int ltr303_i2c_suspend(struct i2c_client *client, pm_message_t msg)
  1456. {
  1457. struct ltr303_priv *obj = i2c_get_clientdata(client);
  1458. int err;
  1459. APS_FUN();
  1460. if(msg.event == PM_EVENT_SUSPEND)
  1461. {
  1462. if(!obj)
  1463. {
  1464. APS_ERR("null pointer!!\n");
  1465. return -EINVAL;
  1466. }
  1467. atomic_set(&obj->als_suspend, 1);
  1468. err = ltr303_als_disable();
  1469. if(err < 0)
  1470. {
  1471. APS_ERR("disable als: %d\n", err);
  1472. return err;
  1473. }
  1474. #if 0 //suspend not need ps suspend not need power down
  1475. atomic_set(&obj->ps_suspend, 1);
  1476. err = ltr303_ps_disable();
  1477. if(err < 0)
  1478. {
  1479. APS_ERR("disable ps: %d\n", err);
  1480. return err;
  1481. }
  1482. ltr303_power(obj->hw, 0);
  1483. #endif
  1484. }
  1485. return 0;
  1486. }
  1487. /*----------------------------------------------------------------------------*/
  1488. static int ltr303_i2c_resume(struct i2c_client *client)
  1489. {
  1490. struct ltr303_priv *obj = i2c_get_clientdata(client);
  1491. int err;
  1492. err = 0;
  1493. APS_FUN();
  1494. if(!obj)
  1495. {
  1496. APS_ERR("null pointer!!\n");
  1497. return -EINVAL;
  1498. }
  1499. ltr303_power(obj->hw, 1);
  1500. /* err = ltr303_devinit();
  1501. if(err < 0)
  1502. {
  1503. APS_ERR("initialize client fail!!\n");
  1504. return err;
  1505. }*/
  1506. atomic_set(&obj->als_suspend, 0);
  1507. if(test_bit(CMC_BIT_ALS, &obj->enable))
  1508. {
  1509. err = ltr303_als_enable(als_gainrange);
  1510. if (err < 0)
  1511. {
  1512. APS_ERR("enable als fail: %d\n", err);
  1513. }
  1514. }
  1515. if(test_bit(CMC_BIT_PS, &obj->enable))
  1516. {
  1517. //err = ltr303_ps_enable(ps_gainrange);
  1518. if (err < 0)
  1519. {
  1520. APS_ERR("enable ps fail: %d\n", err);
  1521. }
  1522. }
  1523. return 0;
  1524. }
  1525. /*----------------------------------------------------------------------------*/
  1526. static int ltr303_als_open_report_data(int open)
  1527. {
  1528. //should queuq work to report event if is_report_input_direct=true
  1529. return 0;
  1530. }
  1531. /*----------------------------------------------------------------------------*/
  1532. static int ltr303_als_enable_nodata(int enable)
  1533. {
  1534. int err=0;
  1535. APS_FUN();
  1536. if (ltr303_obj == NULL){
  1537. APS_ERR("ltr303_i2c_client is null!!\n");
  1538. return -1;
  1539. }
  1540. if (enable > 0) {
  1541. if (0 != (err = ltr303_als_enable(als_gainrange))) {
  1542. APS_ERR("enable als fail: %d\n", err);
  1543. return err;
  1544. }
  1545. set_bit(CMC_BIT_ALS, &ltr303_obj->enable);
  1546. } else {
  1547. if (0 != (err = ltr303_als_disable())) {
  1548. APS_ERR("disable als fail: %d\n", err);
  1549. return err;
  1550. }
  1551. clear_bit(CMC_BIT_ALS, &ltr303_obj->enable);
  1552. }
  1553. return 0;
  1554. }
  1555. /*----------------------------------------------------------------------------*/
  1556. static int ltr303_als_set_delay(u64 ns)
  1557. {
  1558. return 0;
  1559. }
  1560. /*----------------------------------------------------------------------------*/
  1561. static int ltr303_als_get_data(int* value, int* status)
  1562. {
  1563. int alsraw=0;
  1564. APS_FUN();
  1565. if (ltr303_obj == NULL) {
  1566. APS_ERR("ltr303_i2c_client is null!!\n");
  1567. return -EINVAL;
  1568. } else {
  1569. if(readenable){
  1570. alsraw = ltr303_als_read(als_gainrange);
  1571. *value= ltr303_get_als_value(ltr303_obj, alsraw);
  1572. *status = SENSOR_STATUS_ACCURACY_MEDIUM;
  1573. //APS_ERR("als_get_data *value = %d, *status =%d\n",*value, *status);
  1574. }
  1575. }
  1576. return 0;
  1577. }
  1578. /*----------------------------------------------------------------------------*/
  1579. static int ltr303_als_register(void)
  1580. {
  1581. int err = 0;
  1582. struct als_control_path als_ctl={0};
  1583. struct als_data_path als_data={0};
  1584. als_ctl.open_report_data= ltr303_als_open_report_data;
  1585. als_ctl.enable_nodata = ltr303_als_enable_nodata;
  1586. als_ctl.set_delay = ltr303_als_set_delay;
  1587. als_ctl.is_report_input_direct = false;
  1588. #if 0//def CUSTOM_KERNEL_SENSORHUB
  1589. als_ctl.is_support_batch = obj->hw->is_batch_supported_als;
  1590. #else
  1591. als_ctl.is_support_batch = false;
  1592. #endif
  1593. err = als_register_control_path(&als_ctl);
  1594. if (err) {
  1595. APS_ERR("register fail = %d\n", err);
  1596. goto exit_sensor_obj_attach_fail;
  1597. }
  1598. als_data.get_data = ltr303_als_get_data;
  1599. als_data.vender_div = 100;
  1600. err = als_register_data_path(&als_data);
  1601. if (err) {
  1602. APS_ERR("tregister fail = %d\n", err);
  1603. goto exit_sensor_obj_attach_fail;
  1604. }
  1605. err = batch_register_support_info(ID_LIGHT,als_ctl.is_support_batch, 100, 0);
  1606. if (err) {
  1607. APS_ERR("register light batch support err = %d\n", err);
  1608. goto exit_sensor_obj_attach_fail;
  1609. }
  1610. exit_sensor_obj_attach_fail:
  1611. return err;
  1612. }
  1613. /*----------------------------------------------------------------------------*/
  1614. static int ltr303_ps_open_report_data(int open)
  1615. {
  1616. //should queuq work to report event if is_report_input_direct=true
  1617. return 0;
  1618. }
  1619. /*----------------------------------------------------------------------------*/
  1620. static int ltr303_ps_enable_nodata(int enable)
  1621. {
  1622. int err=0;
  1623. APS_FUN();
  1624. if (ltr303_obj == NULL){
  1625. APS_ERR("ltr303_i2c_client is null!!\n");
  1626. return -1;
  1627. }
  1628. if (enable > 0) {
  1629. if (0 != (err = ltr303_ps_enable(ps_gainrange))) {
  1630. APS_ERR("enable ps fail: %d\n", err);
  1631. return err;
  1632. }
  1633. set_bit(CMC_BIT_PS, &ltr303_obj->enable);
  1634. } else {
  1635. if (0 != (err = ltr303_ps_disable())) {
  1636. APS_ERR("disable ps fail: %d\n", err);
  1637. return err;
  1638. }
  1639. clear_bit(CMC_BIT_PS, &ltr303_obj->enable);
  1640. }
  1641. return 0;
  1642. }
  1643. /*----------------------------------------------------------------------------*/
  1644. static int ltr303_ps_set_delay(u64 ns)
  1645. {
  1646. return 0;
  1647. }
  1648. /*----------------------------------------------------------------------------*/
  1649. static int ltr303_ps_get_data(int* value, int* status)
  1650. {
  1651. int psraw=0;
  1652. APS_FUN();
  1653. if (ltr303_obj == NULL) {
  1654. APS_ERR("ltr303_i2c_client is null!!\n");
  1655. return -EINVAL;
  1656. } else {
  1657. psraw = ltr303_ps_read();
  1658. *value= ltr303_get_ps_value(ltr303_obj, psraw);
  1659. *status = SENSOR_STATUS_ACCURACY_MEDIUM;
  1660. //APS_ERR("als_get_data *value = %d, *status =%d\n",*value, *status);
  1661. }
  1662. return 0;
  1663. }
  1664. /*----------------------------------------------------------------------------*/
  1665. static int ltr303_ps_register(void)
  1666. {
  1667. int err = 0;
  1668. struct ps_control_path ps_ctl={0};
  1669. struct ps_data_path ps_data={0};
  1670. ps_ctl.open_report_data= ltr303_ps_open_report_data;
  1671. ps_ctl.enable_nodata = ltr303_ps_enable_nodata;
  1672. ps_ctl.set_delay = ltr303_ps_set_delay;
  1673. ps_ctl.is_report_input_direct = false;
  1674. #if 0//def CUSTOM_KERNEL_SENSORHUB
  1675. ps_ctl.is_support_batch = obj->hw->is_batch_supported_als;
  1676. #else
  1677. ps_ctl.is_support_batch = false;
  1678. #endif
  1679. ps_ctl.is_polling_mode= false;
  1680. err = ps_register_control_path(&ps_ctl);
  1681. if (err) {
  1682. APS_ERR("register fail = %d\n", err);
  1683. goto exit_sensor_obj_attach_fail;
  1684. }
  1685. if((NULL!=ltr303_obj)){//xmxl
  1686. ps_data.get_data = ltr303_ps_get_data;
  1687. ps_data.vender_div = 100;
  1688. err = ps_register_data_path(&ps_data);
  1689. if (err) {
  1690. APS_ERR("tregister fail = %d\n", err);
  1691. goto exit_sensor_obj_attach_fail;
  1692. }
  1693. }
  1694. err = batch_register_support_info(ID_PROXIMITY,ps_ctl.is_support_batch, 100, 0);
  1695. if (err) {
  1696. APS_ERR("register PROXIMITY batch support err = %d\n", err);
  1697. goto exit_sensor_obj_attach_fail;
  1698. }
  1699. exit_sensor_obj_attach_fail:
  1700. return err;
  1701. }
  1702. /*----------------------------------------------------------------------------*/
  1703. static int ltr303_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
  1704. {
  1705. struct ltr303_priv *obj;
  1706. int err = 0;
  1707. APS_FUN();
  1708. if(!(obj = kzalloc(sizeof(*obj), GFP_KERNEL)))
  1709. {
  1710. err = -ENOMEM;
  1711. goto exit;
  1712. }
  1713. memset(obj, 0, sizeof(*obj));
  1714. ltr303_obj = obj;
  1715. obj->hw = hw;
  1716. INIT_WORK(&obj->eint_work, ltr303_eint_work);
  1717. obj->client = client;
  1718. i2c_set_clientdata(client, obj);
  1719. atomic_set(&obj->als_debounce, 300);
  1720. atomic_set(&obj->als_deb_on, 0);
  1721. atomic_set(&obj->als_deb_end, 0);
  1722. atomic_set(&obj->ps_debounce, 300);
  1723. atomic_set(&obj->ps_deb_on, 0);
  1724. atomic_set(&obj->ps_deb_end, 0);
  1725. atomic_set(&obj->ps_mask, 0);
  1726. atomic_set(&obj->als_suspend, 0);
  1727. atomic_set(&obj->ps_thd_val_high, obj->hw->ps_threshold_high);
  1728. atomic_set(&obj->ps_thd_val_low, obj->hw->ps_threshold_low);
  1729. //atomic_set(&obj->als_cmd_val, 0xDF);
  1730. //atomic_set(&obj->ps_cmd_val, 0xC1);
  1731. atomic_set(&obj->ps_thd_val, obj->hw->ps_threshold);
  1732. obj->irq_node = of_find_compatible_node(NULL, NULL, "mediatek,ltr303");
  1733. obj->enable = 0;
  1734. obj->pending_intr = 0;
  1735. obj->als_level_num = sizeof(obj->hw->als_level)/sizeof(obj->hw->als_level[0]);
  1736. obj->als_value_num = sizeof(obj->hw->als_value)/sizeof(obj->hw->als_value[0]);
  1737. obj->als_modulus = (400*100)/(16*150);//(1/Gain)*(400/Tine), this value is fix after init ATIME and CONTROL register value
  1738. //(400)/16*2.72 here is amplify *100
  1739. BUG_ON(sizeof(obj->als_level) != sizeof(obj->hw->als_level));
  1740. memcpy(obj->als_level, obj->hw->als_level, sizeof(obj->als_level));
  1741. BUG_ON(sizeof(obj->als_value) != sizeof(obj->hw->als_value));
  1742. memcpy(obj->als_value, obj->hw->als_value, sizeof(obj->als_value));
  1743. atomic_set(&obj->i2c_retry, 3);
  1744. set_bit(CMC_BIT_ALS, &obj->enable);
  1745. set_bit(CMC_BIT_PS, &obj->enable);
  1746. ltr303_i2c_client = client;
  1747. APS_LOG("ltr303_devinit() start...!\n");
  1748. if(0 != (err = ltr303_devinit()))
  1749. {
  1750. goto exit_init_failed;
  1751. }
  1752. APS_LOG("ltr303_devinit() ...OK!\n");
  1753. if(0 != (err = misc_register(&ltr303_device)))
  1754. {
  1755. APS_ERR("ltr303_device register failed\n");
  1756. goto exit_misc_device_register_failed;
  1757. }
  1758. if(0 != (err = ltr303_create_attr(&ltr303_init_info.platform_diver_addr->driver)))
  1759. {
  1760. APS_ERR("create attribute err = %d\n", err);
  1761. goto exit_create_attr_failed;
  1762. }
  1763. if ((0 != (err = ltr303_als_register())) || (0 != (err = ltr303_ps_register()))){
  1764. APS_ERR("register alsps err = %d\n", err);
  1765. goto exit_sensor_obj_attach_fail;
  1766. }
  1767. /*
  1768. #if defined(CONFIG_HAS_EARLYSUSPEND)
  1769. obj->early_drv.level = EARLY_SUSPEND_LEVEL_DISABLE_FB - 1,
  1770. obj->early_drv.suspend = ltr303_early_suspend,
  1771. obj->early_drv.resume = ltr303_late_resume,
  1772. register_early_suspend(&obj->early_drv);
  1773. #endif
  1774. */
  1775. ltr303_init_flag = 0;
  1776. APS_LOG("%s: OK\n", __func__);
  1777. return 0;
  1778. exit_create_attr_failed:
  1779. exit_sensor_obj_attach_fail:
  1780. misc_deregister(&ltr303_device);
  1781. exit_misc_device_register_failed:
  1782. exit_init_failed:
  1783. kfree(obj);
  1784. exit:
  1785. ltr303_i2c_client = NULL;
  1786. APS_ERR("%s: err = %d\n", __func__, err);
  1787. return err;
  1788. }
  1789. /*----------------------------------------------------------------------------*/
  1790. static int ltr303_i2c_remove(struct i2c_client *client)
  1791. {
  1792. int err;
  1793. if(0 != (err = ltr303_delete_attr(&ltr303_i2c_driver.driver)))
  1794. {
  1795. APS_ERR("ltr303_delete_attr fail: %d\n", err);
  1796. }
  1797. if(0 != (err = misc_deregister(&ltr303_device)))
  1798. {
  1799. APS_ERR("misc_deregister fail: %d\n", err);
  1800. }
  1801. ltr303_i2c_client = NULL;
  1802. i2c_unregister_device(client);
  1803. kfree(i2c_get_clientdata(client));
  1804. return 0;
  1805. }
  1806. /*----------------------------------------------------------------------------*/
  1807. static int ltr303_local_init(void)
  1808. {
  1809. APS_FUN();
  1810. ltr303_power(hw, 1);
  1811. if(0 != (i2c_add_driver(&ltr303_i2c_driver)))
  1812. {
  1813. APS_ERR("add driver error\n");
  1814. return -1;
  1815. }
  1816. else
  1817. {
  1818. APS_LOG("i2c_add_driver OK\n");
  1819. }
  1820. if(-1 == ltr303_init_flag)
  1821. {
  1822. return -1;
  1823. }
  1824. return 0;
  1825. }
  1826. /*----------------------------------------------------------------------------*/
  1827. static int ltr303_remove(void)
  1828. {
  1829. APS_FUN();
  1830. ltr303_power(hw, 0);
  1831. i2c_del_driver(&ltr303_i2c_driver);
  1832. return 0;
  1833. }
  1834. /*----------------------------------------------------------------------------*/
  1835. /*----------------------------------------------------------------------------*/
  1836. static int __init ltr303_init(void)
  1837. {
  1838. const char * name = "mediatek,ltr303_new";
  1839. hw = get_alsps_dts_func(name,hw);
  1840. APS_FUN();
  1841. if(!hw){
  1842. APS_ERR("get dts info fail\n");
  1843. goto EXIT_NOW;
  1844. }
  1845. // i2c_register_board_info(hw->i2c_num, &i2c_ltr303, 1);
  1846. alsps_driver_add(&ltr303_init_info);
  1847. EXIT_NOW:
  1848. return 0;
  1849. }
  1850. /*----------------------------------------------------------------------------*/
  1851. static void __exit ltr303_exit(void)
  1852. {
  1853. APS_FUN();
  1854. }
  1855. /*----------------------------------------------------------------------------*/
  1856. module_init(ltr303_init);
  1857. module_exit(ltr303_exit);
  1858. /*----------------------------------------------------------------------------*/
  1859. MODULE_AUTHOR("Waching Fully");
  1860. MODULE_DESCRIPTION("LTR-303ALS Driver");
  1861. MODULE_LICENSE("GPL");