|
@@ -225,6 +225,7 @@ struct at91_adc_trigger {
|
|
char *name;
|
|
char *name;
|
|
unsigned int trgmod_value;
|
|
unsigned int trgmod_value;
|
|
unsigned int edge_type;
|
|
unsigned int edge_type;
|
|
|
|
+ bool hw_trig;
|
|
};
|
|
};
|
|
|
|
|
|
struct at91_adc_state {
|
|
struct at91_adc_state {
|
|
@@ -254,16 +255,25 @@ static const struct at91_adc_trigger at91_adc_trigger_list[] = {
|
|
.name = "external_rising",
|
|
.name = "external_rising",
|
|
.trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_RISE,
|
|
.trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_RISE,
|
|
.edge_type = IRQ_TYPE_EDGE_RISING,
|
|
.edge_type = IRQ_TYPE_EDGE_RISING,
|
|
|
|
+ .hw_trig = true,
|
|
},
|
|
},
|
|
{
|
|
{
|
|
.name = "external_falling",
|
|
.name = "external_falling",
|
|
.trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_FALL,
|
|
.trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_FALL,
|
|
.edge_type = IRQ_TYPE_EDGE_FALLING,
|
|
.edge_type = IRQ_TYPE_EDGE_FALLING,
|
|
|
|
+ .hw_trig = true,
|
|
},
|
|
},
|
|
{
|
|
{
|
|
.name = "external_any",
|
|
.name = "external_any",
|
|
.trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_ANY,
|
|
.trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_ANY,
|
|
.edge_type = IRQ_TYPE_EDGE_BOTH,
|
|
.edge_type = IRQ_TYPE_EDGE_BOTH,
|
|
|
|
+ .hw_trig = true,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ .name = "software",
|
|
|
|
+ .trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_NO_TRIGGER,
|
|
|
|
+ .edge_type = IRQ_TYPE_NONE,
|
|
|
|
+ .hw_trig = false,
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
|
|
@@ -597,7 +607,7 @@ static int at91_adc_probe(struct platform_device *pdev)
|
|
struct at91_adc_state *st;
|
|
struct at91_adc_state *st;
|
|
struct resource *res;
|
|
struct resource *res;
|
|
int ret, i;
|
|
int ret, i;
|
|
- u32 edge_type;
|
|
|
|
|
|
+ u32 edge_type = IRQ_TYPE_NONE;
|
|
|
|
|
|
indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*st));
|
|
indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*st));
|
|
if (!indio_dev)
|
|
if (!indio_dev)
|
|
@@ -641,14 +651,14 @@ static int at91_adc_probe(struct platform_device *pdev)
|
|
ret = of_property_read_u32(pdev->dev.of_node,
|
|
ret = of_property_read_u32(pdev->dev.of_node,
|
|
"atmel,trigger-edge-type", &edge_type);
|
|
"atmel,trigger-edge-type", &edge_type);
|
|
if (ret) {
|
|
if (ret) {
|
|
- dev_err(&pdev->dev,
|
|
|
|
- "invalid or missing value for atmel,trigger-edge-type\n");
|
|
|
|
- return ret;
|
|
|
|
|
|
+ dev_dbg(&pdev->dev,
|
|
|
|
+ "atmel,trigger-edge-type not specified, only software trigger available\n");
|
|
}
|
|
}
|
|
|
|
|
|
st->selected_trig = NULL;
|
|
st->selected_trig = NULL;
|
|
|
|
|
|
- for (i = 0; i < AT91_SAMA5D2_HW_TRIG_CNT; i++)
|
|
|
|
|
|
+ /* find the right trigger, or no trigger at all */
|
|
|
|
+ for (i = 0; i < AT91_SAMA5D2_HW_TRIG_CNT + 1; i++)
|
|
if (at91_adc_trigger_list[i].edge_type == edge_type) {
|
|
if (at91_adc_trigger_list[i].edge_type == edge_type) {
|
|
st->selected_trig = &at91_adc_trigger_list[i];
|
|
st->selected_trig = &at91_adc_trigger_list[i];
|
|
break;
|
|
break;
|
|
@@ -717,24 +727,27 @@ static int at91_adc_probe(struct platform_device *pdev)
|
|
|
|
|
|
platform_set_drvdata(pdev, indio_dev);
|
|
platform_set_drvdata(pdev, indio_dev);
|
|
|
|
|
|
- ret = at91_adc_buffer_init(indio_dev);
|
|
|
|
- if (ret < 0) {
|
|
|
|
- dev_err(&pdev->dev, "couldn't initialize the buffer.\n");
|
|
|
|
- goto per_clk_disable_unprepare;
|
|
|
|
- }
|
|
|
|
|
|
+ if (st->selected_trig->hw_trig) {
|
|
|
|
+ ret = at91_adc_buffer_init(indio_dev);
|
|
|
|
+ if (ret < 0) {
|
|
|
|
+ dev_err(&pdev->dev, "couldn't initialize the buffer.\n");
|
|
|
|
+ goto per_clk_disable_unprepare;
|
|
|
|
+ }
|
|
|
|
|
|
- ret = at91_adc_trigger_init(indio_dev);
|
|
|
|
- if (ret < 0) {
|
|
|
|
- dev_err(&pdev->dev, "couldn't setup the triggers.\n");
|
|
|
|
- goto per_clk_disable_unprepare;
|
|
|
|
|
|
+ ret = at91_adc_trigger_init(indio_dev);
|
|
|
|
+ if (ret < 0) {
|
|
|
|
+ dev_err(&pdev->dev, "couldn't setup the triggers.\n");
|
|
|
|
+ goto per_clk_disable_unprepare;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
ret = iio_device_register(indio_dev);
|
|
ret = iio_device_register(indio_dev);
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
goto per_clk_disable_unprepare;
|
|
goto per_clk_disable_unprepare;
|
|
|
|
|
|
- dev_info(&pdev->dev, "setting up trigger as %s\n",
|
|
|
|
- st->selected_trig->name);
|
|
|
|
|
|
+ if (st->selected_trig->hw_trig)
|
|
|
|
+ dev_info(&pdev->dev, "setting up trigger as %s\n",
|
|
|
|
+ st->selected_trig->name);
|
|
|
|
|
|
dev_info(&pdev->dev, "version: %x\n",
|
|
dev_info(&pdev->dev, "version: %x\n",
|
|
readl_relaxed(st->base + AT91_SAMA5D2_VERSION));
|
|
readl_relaxed(st->base + AT91_SAMA5D2_VERSION));
|