diff options
| -rw-r--r-- | arch/arm/mach-at91/at91rm9200_devices.c | 173 | ||||
| -rw-r--r-- | arch/arm/mach-at91/at91sam9260_devices.c | 79 | ||||
| -rw-r--r-- | arch/arm/mach-at91/at91sam9261_devices.c | 173 | ||||
| -rw-r--r-- | arch/arm/mach-at91/at91sam9263_devices.c | 129 | ||||
| -rw-r--r-- | arch/arm/mach-at91/at91sam9rl_devices.c | 129 | ||||
| -rw-r--r-- | include/asm-arm/arch-at91/board.h | 17 |
6 files changed, 700 insertions, 0 deletions
diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index a601c7c1670e..cebea4168778 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c | |||
| @@ -636,6 +636,179 @@ void __init at91_init_leds(u8 cpu_led, u8 timer_led) {} | |||
| 636 | 636 | ||
| 637 | 637 | ||
| 638 | /* -------------------------------------------------------------------- | 638 | /* -------------------------------------------------------------------- |
| 639 | * SSC -- Synchronous Serial Controller | ||
| 640 | * -------------------------------------------------------------------- */ | ||
| 641 | |||
| 642 | #if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE) | ||
| 643 | static u64 ssc0_dmamask = DMA_BIT_MASK(32); | ||
| 644 | |||
| 645 | static struct resource ssc0_resources[] = { | ||
| 646 | [0] = { | ||
| 647 | .start = AT91RM9200_BASE_SSC0, | ||
| 648 | .end = AT91RM9200_BASE_SSC0 + SZ_16K - 1, | ||
| 649 | .flags = IORESOURCE_MEM, | ||
| 650 | }, | ||
| 651 | [1] = { | ||
| 652 | .start = AT91RM9200_ID_SSC0, | ||
| 653 | .end = AT91RM9200_ID_SSC0, | ||
| 654 | .flags = IORESOURCE_IRQ, | ||
| 655 | }, | ||
| 656 | }; | ||
| 657 | |||
| 658 | static struct platform_device at91rm9200_ssc0_device = { | ||
| 659 | .name = "ssc", | ||
| 660 | .id = 0, | ||
| 661 | .dev = { | ||
| 662 | .dma_mask = &ssc0_dmamask, | ||
| 663 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 664 | }, | ||
| 665 | .resource = ssc0_resources, | ||
| 666 | .num_resources = ARRAY_SIZE(ssc0_resources), | ||
| 667 | }; | ||
| 668 | |||
| 669 | static inline void configure_ssc0_pins(unsigned pins) | ||
| 670 | { | ||
| 671 | if (pins & ATMEL_SSC_TF) | ||
| 672 | at91_set_A_periph(AT91_PIN_PB0, 1); | ||
| 673 | if (pins & ATMEL_SSC_TK) | ||
| 674 | at91_set_A_periph(AT91_PIN_PB1, 1); | ||
| 675 | if (pins & ATMEL_SSC_TD) | ||
| 676 | at91_set_A_periph(AT91_PIN_PB2, 1); | ||
| 677 | if (pins & ATMEL_SSC_RD) | ||
| 678 | at91_set_A_periph(AT91_PIN_PB3, 1); | ||
| 679 | if (pins & ATMEL_SSC_RK) | ||
| 680 | at91_set_A_periph(AT91_PIN_PB4, 1); | ||
| 681 | if (pins & ATMEL_SSC_RF) | ||
| 682 | at91_set_A_periph(AT91_PIN_PB5, 1); | ||
| 683 | } | ||
| 684 | |||
| 685 | static u64 ssc1_dmamask = DMA_BIT_MASK(32); | ||
| 686 | |||
| 687 | static struct resource ssc1_resources[] = { | ||
| 688 | [0] = { | ||
| 689 | .start = AT91RM9200_BASE_SSC1, | ||
| 690 | .end = AT91RM9200_BASE_SSC1 + SZ_16K - 1, | ||
| 691 | .flags = IORESOURCE_MEM, | ||
| 692 | }, | ||
| 693 | [1] = { | ||
| 694 | .start = AT91RM9200_ID_SSC1, | ||
| 695 | .end = AT91RM9200_ID_SSC1, | ||
| 696 | .flags = IORESOURCE_IRQ, | ||
| 697 | }, | ||
| 698 | }; | ||
| 699 | |||
| 700 | static struct platform_device at91rm9200_ssc1_device = { | ||
| 701 | .name = "ssc", | ||
| 702 | .id = 1, | ||
| 703 | .dev = { | ||
| 704 | .dma_mask = &ssc1_dmamask, | ||
| 705 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 706 | }, | ||
| 707 | .resource = ssc1_resources, | ||
| 708 | .num_resources = ARRAY_SIZE(ssc1_resources), | ||
| 709 | }; | ||
| 710 | |||
| 711 | static inline void configure_ssc1_pins(unsigned pins) | ||
| 712 | { | ||
| 713 | if (pins & ATMEL_SSC_TF) | ||
| 714 | at91_set_A_periph(AT91_PIN_PB6, 1); | ||
| 715 | if (pins & ATMEL_SSC_TK) | ||
| 716 | at91_set_A_periph(AT91_PIN_PB7, 1); | ||
| 717 | if (pins & ATMEL_SSC_TD) | ||
| 718 | at91_set_A_periph(AT91_PIN_PB8, 1); | ||
| 719 | if (pins & ATMEL_SSC_RD) | ||
| 720 | at91_set_A_periph(AT91_PIN_PB9, 1); | ||
| 721 | if (pins & ATMEL_SSC_RK) | ||
| 722 | at91_set_A_periph(AT91_PIN_PB10, 1); | ||
| 723 | if (pins & ATMEL_SSC_RF) | ||
| 724 | at91_set_A_periph(AT91_PIN_PB11, 1); | ||
| 725 | } | ||
| 726 | |||
| 727 | static u64 ssc2_dmamask = DMA_BIT_MASK(32); | ||
| 728 | |||
| 729 | static struct resource ssc2_resources[] = { | ||
| 730 | [0] = { | ||
| 731 | .start = AT91RM9200_BASE_SSC2, | ||
| 732 | .end = AT91RM9200_BASE_SSC2 + SZ_16K - 1, | ||
| 733 | .flags = IORESOURCE_MEM, | ||
| 734 | }, | ||
| 735 | [1] = { | ||
| 736 | .start = AT91RM9200_ID_SSC2, | ||
| 737 | .end = AT91RM9200_ID_SSC2, | ||
| 738 | .flags = IORESOURCE_IRQ, | ||
| 739 | }, | ||
| 740 | }; | ||
| 741 | |||
| 742 | static struct platform_device at91rm9200_ssc2_device = { | ||
| 743 | .name = "ssc", | ||
| 744 | .id = 2, | ||
| 745 | .dev = { | ||
| 746 | .dma_mask = &ssc2_dmamask, | ||
| 747 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 748 | }, | ||
| 749 | .resource = ssc2_resources, | ||
| 750 | .num_resources = ARRAY_SIZE(ssc2_resources), | ||
| 751 | }; | ||
| 752 | |||
| 753 | static inline void configure_ssc2_pins(unsigned pins) | ||
| 754 | { | ||
| 755 | if (pins & ATMEL_SSC_TF) | ||
| 756 | at91_set_A_periph(AT91_PIN_PB12, 1); | ||
| 757 | if (pins & ATMEL_SSC_TK) | ||
| 758 | at91_set_A_periph(AT91_PIN_PB13, 1); | ||
| 759 | if (pins & ATMEL_SSC_TD) | ||
| 760 | at91_set_A_periph(AT91_PIN_PB14, 1); | ||
| 761 | if (pins & ATMEL_SSC_RD) | ||
| 762 | at91_set_A_periph(AT91_PIN_PB15, 1); | ||
| 763 | if (pins & ATMEL_SSC_RK) | ||
| 764 | at91_set_A_periph(AT91_PIN_PB16, 1); | ||
| 765 | if (pins & ATMEL_SSC_RF) | ||
| 766 | at91_set_A_periph(AT91_PIN_PB17, 1); | ||
| 767 | } | ||
| 768 | |||
| 769 | /* | ||
| 770 | * SSC controllers are accessed through library code, instead of any | ||
| 771 | * kind of all-singing/all-dancing driver. For example one could be | ||
| 772 | * used by a particular I2S audio codec's driver, while another one | ||
| 773 | * on the same system might be used by a custom data capture driver. | ||
| 774 | */ | ||
| 775 | void __init at91_add_device_ssc(unsigned id, unsigned pins) | ||
| 776 | { | ||
| 777 | struct platform_device *pdev; | ||
| 778 | |||
| 779 | /* | ||
| 780 | * NOTE: caller is responsible for passing information matching | ||
| 781 | * "pins" to whatever will be using each particular controller. | ||
| 782 | */ | ||
| 783 | switch (id) { | ||
| 784 | case AT91RM9200_ID_SSC0: | ||
| 785 | pdev = &at91rm9200_ssc0_device; | ||
| 786 | configure_ssc0_pins(pins); | ||
| 787 | at91_clock_associate("ssc0_clk", &pdev->dev, "ssc"); | ||
| 788 | break; | ||
| 789 | case AT91RM9200_ID_SSC1: | ||
| 790 | pdev = &at91rm9200_ssc1_device; | ||
| 791 | configure_ssc1_pins(pins); | ||
| 792 | at91_clock_associate("ssc1_clk", &pdev->dev, "ssc"); | ||
| 793 | break; | ||
| 794 | case AT91RM9200_ID_SSC2: | ||
| 795 | pdev = &at91rm9200_ssc2_device; | ||
| 796 | configure_ssc2_pins(pins); | ||
| 797 | at91_clock_associate("ssc2_clk", &pdev->dev, "ssc"); | ||
| 798 | break; | ||
| 799 | default: | ||
| 800 | return; | ||
| 801 | } | ||
| 802 | |||
| 803 | platform_device_register(pdev); | ||
| 804 | } | ||
| 805 | |||
| 806 | #else | ||
| 807 | void __init at91_add_device_ssc(unsigned id, unsigned pins) {} | ||
| 808 | #endif | ||
| 809 | |||
| 810 | |||
| 811 | /* -------------------------------------------------------------------- | ||
| 639 | * UART | 812 | * UART |
| 640 | * -------------------------------------------------------------------- */ | 813 | * -------------------------------------------------------------------- */ |
| 641 | 814 | ||
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index c34fde362ad4..2e3db137bc49 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c | |||
| @@ -607,6 +607,85 @@ void __init at91_init_leds(u8 cpu_led, u8 timer_led) {} | |||
| 607 | 607 | ||
| 608 | 608 | ||
| 609 | /* -------------------------------------------------------------------- | 609 | /* -------------------------------------------------------------------- |
| 610 | * SSC -- Synchronous Serial Controller | ||
| 611 | * -------------------------------------------------------------------- */ | ||
| 612 | |||
| 613 | #if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE) | ||
| 614 | static u64 ssc_dmamask = DMA_BIT_MASK(32); | ||
| 615 | |||
| 616 | static struct resource ssc_resources[] = { | ||
| 617 | [0] = { | ||
| 618 | .start = AT91SAM9260_BASE_SSC, | ||
| 619 | .end = AT91SAM9260_BASE_SSC + SZ_16K - 1, | ||
| 620 | .flags = IORESOURCE_MEM, | ||
| 621 | }, | ||
| 622 | [1] = { | ||
| 623 | .start = AT91SAM9260_ID_SSC, | ||
| 624 | .end = AT91SAM9260_ID_SSC, | ||
| 625 | .flags = IORESOURCE_IRQ, | ||
| 626 | }, | ||
| 627 | }; | ||
| 628 | |||
| 629 | static struct platform_device at91sam9260_ssc_device = { | ||
| 630 | .name = "ssc", | ||
| 631 | .id = 0, | ||
| 632 | .dev = { | ||
| 633 | .dma_mask = &ssc_dmamask, | ||
| 634 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 635 | }, | ||
| 636 | .resource = ssc_resources, | ||
| 637 | .num_resources = ARRAY_SIZE(ssc_resources), | ||
| 638 | }; | ||
| 639 | |||
| 640 | static inline void configure_ssc_pins(unsigned pins) | ||
| 641 | { | ||
| 642 | if (pins & ATMEL_SSC_TF) | ||
| 643 | at91_set_A_periph(AT91_PIN_PB17, 1); | ||
| 644 | if (pins & ATMEL_SSC_TK) | ||
| 645 | at91_set_A_periph(AT91_PIN_PB16, 1); | ||
| 646 | if (pins & ATMEL_SSC_TD) | ||
| 647 | at91_set_A_periph(AT91_PIN_PB18, 1); | ||
| 648 | if (pins & ATMEL_SSC_RD) | ||
| 649 | at91_set_A_periph(AT91_PIN_PB19, 1); | ||
| 650 | if (pins & ATMEL_SSC_RK) | ||
| 651 | at91_set_A_periph(AT91_PIN_PB20, 1); | ||
| 652 | if (pins & ATMEL_SSC_RF) | ||
| 653 | at91_set_A_periph(AT91_PIN_PB21, 1); | ||
| 654 | } | ||
| 655 | |||
| 656 | /* | ||
| 657 | * SSC controllers are accessed through library code, instead of any | ||
| 658 | * kind of all-singing/all-dancing driver. For example one could be | ||
| 659 | * used by a particular I2S audio codec's driver, while another one | ||
| 660 | * on the same system might be used by a custom data capture driver. | ||
| 661 | */ | ||
| 662 | void __init at91_add_device_ssc(unsigned id, unsigned pins) | ||
| 663 | { | ||
| 664 | struct platform_device *pdev; | ||
| 665 | |||
| 666 | /* | ||
| 667 | * NOTE: caller is responsible for passing information matching | ||
| 668 | * "pins" to whatever will be using each particular controller. | ||
| 669 | */ | ||
| 670 | switch (id) { | ||
| 671 | case AT91SAM9260_ID_SSC: | ||
| 672 | pdev = &at91sam9260_ssc_device; | ||
| 673 | configure_ssc_pins(pins); | ||
| 674 | at91_clock_associate("ssc_clk", &pdev->dev, "pclk"); | ||
| 675 | break; | ||
| 676 | default: | ||
| 677 | return; | ||
| 678 | } | ||
| 679 | |||
| 680 | platform_device_register(pdev); | ||
| 681 | } | ||
| 682 | |||
| 683 | #else | ||
| 684 | void __init at91_add_device_ssc(unsigned id, unsigned pins) {} | ||
| 685 | #endif | ||
| 686 | |||
| 687 | |||
| 688 | /* -------------------------------------------------------------------- | ||
| 610 | * UART | 689 | * UART |
| 611 | * -------------------------------------------------------------------- */ | 690 | * -------------------------------------------------------------------- */ |
| 612 | #if defined(CONFIG_SERIAL_ATMEL) | 691 | #if defined(CONFIG_SERIAL_ATMEL) |
diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index f7f02d15045d..266ccf01be53 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c | |||
| @@ -619,6 +619,179 @@ void __init at91_init_leds(u8 cpu_led, u8 timer_led) {} | |||
| 619 | 619 | ||
| 620 | 620 | ||
| 621 | /* -------------------------------------------------------------------- | 621 | /* -------------------------------------------------------------------- |
| 622 | * SSC -- Synchronous Serial Controller | ||
| 623 | * -------------------------------------------------------------------- */ | ||
| 624 | |||
| 625 | #if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE) | ||
| 626 | static u64 ssc0_dmamask = DMA_BIT_MASK(32); | ||
| 627 | |||
| 628 | static struct resource ssc0_resources[] = { | ||
| 629 | [0] = { | ||
| 630 | .start = AT91SAM9261_BASE_SSC0, | ||
| 631 | .end = AT91SAM9261_BASE_SSC0 + SZ_16K - 1, | ||
| 632 | .flags = IORESOURCE_MEM, | ||
| 633 | }, | ||
| 634 | [1] = { | ||
| 635 | .start = AT91SAM9261_ID_SSC0, | ||
| 636 | .end = AT91SAM9261_ID_SSC0, | ||
| 637 | .flags = IORESOURCE_IRQ, | ||
| 638 | }, | ||
| 639 | }; | ||
| 640 | |||
| 641 | static struct platform_device at91sam9261_ssc0_device = { | ||
| 642 | .name = "ssc", | ||
| 643 | .id = 0, | ||
| 644 | .dev = { | ||
| 645 | .dma_mask = &ssc0_dmamask, | ||
| 646 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 647 | }, | ||
| 648 | .resource = ssc0_resources, | ||
| 649 | .num_resources = ARRAY_SIZE(ssc0_resources), | ||
| 650 | }; | ||
| 651 | |||
| 652 | static inline void configure_ssc0_pins(unsigned pins) | ||
| 653 | { | ||
| 654 | if (pins & ATMEL_SSC_TF) | ||
| 655 | at91_set_A_periph(AT91_PIN_PB21, 1); | ||
| 656 | if (pins & ATMEL_SSC_TK) | ||
| 657 | at91_set_A_periph(AT91_PIN_PB22, 1); | ||
| 658 | if (pins & ATMEL_SSC_TD) | ||
| 659 | at91_set_A_periph(AT91_PIN_PB23, 1); | ||
| 660 | if (pins & ATMEL_SSC_RD) | ||
| 661 | at91_set_A_periph(AT91_PIN_PB24, 1); | ||
| 662 | if (pins & ATMEL_SSC_RK) | ||
| 663 | at91_set_A_periph(AT91_PIN_PB25, 1); | ||
| 664 | if (pins & ATMEL_SSC_RF) | ||
| 665 | at91_set_A_periph(AT91_PIN_PB26, 1); | ||
| 666 | } | ||
| 667 | |||
| 668 | static u64 ssc1_dmamask = DMA_BIT_MASK(32); | ||
| 669 | |||
| 670 | static struct resource ssc1_resources[] = { | ||
| 671 | [0] = { | ||
| 672 | .start = AT91SAM9261_BASE_SSC1, | ||
| 673 | .end = AT91SAM9261_BASE_SSC1 + SZ_16K - 1, | ||
| 674 | .flags = IORESOURCE_MEM, | ||
| 675 | }, | ||
| 676 | [1] = { | ||
| 677 | .start = AT91SAM9261_ID_SSC1, | ||
| 678 | .end = AT91SAM9261_ID_SSC1, | ||
| 679 | .flags = IORESOURCE_IRQ, | ||
| 680 | }, | ||
| 681 | }; | ||
| 682 | |||
| 683 | static struct platform_device at91sam9261_ssc1_device = { | ||
| 684 | .name = "ssc", | ||
| 685 | .id = 1, | ||
| 686 | .dev = { | ||
| 687 | .dma_mask = &ssc1_dmamask, | ||
| 688 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 689 | }, | ||
| 690 | .resource = ssc1_resources, | ||
| 691 | .num_resources = ARRAY_SIZE(ssc1_resources), | ||
| 692 | }; | ||
| 693 | |||
| 694 | static inline void configure_ssc1_pins(unsigned pins) | ||
| 695 | { | ||
| 696 | if (pins & ATMEL_SSC_TF) | ||
| 697 | at91_set_B_periph(AT91_PIN_PA17, 1); | ||
| 698 | if (pins & ATMEL_SSC_TK) | ||
| 699 | at91_set_B_periph(AT91_PIN_PA18, 1); | ||
| 700 | if (pins & ATMEL_SSC_TD) | ||
| 701 | at91_set_B_periph(AT91_PIN_PA19, 1); | ||
| 702 | if (pins & ATMEL_SSC_RD) | ||
| 703 | at91_set_B_periph(AT91_PIN_PA20, 1); | ||
| 704 | if (pins & ATMEL_SSC_RK) | ||
| 705 | at91_set_B_periph(AT91_PIN_PA21, 1); | ||
| 706 | if (pins & ATMEL_SSC_RF) | ||
| 707 | at91_set_B_periph(AT91_PIN_PA22, 1); | ||
| 708 | } | ||
| 709 | |||
| 710 | static u64 ssc2_dmamask = DMA_BIT_MASK(32); | ||
| 711 | |||
| 712 | static struct resource ssc2_resources[] = { | ||
| 713 | [0] = { | ||
| 714 | .start = AT91SAM9261_BASE_SSC2, | ||
| 715 | .end = AT91SAM9261_BASE_SSC2 + SZ_16K - 1, | ||
| 716 | .flags = IORESOURCE_MEM, | ||
| 717 | }, | ||
| 718 | [1] = { | ||
| 719 | .start = AT91SAM9261_ID_SSC2, | ||
| 720 | .end = AT91SAM9261_ID_SSC2, | ||
| 721 | .flags = IORESOURCE_IRQ, | ||
| 722 | }, | ||
| 723 | }; | ||
| 724 | |||
| 725 | static struct platform_device at91sam9261_ssc2_device = { | ||
| 726 | .name = "ssc", | ||
| 727 | .id = 2, | ||
| 728 | .dev = { | ||
| 729 | .dma_mask = &ssc2_dmamask, | ||
| 730 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 731 | }, | ||
| 732 | .resource = ssc2_resources, | ||
| 733 | .num_resources = ARRAY_SIZE(ssc2_resources), | ||
| 734 | }; | ||
| 735 | |||
| 736 | static inline void configure_ssc2_pins(unsigned pins) | ||
| 737 | { | ||
| 738 | if (pins & ATMEL_SSC_TF) | ||
| 739 | at91_set_B_periph(AT91_PIN_PC25, 1); | ||
| 740 | if (pins & ATMEL_SSC_TK) | ||
| 741 | at91_set_B_periph(AT91_PIN_PC26, 1); | ||
| 742 | if (pins & ATMEL_SSC_TD) | ||
| 743 | at91_set_B_periph(AT91_PIN_PC27, 1); | ||
| 744 | if (pins & ATMEL_SSC_RD) | ||
| 745 | at91_set_B_periph(AT91_PIN_PC28, 1); | ||
| 746 | if (pins & ATMEL_SSC_RK) | ||
| 747 | at91_set_B_periph(AT91_PIN_PC29, 1); | ||
| 748 | if (pins & ATMEL_SSC_RF) | ||
| 749 | at91_set_B_periph(AT91_PIN_PC30, 1); | ||
| 750 | } | ||
| 751 | |||
| 752 | /* | ||
| 753 | * SSC controllers are accessed through library code, instead of any | ||
| 754 | * kind of all-singing/all-dancing driver. For example one could be | ||
| 755 | * used by a particular I2S audio codec's driver, while another one | ||
| 756 | * on the same system might be used by a custom data capture driver. | ||
| 757 | */ | ||
| 758 | void __init at91_add_device_ssc(unsigned id, unsigned pins) | ||
| 759 | { | ||
| 760 | struct platform_device *pdev; | ||
| 761 | |||
| 762 | /* | ||
| 763 | * NOTE: caller is responsible for passing information matching | ||
| 764 | * "pins" to whatever will be using each particular controller. | ||
| 765 | */ | ||
| 766 | switch (id) { | ||
| 767 | case AT91SAM9261_ID_SSC0: | ||
| 768 | pdev = &at91sam9261_ssc0_device; | ||
| 769 | configure_ssc0_pins(pins); | ||
| 770 | at91_clock_associate("ssc0_clk", &pdev->dev, "pclk"); | ||
| 771 | break; | ||
| 772 | case AT91SAM9261_ID_SSC1: | ||
| 773 | pdev = &at91sam9261_ssc1_device; | ||
| 774 | configure_ssc1_pins(pins); | ||
| 775 | at91_clock_associate("ssc1_clk", &pdev->dev, "pclk"); | ||
| 776 | break; | ||
| 777 | case AT91SAM9261_ID_SSC2: | ||
| 778 | pdev = &at91sam9261_ssc2_device; | ||
| 779 | configure_ssc2_pins(pins); | ||
| 780 | at91_clock_associate("ssc2_clk", &pdev->dev, "pclk"); | ||
| 781 | break; | ||
| 782 | default: | ||
| 783 | return; | ||
| 784 | } | ||
| 785 | |||
| 786 | platform_device_register(pdev); | ||
| 787 | } | ||
| 788 | |||
| 789 | #else | ||
| 790 | void __init at91_add_device_ssc(unsigned id, unsigned pins) {} | ||
| 791 | #endif | ||
| 792 | |||
| 793 | |||
| 794 | /* -------------------------------------------------------------------- | ||
| 622 | * UART | 795 | * UART |
| 623 | * -------------------------------------------------------------------- */ | 796 | * -------------------------------------------------------------------- */ |
| 624 | 797 | ||
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 9bdcf45defcf..f83ef62f2385 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c | |||
| @@ -866,6 +866,135 @@ void __init at91_init_leds(u8 cpu_led, u8 timer_led) {} | |||
| 866 | 866 | ||
| 867 | 867 | ||
| 868 | /* -------------------------------------------------------------------- | 868 | /* -------------------------------------------------------------------- |
| 869 | * SSC -- Synchronous Serial Controller | ||
| 870 | * -------------------------------------------------------------------- */ | ||
| 871 | |||
| 872 | #if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE) | ||
| 873 | static u64 ssc0_dmamask = DMA_BIT_MASK(32); | ||
| 874 | |||
| 875 | static struct resource ssc0_resources[] = { | ||
| 876 | [0] = { | ||
| 877 | .start = AT91SAM9263_BASE_SSC0, | ||
| 878 | .end = AT91SAM9263_BASE_SSC0 + SZ_16K - 1, | ||
| 879 | .flags = IORESOURCE_MEM, | ||
| 880 | }, | ||
| 881 | [1] = { | ||
| 882 | .start = AT91SAM9263_ID_SSC0, | ||
| 883 | .end = AT91SAM9263_ID_SSC0, | ||
| 884 | .flags = IORESOURCE_IRQ, | ||
| 885 | }, | ||
| 886 | }; | ||
| 887 | |||
| 888 | static struct platform_device at91sam9263_ssc0_device = { | ||
| 889 | .name = "ssc", | ||
| 890 | .id = 0, | ||
| 891 | .dev = { | ||
| 892 | .dma_mask = &ssc0_dmamask, | ||
| 893 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 894 | }, | ||
| 895 | .resource = ssc0_resources, | ||
| 896 | .num_resources = ARRAY_SIZE(ssc0_resources), | ||
| 897 | }; | ||
| 898 | |||
| 899 | static inline void configure_ssc0_pins(unsigned pins) | ||
| 900 | { | ||
| 901 | if (pins & ATMEL_SSC_TF) | ||
| 902 | at91_set_B_periph(AT91_PIN_PB0, 1); | ||
| 903 | if (pins & ATMEL_SSC_TK) | ||
| 904 | at91_set_B_periph(AT91_PIN_PB1, 1); | ||
| 905 | if (pins & ATMEL_SSC_TD) | ||
| 906 | at91_set_B_periph(AT91_PIN_PB2, 1); | ||
| 907 | if (pins & ATMEL_SSC_RD) | ||
| 908 | at91_set_B_periph(AT91_PIN_PB3, 1); | ||
| 909 | if (pins & ATMEL_SSC_RK) | ||
| 910 | at91_set_B_periph(AT91_PIN_PB4, 1); | ||
| 911 | if (pins & ATMEL_SSC_RF) | ||
| 912 | at91_set_B_periph(AT91_PIN_PB5, 1); | ||
| 913 | } | ||
| 914 | |||
| 915 | static u64 ssc1_dmamask = DMA_BIT_MASK(32); | ||
| 916 | |||
| 917 | static struct resource ssc1_resources[] = { | ||
| 918 | [0] = { | ||
| 919 | .start = AT91SAM9263_BASE_SSC1, | ||
| 920 | .end = AT91SAM9263_BASE_SSC1 + SZ_16K - 1, | ||
| 921 | .flags = IORESOURCE_MEM, | ||
| 922 | }, | ||
| 923 | [1] = { | ||
| 924 | .start = AT91SAM9263_ID_SSC1, | ||
| 925 | .end = AT91SAM9263_ID_SSC1, | ||
| 926 | .flags = IORESOURCE_IRQ, | ||
| 927 | }, | ||
| 928 | }; | ||
| 929 | |||
| 930 | static struct platform_device at91sam9263_ssc1_device = { | ||
| 931 | .name = "ssc", | ||
| 932 | .id = 1, | ||
| 933 | .dev = { | ||
| 934 | .dma_mask = &ssc1_dmamask, | ||
| 935 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 936 | }, | ||
| 937 | .resource = ssc1_resources, | ||
| 938 | .num_resources = ARRAY_SIZE(ssc1_resources), | ||
| 939 | }; | ||
| 940 | |||
| 941 | static inline void configure_ssc1_pins(unsigned pins) | ||
| 942 | { | ||
| 943 | if (pins & ATMEL_SSC_TF) | ||
| 944 | at91_set_A_periph(AT91_PIN_PB6, 1); | ||
| 945 | if (pins & ATMEL_SSC_TK) | ||
| 946 | at91_set_A_periph(AT91_PIN_PB7, 1); | ||
| 947 | if (pins & ATMEL_SSC_TD) | ||
| 948 | at91_set_A_periph(AT91_PIN_PB8, 1); | ||
| 949 | if (pins & ATMEL_SSC_RD) | ||
| 950 | at91_set_A_periph(AT91_PIN_PB9, 1); | ||
| 951 | if (pins & ATMEL_SSC_RK) | ||
| 952 | at91_set_A_periph(AT91_PIN_PB10, 1); | ||
| 953 | if (pins & ATMEL_SSC_RF) | ||
| 954 | at91_set_A_periph(AT91_PIN_PB11, 1); | ||
| 955 | } | ||
| 956 | |||
| 957 | /* | ||
| 958 | * Return the device node so that board init code can use it as the | ||
| 959 | * parent for the device node reflecting how it's used on this board. | ||
| 960 | * | ||
| 961 | * SSC controllers are accessed through library code, instead of any | ||
| 962 | * kind of all-singing/all-dancing driver. For example one could be | ||
| 963 | * used by a particular I2S audio codec's driver, while another one | ||
| 964 | * on the same system might be used by a custom data capture driver. | ||
| 965 | */ | ||
| 966 | void __init at91_add_device_ssc(unsigned id, unsigned pins) | ||
| 967 | { | ||
| 968 | struct platform_device *pdev; | ||
| 969 | |||
| 970 | /* | ||
| 971 | * NOTE: caller is responsible for passing information matching | ||
| 972 | * "pins" to whatever will be using each particular controller. | ||
| 973 | */ | ||
| 974 | switch (id) { | ||
| 975 | case AT91SAM9263_ID_SSC0: | ||
| 976 | pdev = &at91sam9263_ssc0_device; | ||
| 977 | configure_ssc0_pins(pins); | ||
| 978 | at91_clock_associate("ssc0_clk", &pdev->dev, "pclk"); | ||
| 979 | break; | ||
| 980 | case AT91SAM9263_ID_SSC1: | ||
| 981 | pdev = &at91sam9263_ssc1_device; | ||
| 982 | configure_ssc1_pins(pins); | ||
| 983 | at91_clock_associate("ssc1_clk", &pdev->dev, "pclk"); | ||
| 984 | break; | ||
| 985 | default: | ||
| 986 | return; | ||
| 987 | } | ||
| 988 | |||
| 989 | platform_device_register(pdev); | ||
| 990 | } | ||
| 991 | |||
| 992 | #else | ||
| 993 | void __init at91_add_device_ssc(unsigned id, unsigned pins) {} | ||
| 994 | #endif | ||
| 995 | |||
| 996 | |||
| 997 | /* -------------------------------------------------------------------- | ||
| 869 | * UART | 998 | * UART |
| 870 | * -------------------------------------------------------------------- */ | 999 | * -------------------------------------------------------------------- */ |
| 871 | 1000 | ||
diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index bec8066f9ba1..e886cdfe919d 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c | |||
| @@ -472,6 +472,135 @@ void __init at91_init_leds(u8 cpu_led, u8 timer_led) {} | |||
| 472 | 472 | ||
| 473 | 473 | ||
| 474 | /* -------------------------------------------------------------------- | 474 | /* -------------------------------------------------------------------- |
| 475 | * SSC -- Synchronous Serial Controller | ||
| 476 | * -------------------------------------------------------------------- */ | ||
| 477 | |||
| 478 | #if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE) | ||
| 479 | static u64 ssc0_dmamask = DMA_BIT_MASK(32); | ||
| 480 | |||
| 481 | static struct resource ssc0_resources[] = { | ||
| 482 | [0] = { | ||
| 483 | .start = AT91SAM9RL_BASE_SSC0, | ||
| 484 | .end = AT91SAM9RL_BASE_SSC0 + SZ_16K - 1, | ||
| 485 | .flags = IORESOURCE_MEM, | ||
| 486 | }, | ||
| 487 | [1] = { | ||
| 488 | .start = AT91SAM9RL_ID_SSC0, | ||
| 489 | .end = AT91SAM9RL_ID_SSC0, | ||
| 490 | .flags = IORESOURCE_IRQ, | ||
| 491 | }, | ||
| 492 | }; | ||
| 493 | |||
| 494 | static struct platform_device at91sam9rl_ssc0_device = { | ||
| 495 | .name = "ssc", | ||
| 496 | .id = 0, | ||
| 497 | .dev = { | ||
| 498 | .dma_mask = &ssc0_dmamask, | ||
| 499 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 500 | }, | ||
| 501 | .resource = ssc0_resources, | ||
| 502 | .num_resources = ARRAY_SIZE(ssc0_resources), | ||
| 503 | }; | ||
| 504 | |||
| 505 | static inline void configure_ssc0_pins(unsigned pins) | ||
| 506 | { | ||
| 507 | if (pins & ATMEL_SSC_TF) | ||
| 508 | at91_set_A_periph(AT91_PIN_PC0, 1); | ||
| 509 | if (pins & ATMEL_SSC_TK) | ||
| 510 | at91_set_A_periph(AT91_PIN_PC1, 1); | ||
| 511 | if (pins & ATMEL_SSC_TD) | ||
| 512 | at91_set_A_periph(AT91_PIN_PA15, 1); | ||
| 513 | if (pins & ATMEL_SSC_RD) | ||
| 514 | at91_set_A_periph(AT91_PIN_PA16, 1); | ||
| 515 | if (pins & ATMEL_SSC_RK) | ||
| 516 | at91_set_B_periph(AT91_PIN_PA10, 1); | ||
| 517 | if (pins & ATMEL_SSC_RF) | ||
| 518 | at91_set_B_periph(AT91_PIN_PA22, 1); | ||
| 519 | } | ||
| 520 | |||
| 521 | static u64 ssc1_dmamask = DMA_BIT_MASK(32); | ||
| 522 | |||
| 523 | static struct resource ssc1_resources[] = { | ||
| 524 | [0] = { | ||
| 525 | .start = AT91SAM9RL_BASE_SSC1, | ||
| 526 | .end = AT91SAM9RL_BASE_SSC1 + SZ_16K - 1, | ||
| 527 | .flags = IORESOURCE_MEM, | ||
| 528 | }, | ||
| 529 | [1] = { | ||
| 530 | .start = AT91SAM9RL_ID_SSC1, | ||
| 531 | .end = AT91SAM9RL_ID_SSC1, | ||
| 532 | .flags = IORESOURCE_IRQ, | ||
| 533 | }, | ||
| 534 | }; | ||
| 535 | |||
| 536 | static struct platform_device at91sam9rl_ssc1_device = { | ||
| 537 | .name = "ssc", | ||
| 538 | .id = 1, | ||
| 539 | .dev = { | ||
| 540 | .dma_mask = &ssc1_dmamask, | ||
| 541 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 542 | }, | ||
| 543 | .resource = ssc1_resources, | ||
| 544 | .num_resources = ARRAY_SIZE(ssc1_resources), | ||
| 545 | }; | ||
| 546 | |||
| 547 | static inline void configure_ssc1_pins(unsigned pins) | ||
| 548 | { | ||
| 549 | if (pins & ATMEL_SSC_TF) | ||
| 550 | at91_set_B_periph(AT91_PIN_PA29, 1); | ||
| 551 | if (pins & ATMEL_SSC_TK) | ||
| 552 | at91_set_B_periph(AT91_PIN_PA30, 1); | ||
| 553 | if (pins & ATMEL_SSC_TD) | ||
| 554 | at91_set_B_periph(AT91_PIN_PA13, 1); | ||
| 555 | if (pins & ATMEL_SSC_RD) | ||
| 556 | at91_set_B_periph(AT91_PIN_PA14, 1); | ||
| 557 | if (pins & ATMEL_SSC_RK) | ||
| 558 | at91_set_B_periph(AT91_PIN_PA9, 1); | ||
| 559 | if (pins & ATMEL_SSC_RF) | ||
| 560 | at91_set_B_periph(AT91_PIN_PA8, 1); | ||
| 561 | } | ||
| 562 | |||
| 563 | /* | ||
| 564 | * Return the device node so that board init code can use it as the | ||
| 565 | * parent for the device node reflecting how it's used on this board. | ||
| 566 | * | ||
| 567 | * SSC controllers are accessed through library code, instead of any | ||
| 568 | * kind of all-singing/all-dancing driver. For example one could be | ||
| 569 | * used by a particular I2S audio codec's driver, while another one | ||
| 570 | * on the same system might be used by a custom data capture driver. | ||
| 571 | */ | ||
| 572 | void __init at91_add_device_ssc(unsigned id, unsigned pins) | ||
| 573 | { | ||
| 574 | struct platform_device *pdev; | ||
| 575 | |||
| 576 | /* | ||
| 577 | * NOTE: caller is responsible for passing information matching | ||
| 578 | * "pins" to whatever will be using each particular controller. | ||
| 579 | */ | ||
| 580 | switch (id) { | ||
| 581 | case AT91SAM9RL_ID_SSC0: | ||
| 582 | pdev = &at91sam9rl_ssc0_device; | ||
| 583 | configure_ssc0_pins(pins); | ||
| 584 | at91_clock_associate("ssc0_clk", &pdev->dev, "pclk"); | ||
| 585 | break; | ||
| 586 | case AT91SAM9RL_ID_SSC1: | ||
| 587 | pdev = &at91sam9rl_ssc1_device; | ||
| 588 | configure_ssc1_pins(pins); | ||
| 589 | at91_clock_associate("ssc1_clk", &pdev->dev, "pclk"); | ||
| 590 | break; | ||
| 591 | default: | ||
| 592 | return; | ||
| 593 | } | ||
| 594 | |||
| 595 | platform_device_register(pdev); | ||
| 596 | } | ||
| 597 | |||
| 598 | #else | ||
| 599 | void __init at91_add_device_ssc(unsigned id, unsigned pins) {} | ||
| 600 | #endif | ||
| 601 | |||
| 602 | |||
| 603 | /* -------------------------------------------------------------------- | ||
| 475 | * UART | 604 | * UART |
| 476 | * -------------------------------------------------------------------- */ | 605 | * -------------------------------------------------------------------- */ |
| 477 | 606 | ||
diff --git a/include/asm-arm/arch-at91/board.h b/include/asm-arm/arch-at91/board.h index 762148cc48c1..7fefe018833c 100644 --- a/include/asm-arm/arch-at91/board.h +++ b/include/asm-arm/arch-at91/board.h | |||
| @@ -116,6 +116,23 @@ struct atmel_uart_data { | |||
| 116 | }; | 116 | }; |
| 117 | extern void __init at91_add_device_serial(void); | 117 | extern void __init at91_add_device_serial(void); |
| 118 | 118 | ||
| 119 | /* | ||
| 120 | * SSC -- accessed through ssc_request(id). Drivers don't bind to SSC | ||
| 121 | * platform devices. Their SSC ID is part of their configuration data, | ||
| 122 | * along with information about which SSC signals they should use. | ||
| 123 | */ | ||
| 124 | #define ATMEL_SSC_TK 0x01 | ||
| 125 | #define ATMEL_SSC_TF 0x02 | ||
| 126 | #define ATMEL_SSC_TD 0x04 | ||
| 127 | #define ATMEL_SSC_TX (ATMEL_SSC_TK | ATMEL_SSC_TF | ATMEL_SSC_TD) | ||
| 128 | |||
| 129 | #define ATMEL_SSC_RK 0x10 | ||
| 130 | #define ATMEL_SSC_RF 0x20 | ||
| 131 | #define ATMEL_SSC_RD 0x40 | ||
| 132 | #define ATMEL_SSC_RX (ATMEL_SSC_RK | ATMEL_SSC_RF | ATMEL_SSC_RD) | ||
| 133 | |||
| 134 | extern void __init at91_add_device_ssc(unsigned id, unsigned pins); | ||
| 135 | |||
| 119 | /* LCD Controller */ | 136 | /* LCD Controller */ |
| 120 | struct atmel_lcdfb_info; | 137 | struct atmel_lcdfb_info; |
| 121 | extern void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data); | 138 | extern void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data); |
