diff options
Diffstat (limited to 'arch/arm/mach-at91/at91sam9260_devices.c')
-rw-r--r-- | arch/arm/mach-at91/at91sam9260_devices.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index d556de141114..0ded951f785a 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c | |||
@@ -17,12 +17,15 @@ | |||
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/i2c-gpio.h> | 18 | #include <linux/i2c-gpio.h> |
19 | 19 | ||
20 | #include <linux/platform_data/at91_adc.h> | ||
21 | |||
20 | #include <mach/board.h> | 22 | #include <mach/board.h> |
21 | #include <mach/cpu.h> | 23 | #include <mach/cpu.h> |
22 | #include <mach/at91sam9260.h> | 24 | #include <mach/at91sam9260.h> |
23 | #include <mach/at91sam9260_matrix.h> | 25 | #include <mach/at91sam9260_matrix.h> |
24 | #include <mach/at91_matrix.h> | 26 | #include <mach/at91_matrix.h> |
25 | #include <mach/at91sam9_smc.h> | 27 | #include <mach/at91sam9_smc.h> |
28 | #include <mach/at91_adc.h> | ||
26 | 29 | ||
27 | #include "generic.h" | 30 | #include "generic.h" |
28 | 31 | ||
@@ -1340,6 +1343,93 @@ void __init at91_add_device_cf(struct at91_cf_data *data) | |||
1340 | void __init at91_add_device_cf(struct at91_cf_data * data) {} | 1343 | void __init at91_add_device_cf(struct at91_cf_data * data) {} |
1341 | #endif | 1344 | #endif |
1342 | 1345 | ||
1346 | /* -------------------------------------------------------------------- | ||
1347 | * ADCs | ||
1348 | * -------------------------------------------------------------------- */ | ||
1349 | |||
1350 | #if IS_ENABLED(CONFIG_AT91_ADC) | ||
1351 | static struct at91_adc_data adc_data; | ||
1352 | |||
1353 | static struct resource adc_resources[] = { | ||
1354 | [0] = { | ||
1355 | .start = AT91SAM9260_BASE_ADC, | ||
1356 | .end = AT91SAM9260_BASE_ADC + SZ_16K - 1, | ||
1357 | .flags = IORESOURCE_MEM, | ||
1358 | }, | ||
1359 | [1] = { | ||
1360 | .start = AT91SAM9260_ID_ADC, | ||
1361 | .end = AT91SAM9260_ID_ADC, | ||
1362 | .flags = IORESOURCE_IRQ, | ||
1363 | }, | ||
1364 | }; | ||
1365 | |||
1366 | static struct platform_device at91_adc_device = { | ||
1367 | .name = "at91_adc", | ||
1368 | .id = -1, | ||
1369 | .dev = { | ||
1370 | .platform_data = &adc_data, | ||
1371 | }, | ||
1372 | .resource = adc_resources, | ||
1373 | .num_resources = ARRAY_SIZE(adc_resources), | ||
1374 | }; | ||
1375 | |||
1376 | static struct at91_adc_trigger at91_adc_triggers[] = { | ||
1377 | [0] = { | ||
1378 | .name = "timer-counter-0", | ||
1379 | .value = AT91_ADC_TRGSEL_TC0 | AT91_ADC_TRGEN, | ||
1380 | }, | ||
1381 | [1] = { | ||
1382 | .name = "timer-counter-1", | ||
1383 | .value = AT91_ADC_TRGSEL_TC1 | AT91_ADC_TRGEN, | ||
1384 | }, | ||
1385 | [2] = { | ||
1386 | .name = "timer-counter-2", | ||
1387 | .value = AT91_ADC_TRGSEL_TC2 | AT91_ADC_TRGEN, | ||
1388 | }, | ||
1389 | [3] = { | ||
1390 | .name = "external", | ||
1391 | .value = AT91_ADC_TRGSEL_EXTERNAL | AT91_ADC_TRGEN, | ||
1392 | .is_external = true, | ||
1393 | }, | ||
1394 | }; | ||
1395 | |||
1396 | static struct at91_adc_reg_desc at91_adc_register_g20 = { | ||
1397 | .channel_base = AT91_ADC_CHR(0), | ||
1398 | .drdy_mask = AT91_ADC_DRDY, | ||
1399 | .status_register = AT91_ADC_SR, | ||
1400 | .trigger_register = AT91_ADC_MR, | ||
1401 | }; | ||
1402 | |||
1403 | void __init at91_add_device_adc(struct at91_adc_data *data) | ||
1404 | { | ||
1405 | if (!data) | ||
1406 | return; | ||
1407 | |||
1408 | if (test_bit(0, &data->channels_used)) | ||
1409 | at91_set_A_periph(AT91_PIN_PC0, 0); | ||
1410 | if (test_bit(1, &data->channels_used)) | ||
1411 | at91_set_A_periph(AT91_PIN_PC1, 0); | ||
1412 | if (test_bit(2, &data->channels_used)) | ||
1413 | at91_set_A_periph(AT91_PIN_PC2, 0); | ||
1414 | if (test_bit(3, &data->channels_used)) | ||
1415 | at91_set_A_periph(AT91_PIN_PC3, 0); | ||
1416 | |||
1417 | if (data->use_external_triggers) | ||
1418 | at91_set_A_periph(AT91_PIN_PA22, 0); | ||
1419 | |||
1420 | data->num_channels = 4; | ||
1421 | data->startup_time = 10; | ||
1422 | data->registers = &at91_adc_register_g20; | ||
1423 | data->trigger_number = 4; | ||
1424 | data->trigger_list = at91_adc_triggers; | ||
1425 | |||
1426 | adc_data = *data; | ||
1427 | platform_device_register(&at91_adc_device); | ||
1428 | } | ||
1429 | #else | ||
1430 | void __init at91_add_device_adc(struct at91_adc_data *data) {} | ||
1431 | #endif | ||
1432 | |||
1343 | /* -------------------------------------------------------------------- */ | 1433 | /* -------------------------------------------------------------------- */ |
1344 | /* | 1434 | /* |
1345 | * These devices are always present and don't need any board-specific | 1435 | * These devices are always present and don't need any board-specific |