ltr501.c 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Support for Lite-On LTR501 and similar ambient light and proximity sensors.
  4. *
  5. * Copyright 2014 Peter Meerwald <pmeerw@pmeerw.net>
  6. *
  7. * 7-bit I2C slave address 0x23
  8. *
  9. * TODO: IR LED characteristics
  10. */
  11. #include <linux/module.h>
  12. #include <linux/mod_devicetable.h>
  13. #include <linux/i2c.h>
  14. #include <linux/err.h>
  15. #include <linux/delay.h>
  16. #include <linux/regmap.h>
  17. #include <linux/acpi.h>
  18. #include <linux/regulator/consumer.h>
  19. #include <linux/iio/iio.h>
  20. #include <linux/iio/events.h>
  21. #include <linux/iio/sysfs.h>
  22. #include <linux/iio/trigger_consumer.h>
  23. #include <linux/iio/buffer.h>
  24. #include <linux/iio/triggered_buffer.h>
  25. #define LTR501_DRV_NAME "ltr501"
  26. #define LTR501_ALS_CONTR 0x80 /* ALS operation mode, SW reset */
  27. #define LTR501_PS_CONTR 0x81 /* PS operation mode */
  28. #define LTR501_PS_MEAS_RATE 0x84 /* measurement rate*/
  29. #define LTR501_ALS_MEAS_RATE 0x85 /* ALS integ time, measurement rate*/
  30. #define LTR501_PART_ID 0x86
  31. #define LTR501_MANUFAC_ID 0x87
  32. #define LTR501_ALS_DATA1 0x88 /* 16-bit, little endian */
  33. #define LTR501_ALS_DATA1_UPPER 0x89 /* upper 8 bits of LTR501_ALS_DATA1 */
  34. #define LTR501_ALS_DATA0 0x8a /* 16-bit, little endian */
  35. #define LTR501_ALS_DATA0_UPPER 0x8b /* upper 8 bits of LTR501_ALS_DATA0 */
  36. #define LTR501_ALS_PS_STATUS 0x8c
  37. #define LTR501_PS_DATA 0x8d /* 16-bit, little endian */
  38. #define LTR501_PS_DATA_UPPER 0x8e /* upper 8 bits of LTR501_PS_DATA */
  39. #define LTR501_INTR 0x8f /* output mode, polarity, mode */
  40. #define LTR501_PS_THRESH_UP 0x90 /* 11 bit, ps upper threshold */
  41. #define LTR501_PS_THRESH_LOW 0x92 /* 11 bit, ps lower threshold */
  42. #define LTR501_ALS_THRESH_UP 0x97 /* 16 bit, ALS upper threshold */
  43. #define LTR501_ALS_THRESH_LOW 0x99 /* 16 bit, ALS lower threshold */
  44. #define LTR501_INTR_PRST 0x9e /* ps thresh, als thresh */
  45. #define LTR501_MAX_REG 0x9f
  46. #define LTR501_ALS_CONTR_SW_RESET BIT(2)
  47. #define LTR501_CONTR_PS_GAIN_MASK (BIT(3) | BIT(2))
  48. #define LTR501_CONTR_PS_GAIN_SHIFT 2
  49. #define LTR501_CONTR_ALS_GAIN_MASK BIT(3)
  50. #define LTR501_CONTR_ACTIVE BIT(1)
  51. #define LTR501_STATUS_ALS_INTR BIT(3)
  52. #define LTR501_STATUS_ALS_RDY BIT(2)
  53. #define LTR501_STATUS_PS_INTR BIT(1)
  54. #define LTR501_STATUS_PS_RDY BIT(0)
  55. #define LTR501_PS_DATA_MASK 0x7ff
  56. #define LTR501_PS_THRESH_MASK 0x7ff
  57. #define LTR501_ALS_THRESH_MASK 0xffff
  58. #define LTR501_ALS_DEF_PERIOD 500000
  59. #define LTR501_PS_DEF_PERIOD 100000
  60. #define LTR501_REGMAP_NAME "ltr501_regmap"
  61. #define LTR501_LUX_CONV(vis_coeff, vis_data, ir_coeff, ir_data) \
  62. ((vis_coeff * vis_data) - (ir_coeff * ir_data))
  63. static const int int_time_mapping[] = {100000, 50000, 200000, 400000};
  64. static const struct reg_field reg_field_it =
  65. REG_FIELD(LTR501_ALS_MEAS_RATE, 3, 4);
  66. static const struct reg_field reg_field_als_intr =
  67. REG_FIELD(LTR501_INTR, 1, 1);
  68. static const struct reg_field reg_field_ps_intr =
  69. REG_FIELD(LTR501_INTR, 0, 0);
  70. static const struct reg_field reg_field_als_rate =
  71. REG_FIELD(LTR501_ALS_MEAS_RATE, 0, 2);
  72. static const struct reg_field reg_field_ps_rate =
  73. REG_FIELD(LTR501_PS_MEAS_RATE, 0, 3);
  74. static const struct reg_field reg_field_als_prst =
  75. REG_FIELD(LTR501_INTR_PRST, 0, 3);
  76. static const struct reg_field reg_field_ps_prst =
  77. REG_FIELD(LTR501_INTR_PRST, 4, 7);
  78. struct ltr501_samp_table {
  79. int freq_val; /* repetition frequency in micro HZ*/
  80. int time_val; /* repetition rate in micro seconds */
  81. };
  82. #define LTR501_RESERVED_GAIN -1
  83. enum {
  84. ltr501 = 0,
  85. ltr559,
  86. ltr301,
  87. ltr303,
  88. };
  89. struct ltr501_gain {
  90. int scale;
  91. int uscale;
  92. };
  93. static const struct ltr501_gain ltr501_als_gain_tbl[] = {
  94. {1, 0},
  95. {0, 5000},
  96. };
  97. static const struct ltr501_gain ltr559_als_gain_tbl[] = {
  98. {1, 0},
  99. {0, 500000},
  100. {0, 250000},
  101. {0, 125000},
  102. {LTR501_RESERVED_GAIN, LTR501_RESERVED_GAIN},
  103. {LTR501_RESERVED_GAIN, LTR501_RESERVED_GAIN},
  104. {0, 20000},
  105. {0, 10000},
  106. };
  107. static const struct ltr501_gain ltr501_ps_gain_tbl[] = {
  108. {1, 0},
  109. {0, 250000},
  110. {0, 125000},
  111. {0, 62500},
  112. };
  113. static const struct ltr501_gain ltr559_ps_gain_tbl[] = {
  114. {0, 62500}, /* x16 gain */
  115. {0, 31250}, /* x32 gain */
  116. {0, 15625}, /* bits X1 are for x64 gain */
  117. {0, 15624},
  118. };
  119. struct ltr501_chip_info {
  120. u8 partid;
  121. const struct ltr501_gain *als_gain;
  122. int als_gain_tbl_size;
  123. const struct ltr501_gain *ps_gain;
  124. int ps_gain_tbl_size;
  125. u8 als_mode_active;
  126. u8 als_gain_mask;
  127. u8 als_gain_shift;
  128. struct iio_chan_spec const *channels;
  129. const int no_channels;
  130. const struct iio_info *info;
  131. const struct iio_info *info_no_irq;
  132. };
  133. struct ltr501_data {
  134. struct i2c_client *client;
  135. struct mutex lock_als, lock_ps;
  136. const struct ltr501_chip_info *chip_info;
  137. u8 als_contr, ps_contr;
  138. int als_period, ps_period; /* period in micro seconds */
  139. struct regmap *regmap;
  140. struct regmap_field *reg_it;
  141. struct regmap_field *reg_als_intr;
  142. struct regmap_field *reg_ps_intr;
  143. struct regmap_field *reg_als_rate;
  144. struct regmap_field *reg_ps_rate;
  145. struct regmap_field *reg_als_prst;
  146. struct regmap_field *reg_ps_prst;
  147. uint32_t near_level;
  148. };
  149. static const struct ltr501_samp_table ltr501_als_samp_table[] = {
  150. {20000000, 50000}, {10000000, 100000},
  151. {5000000, 200000}, {2000000, 500000},
  152. {1000000, 1000000}, {500000, 2000000},
  153. {500000, 2000000}, {500000, 2000000}
  154. };
  155. static const struct ltr501_samp_table ltr501_ps_samp_table[] = {
  156. {20000000, 50000}, {14285714, 70000},
  157. {10000000, 100000}, {5000000, 200000},
  158. {2000000, 500000}, {1000000, 1000000},
  159. {500000, 2000000}, {500000, 2000000},
  160. {500000, 2000000}
  161. };
  162. static int ltr501_match_samp_freq(const struct ltr501_samp_table *tab,
  163. int len, int val, int val2)
  164. {
  165. int i, freq;
  166. freq = val * 1000000 + val2;
  167. for (i = 0; i < len; i++) {
  168. if (tab[i].freq_val == freq)
  169. return i;
  170. }
  171. return -EINVAL;
  172. }
  173. static int ltr501_als_read_samp_freq(const struct ltr501_data *data,
  174. int *val, int *val2)
  175. {
  176. int ret, i;
  177. ret = regmap_field_read(data->reg_als_rate, &i);
  178. if (ret < 0)
  179. return ret;
  180. if (i < 0 || i >= ARRAY_SIZE(ltr501_als_samp_table))
  181. return -EINVAL;
  182. *val = ltr501_als_samp_table[i].freq_val / 1000000;
  183. *val2 = ltr501_als_samp_table[i].freq_val % 1000000;
  184. return IIO_VAL_INT_PLUS_MICRO;
  185. }
  186. static int ltr501_ps_read_samp_freq(const struct ltr501_data *data,
  187. int *val, int *val2)
  188. {
  189. int ret, i;
  190. ret = regmap_field_read(data->reg_ps_rate, &i);
  191. if (ret < 0)
  192. return ret;
  193. if (i < 0 || i >= ARRAY_SIZE(ltr501_ps_samp_table))
  194. return -EINVAL;
  195. *val = ltr501_ps_samp_table[i].freq_val / 1000000;
  196. *val2 = ltr501_ps_samp_table[i].freq_val % 1000000;
  197. return IIO_VAL_INT_PLUS_MICRO;
  198. }
  199. static int ltr501_als_write_samp_freq(struct ltr501_data *data,
  200. int val, int val2)
  201. {
  202. int i, ret;
  203. i = ltr501_match_samp_freq(ltr501_als_samp_table,
  204. ARRAY_SIZE(ltr501_als_samp_table),
  205. val, val2);
  206. if (i < 0)
  207. return i;
  208. mutex_lock(&data->lock_als);
  209. ret = regmap_field_write(data->reg_als_rate, i);
  210. mutex_unlock(&data->lock_als);
  211. return ret;
  212. }
  213. static int ltr501_ps_write_samp_freq(struct ltr501_data *data,
  214. int val, int val2)
  215. {
  216. int i, ret;
  217. i = ltr501_match_samp_freq(ltr501_ps_samp_table,
  218. ARRAY_SIZE(ltr501_ps_samp_table),
  219. val, val2);
  220. if (i < 0)
  221. return i;
  222. mutex_lock(&data->lock_ps);
  223. ret = regmap_field_write(data->reg_ps_rate, i);
  224. mutex_unlock(&data->lock_ps);
  225. return ret;
  226. }
  227. static int ltr501_als_read_samp_period(const struct ltr501_data *data, int *val)
  228. {
  229. int ret, i;
  230. ret = regmap_field_read(data->reg_als_rate, &i);
  231. if (ret < 0)
  232. return ret;
  233. if (i < 0 || i >= ARRAY_SIZE(ltr501_als_samp_table))
  234. return -EINVAL;
  235. *val = ltr501_als_samp_table[i].time_val;
  236. return IIO_VAL_INT;
  237. }
  238. static int ltr501_ps_read_samp_period(const struct ltr501_data *data, int *val)
  239. {
  240. int ret, i;
  241. ret = regmap_field_read(data->reg_ps_rate, &i);
  242. if (ret < 0)
  243. return ret;
  244. if (i < 0 || i >= ARRAY_SIZE(ltr501_ps_samp_table))
  245. return -EINVAL;
  246. *val = ltr501_ps_samp_table[i].time_val;
  247. return IIO_VAL_INT;
  248. }
  249. /* IR and visible spectrum coeff's are given in data sheet */
  250. static unsigned long ltr501_calculate_lux(u16 vis_data, u16 ir_data)
  251. {
  252. unsigned long ratio, lux;
  253. if (vis_data == 0)
  254. return 0;
  255. /* multiply numerator by 100 to avoid handling ratio < 1 */
  256. ratio = DIV_ROUND_UP(ir_data * 100, ir_data + vis_data);
  257. if (ratio < 45)
  258. lux = LTR501_LUX_CONV(1774, vis_data, -1105, ir_data);
  259. else if (ratio >= 45 && ratio < 64)
  260. lux = LTR501_LUX_CONV(3772, vis_data, 1336, ir_data);
  261. else if (ratio >= 64 && ratio < 85)
  262. lux = LTR501_LUX_CONV(1690, vis_data, 169, ir_data);
  263. else
  264. lux = 0;
  265. return lux / 1000;
  266. }
  267. static int ltr501_drdy(const struct ltr501_data *data, u8 drdy_mask)
  268. {
  269. int tries = 100;
  270. int ret, status;
  271. while (tries--) {
  272. ret = regmap_read(data->regmap, LTR501_ALS_PS_STATUS, &status);
  273. if (ret < 0)
  274. return ret;
  275. if ((status & drdy_mask) == drdy_mask)
  276. return 0;
  277. msleep(25);
  278. }
  279. dev_err(&data->client->dev, "ltr501_drdy() failed, data not ready\n");
  280. return -EIO;
  281. }
  282. static int ltr501_set_it_time(struct ltr501_data *data, int it)
  283. {
  284. int ret, i, index = -1, status;
  285. for (i = 0; i < ARRAY_SIZE(int_time_mapping); i++) {
  286. if (int_time_mapping[i] == it) {
  287. index = i;
  288. break;
  289. }
  290. }
  291. /* Make sure integ time index is valid */
  292. if (index < 0)
  293. return -EINVAL;
  294. ret = regmap_read(data->regmap, LTR501_ALS_CONTR, &status);
  295. if (ret < 0)
  296. return ret;
  297. if (status & LTR501_CONTR_ALS_GAIN_MASK) {
  298. /*
  299. * 200 ms and 400 ms integ time can only be
  300. * used in dynamic range 1
  301. */
  302. if (index > 1)
  303. return -EINVAL;
  304. } else
  305. /* 50 ms integ time can only be used in dynamic range 2 */
  306. if (index == 1)
  307. return -EINVAL;
  308. return regmap_field_write(data->reg_it, index);
  309. }
  310. /* read int time in micro seconds */
  311. static int ltr501_read_it_time(const struct ltr501_data *data,
  312. int *val, int *val2)
  313. {
  314. int ret, index;
  315. ret = regmap_field_read(data->reg_it, &index);
  316. if (ret < 0)
  317. return ret;
  318. /* Make sure integ time index is valid */
  319. if (index < 0 || index >= ARRAY_SIZE(int_time_mapping))
  320. return -EINVAL;
  321. *val2 = int_time_mapping[index];
  322. *val = 0;
  323. return IIO_VAL_INT_PLUS_MICRO;
  324. }
  325. static int ltr501_read_als(const struct ltr501_data *data, __le16 buf[2])
  326. {
  327. int ret;
  328. ret = ltr501_drdy(data, LTR501_STATUS_ALS_RDY);
  329. if (ret < 0)
  330. return ret;
  331. /* always read both ALS channels in given order */
  332. return regmap_bulk_read(data->regmap, LTR501_ALS_DATA1,
  333. buf, 2 * sizeof(__le16));
  334. }
  335. static int ltr501_read_ps(const struct ltr501_data *data)
  336. {
  337. __le16 status;
  338. int ret;
  339. ret = ltr501_drdy(data, LTR501_STATUS_PS_RDY);
  340. if (ret < 0)
  341. return ret;
  342. ret = regmap_bulk_read(data->regmap, LTR501_PS_DATA,
  343. &status, sizeof(status));
  344. if (ret < 0)
  345. return ret;
  346. return le16_to_cpu(status);
  347. }
  348. static int ltr501_read_intr_prst(const struct ltr501_data *data,
  349. enum iio_chan_type type,
  350. int *val2)
  351. {
  352. int ret, samp_period, prst;
  353. switch (type) {
  354. case IIO_INTENSITY:
  355. ret = regmap_field_read(data->reg_als_prst, &prst);
  356. if (ret < 0)
  357. return ret;
  358. ret = ltr501_als_read_samp_period(data, &samp_period);
  359. if (ret < 0)
  360. return ret;
  361. *val2 = samp_period * prst;
  362. return IIO_VAL_INT_PLUS_MICRO;
  363. case IIO_PROXIMITY:
  364. ret = regmap_field_read(data->reg_ps_prst, &prst);
  365. if (ret < 0)
  366. return ret;
  367. ret = ltr501_ps_read_samp_period(data, &samp_period);
  368. if (ret < 0)
  369. return ret;
  370. *val2 = samp_period * prst;
  371. return IIO_VAL_INT_PLUS_MICRO;
  372. default:
  373. return -EINVAL;
  374. }
  375. return -EINVAL;
  376. }
  377. static int ltr501_write_intr_prst(struct ltr501_data *data,
  378. enum iio_chan_type type,
  379. int val, int val2)
  380. {
  381. int ret, samp_period, new_val;
  382. unsigned long period;
  383. if (val < 0 || val2 < 0)
  384. return -EINVAL;
  385. /* period in microseconds */
  386. period = ((val * 1000000) + val2);
  387. switch (type) {
  388. case IIO_INTENSITY:
  389. ret = ltr501_als_read_samp_period(data, &samp_period);
  390. if (ret < 0)
  391. return ret;
  392. /* period should be atleast equal to sampling period */
  393. if (period < samp_period)
  394. return -EINVAL;
  395. new_val = DIV_ROUND_UP(period, samp_period);
  396. if (new_val < 0 || new_val > 0x0f)
  397. return -EINVAL;
  398. mutex_lock(&data->lock_als);
  399. ret = regmap_field_write(data->reg_als_prst, new_val);
  400. mutex_unlock(&data->lock_als);
  401. if (ret >= 0)
  402. data->als_period = period;
  403. return ret;
  404. case IIO_PROXIMITY:
  405. ret = ltr501_ps_read_samp_period(data, &samp_period);
  406. if (ret < 0)
  407. return ret;
  408. /* period should be atleast equal to rate */
  409. if (period < samp_period)
  410. return -EINVAL;
  411. new_val = DIV_ROUND_UP(period, samp_period);
  412. if (new_val < 0 || new_val > 0x0f)
  413. return -EINVAL;
  414. mutex_lock(&data->lock_ps);
  415. ret = regmap_field_write(data->reg_ps_prst, new_val);
  416. mutex_unlock(&data->lock_ps);
  417. if (ret >= 0)
  418. data->ps_period = period;
  419. return ret;
  420. default:
  421. return -EINVAL;
  422. }
  423. return -EINVAL;
  424. }
  425. static ssize_t ltr501_read_near_level(struct iio_dev *indio_dev,
  426. uintptr_t priv,
  427. const struct iio_chan_spec *chan,
  428. char *buf)
  429. {
  430. struct ltr501_data *data = iio_priv(indio_dev);
  431. return sprintf(buf, "%u\n", data->near_level);
  432. }
  433. static const struct iio_chan_spec_ext_info ltr501_ext_info[] = {
  434. {
  435. .name = "nearlevel",
  436. .shared = IIO_SEPARATE,
  437. .read = ltr501_read_near_level,
  438. },
  439. { /* sentinel */ }
  440. };
  441. static const struct iio_event_spec ltr501_als_event_spec[] = {
  442. {
  443. .type = IIO_EV_TYPE_THRESH,
  444. .dir = IIO_EV_DIR_RISING,
  445. .mask_separate = BIT(IIO_EV_INFO_VALUE),
  446. }, {
  447. .type = IIO_EV_TYPE_THRESH,
  448. .dir = IIO_EV_DIR_FALLING,
  449. .mask_separate = BIT(IIO_EV_INFO_VALUE),
  450. }, {
  451. .type = IIO_EV_TYPE_THRESH,
  452. .dir = IIO_EV_DIR_EITHER,
  453. .mask_separate = BIT(IIO_EV_INFO_ENABLE) |
  454. BIT(IIO_EV_INFO_PERIOD),
  455. },
  456. };
  457. static const struct iio_event_spec ltr501_pxs_event_spec[] = {
  458. {
  459. .type = IIO_EV_TYPE_THRESH,
  460. .dir = IIO_EV_DIR_RISING,
  461. .mask_separate = BIT(IIO_EV_INFO_VALUE),
  462. }, {
  463. .type = IIO_EV_TYPE_THRESH,
  464. .dir = IIO_EV_DIR_FALLING,
  465. .mask_separate = BIT(IIO_EV_INFO_VALUE),
  466. }, {
  467. .type = IIO_EV_TYPE_THRESH,
  468. .dir = IIO_EV_DIR_EITHER,
  469. .mask_separate = BIT(IIO_EV_INFO_ENABLE) |
  470. BIT(IIO_EV_INFO_PERIOD),
  471. },
  472. };
  473. #define LTR501_INTENSITY_CHANNEL(_idx, _addr, _mod, _shared, \
  474. _evspec, _evsize) { \
  475. .type = IIO_INTENSITY, \
  476. .modified = 1, \
  477. .address = (_addr), \
  478. .channel2 = (_mod), \
  479. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  480. .info_mask_shared_by_type = (_shared), \
  481. .scan_index = (_idx), \
  482. .scan_type = { \
  483. .sign = 'u', \
  484. .realbits = 16, \
  485. .storagebits = 16, \
  486. .endianness = IIO_CPU, \
  487. }, \
  488. .event_spec = _evspec,\
  489. .num_event_specs = _evsize,\
  490. }
  491. #define LTR501_LIGHT_CHANNEL() { \
  492. .type = IIO_LIGHT, \
  493. .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), \
  494. .scan_index = -1, \
  495. }
  496. static const struct iio_chan_spec ltr501_channels[] = {
  497. LTR501_LIGHT_CHANNEL(),
  498. LTR501_INTENSITY_CHANNEL(0, LTR501_ALS_DATA0, IIO_MOD_LIGHT_BOTH, 0,
  499. ltr501_als_event_spec,
  500. ARRAY_SIZE(ltr501_als_event_spec)),
  501. LTR501_INTENSITY_CHANNEL(1, LTR501_ALS_DATA1, IIO_MOD_LIGHT_IR,
  502. BIT(IIO_CHAN_INFO_SCALE) |
  503. BIT(IIO_CHAN_INFO_INT_TIME) |
  504. BIT(IIO_CHAN_INFO_SAMP_FREQ),
  505. NULL, 0),
  506. {
  507. .type = IIO_PROXIMITY,
  508. .address = LTR501_PS_DATA,
  509. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  510. BIT(IIO_CHAN_INFO_SCALE),
  511. .scan_index = 2,
  512. .scan_type = {
  513. .sign = 'u',
  514. .realbits = 11,
  515. .storagebits = 16,
  516. .endianness = IIO_CPU,
  517. },
  518. .event_spec = ltr501_pxs_event_spec,
  519. .num_event_specs = ARRAY_SIZE(ltr501_pxs_event_spec),
  520. .ext_info = ltr501_ext_info,
  521. },
  522. IIO_CHAN_SOFT_TIMESTAMP(3),
  523. };
  524. static const struct iio_chan_spec ltr301_channels[] = {
  525. LTR501_LIGHT_CHANNEL(),
  526. LTR501_INTENSITY_CHANNEL(0, LTR501_ALS_DATA0, IIO_MOD_LIGHT_BOTH, 0,
  527. ltr501_als_event_spec,
  528. ARRAY_SIZE(ltr501_als_event_spec)),
  529. LTR501_INTENSITY_CHANNEL(1, LTR501_ALS_DATA1, IIO_MOD_LIGHT_IR,
  530. BIT(IIO_CHAN_INFO_SCALE) |
  531. BIT(IIO_CHAN_INFO_INT_TIME) |
  532. BIT(IIO_CHAN_INFO_SAMP_FREQ),
  533. NULL, 0),
  534. IIO_CHAN_SOFT_TIMESTAMP(2),
  535. };
  536. static int ltr501_read_raw(struct iio_dev *indio_dev,
  537. struct iio_chan_spec const *chan,
  538. int *val, int *val2, long mask)
  539. {
  540. struct ltr501_data *data = iio_priv(indio_dev);
  541. __le16 buf[2];
  542. int ret, i;
  543. switch (mask) {
  544. case IIO_CHAN_INFO_PROCESSED:
  545. switch (chan->type) {
  546. case IIO_LIGHT:
  547. ret = iio_device_claim_direct_mode(indio_dev);
  548. if (ret)
  549. return ret;
  550. mutex_lock(&data->lock_als);
  551. ret = ltr501_read_als(data, buf);
  552. mutex_unlock(&data->lock_als);
  553. iio_device_release_direct_mode(indio_dev);
  554. if (ret < 0)
  555. return ret;
  556. *val = ltr501_calculate_lux(le16_to_cpu(buf[1]),
  557. le16_to_cpu(buf[0]));
  558. return IIO_VAL_INT;
  559. default:
  560. return -EINVAL;
  561. }
  562. case IIO_CHAN_INFO_RAW:
  563. ret = iio_device_claim_direct_mode(indio_dev);
  564. if (ret)
  565. return ret;
  566. switch (chan->type) {
  567. case IIO_INTENSITY:
  568. mutex_lock(&data->lock_als);
  569. ret = ltr501_read_als(data, buf);
  570. mutex_unlock(&data->lock_als);
  571. if (ret < 0)
  572. break;
  573. *val = le16_to_cpu(chan->address == LTR501_ALS_DATA1 ?
  574. buf[0] : buf[1]);
  575. ret = IIO_VAL_INT;
  576. break;
  577. case IIO_PROXIMITY:
  578. mutex_lock(&data->lock_ps);
  579. ret = ltr501_read_ps(data);
  580. mutex_unlock(&data->lock_ps);
  581. if (ret < 0)
  582. break;
  583. *val = ret & LTR501_PS_DATA_MASK;
  584. ret = IIO_VAL_INT;
  585. break;
  586. default:
  587. ret = -EINVAL;
  588. break;
  589. }
  590. iio_device_release_direct_mode(indio_dev);
  591. return ret;
  592. case IIO_CHAN_INFO_SCALE:
  593. switch (chan->type) {
  594. case IIO_INTENSITY:
  595. i = (data->als_contr & data->chip_info->als_gain_mask)
  596. >> data->chip_info->als_gain_shift;
  597. *val = data->chip_info->als_gain[i].scale;
  598. *val2 = data->chip_info->als_gain[i].uscale;
  599. return IIO_VAL_INT_PLUS_MICRO;
  600. case IIO_PROXIMITY:
  601. i = (data->ps_contr & LTR501_CONTR_PS_GAIN_MASK) >>
  602. LTR501_CONTR_PS_GAIN_SHIFT;
  603. *val = data->chip_info->ps_gain[i].scale;
  604. *val2 = data->chip_info->ps_gain[i].uscale;
  605. return IIO_VAL_INT_PLUS_MICRO;
  606. default:
  607. return -EINVAL;
  608. }
  609. case IIO_CHAN_INFO_INT_TIME:
  610. switch (chan->type) {
  611. case IIO_INTENSITY:
  612. return ltr501_read_it_time(data, val, val2);
  613. default:
  614. return -EINVAL;
  615. }
  616. case IIO_CHAN_INFO_SAMP_FREQ:
  617. switch (chan->type) {
  618. case IIO_INTENSITY:
  619. return ltr501_als_read_samp_freq(data, val, val2);
  620. case IIO_PROXIMITY:
  621. return ltr501_ps_read_samp_freq(data, val, val2);
  622. default:
  623. return -EINVAL;
  624. }
  625. }
  626. return -EINVAL;
  627. }
  628. static int ltr501_get_gain_index(const struct ltr501_gain *gain, int size,
  629. int val, int val2)
  630. {
  631. int i;
  632. for (i = 0; i < size; i++)
  633. if (val == gain[i].scale && val2 == gain[i].uscale)
  634. return i;
  635. return -1;
  636. }
  637. static int ltr501_write_raw(struct iio_dev *indio_dev,
  638. struct iio_chan_spec const *chan,
  639. int val, int val2, long mask)
  640. {
  641. struct ltr501_data *data = iio_priv(indio_dev);
  642. int i, ret, freq_val, freq_val2;
  643. const struct ltr501_chip_info *info = data->chip_info;
  644. ret = iio_device_claim_direct_mode(indio_dev);
  645. if (ret)
  646. return ret;
  647. switch (mask) {
  648. case IIO_CHAN_INFO_SCALE:
  649. switch (chan->type) {
  650. case IIO_INTENSITY:
  651. i = ltr501_get_gain_index(info->als_gain,
  652. info->als_gain_tbl_size,
  653. val, val2);
  654. if (i < 0) {
  655. ret = -EINVAL;
  656. break;
  657. }
  658. data->als_contr &= ~info->als_gain_mask;
  659. data->als_contr |= i << info->als_gain_shift;
  660. ret = regmap_write(data->regmap, LTR501_ALS_CONTR,
  661. data->als_contr);
  662. break;
  663. case IIO_PROXIMITY:
  664. i = ltr501_get_gain_index(info->ps_gain,
  665. info->ps_gain_tbl_size,
  666. val, val2);
  667. if (i < 0) {
  668. ret = -EINVAL;
  669. break;
  670. }
  671. data->ps_contr &= ~LTR501_CONTR_PS_GAIN_MASK;
  672. data->ps_contr |= i << LTR501_CONTR_PS_GAIN_SHIFT;
  673. ret = regmap_write(data->regmap, LTR501_PS_CONTR,
  674. data->ps_contr);
  675. break;
  676. default:
  677. ret = -EINVAL;
  678. break;
  679. }
  680. break;
  681. case IIO_CHAN_INFO_INT_TIME:
  682. switch (chan->type) {
  683. case IIO_INTENSITY:
  684. if (val != 0) {
  685. ret = -EINVAL;
  686. break;
  687. }
  688. mutex_lock(&data->lock_als);
  689. ret = ltr501_set_it_time(data, val2);
  690. mutex_unlock(&data->lock_als);
  691. break;
  692. default:
  693. ret = -EINVAL;
  694. break;
  695. }
  696. break;
  697. case IIO_CHAN_INFO_SAMP_FREQ:
  698. switch (chan->type) {
  699. case IIO_INTENSITY:
  700. ret = ltr501_als_read_samp_freq(data, &freq_val,
  701. &freq_val2);
  702. if (ret < 0)
  703. break;
  704. ret = ltr501_als_write_samp_freq(data, val, val2);
  705. if (ret < 0)
  706. break;
  707. /* update persistence count when changing frequency */
  708. ret = ltr501_write_intr_prst(data, chan->type,
  709. 0, data->als_period);
  710. if (ret < 0)
  711. ret = ltr501_als_write_samp_freq(data, freq_val,
  712. freq_val2);
  713. break;
  714. case IIO_PROXIMITY:
  715. ret = ltr501_ps_read_samp_freq(data, &freq_val,
  716. &freq_val2);
  717. if (ret < 0)
  718. break;
  719. ret = ltr501_ps_write_samp_freq(data, val, val2);
  720. if (ret < 0)
  721. break;
  722. /* update persistence count when changing frequency */
  723. ret = ltr501_write_intr_prst(data, chan->type,
  724. 0, data->ps_period);
  725. if (ret < 0)
  726. ret = ltr501_ps_write_samp_freq(data, freq_val,
  727. freq_val2);
  728. break;
  729. default:
  730. ret = -EINVAL;
  731. break;
  732. }
  733. break;
  734. default:
  735. ret = -EINVAL;
  736. break;
  737. }
  738. iio_device_release_direct_mode(indio_dev);
  739. return ret;
  740. }
  741. static int ltr501_read_thresh(const struct iio_dev *indio_dev,
  742. const struct iio_chan_spec *chan,
  743. enum iio_event_type type,
  744. enum iio_event_direction dir,
  745. enum iio_event_info info,
  746. int *val, int *val2)
  747. {
  748. const struct ltr501_data *data = iio_priv(indio_dev);
  749. int ret, thresh_data;
  750. switch (chan->type) {
  751. case IIO_INTENSITY:
  752. switch (dir) {
  753. case IIO_EV_DIR_RISING:
  754. ret = regmap_bulk_read(data->regmap,
  755. LTR501_ALS_THRESH_UP,
  756. &thresh_data, 2);
  757. if (ret < 0)
  758. return ret;
  759. *val = thresh_data & LTR501_ALS_THRESH_MASK;
  760. return IIO_VAL_INT;
  761. case IIO_EV_DIR_FALLING:
  762. ret = regmap_bulk_read(data->regmap,
  763. LTR501_ALS_THRESH_LOW,
  764. &thresh_data, 2);
  765. if (ret < 0)
  766. return ret;
  767. *val = thresh_data & LTR501_ALS_THRESH_MASK;
  768. return IIO_VAL_INT;
  769. default:
  770. return -EINVAL;
  771. }
  772. case IIO_PROXIMITY:
  773. switch (dir) {
  774. case IIO_EV_DIR_RISING:
  775. ret = regmap_bulk_read(data->regmap,
  776. LTR501_PS_THRESH_UP,
  777. &thresh_data, 2);
  778. if (ret < 0)
  779. return ret;
  780. *val = thresh_data & LTR501_PS_THRESH_MASK;
  781. return IIO_VAL_INT;
  782. case IIO_EV_DIR_FALLING:
  783. ret = regmap_bulk_read(data->regmap,
  784. LTR501_PS_THRESH_LOW,
  785. &thresh_data, 2);
  786. if (ret < 0)
  787. return ret;
  788. *val = thresh_data & LTR501_PS_THRESH_MASK;
  789. return IIO_VAL_INT;
  790. default:
  791. return -EINVAL;
  792. }
  793. default:
  794. return -EINVAL;
  795. }
  796. return -EINVAL;
  797. }
  798. static int ltr501_write_thresh(struct iio_dev *indio_dev,
  799. const struct iio_chan_spec *chan,
  800. enum iio_event_type type,
  801. enum iio_event_direction dir,
  802. enum iio_event_info info,
  803. int val, int val2)
  804. {
  805. struct ltr501_data *data = iio_priv(indio_dev);
  806. int ret;
  807. if (val < 0)
  808. return -EINVAL;
  809. switch (chan->type) {
  810. case IIO_INTENSITY:
  811. if (val > LTR501_ALS_THRESH_MASK)
  812. return -EINVAL;
  813. switch (dir) {
  814. case IIO_EV_DIR_RISING:
  815. mutex_lock(&data->lock_als);
  816. ret = regmap_bulk_write(data->regmap,
  817. LTR501_ALS_THRESH_UP,
  818. &val, 2);
  819. mutex_unlock(&data->lock_als);
  820. return ret;
  821. case IIO_EV_DIR_FALLING:
  822. mutex_lock(&data->lock_als);
  823. ret = regmap_bulk_write(data->regmap,
  824. LTR501_ALS_THRESH_LOW,
  825. &val, 2);
  826. mutex_unlock(&data->lock_als);
  827. return ret;
  828. default:
  829. return -EINVAL;
  830. }
  831. case IIO_PROXIMITY:
  832. if (val > LTR501_PS_THRESH_MASK)
  833. return -EINVAL;
  834. switch (dir) {
  835. case IIO_EV_DIR_RISING:
  836. mutex_lock(&data->lock_ps);
  837. ret = regmap_bulk_write(data->regmap,
  838. LTR501_PS_THRESH_UP,
  839. &val, 2);
  840. mutex_unlock(&data->lock_ps);
  841. return ret;
  842. case IIO_EV_DIR_FALLING:
  843. mutex_lock(&data->lock_ps);
  844. ret = regmap_bulk_write(data->regmap,
  845. LTR501_PS_THRESH_LOW,
  846. &val, 2);
  847. mutex_unlock(&data->lock_ps);
  848. return ret;
  849. default:
  850. return -EINVAL;
  851. }
  852. default:
  853. return -EINVAL;
  854. }
  855. return -EINVAL;
  856. }
  857. static int ltr501_read_event(struct iio_dev *indio_dev,
  858. const struct iio_chan_spec *chan,
  859. enum iio_event_type type,
  860. enum iio_event_direction dir,
  861. enum iio_event_info info,
  862. int *val, int *val2)
  863. {
  864. int ret;
  865. switch (info) {
  866. case IIO_EV_INFO_VALUE:
  867. return ltr501_read_thresh(indio_dev, chan, type, dir,
  868. info, val, val2);
  869. case IIO_EV_INFO_PERIOD:
  870. ret = ltr501_read_intr_prst(iio_priv(indio_dev),
  871. chan->type, val2);
  872. *val = *val2 / 1000000;
  873. *val2 = *val2 % 1000000;
  874. return ret;
  875. default:
  876. return -EINVAL;
  877. }
  878. return -EINVAL;
  879. }
  880. static int ltr501_write_event(struct iio_dev *indio_dev,
  881. const struct iio_chan_spec *chan,
  882. enum iio_event_type type,
  883. enum iio_event_direction dir,
  884. enum iio_event_info info,
  885. int val, int val2)
  886. {
  887. switch (info) {
  888. case IIO_EV_INFO_VALUE:
  889. if (val2 != 0)
  890. return -EINVAL;
  891. return ltr501_write_thresh(indio_dev, chan, type, dir,
  892. info, val, val2);
  893. case IIO_EV_INFO_PERIOD:
  894. return ltr501_write_intr_prst(iio_priv(indio_dev), chan->type,
  895. val, val2);
  896. default:
  897. return -EINVAL;
  898. }
  899. return -EINVAL;
  900. }
  901. static int ltr501_read_event_config(struct iio_dev *indio_dev,
  902. const struct iio_chan_spec *chan,
  903. enum iio_event_type type,
  904. enum iio_event_direction dir)
  905. {
  906. struct ltr501_data *data = iio_priv(indio_dev);
  907. int ret, status;
  908. switch (chan->type) {
  909. case IIO_INTENSITY:
  910. ret = regmap_field_read(data->reg_als_intr, &status);
  911. if (ret < 0)
  912. return ret;
  913. return status;
  914. case IIO_PROXIMITY:
  915. ret = regmap_field_read(data->reg_ps_intr, &status);
  916. if (ret < 0)
  917. return ret;
  918. return status;
  919. default:
  920. return -EINVAL;
  921. }
  922. return -EINVAL;
  923. }
  924. static int ltr501_write_event_config(struct iio_dev *indio_dev,
  925. const struct iio_chan_spec *chan,
  926. enum iio_event_type type,
  927. enum iio_event_direction dir, int state)
  928. {
  929. struct ltr501_data *data = iio_priv(indio_dev);
  930. int ret;
  931. /* only 1 and 0 are valid inputs */
  932. if (state != 1 && state != 0)
  933. return -EINVAL;
  934. switch (chan->type) {
  935. case IIO_INTENSITY:
  936. mutex_lock(&data->lock_als);
  937. ret = regmap_field_write(data->reg_als_intr, state);
  938. mutex_unlock(&data->lock_als);
  939. return ret;
  940. case IIO_PROXIMITY:
  941. mutex_lock(&data->lock_ps);
  942. ret = regmap_field_write(data->reg_ps_intr, state);
  943. mutex_unlock(&data->lock_ps);
  944. return ret;
  945. default:
  946. return -EINVAL;
  947. }
  948. return -EINVAL;
  949. }
  950. static ssize_t ltr501_show_proximity_scale_avail(struct device *dev,
  951. struct device_attribute *attr,
  952. char *buf)
  953. {
  954. struct ltr501_data *data = iio_priv(dev_to_iio_dev(dev));
  955. const struct ltr501_chip_info *info = data->chip_info;
  956. ssize_t len = 0;
  957. int i;
  958. for (i = 0; i < info->ps_gain_tbl_size; i++) {
  959. if (info->ps_gain[i].scale == LTR501_RESERVED_GAIN)
  960. continue;
  961. len += scnprintf(buf + len, PAGE_SIZE - len, "%d.%06d ",
  962. info->ps_gain[i].scale,
  963. info->ps_gain[i].uscale);
  964. }
  965. buf[len - 1] = '\n';
  966. return len;
  967. }
  968. static ssize_t ltr501_show_intensity_scale_avail(struct device *dev,
  969. struct device_attribute *attr,
  970. char *buf)
  971. {
  972. struct ltr501_data *data = iio_priv(dev_to_iio_dev(dev));
  973. const struct ltr501_chip_info *info = data->chip_info;
  974. ssize_t len = 0;
  975. int i;
  976. for (i = 0; i < info->als_gain_tbl_size; i++) {
  977. if (info->als_gain[i].scale == LTR501_RESERVED_GAIN)
  978. continue;
  979. len += scnprintf(buf + len, PAGE_SIZE - len, "%d.%06d ",
  980. info->als_gain[i].scale,
  981. info->als_gain[i].uscale);
  982. }
  983. buf[len - 1] = '\n';
  984. return len;
  985. }
  986. static IIO_CONST_ATTR_INT_TIME_AVAIL("0.05 0.1 0.2 0.4");
  987. static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("20 10 5 2 1 0.5");
  988. static IIO_DEVICE_ATTR(in_proximity_scale_available, S_IRUGO,
  989. ltr501_show_proximity_scale_avail, NULL, 0);
  990. static IIO_DEVICE_ATTR(in_intensity_scale_available, S_IRUGO,
  991. ltr501_show_intensity_scale_avail, NULL, 0);
  992. static struct attribute *ltr501_attributes[] = {
  993. &iio_dev_attr_in_proximity_scale_available.dev_attr.attr,
  994. &iio_dev_attr_in_intensity_scale_available.dev_attr.attr,
  995. &iio_const_attr_integration_time_available.dev_attr.attr,
  996. &iio_const_attr_sampling_frequency_available.dev_attr.attr,
  997. NULL
  998. };
  999. static struct attribute *ltr301_attributes[] = {
  1000. &iio_dev_attr_in_intensity_scale_available.dev_attr.attr,
  1001. &iio_const_attr_integration_time_available.dev_attr.attr,
  1002. &iio_const_attr_sampling_frequency_available.dev_attr.attr,
  1003. NULL
  1004. };
  1005. static const struct attribute_group ltr501_attribute_group = {
  1006. .attrs = ltr501_attributes,
  1007. };
  1008. static const struct attribute_group ltr301_attribute_group = {
  1009. .attrs = ltr301_attributes,
  1010. };
  1011. static const struct iio_info ltr501_info_no_irq = {
  1012. .read_raw = ltr501_read_raw,
  1013. .write_raw = ltr501_write_raw,
  1014. .attrs = &ltr501_attribute_group,
  1015. };
  1016. static const struct iio_info ltr501_info = {
  1017. .read_raw = ltr501_read_raw,
  1018. .write_raw = ltr501_write_raw,
  1019. .attrs = &ltr501_attribute_group,
  1020. .read_event_value = &ltr501_read_event,
  1021. .write_event_value = &ltr501_write_event,
  1022. .read_event_config = &ltr501_read_event_config,
  1023. .write_event_config = &ltr501_write_event_config,
  1024. };
  1025. static const struct iio_info ltr301_info_no_irq = {
  1026. .read_raw = ltr501_read_raw,
  1027. .write_raw = ltr501_write_raw,
  1028. .attrs = &ltr301_attribute_group,
  1029. };
  1030. static const struct iio_info ltr301_info = {
  1031. .read_raw = ltr501_read_raw,
  1032. .write_raw = ltr501_write_raw,
  1033. .attrs = &ltr301_attribute_group,
  1034. .read_event_value = &ltr501_read_event,
  1035. .write_event_value = &ltr501_write_event,
  1036. .read_event_config = &ltr501_read_event_config,
  1037. .write_event_config = &ltr501_write_event_config,
  1038. };
  1039. static const struct ltr501_chip_info ltr501_chip_info_tbl[] = {
  1040. [ltr501] = {
  1041. .partid = 0x08,
  1042. .als_gain = ltr501_als_gain_tbl,
  1043. .als_gain_tbl_size = ARRAY_SIZE(ltr501_als_gain_tbl),
  1044. .ps_gain = ltr501_ps_gain_tbl,
  1045. .ps_gain_tbl_size = ARRAY_SIZE(ltr501_ps_gain_tbl),
  1046. .als_mode_active = BIT(0) | BIT(1),
  1047. .als_gain_mask = BIT(3),
  1048. .als_gain_shift = 3,
  1049. .info = &ltr501_info,
  1050. .info_no_irq = &ltr501_info_no_irq,
  1051. .channels = ltr501_channels,
  1052. .no_channels = ARRAY_SIZE(ltr501_channels),
  1053. },
  1054. [ltr559] = {
  1055. .partid = 0x09,
  1056. .als_gain = ltr559_als_gain_tbl,
  1057. .als_gain_tbl_size = ARRAY_SIZE(ltr559_als_gain_tbl),
  1058. .ps_gain = ltr559_ps_gain_tbl,
  1059. .ps_gain_tbl_size = ARRAY_SIZE(ltr559_ps_gain_tbl),
  1060. .als_mode_active = BIT(0),
  1061. .als_gain_mask = BIT(2) | BIT(3) | BIT(4),
  1062. .als_gain_shift = 2,
  1063. .info = &ltr501_info,
  1064. .info_no_irq = &ltr501_info_no_irq,
  1065. .channels = ltr501_channels,
  1066. .no_channels = ARRAY_SIZE(ltr501_channels),
  1067. },
  1068. [ltr301] = {
  1069. .partid = 0x08,
  1070. .als_gain = ltr501_als_gain_tbl,
  1071. .als_gain_tbl_size = ARRAY_SIZE(ltr501_als_gain_tbl),
  1072. .als_mode_active = BIT(0) | BIT(1),
  1073. .als_gain_mask = BIT(3),
  1074. .als_gain_shift = 3,
  1075. .info = &ltr301_info,
  1076. .info_no_irq = &ltr301_info_no_irq,
  1077. .channels = ltr301_channels,
  1078. .no_channels = ARRAY_SIZE(ltr301_channels),
  1079. },
  1080. [ltr303] = {
  1081. .partid = 0x0A,
  1082. .als_gain = ltr559_als_gain_tbl,
  1083. .als_gain_tbl_size = ARRAY_SIZE(ltr559_als_gain_tbl),
  1084. .als_mode_active = BIT(0),
  1085. .als_gain_mask = BIT(2) | BIT(3) | BIT(4),
  1086. .als_gain_shift = 2,
  1087. .info = &ltr301_info,
  1088. .info_no_irq = &ltr301_info_no_irq,
  1089. .channels = ltr301_channels,
  1090. .no_channels = ARRAY_SIZE(ltr301_channels),
  1091. },
  1092. };
  1093. static int ltr501_write_contr(struct ltr501_data *data, u8 als_val, u8 ps_val)
  1094. {
  1095. int ret;
  1096. ret = regmap_write(data->regmap, LTR501_ALS_CONTR, als_val);
  1097. if (ret < 0)
  1098. return ret;
  1099. return regmap_write(data->regmap, LTR501_PS_CONTR, ps_val);
  1100. }
  1101. static irqreturn_t ltr501_trigger_handler(int irq, void *p)
  1102. {
  1103. struct iio_poll_func *pf = p;
  1104. struct iio_dev *indio_dev = pf->indio_dev;
  1105. struct ltr501_data *data = iio_priv(indio_dev);
  1106. struct {
  1107. u16 channels[3];
  1108. aligned_s64 ts;
  1109. } scan;
  1110. __le16 als_buf[2];
  1111. u8 mask = 0;
  1112. int j = 0;
  1113. int ret, psdata;
  1114. memset(&scan, 0, sizeof(scan));
  1115. /* figure out which data needs to be ready */
  1116. if (test_bit(0, indio_dev->active_scan_mask) ||
  1117. test_bit(1, indio_dev->active_scan_mask))
  1118. mask |= LTR501_STATUS_ALS_RDY;
  1119. if (test_bit(2, indio_dev->active_scan_mask))
  1120. mask |= LTR501_STATUS_PS_RDY;
  1121. ret = ltr501_drdy(data, mask);
  1122. if (ret < 0)
  1123. goto done;
  1124. if (mask & LTR501_STATUS_ALS_RDY) {
  1125. ret = regmap_bulk_read(data->regmap, LTR501_ALS_DATA1,
  1126. als_buf, sizeof(als_buf));
  1127. if (ret < 0)
  1128. goto done;
  1129. if (test_bit(0, indio_dev->active_scan_mask))
  1130. scan.channels[j++] = le16_to_cpu(als_buf[1]);
  1131. if (test_bit(1, indio_dev->active_scan_mask))
  1132. scan.channels[j++] = le16_to_cpu(als_buf[0]);
  1133. }
  1134. if (mask & LTR501_STATUS_PS_RDY) {
  1135. ret = regmap_bulk_read(data->regmap, LTR501_PS_DATA,
  1136. &psdata, 2);
  1137. if (ret < 0)
  1138. goto done;
  1139. scan.channels[j++] = psdata & LTR501_PS_DATA_MASK;
  1140. }
  1141. iio_push_to_buffers_with_timestamp(indio_dev, &scan,
  1142. iio_get_time_ns(indio_dev));
  1143. done:
  1144. iio_trigger_notify_done(indio_dev->trig);
  1145. return IRQ_HANDLED;
  1146. }
  1147. static irqreturn_t ltr501_interrupt_handler(int irq, void *private)
  1148. {
  1149. struct iio_dev *indio_dev = private;
  1150. struct ltr501_data *data = iio_priv(indio_dev);
  1151. int ret, status;
  1152. ret = regmap_read(data->regmap, LTR501_ALS_PS_STATUS, &status);
  1153. if (ret < 0) {
  1154. dev_err(&data->client->dev,
  1155. "irq read int reg failed\n");
  1156. return IRQ_HANDLED;
  1157. }
  1158. if (status & LTR501_STATUS_ALS_INTR)
  1159. iio_push_event(indio_dev,
  1160. IIO_UNMOD_EVENT_CODE(IIO_INTENSITY, 0,
  1161. IIO_EV_TYPE_THRESH,
  1162. IIO_EV_DIR_EITHER),
  1163. iio_get_time_ns(indio_dev));
  1164. if (status & LTR501_STATUS_PS_INTR)
  1165. iio_push_event(indio_dev,
  1166. IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 0,
  1167. IIO_EV_TYPE_THRESH,
  1168. IIO_EV_DIR_EITHER),
  1169. iio_get_time_ns(indio_dev));
  1170. return IRQ_HANDLED;
  1171. }
  1172. static int ltr501_init(struct ltr501_data *data)
  1173. {
  1174. int ret, status;
  1175. ret = regmap_read(data->regmap, LTR501_ALS_CONTR, &status);
  1176. if (ret < 0)
  1177. return ret;
  1178. data->als_contr = status | data->chip_info->als_mode_active;
  1179. ret = regmap_read(data->regmap, LTR501_PS_CONTR, &status);
  1180. if (ret < 0)
  1181. return ret;
  1182. data->ps_contr = status | LTR501_CONTR_ACTIVE;
  1183. ret = ltr501_read_intr_prst(data, IIO_INTENSITY, &data->als_period);
  1184. if (ret < 0)
  1185. return ret;
  1186. ret = ltr501_read_intr_prst(data, IIO_PROXIMITY, &data->ps_period);
  1187. if (ret < 0)
  1188. return ret;
  1189. return ltr501_write_contr(data, data->als_contr, data->ps_contr);
  1190. }
  1191. static bool ltr501_is_volatile_reg(struct device *dev, unsigned int reg)
  1192. {
  1193. switch (reg) {
  1194. case LTR501_ALS_DATA1:
  1195. case LTR501_ALS_DATA1_UPPER:
  1196. case LTR501_ALS_DATA0:
  1197. case LTR501_ALS_DATA0_UPPER:
  1198. case LTR501_ALS_PS_STATUS:
  1199. case LTR501_PS_DATA:
  1200. case LTR501_PS_DATA_UPPER:
  1201. return true;
  1202. default:
  1203. return false;
  1204. }
  1205. }
  1206. static const struct regmap_config ltr501_regmap_config = {
  1207. .name = LTR501_REGMAP_NAME,
  1208. .reg_bits = 8,
  1209. .val_bits = 8,
  1210. .max_register = LTR501_MAX_REG,
  1211. .cache_type = REGCACHE_RBTREE,
  1212. .volatile_reg = ltr501_is_volatile_reg,
  1213. };
  1214. static int ltr501_powerdown(struct ltr501_data *data)
  1215. {
  1216. return ltr501_write_contr(data, data->als_contr &
  1217. ~data->chip_info->als_mode_active,
  1218. data->ps_contr & ~LTR501_CONTR_ACTIVE);
  1219. }
  1220. static const char *ltr501_match_acpi_device(struct device *dev, int *chip_idx)
  1221. {
  1222. const struct acpi_device_id *id;
  1223. id = acpi_match_device(dev->driver->acpi_match_table, dev);
  1224. if (!id)
  1225. return NULL;
  1226. *chip_idx = id->driver_data;
  1227. return dev_name(dev);
  1228. }
  1229. static int ltr501_probe(struct i2c_client *client)
  1230. {
  1231. const struct i2c_device_id *id = i2c_client_get_device_id(client);
  1232. static const char * const regulator_names[] = { "vdd", "vddio" };
  1233. struct ltr501_data *data;
  1234. struct iio_dev *indio_dev;
  1235. struct regmap *regmap;
  1236. int ret, partid, chip_idx = 0;
  1237. const char *name = NULL;
  1238. indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
  1239. if (!indio_dev)
  1240. return -ENOMEM;
  1241. regmap = devm_regmap_init_i2c(client, &ltr501_regmap_config);
  1242. if (IS_ERR(regmap)) {
  1243. dev_err(&client->dev, "Regmap initialization failed.\n");
  1244. return PTR_ERR(regmap);
  1245. }
  1246. data = iio_priv(indio_dev);
  1247. i2c_set_clientdata(client, indio_dev);
  1248. data->client = client;
  1249. data->regmap = regmap;
  1250. mutex_init(&data->lock_als);
  1251. mutex_init(&data->lock_ps);
  1252. ret = devm_regulator_bulk_get_enable(&client->dev,
  1253. ARRAY_SIZE(regulator_names),
  1254. regulator_names);
  1255. if (ret)
  1256. return dev_err_probe(&client->dev, ret,
  1257. "Failed to get regulators\n");
  1258. data->reg_it = devm_regmap_field_alloc(&client->dev, regmap,
  1259. reg_field_it);
  1260. if (IS_ERR(data->reg_it)) {
  1261. dev_err(&client->dev, "Integ time reg field init failed.\n");
  1262. return PTR_ERR(data->reg_it);
  1263. }
  1264. data->reg_als_intr = devm_regmap_field_alloc(&client->dev, regmap,
  1265. reg_field_als_intr);
  1266. if (IS_ERR(data->reg_als_intr)) {
  1267. dev_err(&client->dev, "ALS intr mode reg field init failed\n");
  1268. return PTR_ERR(data->reg_als_intr);
  1269. }
  1270. data->reg_ps_intr = devm_regmap_field_alloc(&client->dev, regmap,
  1271. reg_field_ps_intr);
  1272. if (IS_ERR(data->reg_ps_intr)) {
  1273. dev_err(&client->dev, "PS intr mode reg field init failed.\n");
  1274. return PTR_ERR(data->reg_ps_intr);
  1275. }
  1276. data->reg_als_rate = devm_regmap_field_alloc(&client->dev, regmap,
  1277. reg_field_als_rate);
  1278. if (IS_ERR(data->reg_als_rate)) {
  1279. dev_err(&client->dev, "ALS samp rate field init failed.\n");
  1280. return PTR_ERR(data->reg_als_rate);
  1281. }
  1282. data->reg_ps_rate = devm_regmap_field_alloc(&client->dev, regmap,
  1283. reg_field_ps_rate);
  1284. if (IS_ERR(data->reg_ps_rate)) {
  1285. dev_err(&client->dev, "PS samp rate field init failed.\n");
  1286. return PTR_ERR(data->reg_ps_rate);
  1287. }
  1288. data->reg_als_prst = devm_regmap_field_alloc(&client->dev, regmap,
  1289. reg_field_als_prst);
  1290. if (IS_ERR(data->reg_als_prst)) {
  1291. dev_err(&client->dev, "ALS prst reg field init failed\n");
  1292. return PTR_ERR(data->reg_als_prst);
  1293. }
  1294. data->reg_ps_prst = devm_regmap_field_alloc(&client->dev, regmap,
  1295. reg_field_ps_prst);
  1296. if (IS_ERR(data->reg_ps_prst)) {
  1297. dev_err(&client->dev, "PS prst reg field init failed.\n");
  1298. return PTR_ERR(data->reg_ps_prst);
  1299. }
  1300. ret = regmap_read(data->regmap, LTR501_PART_ID, &partid);
  1301. if (ret < 0)
  1302. return ret;
  1303. if (id) {
  1304. name = id->name;
  1305. chip_idx = id->driver_data;
  1306. } else if (ACPI_HANDLE(&client->dev)) {
  1307. name = ltr501_match_acpi_device(&client->dev, &chip_idx);
  1308. } else {
  1309. return -ENODEV;
  1310. }
  1311. data->chip_info = &ltr501_chip_info_tbl[chip_idx];
  1312. if ((partid >> 4) != data->chip_info->partid)
  1313. return -ENODEV;
  1314. if (device_property_read_u32(&client->dev, "proximity-near-level",
  1315. &data->near_level))
  1316. data->near_level = 0;
  1317. indio_dev->info = data->chip_info->info;
  1318. indio_dev->channels = data->chip_info->channels;
  1319. indio_dev->num_channels = data->chip_info->no_channels;
  1320. indio_dev->name = name;
  1321. indio_dev->modes = INDIO_DIRECT_MODE;
  1322. ret = ltr501_init(data);
  1323. if (ret < 0)
  1324. return ret;
  1325. if (client->irq > 0) {
  1326. ret = devm_request_threaded_irq(&client->dev, client->irq,
  1327. NULL, ltr501_interrupt_handler,
  1328. IRQF_TRIGGER_FALLING |
  1329. IRQF_ONESHOT,
  1330. "ltr501_thresh_event",
  1331. indio_dev);
  1332. if (ret) {
  1333. dev_err(&client->dev, "request irq (%d) failed\n",
  1334. client->irq);
  1335. return ret;
  1336. }
  1337. } else {
  1338. indio_dev->info = data->chip_info->info_no_irq;
  1339. }
  1340. ret = iio_triggered_buffer_setup(indio_dev, NULL,
  1341. ltr501_trigger_handler, NULL);
  1342. if (ret)
  1343. goto powerdown_on_error;
  1344. ret = iio_device_register(indio_dev);
  1345. if (ret)
  1346. goto error_unreg_buffer;
  1347. return 0;
  1348. error_unreg_buffer:
  1349. iio_triggered_buffer_cleanup(indio_dev);
  1350. powerdown_on_error:
  1351. ltr501_powerdown(data);
  1352. return ret;
  1353. }
  1354. static void ltr501_remove(struct i2c_client *client)
  1355. {
  1356. struct iio_dev *indio_dev = i2c_get_clientdata(client);
  1357. iio_device_unregister(indio_dev);
  1358. iio_triggered_buffer_cleanup(indio_dev);
  1359. ltr501_powerdown(iio_priv(indio_dev));
  1360. }
  1361. static int ltr501_suspend(struct device *dev)
  1362. {
  1363. struct ltr501_data *data = iio_priv(i2c_get_clientdata(
  1364. to_i2c_client(dev)));
  1365. return ltr501_powerdown(data);
  1366. }
  1367. static int ltr501_resume(struct device *dev)
  1368. {
  1369. struct ltr501_data *data = iio_priv(i2c_get_clientdata(
  1370. to_i2c_client(dev)));
  1371. return ltr501_write_contr(data, data->als_contr,
  1372. data->ps_contr);
  1373. }
  1374. static DEFINE_SIMPLE_DEV_PM_OPS(ltr501_pm_ops, ltr501_suspend, ltr501_resume);
  1375. static const struct acpi_device_id ltr_acpi_match[] = {
  1376. { "LTER0501", ltr501 },
  1377. { "LTER0559", ltr559 },
  1378. { "LTER0301", ltr301 },
  1379. /* https://www.catalog.update.microsoft.com/Search.aspx?q=lter0303 */
  1380. { "LTER0303", ltr303 },
  1381. { },
  1382. };
  1383. MODULE_DEVICE_TABLE(acpi, ltr_acpi_match);
  1384. static const struct i2c_device_id ltr501_id[] = {
  1385. { "ltr501", ltr501 },
  1386. { "ltr559", ltr559 },
  1387. { "ltr301", ltr301 },
  1388. { "ltr303", ltr303 },
  1389. { }
  1390. };
  1391. MODULE_DEVICE_TABLE(i2c, ltr501_id);
  1392. static const struct of_device_id ltr501_of_match[] = {
  1393. { .compatible = "liteon,ltr501", },
  1394. { .compatible = "liteon,ltr559", },
  1395. { .compatible = "liteon,ltr301", },
  1396. { .compatible = "liteon,ltr303", },
  1397. {}
  1398. };
  1399. MODULE_DEVICE_TABLE(of, ltr501_of_match);
  1400. static struct i2c_driver ltr501_driver = {
  1401. .driver = {
  1402. .name = LTR501_DRV_NAME,
  1403. .of_match_table = ltr501_of_match,
  1404. .pm = pm_sleep_ptr(&ltr501_pm_ops),
  1405. .acpi_match_table = ltr_acpi_match,
  1406. },
  1407. .probe = ltr501_probe,
  1408. .remove = ltr501_remove,
  1409. .id_table = ltr501_id,
  1410. };
  1411. module_i2c_driver(ltr501_driver);
  1412. MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>");
  1413. MODULE_DESCRIPTION("Lite-On LTR501 ambient light and proximity sensor driver");
  1414. MODULE_LICENSE("GPL");