diff options
author | Laxman Dewangan <ldewangan@nvidia.com> | 2014-04-04 21:16:56 +0530 |
---|---|---|
committer | Laxman Dewangan <ldewangan@nvidia.com> | 2014-04-05 04:46:33 -0700 |
commit | cc243afc6ecf4b49d2193605c37c6cc61aff6ae9 (patch) | |
tree | 77b77ea8fda8887aacb5bd1b9d455b4515c6a280 /drivers/staging | |
parent | ab0506a0c2f55e860425ff93a9cdfb96495554b0 (diff) |
iio: adc: palmas: add dt support for autoconversion
Add DT parsing for auto conversion configurations on palmas-adc.
The autoconversion subnode is require as
gpadc {
::::
auto_conv0 {
// Auto-conversion 0 parameters
};
auto_conv1 {
// Auto-conversion 1 parameters
};
::::::::
};
Change-Id: Id730213f6d5c685efef65cee9c74c4e33c81c66c
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/392401
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/iio/adc/palmas_gpadc.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/drivers/staging/iio/adc/palmas_gpadc.c b/drivers/staging/iio/adc/palmas_gpadc.c index 64bafc077a01..85181a913fe0 100644 --- a/drivers/staging/iio/adc/palmas_gpadc.c +++ b/drivers/staging/iio/adc/palmas_gpadc.c @@ -883,6 +883,45 @@ static const struct iio_chan_spec palmas_gpadc_iio_channel[] = { PALMAS_ADC_CHAN_IIO(IN15), }; +static int palmas_gpadc_get_autoconv_prop(struct device *dev, + struct device_node *np, const char *node_name, + struct palmas_adc_auto_conv_property **conv_prop) +{ + struct device_node *conv_node; + struct palmas_adc_auto_conv_property *cprop; + int ret; + u32 pval; + s32 thres; + + conv_node = of_get_child_by_name(np, node_name); + if (!conv_node) + return -EINVAL; + + cprop = devm_kzalloc(dev, sizeof(*cprop), GFP_KERNEL); + if (!cprop) + return -ENOMEM; + + ret = of_property_read_u32(conv_node, "ti,adc-channel-number", &pval); + if (ret < 0) { + dev_err(dev, "Autoconversion channel is missing\n"); + return ret; + } + cprop->adc_channel_number = pval; + + ret = of_property_read_s32(conv_node, "ti,adc-high-threshold", &thres); + if (!ret) + cprop->adc_high_threshold = thres; + + ret = of_property_read_s32(conv_node, "ti,adc-low-threshold", &thres); + if (!ret) + cprop->adc_low_threshold = thres; + + cprop->adc_shutdown = of_property_read_bool(conv_node, + "ti,enable-shutdown"); + *conv_prop = cprop; + return 0; +} + static int palmas_gpadc_get_adc_dt_data(struct platform_device *pdev, struct palmas_gpadc_platform_data **gpadc_pdata) { @@ -891,6 +930,7 @@ static int palmas_gpadc_get_adc_dt_data(struct platform_device *pdev, struct device_node *map_node; struct device_node *child; struct iio_map *palmas_iio_map; + struct palmas_adc_auto_conv_property *conv_prop; int ret; u32 pval; int nmap, nvalid_map; @@ -913,6 +953,20 @@ static int palmas_gpadc_get_adc_dt_data(struct platform_device *pdev, gp_data->extended_delay = of_property_read_bool(np, "ti,enable-extended-delay"); + ret = of_property_read_u32(np, "ti,auto-conversion-period-ms", &pval); + if (!ret) + gp_data->auto_conversion_period_ms = pval; + + ret = palmas_gpadc_get_autoconv_prop(&pdev->dev, np, "auto_conv0", + &conv_prop); + if (!ret) + gp_data->adc_auto_conv0_data = conv_prop; + + ret = palmas_gpadc_get_autoconv_prop(&pdev->dev, np, "auto_conv1", + &conv_prop); + if (!ret) + gp_data->adc_auto_conv1_data = conv_prop; + map_node = of_get_child_by_name(np, "iio_map"); if (!map_node) { dev_warn(&pdev->dev, "IIO map table not found\n"); |