The reason why this is a RFC is because I'm still waiting for proper HW to test this thing. The reason why I'm sending this already is because there's some non usual features which might require extra ABI. Hence, while waiting I thought we could already speed up the process in regards with the ABI. I still pushed the driver but the intent here is not really to review it. Naturally, if someone already wants to give some feedback, that's very much appreciated :) Now, there are three main interfaces depending on the channel mode: 1) default (no new ABI) 2) toggle mode 3) dither mode The channel mode will be a devicetree property as it does not really make much sense to change between modes at runtime even more because the piece of HW we might want to control with a channel might be different depending on the selected mode (I'm fairly sure on this between toggle and other modes but not so sure between dither and default mode). toggle mode special ABI: * Toggle operation enables fast switching of a DAC output between two different DAC codes without any SPI transaction. Two codes are set in input_a and input_b and then the output switches according to an input signal (input_a -> clk high; input_b -> clk low). out_voltageY_input_register - selects between input_a and input_b. After selecting one register, we can write the dac code in out_voltageY_raw. out_voltageY_toggle_en - Disable/Enable toggle mode. The reason why I think this one is important is because if we wanna change the 2 codes, we should first disable this, set the codes and only then enable the mode back... As I'm writing this, It kind of came to me that we can probably achieve this with out_voltageY_powerdown attr (maybe takes a bit more time to see the outputs but...) dither mode special ABI: * Dither operation adds a small sinusoidal wave to the digital DAC signal path. Dithering is a signal processing technique that involves the injection of ac noise to the signal path to reduce system nonlinearities. out_voltage0_dither_en - Same as in toggle mode. out_voltage0_dither_period out_voltage0_dither_phase - Period and phase of the signal. Only some values are valid so there's also *_available files for these. I'm not sure if we can use the more generic IIO_CHAN_INFO_PHASE and IIO_CHAN_INFO_FREQUENCY here as these parameters don't really apply to the channel output signal... out_voltage0_input_register - Same as in toggle mode. However in this mode the code set in the input_b register has a special meaning. It's the amplitude of the dither signal. One special mention to the dac scale. In this part this is something that can be purely controlled by SW so that I'm allowing userspace to change it rather then having it in dts. The available scales are: * [0 5V] -> offset 0 * [0 10V] -> offset 0 * [-5 5V] -> offset -32678 * [-10 10V] -> offset -32768 * [-15 15V] -> offset -32768 With the above, we also need to have the offset configurable and right now I'm going to some trouble to make sure the scale + offset is something valid. Honestly, I think I'm overdoing it because things can still go wrong with [0 10V] and [-5 5V] as the scales are the same here. Furthermore, there's no real arm that can be done to the HW. Is just that the readings won't match with what someone might be expecting. My plan is to just remove those checks and assume is up to userspace to make it right and not have [-10 10V] scale with 0 offset for example. I know that I'm taking a shortcut here :) so if you prefer to only discuss this in the __real__ series, I totally get it. https://www.analog.com/media/en/technical-documentation/data-sheets/ltc2688.pdf - Nuno Sá Nuno Sá (1): iio: dac: add support for ltc2688 drivers/iio/dac/ltc2688.c | 995 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 995 insertions(+) create mode 100644 drivers/iio/dac/ltc2688.c -- 2.33.1