-
Notifications
You must be signed in to change notification settings - Fork 844
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add support for AD8460 #2458
Add support for AD8460 #2458
Conversation
0c03ef0
to
5110eb7
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Some initial feedback... Also make sure to fix compilation for arm64
v2
|
@MarielTinaco, sorry for the delay. I did replied to some your questions... Make sure to fix the build errors CI is reporting and push another version of the PULL. Hint for the future: |
Hi @nunojsa unfortunately I do not have access to push into the ADI tree. But it will surely come in handy in the future. Thanks! |
dd308cf
to
577e6a0
Compare
V3
|
577e6a0
to
5e5cdb2
Compare
V4
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Main thing we should see now is that limits stuff. I'm not sure but maybe somehow using the hwmon subsystem would make sense. Like that we could actually control those limits over userspace. But for that, I think we would need to be capable to also read the "thing" we're putting limits on...
|
||
clock-names: | ||
items: | ||
- const: sync_clk |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if we just have one clk, we don't really need clock-names
...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if I remove the usage of clock-names? how does this affect the way I call sync_clk from the driver?
in the driver code, this is the current implementation
sync_clk = devm_clk_get_enabled(&spi->dev, "sync_clk");
if (IS_ERR(sync_clk))
return dev_err_probe(&spi->dev, PTR_ERR(sync_clk),
"Failed to get sync clk\n");
drivers/iio/dac/ad8460.c
Outdated
if (ret) | ||
return ret; | ||
|
||
ret = regmap_read(state->regmap, AD8460_CTRL_REG(0x02), &mode); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
again... is a read() that bad?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
right, I don't think this should interfere with the buffer capture. I should just remove the device claim/release, is that right?
struct iio_dev *indio_dev = arg;
struct ad8460_state *state = iio_priv(indio_dev);
u32 reg;
int ret;
ret = regmap_read(state->regmap, AD8460_CTRL_REG(0x02), ®);
if (ret)
return ret;
*val = FIELD_GET(AD8460_PATTERN_DEPTH_MSK, reg);
return 0;
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
right, I don't think this should interfere with the buffer capture.
With the above in mind, I think so, yes...
int *val, | ||
int *val2, | ||
long mask) | ||
{ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can we only get samples while buffering? Or can we just read a single sample (using IIO_CHAN_INFO_RAW)?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ups, forget this. This is a DAC... And from a quick look on DS, it looks like we don't have any register to control the word to send out (just using that pattern memory stuff)
Pattern depth and pattern memory are configurable settings for the Arbitrary Pattern Generator (APG) mode. Pattern memory is an array like property that is found on the SPI registers.
But taking your words, I'm now thinking if it would make sense to support IIO_CHAN_INFO_RAW where pattern depth is pretty much 1 and we just output a DC voltage. Would that work or does it make sense to you?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, it does make sense to support IIO_CHAN_INFO_RAW this way.
I'll include this in the next revision
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah, this device has some funny stuff :)
drivers/iio/dac/ad8460.c
Outdated
if (ret) | ||
return ret; | ||
|
||
ret = ad8460_enable_apg_mode(state, val); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
iio_device_release_direct_mode(indio_dev)
here?
otherwise we leave it claimed on error;
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i take it that I should bump the iio_device_release_direct_mode(indio_dev)
up before return like here?
ret = ad8460_enable_apg_mode(state, val);
iio_device_release_direct_mode(indio_dev);
return ret;
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yep
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well, when upstreaming use the new iio_device_claim_direct_scoped(). Then, no need to care about releasing it :)
drivers/iio/dac/ad8460.c
Outdated
static struct iio_chan_spec_ext_info ad8460_ext_info[] = { | ||
AD8460_CHAN_EXT_INFO("powerdown", 0, IIO_SEPARATE, | ||
ad8460_read_powerdown, ad8460_write_powerdown), | ||
{}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
general nitpick (upstream will say): null terminators, don't need a trailing comma
drivers/iio/dac/ad8460.c
Outdated
|
||
return IIO_VAL_INT; | ||
case IIO_CHAN_INFO_SCALE: | ||
*val = 80 * (2000 / state->rset_ohms) * (state->vref_mv / 1000); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i wonder if it's better to rewrite this formula to prefer multiplications first and divisions later;
integer division tends to lose some precision;
then there can be a comment about the original formula, or reference it to the datasheet
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I refactored it this way
case IIO_CHAN_INFO_SCALE:
/* vCONVENTIONAL = 80V * (DAC_CODE / 2**14) - 40V
* vMAX = 80V * (2**14 / 2**14) - 40V
* vMIN = 80V * (0 / 2**14) - 40V
* vADJ = vCONVENTIONAL * (2000 / rSET) * (vREF / 1.2)
* vSPAN = vADJ_MAX - vADJ_MIN
* See datasheet page 49, section FULL-SCALE REDUCTION
*/
num = 80 * 2000 * state->vref_mv;
denom = state->rset_ohms * 1200;
*val = DIV_ROUND_CLOSEST_ULL(num, denom);
return IIO_VAL_INT;
V5
|
adi,temp-lim-millicelsius: | ||
description: Specify the overtemperature limits | ||
minimum: 20000 | ||
maximum: 150000 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it seems to me that the above properties will likely not be needed. But if you stick with them, you should set a default:
value for them
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed this attribute
drivers/iio/dac/ad8460.c
Outdated
if (ret) | ||
return ret; | ||
|
||
usleep_range(10, 50); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fsleep()
drivers/iio/dac/ad8460.c
Outdated
|
||
reg = FIELD_PREP(AD8460_PATTERN_DEPTH_MSK, 0); | ||
return regmap_update_bits(state->regmap, AD8460_CTRL_REG(0x02), | ||
AD8460_PATTERN_DEPTH_MSK, reg); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You need to review your locking... You're protecting ad8460_enable_apg_mode() internally and then ad8460_set_hvdac_byte() while the following regmap_update_bits() has no protection (apart from internal regmap lock that won't matter in this case). It seems to me that the complete sequence should be protected.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see, it seems like a should put locking on the higher level functions or those functions that wrap the other function calls and remove it from the lower level functions
int ret; | ||
|
||
switch (mask) { | ||
case IIO_CHAN_INFO_RAW: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also seems to me this should be protected with iio_device_claim_direct_scoped(). If you're buffering, you should not be able to do a write_raw(). Otherwise, buffering will break
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will I be able to use iio_device_claim_direct_scoped() right now? is it supported in this repo yet? Or did you mean that I must have it during upstream and use iio_device_claim_direct_mode/iio_device_release_direct_mode for now?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For now, this is what write raw looks like using the IIO device claim/release
struct ad8460_state *state = iio_priv(indio_dev);
unsigned int reg;
int ret;
switch (mask) {
case IIO_CHAN_INFO_RAW:
ret = iio_device_claim_direct_mode(indio_dev);
if (ret)
return ret;
guard(mutex)(&state->lock);
ret = ad8460_enable_apg_mode(state, 1);
if (ret)
return ret;
ret = ad8460_set_hvdac_byte(state, 0, val);
if (ret)
return ret;
reg = FIELD_PREP(AD8460_PATTERN_DEPTH_MSK, 0);
ret = regmap_update_bits(state->regmap, AD8460_CTRL_REG(0x02),
AD8460_PATTERN_DEPTH_MSK, reg);
iio_device_release_direct_mode(indio_dev);
return ret;
default:
return -EINVAL;
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will I be able to use iio_device_claim_direct_scoped() right now? is it supported in this repo yet? Or did you mean that I must have it during upstream and use iio_device_claim_direct_mode/iio_device_release_direct_mode for now?
I think it's only upstream for now...
drivers/iio/dac/ad8460.c
Outdated
} | ||
DEFINE_DEBUGFS_ATTRIBUTE(ad8460_apg_pattern_depth_fops, | ||
ad8460_show_apg_pattern_depth, | ||
ad8460_set_apg_pattern_depth, "%llu\n"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we still want the debugfs interface now we have it in write raw? The only justification I see would be to have more words.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the pattern_depth can remain on debugfs interface. If setting two integer values at a time, (pattern index and word) is available in write raw, I think pattern_memory can also be removed from debugfs. Maybe the two values of write_raw (val and val2) can be used for this? I'll remove the apg_mode_enable from debugfs now, since it is handled on write raw and pre-enable of buffer.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
another option is to be able selection of test patterns instead such as square, ramp, default etc. this can cover both pattern_depth and pattern_memory setting. what do you think?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm not sure what you mean about the last question? Could you clarify it a bit?
c92d51a
to
dcfb796
Compare
V6
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This already looks good enough to send a first version upstream. So you can take my last review and send it out :). Couple of things to note:
- You need to improve your commit message on the patch adding support for the driver. Don't mention
via axi
. You need a small description of the device (like you have in the bindings patch); - Don't forget to mention the hwmon capabilities and how can we better support them (if still have the intuit of adding them)
- And be prepared for some (maybe lots) changes to be asked. This is a very funny part so I expect the upstream review to be equally "funny" :)
drivers/iio/dac/ad8460.c
Outdated
|
||
state->sync_clk = sync_clk; | ||
|
||
vrefio = devm_regulator_get_optional(&spi->dev, "vrefio"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, this needs to be on the bindings...
drivers/iio/dac/ad8460.c
Outdated
} | ||
DEFINE_DEBUGFS_ATTRIBUTE(ad8460_apg_pattern_depth_fops, | ||
ad8460_show_apg_pattern_depth, | ||
ad8460_set_apg_pattern_depth, "%llu\n"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm not sure what you mean about the last question? Could you clarify it a bit?
drivers/iio/dac/ad8460.c
Outdated
static struct iio_chan_spec_ext_info ad8460_ext_info[] = { | ||
AD8460_CHAN_EXT_INFO("powerdown", 0, IIO_SEPARATE, | ||
ad8460_read_powerdown, ad8460_write_powerdown), | ||
{} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
note you may be asked to support powerdown-mode
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see. Although, unlike other devices where the powerdown modes are explicitly stated as part of the SPI register, in this device, I don't think there is an exact equivalent, that comes close to the selections defined in the ABI for powerdown-modes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think you need to support all of them... Does the datasheet sates something about what happens when you power down. Again, no special need for this now (was just warning that you might get asked for it). You can always argue this upstream and see the reply.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, we're allowed to update the ABI file... You can propose a new entry and support it in the drier and see how it goes :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
gotcha! But since there is only possible powerdown-mode, do I just create an empty setter/getter for it? like here
static const char * const ad8460_powerdown_modes[] = {
"27kohm_to_gnd",
};
static int ad8460_get_powerdown_mode(struct iio_dev *indio_dev,
const struct iio_chan_spec *chan)
{
return 0;
}
static int ad8460_set_powerdown_mode(struct iio_dev *indio_dev,
const struct iio_chan_spec *chan,
unsigned int type)
{
return 0;
}
static const struct iio_enum ad8460_powerdown_mode_enum = {
.items = ad8460_powerdown_modes,
.num_items = ARRAY_SIZE(ad8460_powerdown_modes),
.get = ad8460_get_powerdown_mode,
.set = ad8460_set_powerdown_mode,
};
I found one such example. stm32-dac
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, but I don't think you're mode is 27kohm_to_gnd
. In the datasheet pic you pasted nothing states any ground connection. It says the output goes into high-z (with an impedance of around 27kohm). And that's effectively the three_state
mode already supported.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, I see. You're right
drivers/iio/dac/ad8460.c
Outdated
unsigned int num, denom; | ||
int data, ret; | ||
|
||
guard(mutex)(&state->lock); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not moving this into the IIO_CHAN_INFO_RAW case?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If clean up magic is moved directly inside the "raw" case, as seen below
switch (mask) {
case IIO_CHAN_INFO_RAW:
guard(mutex)(&state->lock);
ret = ad8460_get_hvdac_byte(state, 0, &data);
if (ret)
return ret;
*val = data;
return IIO_VAL_INT;
An error is thrown because there is no declaration before it. So what I did is placed the guard(mutex).. inside the get_hvdac_byte
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use:
scoped_guard(mutex, &state->lock) {
ret = ad8460_get_hvdac_byte(state, 0, &data);
if (ret)
return ret;
}
...
and it should work...
int ret; | ||
|
||
switch (mask) { | ||
case IIO_CHAN_INFO_RAW: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will I be able to use iio_device_claim_direct_scoped() right now? is it supported in this repo yet? Or did you mean that I must have it during upstream and use iio_device_claim_direct_mode/iio_device_release_direct_mode for now?
I think it's only upstream for now...
76d6727
to
e995b43
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Small notes from me... go ahead and send it upstream (I'll also be on vacations for two weeks so no need to wait.)
drivers/iio/dac/ad8460.c
Outdated
} | ||
fsleep(100); | ||
|
||
return ret; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think ret
can be used without any initialization in case gpio is used.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Refactored the reset function this way. To remove the dependency to ret
static int ad8460_reset(const struct ad8460_state *state)
{
struct device *dev = &state->spi->dev;
struct gpio_desc *gpio;
gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
if (IS_ERR(gpio))
return dev_err_probe(dev, PTR_ERR(gpio),
"Failed to get reset gpio");
if (gpio) {
fsleep(100);
gpiod_set_value_cansleep(gpio, 1);
} else {
return regmap_write(state->regmap, AD8460_CTRL_REG(0x03), 1);
}
fsleep(100);
return 0;
}
drivers/iio/dac/ad8460.c
Outdated
if (ret) | ||
return ret; | ||
|
||
*val = (FIELD_GET(AD8460_DATA_BYTE_HIGH_MSK, high) << 8) | low; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
double check it but I don't think the parenthesis...
drivers/iio/dac/ad8460.c
Outdated
char data[16]; | ||
int ret, val; | ||
|
||
guard(mutex)(&state->lock); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
use scoped_guard() and use it in the only place needed... ad8460_set_hvdac_byte()
drivers/iio/dac/ad8460.c
Outdated
int ret, val; | ||
char data[16]; | ||
|
||
guard(mutex)(&state->lock); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
scoped_guard()
drivers/iio/dac/ad8460.c
Outdated
{ | ||
struct ad8460_state *state = iio_priv(indio_dev); | ||
|
||
guard(mutex)(&state->lock); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AFAICT, you don't need the mutex lock here. ad8460_enable_apg_mode() only runs against your write_raw() function and the call is protected with iio_device_claim_direct_mode() which used the same internal IIO mutex as the postdisable() and preenable() callbacks. So in this case, the internal IIO lock is fine to guarantee correctness.
drivers/iio/dac/ad8460.c
Outdated
|
||
ret = ad8460_enable_apg_mode(state, 1); | ||
if (ret) | ||
return ret; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You should use the scoped version of iio_device_claim_direct_mode() when upstreaming. But note that in this code you have a deadlock as you're returning without iio_device_release_direct_mode()
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I ended up with this refactor
int ret;
switch (mask) {
case IIO_CHAN_INFO_RAW:
ret = iio_device_claim_direct_mode(indio_dev);
if (ret)
return ret;
ret = ad8460_enable_apg_mode(state, 1);
iio_device_release_direct_mode(indio_dev);
if (ret)
return ret;
scoped_guard(mutex, &state->lock) {
ret = ad8460_set_hvdac_byte(state, 0, val);
if (ret)
return ret;
reg = FIELD_PREP(AD8460_PATTERN_DEPTH_MSK, 0);
ret = regmap_update_bits(state->regmap,
AD8460_CTRL_REG(0x02),
AD8460_PATTERN_DEPTH_MSK, reg);
}
return ret;
default:
return -EINVAL;
}
drivers/iio/dac/ad8460.c
Outdated
|
||
ret = ad8460_set_hvdac_byte(state, 0, val); | ||
if (ret) | ||
return ret; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ditto
d67518a
to
5e36daa
Compare
V7 Applied changes from upstream |
5e36daa
to
6b0e24e
Compare
Change logs V7
Note: driver accepted upstream |
6b0e24e
to
6dd5d45
Compare
Could you update the PR by cherry-picking directly the commits from upstream? It then makes it obvious that this is upstream. Also, don't we have dt bindings for this? |
c9f0e17
to
65d6f32
Compare
This adds the bindings documentation for the 14-bit High Voltage, High Current, Waveform Generator Digital-to-Analog converter. Signed-off-by: Mariel Tinaco <[email protected]> Reviewed-by: Krzysztof Kozlowski <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jonathan Cameron <[email protected]>
The AD8460 is a “bits in, power out” high voltage, high-power, high-speed driver optimized for large output current (up to ±1 A) and high slew rate (up to ±1800 V/μs) at high voltage (up to ±40 V) into capacitive loads. A digital engine implements user-configurable features: modes for digital input, programmable supply current, and fault monitoring and programmable protection settings for output current, output voltage, and junction temperature. The AD8460 operates on high voltage dual supplies up to ±55 V and a single low voltage supply of 5 V. Backported few API's not yet compatible with ADI linux fork devm_iio_dmaengine_buffer_setup_ext - Reverted to "devm_iio_dmaengine_buffer_setup" devm_mutex_init - Reverted to "mutex_init" in_range - Used explicit range checking Signed-off-by: Mariel Tinaco <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jonathan Cameron <[email protected]>
Add entry for the AD8460 driver. Signed-off-by: Mariel Tinaco <[email protected]>
Add devicetree for AD8460. Signed-off-by: Mariel Tinaco <[email protected]>
Fix the DT compatible string in the of_device_id table to match the binding documentation. There should not be a space after the comma. Fixes: a976ef2 ("iio: dac: support the ad8460 Waveform DAC") Signed-off-by: David Lechner <[email protected]> Link: https://patch.msgid.link/20241018-iio-adc-ad8460-fix-dt-compatible-v1-1-058231638527@baylibre.com Signed-off-by: Jonathan Cameron <[email protected]>
Add SPI device match table for ADI AD8460 DAC. As described in [1], this is required for the module to automatically load, even when using DT. [1]: https://lore.kernel.org/all/[email protected]/ Signed-off-by: David Lechner <[email protected]> Link: https://patch.msgid.link/20241018-iio-dac-ad8460-add-spi-match-table-v1-1-84a5f903bf50@baylibre.com Signed-off-by: Jonathan Cameron <[email protected]>
65d6f32
to
69722e4
Compare
This adds device tree bindings compatible strings, driver support and ZedBoard device trees for AD8460 High Voltage, High Current Arbitrary Waveform Generator DAC.
For more information:
Arbitrary Waveform Generator with Integrated 14-Bit High Speed DAC
This has been tested on the ZedBoard which controls the EVAL-AD8460SDZ evaluation board