aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/avr32/mach-at32ap/at32ap7000.c208
-rw-r--r--include/asm-avr32/arch-at32ap/board.h5
2 files changed, 213 insertions, 0 deletions
diff --git a/arch/avr32/mach-at32ap/at32ap7000.c b/arch/avr32/mach-at32ap/at32ap7000.c
index 30aedc9473f7..d152504f12b9 100644
--- a/arch/avr32/mach-at32ap/at32ap7000.c
+++ b/arch/avr32/mach-at32ap/at32ap7000.c
@@ -556,6 +556,17 @@ static struct clk pico_clk = {
556 .users = 1, 556 .users = 1,
557}; 557};
558 558
559static struct resource dmaca0_resource[] = {
560 {
561 .start = 0xff200000,
562 .end = 0xff20ffff,
563 .flags = IORESOURCE_MEM,
564 },
565 IRQ(2),
566};
567DEFINE_DEV(dmaca, 0);
568DEV_CLK(hclk, dmaca0, hsb, 10);
569
559/* -------------------------------------------------------------------- 570/* --------------------------------------------------------------------
560 * HMATRIX 571 * HMATRIX
561 * -------------------------------------------------------------------- */ 572 * -------------------------------------------------------------------- */
@@ -655,6 +666,7 @@ void __init at32_add_system_devices(void)
655 platform_device_register(&at32_eic0_device); 666 platform_device_register(&at32_eic0_device);
656 platform_device_register(&smc0_device); 667 platform_device_register(&smc0_device);
657 platform_device_register(&pdc_device); 668 platform_device_register(&pdc_device);
669 platform_device_register(&dmaca0_device);
658 670
659 platform_device_register(&at32_systc0_device); 671 platform_device_register(&at32_systc0_device);
660 672
@@ -960,6 +972,96 @@ at32_add_device_spi(unsigned int id, struct spi_board_info *b, unsigned int n)
960} 972}
961 973
962/* -------------------------------------------------------------------- 974/* --------------------------------------------------------------------
975 * TWI
976 * -------------------------------------------------------------------- */
977static struct resource atmel_twi0_resource[] __initdata = {
978 PBMEM(0xffe00800),
979 IRQ(5),
980};
981static struct clk atmel_twi0_pclk = {
982 .name = "twi_pclk",
983 .parent = &pba_clk,
984 .mode = pba_clk_mode,
985 .get_rate = pba_clk_get_rate,
986 .index = 2,
987};
988
989struct platform_device *__init at32_add_device_twi(unsigned int id)
990{
991 struct platform_device *pdev;
992
993 if (id != 0)
994 return NULL;
995
996 pdev = platform_device_alloc("atmel_twi", id);
997 if (!pdev)
998 return NULL;
999
1000 if (platform_device_add_resources(pdev, atmel_twi0_resource,
1001 ARRAY_SIZE(atmel_twi0_resource)))
1002 goto err_add_resources;
1003
1004 select_peripheral(PA(6), PERIPH_A, 0); /* SDA */
1005 select_peripheral(PA(7), PERIPH_A, 0); /* SDL */
1006
1007 atmel_twi0_pclk.dev = &pdev->dev;
1008
1009 platform_device_add(pdev);
1010 return pdev;
1011
1012err_add_resources:
1013 platform_device_put(pdev);
1014 return NULL;
1015}
1016
1017/* --------------------------------------------------------------------
1018 * MMC
1019 * -------------------------------------------------------------------- */
1020static struct resource atmel_mci0_resource[] __initdata = {
1021 PBMEM(0xfff02400),
1022 IRQ(28),
1023};
1024static struct clk atmel_mci0_pclk = {
1025 .name = "mci_clk",
1026 .parent = &pbb_clk,
1027 .mode = pbb_clk_mode,
1028 .get_rate = pbb_clk_get_rate,
1029 .index = 9,
1030};
1031
1032struct platform_device *__init at32_add_device_mci(unsigned int id)
1033{
1034 struct platform_device *pdev;
1035
1036 if (id != 0)
1037 return NULL;
1038
1039 pdev = platform_device_alloc("atmel_mci", id);
1040 if (!pdev)
1041 return NULL;
1042
1043 if (platform_device_add_resources(pdev, atmel_mci0_resource,
1044 ARRAY_SIZE(atmel_mci0_resource)))
1045 goto err_add_resources;
1046
1047 select_peripheral(PA(10), PERIPH_A, 0); /* CLK */
1048 select_peripheral(PA(11), PERIPH_A, 0); /* CMD */
1049 select_peripheral(PA(12), PERIPH_A, 0); /* DATA0 */
1050 select_peripheral(PA(13), PERIPH_A, 0); /* DATA1 */
1051 select_peripheral(PA(14), PERIPH_A, 0); /* DATA2 */
1052 select_peripheral(PA(15), PERIPH_A, 0); /* DATA3 */
1053
1054 atmel_mci0_pclk.dev = &pdev->dev;
1055
1056 platform_device_add(pdev);
1057 return pdev;
1058
1059err_add_resources:
1060 platform_device_put(pdev);
1061 return NULL;
1062}
1063
1064/* --------------------------------------------------------------------
963 * LCDC 1065 * LCDC
964 * -------------------------------------------------------------------- */ 1066 * -------------------------------------------------------------------- */
965static struct atmel_lcdfb_info atmel_lcdfb0_data; 1067static struct atmel_lcdfb_info atmel_lcdfb0_data;
@@ -1293,6 +1395,105 @@ at32_add_device_ide(unsigned int id, unsigned int extint,
1293} 1395}
1294 1396
1295/* -------------------------------------------------------------------- 1397/* --------------------------------------------------------------------
1398 * AC97C
1399 * -------------------------------------------------------------------- */
1400static struct resource atmel_ac97c0_resource[] __initdata = {
1401 PBMEM(0xfff02800),
1402 IRQ(29),
1403};
1404static struct clk atmel_ac97c0_pclk = {
1405 .name = "pclk",
1406 .parent = &pbb_clk,
1407 .mode = pbb_clk_mode,
1408 .get_rate = pbb_clk_get_rate,
1409 .index = 10,
1410};
1411
1412struct platform_device *__init at32_add_device_ac97c(unsigned int id)
1413{
1414 struct platform_device *pdev;
1415
1416 if (id != 0)
1417 return NULL;
1418
1419 pdev = platform_device_alloc("atmel_ac97c", id);
1420 if (!pdev)
1421 return NULL;
1422
1423 if (platform_device_add_resources(pdev, atmel_ac97c0_resource,
1424 ARRAY_SIZE(atmel_ac97c0_resource)))
1425 goto err_add_resources;
1426
1427 select_peripheral(PB(20), PERIPH_B, 0); /* SYNC */
1428 select_peripheral(PB(21), PERIPH_B, 0); /* SDO */
1429 select_peripheral(PB(22), PERIPH_B, 0); /* SDI */
1430 select_peripheral(PB(23), PERIPH_B, 0); /* SCLK */
1431
1432 atmel_ac97c0_pclk.dev = &pdev->dev;
1433
1434 platform_device_add(pdev);
1435 return pdev;
1436
1437err_add_resources:
1438 platform_device_put(pdev);
1439 return NULL;
1440}
1441
1442/* --------------------------------------------------------------------
1443 * ABDAC
1444 * -------------------------------------------------------------------- */
1445static struct resource abdac0_resource[] __initdata = {
1446 PBMEM(0xfff02000),
1447 IRQ(27),
1448};
1449static struct clk abdac0_pclk = {
1450 .name = "pclk",
1451 .parent = &pbb_clk,
1452 .mode = pbb_clk_mode,
1453 .get_rate = pbb_clk_get_rate,
1454 .index = 8,
1455};
1456static struct clk abdac0_sample_clk = {
1457 .name = "sample_clk",
1458 .mode = genclk_mode,
1459 .get_rate = genclk_get_rate,
1460 .set_rate = genclk_set_rate,
1461 .set_parent = genclk_set_parent,
1462 .index = 6,
1463};
1464
1465struct platform_device *__init at32_add_device_abdac(unsigned int id)
1466{
1467 struct platform_device *pdev;
1468
1469 if (id != 0)
1470 return NULL;
1471
1472 pdev = platform_device_alloc("abdac", id);
1473 if (!pdev)
1474 return NULL;
1475
1476 if (platform_device_add_resources(pdev, abdac0_resource,
1477 ARRAY_SIZE(abdac0_resource)))
1478 goto err_add_resources;
1479
1480 select_peripheral(PB(20), PERIPH_A, 0); /* DATA1 */
1481 select_peripheral(PB(21), PERIPH_A, 0); /* DATA0 */
1482 select_peripheral(PB(22), PERIPH_A, 0); /* DATAN1 */
1483 select_peripheral(PB(23), PERIPH_A, 0); /* DATAN0 */
1484
1485 abdac0_pclk.dev = &pdev->dev;
1486 abdac0_sample_clk.dev = &pdev->dev;
1487
1488 platform_device_add(pdev);
1489 return pdev;
1490
1491err_add_resources:
1492 platform_device_put(pdev);
1493 return NULL;
1494}
1495
1496/* --------------------------------------------------------------------
1296 * GCLK 1497 * GCLK
1297 * -------------------------------------------------------------------- */ 1498 * -------------------------------------------------------------------- */
1298static struct clk gclk0 = { 1499static struct clk gclk0 = {
@@ -1355,6 +1556,7 @@ struct clk *at32_clock_list[] = {
1355 &smc0_mck, 1556 &smc0_mck,
1356 &pdc_hclk, 1557 &pdc_hclk,
1357 &pdc_pclk, 1558 &pdc_pclk,
1559 &dmaca0_hclk,
1358 &pico_clk, 1560 &pico_clk,
1359 &pio0_mck, 1561 &pio0_mck,
1360 &pio1_mck, 1562 &pio1_mck,
@@ -1372,6 +1574,8 @@ struct clk *at32_clock_list[] = {
1372 &macb1_pclk, 1574 &macb1_pclk,
1373 &atmel_spi0_spi_clk, 1575 &atmel_spi0_spi_clk,
1374 &atmel_spi1_spi_clk, 1576 &atmel_spi1_spi_clk,
1577 &atmel_twi0_pclk,
1578 &atmel_mci0_pclk,
1375 &atmel_lcdfb0_hck1, 1579 &atmel_lcdfb0_hck1,
1376 &atmel_lcdfb0_pixclk, 1580 &atmel_lcdfb0_pixclk,
1377 &ssc0_pclk, 1581 &ssc0_pclk,
@@ -1379,6 +1583,9 @@ struct clk *at32_clock_list[] = {
1379 &ssc2_pclk, 1583 &ssc2_pclk,
1380 &usba0_hclk, 1584 &usba0_hclk,
1381 &usba0_pclk, 1585 &usba0_pclk,
1586 &atmel_ac97c0_pclk,
1587 &abdac0_pclk,
1588 &abdac0_sample_clk,
1382 &gclk0, 1589 &gclk0,
1383 &gclk1, 1590 &gclk1,
1384 &gclk2, 1591 &gclk2,
@@ -1420,6 +1627,7 @@ void __init at32_clock_init(void)
1420 genclk_init_parent(&gclk3); 1627 genclk_init_parent(&gclk3);
1421 genclk_init_parent(&gclk4); 1628 genclk_init_parent(&gclk4);
1422 genclk_init_parent(&atmel_lcdfb0_pixclk); 1629 genclk_init_parent(&atmel_lcdfb0_pixclk);
1630 genclk_init_parent(&abdac0_sample_clk);
1423 1631
1424 /* 1632 /*
1425 * Turn on all clocks that have at least one user already, and 1633 * Turn on all clocks that have at least one user already, and
diff --git a/include/asm-avr32/arch-at32ap/board.h b/include/asm-avr32/arch-at32ap/board.h
index c18160f29cbd..946378a1b6b5 100644
--- a/include/asm-avr32/arch-at32ap/board.h
+++ b/include/asm-avr32/arch-at32ap/board.h
@@ -65,4 +65,9 @@ at32_add_device_ide(unsigned int id, unsigned int extint,
65struct platform_device * 65struct platform_device *
66at32_add_device_ssc(unsigned int id, unsigned int flags); 66at32_add_device_ssc(unsigned int id, unsigned int flags);
67 67
68struct platform_device *at32_add_device_twi(unsigned int id);
69struct platform_device *at32_add_device_mci(unsigned int id);
70struct platform_device *at32_add_device_ac97c(unsigned int id);
71struct platform_device *at32_add_device_abdac(unsigned int id);
72
68#endif /* __ASM_ARCH_BOARD_H */ 73#endif /* __ASM_ARCH_BOARD_H */