Lines Matching full:data
48 #define SHT15_TSU 150 /* (nsecs) data setup time */
70 * @d1: see data sheet
123 * struct sht15_data - device instance specific data
125 * @data: data GPIO line
132 * @checksumming: flag used to enable the data validation with CRC.
154 struct gpio_desc *data; member
180 * @data: sht15 specific data.
181 * @value: sht15 retrieved data.
182 * @len: Length of retrieved data
186 static u8 sht15_crc8(struct sht15_data *data, in sht15_crc8() argument
190 u8 crc = bitrev8(data->val_status & 0x0F); in sht15_crc8()
202 * @data: sht15 specific data
204 * This implements section 3.4 of the data sheet
206 static int sht15_connection_reset(struct sht15_data *data) in sht15_connection_reset() argument
210 err = gpiod_direction_output(data->data, 1); in sht15_connection_reset()
214 gpiod_set_value(data->sck, 0); in sht15_connection_reset()
217 gpiod_set_value(data->sck, 1); in sht15_connection_reset()
219 gpiod_set_value(data->sck, 0); in sht15_connection_reset()
227 * @data: device state data
230 static inline void sht15_send_bit(struct sht15_data *data, int val) in sht15_send_bit() argument
232 gpiod_set_value(data->data, val); in sht15_send_bit()
234 gpiod_set_value(data->sck, 1); in sht15_send_bit()
236 gpiod_set_value(data->sck, 0); in sht15_send_bit()
242 * @data: device state data
244 * Timings for this are not documented on the data sheet, so very
246 * figure 12 on the data sheet.
248 static int sht15_transmission_start(struct sht15_data *data) in sht15_transmission_start() argument
252 /* ensure data is high and output */ in sht15_transmission_start()
253 err = gpiod_direction_output(data->data, 1); in sht15_transmission_start()
257 gpiod_set_value(data->sck, 0); in sht15_transmission_start()
259 gpiod_set_value(data->sck, 1); in sht15_transmission_start()
261 gpiod_set_value(data->data, 0); in sht15_transmission_start()
263 gpiod_set_value(data->sck, 0); in sht15_transmission_start()
265 gpiod_set_value(data->sck, 1); in sht15_transmission_start()
267 gpiod_set_value(data->data, 1); in sht15_transmission_start()
269 gpiod_set_value(data->sck, 0); in sht15_transmission_start()
276 * @data: device state
279 static void sht15_send_byte(struct sht15_data *data, u8 byte) in sht15_send_byte() argument
284 sht15_send_bit(data, !!(byte & 0x80)); in sht15_send_byte()
291 * @data: device state
293 static int sht15_wait_for_response(struct sht15_data *data) in sht15_wait_for_response() argument
297 err = gpiod_direction_input(data->data); in sht15_wait_for_response()
300 gpiod_set_value(data->sck, 1); in sht15_wait_for_response()
302 if (gpiod_get_value(data->data)) { in sht15_wait_for_response()
303 gpiod_set_value(data->sck, 0); in sht15_wait_for_response()
304 dev_err(data->dev, "Command not acknowledged\n"); in sht15_wait_for_response()
305 err = sht15_connection_reset(data); in sht15_wait_for_response()
310 gpiod_set_value(data->sck, 0); in sht15_wait_for_response()
317 * @data: device state
320 * On entry, sck is output low, data is output pull high
323 static int sht15_send_cmd(struct sht15_data *data, u8 cmd) in sht15_send_cmd() argument
327 err = sht15_transmission_start(data); in sht15_send_cmd()
330 sht15_send_byte(data, cmd); in sht15_send_cmd()
331 return sht15_wait_for_response(data); in sht15_send_cmd()
336 * @data: sht15 specific data.
340 static int sht15_soft_reset(struct sht15_data *data) in sht15_soft_reset() argument
344 ret = sht15_send_cmd(data, SHT15_SOFT_RESET); in sht15_soft_reset()
349 data->val_status = 0; in sht15_soft_reset()
356 * @data: sht15 specific data.
358 * Each byte of data is acknowledged by pulling the data line
361 static int sht15_ack(struct sht15_data *data) in sht15_ack() argument
365 err = gpiod_direction_output(data->data, 0); in sht15_ack()
369 gpiod_set_value(data->sck, 1); in sht15_ack()
371 gpiod_set_value(data->sck, 0); in sht15_ack()
373 gpiod_set_value(data->data, 1); in sht15_ack()
375 return gpiod_direction_input(data->data); in sht15_ack()
380 * @data: device state.
382 * This is basically a NAK (single clock pulse, data high).
384 static int sht15_end_transmission(struct sht15_data *data) in sht15_end_transmission() argument
388 err = gpiod_direction_output(data->data, 1); in sht15_end_transmission()
392 gpiod_set_value(data->sck, 1); in sht15_end_transmission()
394 gpiod_set_value(data->sck, 0); in sht15_end_transmission()
401 * @data: device state.
403 static u8 sht15_read_byte(struct sht15_data *data) in sht15_read_byte() argument
410 gpiod_set_value(data->sck, 1); in sht15_read_byte()
412 byte |= !!gpiod_get_value(data->data); in sht15_read_byte()
413 gpiod_set_value(data->sck, 0); in sht15_read_byte()
421 * @data: sht15 specific data.
426 static int sht15_send_status(struct sht15_data *data, u8 status) in sht15_send_status() argument
430 err = sht15_send_cmd(data, SHT15_WRITE_STATUS); in sht15_send_status()
433 err = gpiod_direction_output(data->data, 1); in sht15_send_status()
437 sht15_send_byte(data, status); in sht15_send_status()
438 err = sht15_wait_for_response(data); in sht15_send_status()
442 data->val_status = status; in sht15_send_status()
448 * @data: device instance specific data.
452 static int sht15_update_status(struct sht15_data *data) in sht15_update_status() argument
461 mutex_lock(&data->read_lock); in sht15_update_status()
462 if (time_after(jiffies, data->last_status + timeout) in sht15_update_status()
463 || !data->status_valid) { in sht15_update_status()
464 ret = sht15_send_cmd(data, SHT15_READ_STATUS); in sht15_update_status()
467 status = sht15_read_byte(data); in sht15_update_status()
469 if (data->checksumming) { in sht15_update_status()
470 sht15_ack(data); in sht15_update_status()
471 dev_checksum = bitrev8(sht15_read_byte(data)); in sht15_update_status()
474 data->checksum_ok = (sht15_crc8(data, checksum_vals, 2) in sht15_update_status()
478 ret = sht15_end_transmission(data); in sht15_update_status()
483 * Perform checksum validation on the received data. in sht15_update_status()
487 if (data->checksumming && !data->checksum_ok) { in sht15_update_status()
488 previous_config = data->val_status & 0x07; in sht15_update_status()
489 ret = sht15_soft_reset(data); in sht15_update_status()
493 ret = sht15_send_status(data, previous_config); in sht15_update_status()
495 dev_err(data->dev, in sht15_update_status()
505 data->val_status = status; in sht15_update_status()
506 data->status_valid = true; in sht15_update_status()
507 data->last_status = jiffies; in sht15_update_status()
511 mutex_unlock(&data->read_lock); in sht15_update_status()
517 * @data: device instance specific data
522 static int sht15_measurement(struct sht15_data *data, in sht15_measurement() argument
529 ret = sht15_send_cmd(data, command); in sht15_measurement()
533 ret = gpiod_direction_input(data->data); in sht15_measurement()
536 atomic_set(&data->interrupt_handled, 0); in sht15_measurement()
538 enable_irq(gpiod_to_irq(data->data)); in sht15_measurement()
539 if (gpiod_get_value(data->data) == 0) { in sht15_measurement()
540 disable_irq_nosync(gpiod_to_irq(data->data)); in sht15_measurement()
542 if (!atomic_read(&data->interrupt_handled)) in sht15_measurement()
543 schedule_work(&data->read_work); in sht15_measurement()
545 ret = wait_event_timeout(data->wait_queue, in sht15_measurement()
546 (data->state == SHT15_READING_NOTHING), in sht15_measurement()
548 if (data->state != SHT15_READING_NOTHING) { /* I/O error occurred */ in sht15_measurement()
549 data->state = SHT15_READING_NOTHING; in sht15_measurement()
552 disable_irq_nosync(gpiod_to_irq(data->data)); in sht15_measurement()
553 ret = sht15_connection_reset(data); in sht15_measurement()
560 * Perform checksum validation on the received data. in sht15_measurement()
564 if (data->checksumming && !data->checksum_ok) { in sht15_measurement()
565 previous_config = data->val_status & 0x07; in sht15_measurement()
566 ret = sht15_soft_reset(data); in sht15_measurement()
570 ret = sht15_send_status(data, previous_config); in sht15_measurement()
572 dev_err(data->dev, in sht15_measurement()
586 * @data: device state
588 static int sht15_update_measurements(struct sht15_data *data) in sht15_update_measurements() argument
593 mutex_lock(&data->read_lock); in sht15_update_measurements()
594 if (time_after(jiffies, data->last_measurement + timeout) in sht15_update_measurements()
595 || !data->measurements_valid) { in sht15_update_measurements()
596 data->state = SHT15_READING_HUMID; in sht15_update_measurements()
597 ret = sht15_measurement(data, SHT15_MEASURE_RH, 160); in sht15_update_measurements()
600 data->state = SHT15_READING_TEMP; in sht15_update_measurements()
601 ret = sht15_measurement(data, SHT15_MEASURE_TEMP, 400); in sht15_update_measurements()
604 data->measurements_valid = true; in sht15_update_measurements()
605 data->last_measurement = jiffies; in sht15_update_measurements()
609 mutex_unlock(&data->read_lock); in sht15_update_measurements()
615 * @data: device state
617 * As per section 4.3 of the data sheet.
619 static inline int sht15_calc_temp(struct sht15_data *data) in sht15_calc_temp() argument
622 int d2 = (data->val_status & SHT15_STATUS_LOW_RESOLUTION) ? 40 : 10; in sht15_calc_temp()
627 if (data->supply_uv > temppoints[i - 1].vdd) { in sht15_calc_temp()
628 d1 = (data->supply_uv - temppoints[i - 1].vdd) in sht15_calc_temp()
635 return data->val_temp * d2 + d1; in sht15_calc_temp()
640 * @data: device state
643 * the data sheet.
648 static inline int sht15_calc_humid(struct sht15_data *data) in sht15_calc_humid() argument
651 int temp = sht15_calc_temp(data); in sht15_calc_humid()
656 if (data->val_status & SHT15_STATUS_LOW_RESOLUTION) { in sht15_calc_humid()
667 + c2 * data->val_humid / 1000 in sht15_calc_humid()
668 + (data->val_humid * data->val_humid * c3) / 10000; in sht15_calc_humid()
669 return (temp - 25000) * (10000 + t2 * data->val_humid) in sht15_calc_humid()
688 struct sht15_data *data = dev_get_drvdata(dev); in sht15_show_status() local
691 ret = sht15_update_status(data); in sht15_show_status()
693 return ret ? ret : sprintf(buf, "%d\n", !!(data->val_status & bit)); in sht15_show_status()
701 * @count: length of the data.
711 struct sht15_data *data = dev_get_drvdata(dev); in sht15_store_heater() local
718 mutex_lock(&data->read_lock); in sht15_store_heater()
719 status = data->val_status & 0x07; in sht15_store_heater()
725 ret = sht15_send_status(data, status); in sht15_store_heater()
726 mutex_unlock(&data->read_lock); in sht15_store_heater()
745 struct sht15_data *data = dev_get_drvdata(dev); in sht15_show_temp() local
748 ret = sht15_update_measurements(data); in sht15_show_temp()
751 sht15_calc_temp(data)); in sht15_show_temp()
768 struct sht15_data *data = dev_get_drvdata(dev); in sht15_show_humidity() local
770 ret = sht15_update_measurements(data); in sht15_show_humidity()
772 return ret ? ret : sprintf(buf, "%d\n", sht15_calc_humid(data)); in sht15_show_humidity()
810 struct sht15_data *data = d; in sht15_interrupt_fired() local
814 atomic_inc(&data->interrupt_handled); in sht15_interrupt_fired()
816 if (data->state != SHT15_READING_NOTHING) in sht15_interrupt_fired()
817 schedule_work(&data->read_work); in sht15_interrupt_fired()
826 struct sht15_data *data in sht15_bh_read_data() local
831 if (gpiod_get_value(data->data)) { in sht15_bh_read_data()
836 atomic_set(&data->interrupt_handled, 0); in sht15_bh_read_data()
837 enable_irq(gpiod_to_irq(data->data)); in sht15_bh_read_data()
839 if (gpiod_get_value(data->data) in sht15_bh_read_data()
840 || atomic_read(&data->interrupt_handled)) in sht15_bh_read_data()
844 /* Read the data back from the device */ in sht15_bh_read_data()
845 val = sht15_read_byte(data); in sht15_bh_read_data()
847 if (sht15_ack(data)) in sht15_bh_read_data()
849 val |= sht15_read_byte(data); in sht15_bh_read_data()
851 if (data->checksumming) { in sht15_bh_read_data()
856 if (sht15_ack(data)) in sht15_bh_read_data()
858 dev_checksum = bitrev8(sht15_read_byte(data)); in sht15_bh_read_data()
859 checksum_vals[0] = (data->state == SHT15_READING_TEMP) ? in sht15_bh_read_data()
863 data->checksum_ok in sht15_bh_read_data()
864 = (sht15_crc8(data, checksum_vals, 3) == dev_checksum); in sht15_bh_read_data()
868 if (sht15_end_transmission(data)) in sht15_bh_read_data()
871 switch (data->state) { in sht15_bh_read_data()
873 data->val_temp = val; in sht15_bh_read_data()
876 data->val_humid = val; in sht15_bh_read_data()
882 data->state = SHT15_READING_NOTHING; in sht15_bh_read_data()
884 wake_up(&data->wait_queue); in sht15_bh_read_data()
889 struct sht15_data *data in sht15_update_voltage() local
892 data->supply_uv = regulator_get_voltage(data->reg); in sht15_update_voltage()
908 struct sht15_data *data = container_of(nb, struct sht15_data, nb); in sht15_invalidate_voltage() local
911 data->supply_uv_valid = false; in sht15_invalidate_voltage()
912 schedule_work(&data->update_supply_work); in sht15_invalidate_voltage()
928 struct sht15_data *data; in sht15_probe() local
930 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in sht15_probe()
931 if (!data) in sht15_probe()
934 INIT_WORK(&data->read_work, sht15_bh_read_data); in sht15_probe()
935 INIT_WORK(&data->update_supply_work, sht15_update_voltage); in sht15_probe()
936 platform_set_drvdata(pdev, data); in sht15_probe()
937 mutex_init(&data->read_lock); in sht15_probe()
938 data->dev = &pdev->dev; in sht15_probe()
939 init_waitqueue_head(&data->wait_queue); in sht15_probe()
945 data->reg = devm_regulator_get_optional(data->dev, "vcc"); in sht15_probe()
946 if (!IS_ERR(data->reg)) { in sht15_probe()
949 voltage = regulator_get_voltage(data->reg); in sht15_probe()
951 data->supply_uv = voltage; in sht15_probe()
953 ret = regulator_enable(data->reg); in sht15_probe()
964 data->nb.notifier_call = &sht15_invalidate_voltage; in sht15_probe()
965 ret = regulator_register_notifier(data->reg, &data->nb); in sht15_probe()
969 regulator_disable(data->reg); in sht15_probe()
975 data->sck = devm_gpiod_get(&pdev->dev, "clk", GPIOD_OUT_LOW); in sht15_probe()
976 if (IS_ERR(data->sck)) { in sht15_probe()
977 ret = PTR_ERR(data->sck); in sht15_probe()
981 data->data = devm_gpiod_get(&pdev->dev, "data", GPIOD_IN); in sht15_probe()
982 if (IS_ERR(data->data)) { in sht15_probe()
983 ret = PTR_ERR(data->data); in sht15_probe()
984 dev_err(&pdev->dev, "data line GPIO request failed\n"); in sht15_probe()
988 ret = devm_request_irq(&pdev->dev, gpiod_to_irq(data->data), in sht15_probe()
991 "sht15 data", in sht15_probe()
992 data); in sht15_probe()
994 dev_err(&pdev->dev, "failed to get irq for data line\n"); in sht15_probe()
997 disable_irq_nosync(gpiod_to_irq(data->data)); in sht15_probe()
998 ret = sht15_connection_reset(data); in sht15_probe()
1001 ret = sht15_soft_reset(data); in sht15_probe()
1011 data->hwmon_dev = hwmon_device_register(data->dev); in sht15_probe()
1012 if (IS_ERR(data->hwmon_dev)) { in sht15_probe()
1013 ret = PTR_ERR(data->hwmon_dev); in sht15_probe()
1022 if (!IS_ERR(data->reg)) { in sht15_probe()
1023 regulator_unregister_notifier(data->reg, &data->nb); in sht15_probe()
1024 regulator_disable(data->reg); in sht15_probe()
1031 struct sht15_data *data = platform_get_drvdata(pdev); in sht15_remove() local
1037 mutex_lock(&data->read_lock); in sht15_remove()
1038 if (sht15_soft_reset(data)) { in sht15_remove()
1039 mutex_unlock(&data->read_lock); in sht15_remove()
1042 hwmon_device_unregister(data->hwmon_dev); in sht15_remove()
1044 if (!IS_ERR(data->reg)) { in sht15_remove()
1045 regulator_unregister_notifier(data->reg, &data->nb); in sht15_remove()
1046 regulator_disable(data->reg); in sht15_remove()
1049 mutex_unlock(&data->read_lock); in sht15_remove()