Lines Matching +full:io +full:- +full:channel +full:- +full:mux
1 // SPDX-License-Identifier: GPL-2.0+
3 * si1133.c - Support for Silabs SI1133 combined ambient
6 * Copyright 2018 Maxime Roussin-Belanger <maxime.roussinbelanger@gmail.com>
225 {-2671, 234}
230 {-1022, 36363},
232 { -367, 57909},
233 {-1774, 38240},
234 { -608, 46775},
235 {-1503, 51831},
236 {-1886, 58928}
256 shift = ((u16)coeffs->info & 0xFF00) >> 8; in si1133_calculate_output()
259 shift = -shift; in si1133_calculate_output()
263 coeffs->mag, shift); in si1133_calculate_output()
270 coeffs->mag, shift); in si1133_calculate_output()
280 * https://siliconlabs.github.io/Gecko_SDK_Doc/efm32zg/html/si1133_8c_source.html#l00716
291 if (coeffs->info < 0) in si1133_calc_polynomial()
292 sign = -1; in si1133_calc_polynomial()
296 x_order = si1133_get_x_order(coeffs->info); in si1133_calc_polynomial()
297 y_order = si1133_get_y_order(coeffs->info); in si1133_calc_polynomial()
301 sign * coeffs->mag << SI1133_LUX_OUTPUT_FRACTION; in si1133_calc_polynomial()
315 struct device *dev = &data->client->dev; in si1133_cmd_reset_sw()
320 err = regmap_write(data->regmap, SI1133_REG_COMMAND, in si1133_cmd_reset_sw()
327 err = regmap_read(data->regmap, SI1133_REG_RESPONSE0, &resp); in si1133_cmd_reset_sw()
328 if (err == -ENXIO) { in si1133_cmd_reset_sw()
339 return -ETIMEDOUT; in si1133_cmd_reset_sw()
344 data->rsp_seq = SI1133_MAX_CMD_CTR; in si1133_cmd_reset_sw()
356 return -EOVERFLOW; in si1133_parse_response_err()
360 return -EOVERFLOW; in si1133_parse_response_err()
365 return -EINVAL; in si1133_parse_response_err()
368 return -EINVAL; in si1133_parse_response_err()
371 return -EINVAL; in si1133_parse_response_err()
377 int err = regmap_write(data->regmap, SI1133_REG_COMMAND, in si1133_cmd_reset_counter()
382 data->rsp_seq = 0; in si1133_cmd_reset_counter()
389 struct device *dev = &data->client->dev; in si1133_command()
394 mutex_lock(&data->mutex); in si1133_command()
396 expected_seq = (data->rsp_seq + 1) & SI1133_MAX_CMD_CTR; in si1133_command()
399 reinit_completion(&data->completion); in si1133_command()
401 err = regmap_write(data->regmap, SI1133_REG_COMMAND, cmd); in si1133_command()
410 if (!wait_for_completion_timeout(&data->completion, in si1133_command()
412 err = -ETIMEDOUT; in si1133_command()
415 err = regmap_read(data->regmap, SI1133_REG_RESPONSE0, &resp); in si1133_command()
419 err = regmap_read_poll_timeout(data->regmap, in si1133_command()
438 data->rsp_seq = expected_seq; in si1133_command()
442 mutex_unlock(&data->mutex); in si1133_command()
449 int err = regmap_write(data->regmap, SI1133_REG_HOSTIN0, value); in si1133_param_set()
465 return regmap_read(data->regmap, SI1133_REG_RESPONSE1, result); in si1133_param_query()
470 .channel = _ch, \
480 .channel = 0,
527 return -EINVAL; in si1133_get_int_time_index()
539 data->adc_sens[adc] &= 0xF0; in si1133_set_integration_time()
540 data->adc_sens[adc] |= index; in si1133_set_integration_time()
543 data->adc_sens[adc]); in si1133_set_integration_time()
548 /* channel list already set, no need to reprogram */ in si1133_set_chlist()
549 if (data->scan_mask == scan_mask) in si1133_set_chlist()
552 data->scan_mask = scan_mask; in si1133_set_chlist()
567 data->adc_config[adc] = adc_config; in si1133_chan_set_adcconfig()
589 static int si1133_set_adcmux(struct si1133_data *data, u8 adc, u8 mux) in si1133_set_adcmux() argument
591 if ((mux & data->adc_config[adc]) == mux) in si1133_set_adcmux()
592 return 0; /* mux already set to correct value */ in si1133_set_adcmux()
594 return si1133_update_adcconfig(data, adc, SI1133_ADCMUX_MASK, 0, mux); in si1133_set_adcmux()
611 return regmap_bulk_read(data->regmap, start_reg, buffer, length); in si1133_bulk_read()
622 err = si1133_set_adcmux(data, 0, chan->channel); in si1133_measure()
648 err = regmap_read(data->regmap, SI1133_REG_IRQ_STATUS, &irq_status); in si1133_threaded_irq_handler()
650 dev_err_ratelimited(&iio_dev->dev, "Error reading IRQ\n"); in si1133_threaded_irq_handler()
654 if (irq_status != data->scan_mask) in si1133_threaded_irq_handler()
658 complete(&data->completion); in si1133_threaded_irq_handler()
670 return -EINVAL; in si1133_scale_to_swgain()
684 data->adc_sens[adc] = adc_sens; in si1133_chan_set_adcsens()
752 u8 adc_sens = data->adc_sens[0]; in si1133_read_raw()
757 switch (chan->type) { in si1133_read_raw()
765 return -EINVAL; in si1133_read_raw()
768 switch (chan->type) { in si1133_read_raw()
777 return -EINVAL; in si1133_read_raw()
780 switch (chan->type) { in si1133_read_raw()
789 return -EINVAL; in si1133_read_raw()
792 switch (chan->type) { in si1133_read_raw()
802 return -EINVAL; in si1133_read_raw()
805 switch (chan->type) { in si1133_read_raw()
814 return -EINVAL; in si1133_read_raw()
817 return -EINVAL; in si1133_read_raw()
829 switch (chan->type) { in si1133_write_raw()
841 return -EINVAL; in si1133_write_raw()
846 switch (chan->type) { in si1133_write_raw()
850 return -EINVAL; in si1133_write_raw()
857 return -EINVAL; in si1133_write_raw()
860 return -EINVAL; in si1133_write_raw()
881 * si1133_init_lux_channels - Configure 3 different channels(adc) (1,2 and 3)
882 * The channel configuration for the lux measurement was taken from :
883 * https://siliconlabs.github.io/Gecko_SDK_Doc/efm32zg/html/si1133_8c_source.html#l00578
885 * Reserved the channel 0 for the other raw measurements
957 return regmap_write(data->regmap, SI1133_REG_IRQ_ENABLE, in si1133_initialize()
968 err = regmap_read(data->regmap, SI1133_REG_PART_ID, &part_id); in si1133_validate_ids()
972 err = regmap_read(data->regmap, SI1133_REG_REV_ID, &rev_id); in si1133_validate_ids()
976 err = regmap_read(data->regmap, SI1133_REG_MFR_ID, &mfr_id); in si1133_validate_ids()
980 dev_info(&iio_dev->dev, in si1133_validate_ids()
984 dev_err(&iio_dev->dev, in si1133_validate_ids()
987 return -ENODEV; in si1133_validate_ids()
1000 iio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in si1133_probe()
1002 return -ENOMEM; in si1133_probe()
1006 init_completion(&data->completion); in si1133_probe()
1008 data->regmap = devm_regmap_init_i2c(client, &si1133_regmap_config); in si1133_probe()
1009 if (IS_ERR(data->regmap)) { in si1133_probe()
1010 err = PTR_ERR(data->regmap); in si1133_probe()
1011 dev_err(&client->dev, "Failed to initialise regmap: %d\n", err); in si1133_probe()
1016 data->client = client; in si1133_probe()
1018 iio_dev->name = id->name; in si1133_probe()
1019 iio_dev->channels = si1133_channels; in si1133_probe()
1020 iio_dev->num_channels = ARRAY_SIZE(si1133_channels); in si1133_probe()
1021 iio_dev->info = &si1133_info; in si1133_probe()
1022 iio_dev->modes = INDIO_DIRECT_MODE; in si1133_probe()
1024 mutex_init(&data->mutex); in si1133_probe()
1032 dev_err(&client->dev, in si1133_probe()
1037 if (!client->irq) { in si1133_probe()
1038 dev_err(&client->dev, in si1133_probe()
1040 return -EINVAL; in si1133_probe()
1043 err = devm_request_threaded_irq(&client->dev, client->irq, in si1133_probe()
1047 client->name, iio_dev); in si1133_probe()
1049 dev_warn(&client->dev, "Request irq %d failed: %i\n", in si1133_probe()
1050 client->irq, err); in si1133_probe()
1054 return devm_iio_device_register(&client->dev, iio_dev); in si1133_probe()
1073 MODULE_AUTHOR("Maxime Roussin-Belanger <maxime.roussinbelanger@gmail.com>");