atlas-ph-sensor.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * atlas-ph-sensor.c - Support for Atlas Scientific OEM pH-SM sensor
  4. *
  5. * Copyright (C) 2015-2018 Matt Ranostay
  6. * Author: Matt Ranostay <matt.ranostay@konsulko.com>
  7. */
  8. #include <linux/module.h>
  9. #include <linux/init.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/delay.h>
  12. #include <linux/mutex.h>
  13. #include <linux/err.h>
  14. #include <linux/irq.h>
  15. #include <linux/irq_work.h>
  16. #include <linux/gpio.h>
  17. #include <linux/i2c.h>
  18. #include <linux/of_device.h>
  19. #include <linux/regmap.h>
  20. #include <linux/iio/iio.h>
  21. #include <linux/iio/buffer.h>
  22. #include <linux/iio/trigger.h>
  23. #include <linux/iio/trigger_consumer.h>
  24. #include <linux/iio/triggered_buffer.h>
  25. #include <linux/pm_runtime.h>
  26. #define ATLAS_REGMAP_NAME "atlas_ph_regmap"
  27. #define ATLAS_DRV_NAME "atlas_ph"
  28. #define ATLAS_REG_DEV_TYPE 0x00
  29. #define ATLAS_REG_DEV_VERSION 0x01
  30. #define ATLAS_REG_INT_CONTROL 0x04
  31. #define ATLAS_REG_INT_CONTROL_EN BIT(3)
  32. #define ATLAS_REG_PWR_CONTROL 0x06
  33. #define ATLAS_REG_PH_CALIB_STATUS 0x0d
  34. #define ATLAS_REG_PH_CALIB_STATUS_MASK 0x07
  35. #define ATLAS_REG_PH_CALIB_STATUS_LOW BIT(0)
  36. #define ATLAS_REG_PH_CALIB_STATUS_MID BIT(1)
  37. #define ATLAS_REG_PH_CALIB_STATUS_HIGH BIT(2)
  38. #define ATLAS_REG_EC_CALIB_STATUS 0x0f
  39. #define ATLAS_REG_EC_CALIB_STATUS_MASK 0x0f
  40. #define ATLAS_REG_EC_CALIB_STATUS_DRY BIT(0)
  41. #define ATLAS_REG_EC_CALIB_STATUS_SINGLE BIT(1)
  42. #define ATLAS_REG_EC_CALIB_STATUS_LOW BIT(2)
  43. #define ATLAS_REG_EC_CALIB_STATUS_HIGH BIT(3)
  44. #define ATLAS_REG_PH_TEMP_DATA 0x0e
  45. #define ATLAS_REG_PH_DATA 0x16
  46. #define ATLAS_REG_EC_PROBE 0x08
  47. #define ATLAS_REG_EC_TEMP_DATA 0x10
  48. #define ATLAS_REG_EC_DATA 0x18
  49. #define ATLAS_REG_TDS_DATA 0x1c
  50. #define ATLAS_REG_PSS_DATA 0x20
  51. #define ATLAS_REG_ORP_CALIB_STATUS 0x0d
  52. #define ATLAS_REG_ORP_DATA 0x0e
  53. #define ATLAS_PH_INT_TIME_IN_MS 450
  54. #define ATLAS_EC_INT_TIME_IN_MS 650
  55. #define ATLAS_ORP_INT_TIME_IN_MS 450
  56. enum {
  57. ATLAS_PH_SM,
  58. ATLAS_EC_SM,
  59. ATLAS_ORP_SM,
  60. };
  61. struct atlas_data {
  62. struct i2c_client *client;
  63. struct iio_trigger *trig;
  64. struct atlas_device *chip;
  65. struct regmap *regmap;
  66. struct irq_work work;
  67. __be32 buffer[6]; /* 96-bit data + 32-bit pad + 64-bit timestamp */
  68. };
  69. static const struct regmap_config atlas_regmap_config = {
  70. .name = ATLAS_REGMAP_NAME,
  71. .reg_bits = 8,
  72. .val_bits = 8,
  73. };
  74. static const struct iio_chan_spec atlas_ph_channels[] = {
  75. {
  76. .type = IIO_PH,
  77. .address = ATLAS_REG_PH_DATA,
  78. .info_mask_separate =
  79. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  80. .scan_index = 0,
  81. .scan_type = {
  82. .sign = 'u',
  83. .realbits = 32,
  84. .storagebits = 32,
  85. .endianness = IIO_BE,
  86. },
  87. },
  88. IIO_CHAN_SOFT_TIMESTAMP(1),
  89. {
  90. .type = IIO_TEMP,
  91. .address = ATLAS_REG_PH_TEMP_DATA,
  92. .info_mask_separate =
  93. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  94. .output = 1,
  95. .scan_index = -1
  96. },
  97. };
  98. #define ATLAS_EC_CHANNEL(_idx, _addr) \
  99. {\
  100. .type = IIO_CONCENTRATION, \
  101. .indexed = 1, \
  102. .channel = _idx, \
  103. .address = _addr, \
  104. .info_mask_separate = \
  105. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE), \
  106. .scan_index = _idx + 1, \
  107. .scan_type = { \
  108. .sign = 'u', \
  109. .realbits = 32, \
  110. .storagebits = 32, \
  111. .endianness = IIO_BE, \
  112. }, \
  113. }
  114. static const struct iio_chan_spec atlas_ec_channels[] = {
  115. {
  116. .type = IIO_ELECTRICALCONDUCTIVITY,
  117. .address = ATLAS_REG_EC_DATA,
  118. .info_mask_separate =
  119. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  120. .scan_index = 0,
  121. .scan_type = {
  122. .sign = 'u',
  123. .realbits = 32,
  124. .storagebits = 32,
  125. .endianness = IIO_BE,
  126. },
  127. },
  128. ATLAS_EC_CHANNEL(0, ATLAS_REG_TDS_DATA),
  129. ATLAS_EC_CHANNEL(1, ATLAS_REG_PSS_DATA),
  130. IIO_CHAN_SOFT_TIMESTAMP(3),
  131. {
  132. .type = IIO_TEMP,
  133. .address = ATLAS_REG_EC_TEMP_DATA,
  134. .info_mask_separate =
  135. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  136. .output = 1,
  137. .scan_index = -1
  138. },
  139. };
  140. static const struct iio_chan_spec atlas_orp_channels[] = {
  141. {
  142. .type = IIO_VOLTAGE,
  143. .address = ATLAS_REG_ORP_DATA,
  144. .info_mask_separate =
  145. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  146. .scan_index = 0,
  147. .scan_type = {
  148. .sign = 's',
  149. .realbits = 32,
  150. .storagebits = 32,
  151. .endianness = IIO_BE,
  152. },
  153. },
  154. IIO_CHAN_SOFT_TIMESTAMP(1),
  155. };
  156. static int atlas_check_ph_calibration(struct atlas_data *data)
  157. {
  158. struct device *dev = &data->client->dev;
  159. int ret;
  160. unsigned int val;
  161. ret = regmap_read(data->regmap, ATLAS_REG_PH_CALIB_STATUS, &val);
  162. if (ret)
  163. return ret;
  164. if (!(val & ATLAS_REG_PH_CALIB_STATUS_MASK)) {
  165. dev_warn(dev, "device has not been calibrated\n");
  166. return 0;
  167. }
  168. if (!(val & ATLAS_REG_PH_CALIB_STATUS_LOW))
  169. dev_warn(dev, "device missing low point calibration\n");
  170. if (!(val & ATLAS_REG_PH_CALIB_STATUS_MID))
  171. dev_warn(dev, "device missing mid point calibration\n");
  172. if (!(val & ATLAS_REG_PH_CALIB_STATUS_HIGH))
  173. dev_warn(dev, "device missing high point calibration\n");
  174. return 0;
  175. }
  176. static int atlas_check_ec_calibration(struct atlas_data *data)
  177. {
  178. struct device *dev = &data->client->dev;
  179. int ret;
  180. unsigned int val;
  181. __be16 rval;
  182. ret = regmap_bulk_read(data->regmap, ATLAS_REG_EC_PROBE, &rval, 2);
  183. if (ret)
  184. return ret;
  185. val = be16_to_cpu(rval);
  186. dev_info(dev, "probe set to K = %d.%.2d", val / 100, val % 100);
  187. ret = regmap_read(data->regmap, ATLAS_REG_EC_CALIB_STATUS, &val);
  188. if (ret)
  189. return ret;
  190. if (!(val & ATLAS_REG_EC_CALIB_STATUS_MASK)) {
  191. dev_warn(dev, "device has not been calibrated\n");
  192. return 0;
  193. }
  194. if (!(val & ATLAS_REG_EC_CALIB_STATUS_DRY))
  195. dev_warn(dev, "device missing dry point calibration\n");
  196. if (val & ATLAS_REG_EC_CALIB_STATUS_SINGLE) {
  197. dev_warn(dev, "device using single point calibration\n");
  198. } else {
  199. if (!(val & ATLAS_REG_EC_CALIB_STATUS_LOW))
  200. dev_warn(dev, "device missing low point calibration\n");
  201. if (!(val & ATLAS_REG_EC_CALIB_STATUS_HIGH))
  202. dev_warn(dev, "device missing high point calibration\n");
  203. }
  204. return 0;
  205. }
  206. static int atlas_check_orp_calibration(struct atlas_data *data)
  207. {
  208. struct device *dev = &data->client->dev;
  209. int ret;
  210. unsigned int val;
  211. ret = regmap_read(data->regmap, ATLAS_REG_ORP_CALIB_STATUS, &val);
  212. if (ret)
  213. return ret;
  214. if (!val)
  215. dev_warn(dev, "device has not been calibrated\n");
  216. return 0;
  217. };
  218. struct atlas_device {
  219. const struct iio_chan_spec *channels;
  220. int num_channels;
  221. int data_reg;
  222. int (*calibration)(struct atlas_data *data);
  223. int delay;
  224. };
  225. static struct atlas_device atlas_devices[] = {
  226. [ATLAS_PH_SM] = {
  227. .channels = atlas_ph_channels,
  228. .num_channels = 3,
  229. .data_reg = ATLAS_REG_PH_DATA,
  230. .calibration = &atlas_check_ph_calibration,
  231. .delay = ATLAS_PH_INT_TIME_IN_MS,
  232. },
  233. [ATLAS_EC_SM] = {
  234. .channels = atlas_ec_channels,
  235. .num_channels = 5,
  236. .data_reg = ATLAS_REG_EC_DATA,
  237. .calibration = &atlas_check_ec_calibration,
  238. .delay = ATLAS_EC_INT_TIME_IN_MS,
  239. },
  240. [ATLAS_ORP_SM] = {
  241. .channels = atlas_orp_channels,
  242. .num_channels = 2,
  243. .data_reg = ATLAS_REG_ORP_DATA,
  244. .calibration = &atlas_check_orp_calibration,
  245. .delay = ATLAS_ORP_INT_TIME_IN_MS,
  246. },
  247. };
  248. static int atlas_set_powermode(struct atlas_data *data, int on)
  249. {
  250. return regmap_write(data->regmap, ATLAS_REG_PWR_CONTROL, on);
  251. }
  252. static int atlas_set_interrupt(struct atlas_data *data, bool state)
  253. {
  254. return regmap_update_bits(data->regmap, ATLAS_REG_INT_CONTROL,
  255. ATLAS_REG_INT_CONTROL_EN,
  256. state ? ATLAS_REG_INT_CONTROL_EN : 0);
  257. }
  258. static int atlas_buffer_postenable(struct iio_dev *indio_dev)
  259. {
  260. struct atlas_data *data = iio_priv(indio_dev);
  261. int ret;
  262. ret = iio_triggered_buffer_postenable(indio_dev);
  263. if (ret)
  264. return ret;
  265. ret = pm_runtime_get_sync(&data->client->dev);
  266. if (ret < 0) {
  267. pm_runtime_put_noidle(&data->client->dev);
  268. return ret;
  269. }
  270. return atlas_set_interrupt(data, true);
  271. }
  272. static int atlas_buffer_predisable(struct iio_dev *indio_dev)
  273. {
  274. struct atlas_data *data = iio_priv(indio_dev);
  275. int ret;
  276. ret = iio_triggered_buffer_predisable(indio_dev);
  277. if (ret)
  278. return ret;
  279. ret = atlas_set_interrupt(data, false);
  280. if (ret)
  281. return ret;
  282. pm_runtime_mark_last_busy(&data->client->dev);
  283. return pm_runtime_put_autosuspend(&data->client->dev);
  284. }
  285. static const struct iio_trigger_ops atlas_interrupt_trigger_ops = {
  286. };
  287. static const struct iio_buffer_setup_ops atlas_buffer_setup_ops = {
  288. .postenable = atlas_buffer_postenable,
  289. .predisable = atlas_buffer_predisable,
  290. };
  291. static void atlas_work_handler(struct irq_work *work)
  292. {
  293. struct atlas_data *data = container_of(work, struct atlas_data, work);
  294. iio_trigger_poll(data->trig);
  295. }
  296. static irqreturn_t atlas_trigger_handler(int irq, void *private)
  297. {
  298. struct iio_poll_func *pf = private;
  299. struct iio_dev *indio_dev = pf->indio_dev;
  300. struct atlas_data *data = iio_priv(indio_dev);
  301. int ret;
  302. ret = regmap_bulk_read(data->regmap, data->chip->data_reg,
  303. (u8 *) &data->buffer,
  304. sizeof(__be32) * (data->chip->num_channels - 2));
  305. if (!ret)
  306. iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
  307. iio_get_time_ns(indio_dev));
  308. iio_trigger_notify_done(indio_dev->trig);
  309. return IRQ_HANDLED;
  310. }
  311. static irqreturn_t atlas_interrupt_handler(int irq, void *private)
  312. {
  313. struct iio_dev *indio_dev = private;
  314. struct atlas_data *data = iio_priv(indio_dev);
  315. irq_work_queue(&data->work);
  316. return IRQ_HANDLED;
  317. }
  318. static int atlas_read_measurement(struct atlas_data *data, int reg, __be32 *val)
  319. {
  320. struct device *dev = &data->client->dev;
  321. int suspended = pm_runtime_suspended(dev);
  322. int ret;
  323. ret = pm_runtime_get_sync(dev);
  324. if (ret < 0) {
  325. pm_runtime_put_noidle(dev);
  326. return ret;
  327. }
  328. if (suspended)
  329. msleep(data->chip->delay);
  330. ret = regmap_bulk_read(data->regmap, reg, (u8 *) val, sizeof(*val));
  331. pm_runtime_mark_last_busy(dev);
  332. pm_runtime_put_autosuspend(dev);
  333. return ret;
  334. }
  335. static int atlas_read_raw(struct iio_dev *indio_dev,
  336. struct iio_chan_spec const *chan,
  337. int *val, int *val2, long mask)
  338. {
  339. struct atlas_data *data = iio_priv(indio_dev);
  340. switch (mask) {
  341. case IIO_CHAN_INFO_RAW: {
  342. int ret;
  343. __be32 reg;
  344. switch (chan->type) {
  345. case IIO_TEMP:
  346. ret = regmap_bulk_read(data->regmap, chan->address,
  347. (u8 *) &reg, sizeof(reg));
  348. break;
  349. case IIO_PH:
  350. case IIO_CONCENTRATION:
  351. case IIO_ELECTRICALCONDUCTIVITY:
  352. case IIO_VOLTAGE:
  353. ret = iio_device_claim_direct_mode(indio_dev);
  354. if (ret)
  355. return ret;
  356. ret = atlas_read_measurement(data, chan->address, &reg);
  357. iio_device_release_direct_mode(indio_dev);
  358. break;
  359. default:
  360. ret = -EINVAL;
  361. }
  362. if (!ret) {
  363. *val = be32_to_cpu(reg);
  364. ret = IIO_VAL_INT;
  365. }
  366. return ret;
  367. }
  368. case IIO_CHAN_INFO_SCALE:
  369. switch (chan->type) {
  370. case IIO_TEMP:
  371. *val = 10;
  372. return IIO_VAL_INT;
  373. case IIO_PH:
  374. *val = 1; /* 0.001 */
  375. *val2 = 1000;
  376. break;
  377. case IIO_ELECTRICALCONDUCTIVITY:
  378. *val = 1; /* 0.00001 */
  379. *val2 = 100000;
  380. break;
  381. case IIO_CONCENTRATION:
  382. *val = 0; /* 0.000000001 */
  383. *val2 = 1000;
  384. return IIO_VAL_INT_PLUS_NANO;
  385. case IIO_VOLTAGE:
  386. *val = 1; /* 0.1 */
  387. *val2 = 10;
  388. break;
  389. default:
  390. return -EINVAL;
  391. }
  392. return IIO_VAL_FRACTIONAL;
  393. }
  394. return -EINVAL;
  395. }
  396. static int atlas_write_raw(struct iio_dev *indio_dev,
  397. struct iio_chan_spec const *chan,
  398. int val, int val2, long mask)
  399. {
  400. struct atlas_data *data = iio_priv(indio_dev);
  401. __be32 reg = cpu_to_be32(val / 10);
  402. if (val2 != 0 || val < 0 || val > 20000)
  403. return -EINVAL;
  404. if (mask != IIO_CHAN_INFO_RAW || chan->type != IIO_TEMP)
  405. return -EINVAL;
  406. return regmap_bulk_write(data->regmap, chan->address,
  407. &reg, sizeof(reg));
  408. }
  409. static const struct iio_info atlas_info = {
  410. .read_raw = atlas_read_raw,
  411. .write_raw = atlas_write_raw,
  412. };
  413. static const struct i2c_device_id atlas_id[] = {
  414. { "atlas-ph-sm", ATLAS_PH_SM},
  415. { "atlas-ec-sm", ATLAS_EC_SM},
  416. { "atlas-orp-sm", ATLAS_ORP_SM},
  417. {}
  418. };
  419. MODULE_DEVICE_TABLE(i2c, atlas_id);
  420. static const struct of_device_id atlas_dt_ids[] = {
  421. { .compatible = "atlas,ph-sm", .data = (void *)ATLAS_PH_SM, },
  422. { .compatible = "atlas,ec-sm", .data = (void *)ATLAS_EC_SM, },
  423. { .compatible = "atlas,orp-sm", .data = (void *)ATLAS_ORP_SM, },
  424. { }
  425. };
  426. MODULE_DEVICE_TABLE(of, atlas_dt_ids);
  427. static int atlas_probe(struct i2c_client *client,
  428. const struct i2c_device_id *id)
  429. {
  430. struct atlas_data *data;
  431. struct atlas_device *chip;
  432. const struct of_device_id *of_id;
  433. struct iio_trigger *trig;
  434. struct iio_dev *indio_dev;
  435. int ret;
  436. indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
  437. if (!indio_dev)
  438. return -ENOMEM;
  439. of_id = of_match_device(atlas_dt_ids, &client->dev);
  440. if (!of_id)
  441. chip = &atlas_devices[id->driver_data];
  442. else
  443. chip = &atlas_devices[(unsigned long)of_id->data];
  444. indio_dev->info = &atlas_info;
  445. indio_dev->name = ATLAS_DRV_NAME;
  446. indio_dev->channels = chip->channels;
  447. indio_dev->num_channels = chip->num_channels;
  448. indio_dev->modes = INDIO_BUFFER_SOFTWARE | INDIO_DIRECT_MODE;
  449. indio_dev->dev.parent = &client->dev;
  450. trig = devm_iio_trigger_alloc(&client->dev, "%s-dev%d",
  451. indio_dev->name, indio_dev->id);
  452. if (!trig)
  453. return -ENOMEM;
  454. data = iio_priv(indio_dev);
  455. data->client = client;
  456. data->trig = trig;
  457. data->chip = chip;
  458. trig->dev.parent = indio_dev->dev.parent;
  459. trig->ops = &atlas_interrupt_trigger_ops;
  460. iio_trigger_set_drvdata(trig, indio_dev);
  461. i2c_set_clientdata(client, indio_dev);
  462. data->regmap = devm_regmap_init_i2c(client, &atlas_regmap_config);
  463. if (IS_ERR(data->regmap)) {
  464. dev_err(&client->dev, "regmap initialization failed\n");
  465. return PTR_ERR(data->regmap);
  466. }
  467. ret = pm_runtime_set_active(&client->dev);
  468. if (ret)
  469. return ret;
  470. if (client->irq <= 0) {
  471. dev_err(&client->dev, "no valid irq defined\n");
  472. return -EINVAL;
  473. }
  474. ret = chip->calibration(data);
  475. if (ret)
  476. return ret;
  477. ret = iio_trigger_register(trig);
  478. if (ret) {
  479. dev_err(&client->dev, "failed to register trigger\n");
  480. return ret;
  481. }
  482. ret = iio_triggered_buffer_setup(indio_dev, &iio_pollfunc_store_time,
  483. &atlas_trigger_handler, &atlas_buffer_setup_ops);
  484. if (ret) {
  485. dev_err(&client->dev, "cannot setup iio trigger\n");
  486. goto unregister_trigger;
  487. }
  488. init_irq_work(&data->work, atlas_work_handler);
  489. /* interrupt pin toggles on new conversion */
  490. ret = devm_request_threaded_irq(&client->dev, client->irq,
  491. NULL, atlas_interrupt_handler,
  492. IRQF_TRIGGER_RISING |
  493. IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
  494. "atlas_irq",
  495. indio_dev);
  496. if (ret) {
  497. dev_err(&client->dev, "request irq (%d) failed\n", client->irq);
  498. goto unregister_buffer;
  499. }
  500. ret = atlas_set_powermode(data, 1);
  501. if (ret) {
  502. dev_err(&client->dev, "cannot power device on");
  503. goto unregister_buffer;
  504. }
  505. pm_runtime_enable(&client->dev);
  506. pm_runtime_set_autosuspend_delay(&client->dev, 2500);
  507. pm_runtime_use_autosuspend(&client->dev);
  508. ret = iio_device_register(indio_dev);
  509. if (ret) {
  510. dev_err(&client->dev, "unable to register device\n");
  511. goto unregister_pm;
  512. }
  513. return 0;
  514. unregister_pm:
  515. pm_runtime_disable(&client->dev);
  516. atlas_set_powermode(data, 0);
  517. unregister_buffer:
  518. iio_triggered_buffer_cleanup(indio_dev);
  519. unregister_trigger:
  520. iio_trigger_unregister(data->trig);
  521. return ret;
  522. }
  523. static int atlas_remove(struct i2c_client *client)
  524. {
  525. struct iio_dev *indio_dev = i2c_get_clientdata(client);
  526. struct atlas_data *data = iio_priv(indio_dev);
  527. iio_device_unregister(indio_dev);
  528. iio_triggered_buffer_cleanup(indio_dev);
  529. iio_trigger_unregister(data->trig);
  530. pm_runtime_disable(&client->dev);
  531. pm_runtime_set_suspended(&client->dev);
  532. pm_runtime_put_noidle(&client->dev);
  533. return atlas_set_powermode(data, 0);
  534. }
  535. #ifdef CONFIG_PM
  536. static int atlas_runtime_suspend(struct device *dev)
  537. {
  538. struct atlas_data *data =
  539. iio_priv(i2c_get_clientdata(to_i2c_client(dev)));
  540. return atlas_set_powermode(data, 0);
  541. }
  542. static int atlas_runtime_resume(struct device *dev)
  543. {
  544. struct atlas_data *data =
  545. iio_priv(i2c_get_clientdata(to_i2c_client(dev)));
  546. return atlas_set_powermode(data, 1);
  547. }
  548. #endif
  549. static const struct dev_pm_ops atlas_pm_ops = {
  550. SET_RUNTIME_PM_OPS(atlas_runtime_suspend,
  551. atlas_runtime_resume, NULL)
  552. };
  553. static struct i2c_driver atlas_driver = {
  554. .driver = {
  555. .name = ATLAS_DRV_NAME,
  556. .of_match_table = of_match_ptr(atlas_dt_ids),
  557. .pm = &atlas_pm_ops,
  558. },
  559. .probe = atlas_probe,
  560. .remove = atlas_remove,
  561. .id_table = atlas_id,
  562. };
  563. module_i2c_driver(atlas_driver);
  564. MODULE_AUTHOR("Matt Ranostay <matt.ranostay@konsulko.com>");
  565. MODULE_DESCRIPTION("Atlas Scientific pH-SM sensor");
  566. MODULE_LICENSE("GPL");