diff options
| -rw-r--r-- | drivers/iio/adc/at91-sama5d2_adc.c | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c index bc5b38e3a147..a70ef7fec95f 100644 --- a/drivers/iio/adc/at91-sama5d2_adc.c +++ b/drivers/iio/adc/at91-sama5d2_adc.c | |||
| @@ -225,6 +225,7 @@ struct at91_adc_trigger { | |||
| 225 | char *name; | 225 | char *name; |
| 226 | unsigned int trgmod_value; | 226 | unsigned int trgmod_value; |
| 227 | unsigned int edge_type; | 227 | unsigned int edge_type; |
| 228 | bool hw_trig; | ||
| 228 | }; | 229 | }; |
| 229 | 230 | ||
| 230 | struct at91_adc_state { | 231 | struct at91_adc_state { |
| @@ -254,16 +255,25 @@ static const struct at91_adc_trigger at91_adc_trigger_list[] = { | |||
| 254 | .name = "external_rising", | 255 | .name = "external_rising", |
| 255 | .trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_RISE, | 256 | .trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_RISE, |
| 256 | .edge_type = IRQ_TYPE_EDGE_RISING, | 257 | .edge_type = IRQ_TYPE_EDGE_RISING, |
| 258 | .hw_trig = true, | ||
| 257 | }, | 259 | }, |
| 258 | { | 260 | { |
| 259 | .name = "external_falling", | 261 | .name = "external_falling", |
| 260 | .trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_FALL, | 262 | .trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_FALL, |
| 261 | .edge_type = IRQ_TYPE_EDGE_FALLING, | 263 | .edge_type = IRQ_TYPE_EDGE_FALLING, |
| 264 | .hw_trig = true, | ||
| 262 | }, | 265 | }, |
| 263 | { | 266 | { |
| 264 | .name = "external_any", | 267 | .name = "external_any", |
| 265 | .trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_ANY, | 268 | .trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_ANY, |
| 266 | .edge_type = IRQ_TYPE_EDGE_BOTH, | 269 | .edge_type = IRQ_TYPE_EDGE_BOTH, |
| 270 | .hw_trig = true, | ||
| 271 | }, | ||
| 272 | { | ||
| 273 | .name = "software", | ||
| 274 | .trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_NO_TRIGGER, | ||
| 275 | .edge_type = IRQ_TYPE_NONE, | ||
| 276 | .hw_trig = false, | ||
| 267 | }, | 277 | }, |
| 268 | }; | 278 | }; |
| 269 | 279 | ||
| @@ -597,7 +607,7 @@ static int at91_adc_probe(struct platform_device *pdev) | |||
| 597 | struct at91_adc_state *st; | 607 | struct at91_adc_state *st; |
| 598 | struct resource *res; | 608 | struct resource *res; |
| 599 | int ret, i; | 609 | int ret, i; |
| 600 | u32 edge_type; | 610 | u32 edge_type = IRQ_TYPE_NONE; |
| 601 | 611 | ||
| 602 | indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*st)); | 612 | indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*st)); |
| 603 | if (!indio_dev) | 613 | if (!indio_dev) |
| @@ -641,14 +651,14 @@ static int at91_adc_probe(struct platform_device *pdev) | |||
| 641 | ret = of_property_read_u32(pdev->dev.of_node, | 651 | ret = of_property_read_u32(pdev->dev.of_node, |
| 642 | "atmel,trigger-edge-type", &edge_type); | 652 | "atmel,trigger-edge-type", &edge_type); |
| 643 | if (ret) { | 653 | if (ret) { |
| 644 | dev_err(&pdev->dev, | 654 | dev_dbg(&pdev->dev, |
| 645 | "invalid or missing value for atmel,trigger-edge-type\n"); | 655 | "atmel,trigger-edge-type not specified, only software trigger available\n"); |
| 646 | return ret; | ||
| 647 | } | 656 | } |
| 648 | 657 | ||
| 649 | st->selected_trig = NULL; | 658 | st->selected_trig = NULL; |
| 650 | 659 | ||
| 651 | for (i = 0; i < AT91_SAMA5D2_HW_TRIG_CNT; i++) | 660 | /* find the right trigger, or no trigger at all */ |
| 661 | for (i = 0; i < AT91_SAMA5D2_HW_TRIG_CNT + 1; i++) | ||
| 652 | if (at91_adc_trigger_list[i].edge_type == edge_type) { | 662 | if (at91_adc_trigger_list[i].edge_type == edge_type) { |
| 653 | st->selected_trig = &at91_adc_trigger_list[i]; | 663 | st->selected_trig = &at91_adc_trigger_list[i]; |
| 654 | break; | 664 | break; |
| @@ -717,24 +727,27 @@ static int at91_adc_probe(struct platform_device *pdev) | |||
| 717 | 727 | ||
| 718 | platform_set_drvdata(pdev, indio_dev); | 728 | platform_set_drvdata(pdev, indio_dev); |
| 719 | 729 | ||
| 720 | ret = at91_adc_buffer_init(indio_dev); | 730 | if (st->selected_trig->hw_trig) { |
| 721 | if (ret < 0) { | 731 | ret = at91_adc_buffer_init(indio_dev); |
| 722 | dev_err(&pdev->dev, "couldn't initialize the buffer.\n"); | 732 | if (ret < 0) { |
| 723 | goto per_clk_disable_unprepare; | 733 | dev_err(&pdev->dev, "couldn't initialize the buffer.\n"); |
| 724 | } | 734 | goto per_clk_disable_unprepare; |
| 735 | } | ||
| 725 | 736 | ||
| 726 | ret = at91_adc_trigger_init(indio_dev); | 737 | ret = at91_adc_trigger_init(indio_dev); |
| 727 | if (ret < 0) { | 738 | if (ret < 0) { |
| 728 | dev_err(&pdev->dev, "couldn't setup the triggers.\n"); | 739 | dev_err(&pdev->dev, "couldn't setup the triggers.\n"); |
| 729 | goto per_clk_disable_unprepare; | 740 | goto per_clk_disable_unprepare; |
| 741 | } | ||
| 730 | } | 742 | } |
| 731 | 743 | ||
| 732 | ret = iio_device_register(indio_dev); | 744 | ret = iio_device_register(indio_dev); |
| 733 | if (ret < 0) | 745 | if (ret < 0) |
| 734 | goto per_clk_disable_unprepare; | 746 | goto per_clk_disable_unprepare; |
| 735 | 747 | ||
| 736 | dev_info(&pdev->dev, "setting up trigger as %s\n", | 748 | if (st->selected_trig->hw_trig) |
| 737 | st->selected_trig->name); | 749 | dev_info(&pdev->dev, "setting up trigger as %s\n", |
| 750 | st->selected_trig->name); | ||
| 738 | 751 | ||
| 739 | dev_info(&pdev->dev, "version: %x\n", | 752 | dev_info(&pdev->dev, "version: %x\n", |
| 740 | readl_relaxed(st->base + AT91_SAMA5D2_VERSION)); | 753 | readl_relaxed(st->base + AT91_SAMA5D2_VERSION)); |
