Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'at91/cleanup' into next/dt

Conflicts:
arch/arm/boot/dts/at91sam9rl.dtsi

Needed as a dependency for the at91/dt2 branch

Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+1803 -804
+119 -9
Documentation/devicetree/bindings/clock/at91-clock.txt
··· 6 6 7 7 Required properties: 8 8 - compatible : shall be one of the following: 9 + "atmel,at91sam9x5-sckc": 10 + at91 SCKC (Slow Clock Controller) 11 + This node contains the slow clock definitions. 12 + 13 + "atmel,at91sam9x5-clk-slow-osc": 14 + at91 slow oscillator 15 + 16 + "atmel,at91sam9x5-clk-slow-rc-osc": 17 + at91 internal slow RC oscillator 18 + 9 19 "atmel,at91rm9200-pmc" or 10 20 "atmel,at91sam9g45-pmc" or 11 21 "atmel,at91sam9n12-pmc" or ··· 25 15 All at91 specific clocks (clocks defined below) must be child 26 16 node of the PMC node. 27 17 18 + "atmel,at91sam9x5-clk-slow" (under sckc node) 19 + or 20 + "atmel,at91sam9260-clk-slow" (under pmc node): 21 + at91 slow clk 22 + 23 + "atmel,at91rm9200-clk-main-osc" 24 + "atmel,at91sam9x5-clk-main-rc-osc" 25 + at91 main clk sources 26 + 27 + "atmel,at91sam9x5-clk-main" 28 28 "atmel,at91rm9200-clk-main": 29 - at91 main oscillator 29 + at91 main clock 30 30 31 31 "atmel,at91rm9200-clk-master" or 32 32 "atmel,at91sam9x5-clk-master": ··· 74 54 "atmel,at91sam9x5-clk-utmi": 75 55 at91 utmi clock 76 56 57 + Required properties for SCKC node: 58 + - reg : defines the IO memory reserved for the SCKC. 59 + - #size-cells : shall be 0 (reg is used to encode clk id). 60 + - #address-cells : shall be 1 (reg is used to encode clk id). 61 + 62 + 63 + For example: 64 + sckc: sckc@fffffe50 { 65 + compatible = "atmel,sama5d3-pmc"; 66 + reg = <0xfffffe50 0x4> 67 + #size-cells = <0>; 68 + #address-cells = <1>; 69 + 70 + /* put at91 slow clocks here */ 71 + }; 72 + 73 + 74 + Required properties for internal slow RC oscillator: 75 + - #clock-cells : from common clock binding; shall be set to 0. 76 + - clock-frequency : define the internal RC oscillator frequency. 77 + 78 + Optional properties: 79 + - clock-accuracy : define the internal RC oscillator accuracy. 80 + 81 + For example: 82 + slow_rc_osc: slow_rc_osc { 83 + compatible = "atmel,at91sam9x5-clk-slow-rc-osc"; 84 + clock-frequency = <32768>; 85 + clock-accuracy = <50000000>; 86 + }; 87 + 88 + Required properties for slow oscillator: 89 + - #clock-cells : from common clock binding; shall be set to 0. 90 + - clocks : shall encode the main osc source clk sources (see atmel datasheet). 91 + 92 + Optional properties: 93 + - atmel,osc-bypass : boolean property. Set this when a clock signal is directly 94 + provided on XIN. 95 + 96 + For example: 97 + slow_osc: slow_osc { 98 + compatible = "atmel,at91rm9200-clk-slow-osc"; 99 + #clock-cells = <0>; 100 + clocks = <&slow_xtal>; 101 + }; 102 + 103 + Required properties for slow clock: 104 + - #clock-cells : from common clock binding; shall be set to 0. 105 + - clocks : shall encode the slow clk sources (see atmel datasheet). 106 + 107 + For example: 108 + clk32k: slck { 109 + compatible = "atmel,at91sam9x5-clk-slow"; 110 + #clock-cells = <0>; 111 + clocks = <&slow_rc_osc &slow_osc>; 112 + }; 113 + 77 114 Required properties for PMC node: 78 115 - reg : defines the IO memory reserved for the PMC. 79 116 - #size-cells : shall be 0 (reg is used to encode clk id). ··· 162 85 /* put at91 clocks here */ 163 86 }; 164 87 88 + Required properties for main clock internal RC oscillator: 89 + - interrupt-parent : must reference the PMC node. 90 + - interrupts : shall be set to "<0>". 91 + - clock-frequency : define the internal RC oscillator frequency. 92 + 93 + Optional properties: 94 + - clock-accuracy : define the internal RC oscillator accuracy. 95 + 96 + For example: 97 + main_rc_osc: main_rc_osc { 98 + compatible = "atmel,at91sam9x5-clk-main-rc-osc"; 99 + interrupt-parent = <&pmc>; 100 + interrupts = <0>; 101 + clock-frequency = <12000000>; 102 + clock-accuracy = <50000000>; 103 + }; 104 + 105 + Required properties for main clock oscillator: 106 + - interrupt-parent : must reference the PMC node. 107 + - interrupts : shall be set to "<0>". 108 + - #clock-cells : from common clock binding; shall be set to 0. 109 + - clocks : shall encode the main osc source clk sources (see atmel datasheet). 110 + 111 + Optional properties: 112 + - atmel,osc-bypass : boolean property. Specified if a clock signal is provided 113 + on XIN. 114 + 115 + clock signal is directly provided on XIN pin. 116 + 117 + For example: 118 + main_osc: main_osc { 119 + compatible = "atmel,at91rm9200-clk-main-osc"; 120 + interrupt-parent = <&pmc>; 121 + interrupts = <0>; 122 + #clock-cells = <0>; 123 + clocks = <&main_xtal>; 124 + }; 125 + 165 126 Required properties for main clock: 166 127 - interrupt-parent : must reference the PMC node. 167 128 - interrupts : shall be set to "<0>". 168 129 - #clock-cells : from common clock binding; shall be set to 0. 169 - - clocks (optional if clock-frequency is provided) : shall be the slow clock 170 - phandle. This clock is used to calculate the main clock rate if 171 - "clock-frequency" is not provided. 172 - - clock-frequency : the main oscillator frequency.Prefer the use of 173 - "clock-frequency" over automatic clock rate calculation. 130 + - clocks : shall encode the main clk sources (see atmel datasheet). 174 131 175 132 For example: 176 133 main: mainck { 177 - compatible = "atmel,at91rm9200-clk-main"; 134 + compatible = "atmel,at91sam9x5-clk-main"; 178 135 interrupt-parent = <&pmc>; 179 136 interrupts = <0>; 180 137 #clock-cells = <0>; 181 - clocks = <&ck32k>; 182 - clock-frequency = <18432000>; 138 + clocks = <&main_rc_osc &main_osc>; 183 139 }; 184 140 185 141 Required properties for master clock:
-6
MAINTAINERS
··· 1617 1617 F: drivers/misc/atmel_tclib.c 1618 1618 F: drivers/clocksource/tcb_clksrc.c 1619 1619 1620 - ATMEL TSADCC DRIVER 1621 - M: Josh Wu <josh.wu@atmel.com> 1622 - L: linux-input@vger.kernel.org 1623 - S: Supported 1624 - F: drivers/input/touchscreen/atmel_tsadcc.c 1625 - 1626 1620 ATMEL USBA UDC DRIVER 1627 1621 M: Nicolas Ferre <nicolas.ferre@atmel.com> 1628 1622 L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
-1
arch/arm/Kconfig
··· 376 376 select ARCH_REQUIRE_GPIOLIB 377 377 select CLKDEV_LOOKUP 378 378 select IRQ_DOMAIN 379 - select NEED_MACH_GPIO_H 380 379 select NEED_MACH_IO_H if PCCARD 381 380 select PINCTRL 382 381 select PINCTRL_AT91 if USE_OF
-5
arch/arm/boot/dts/at91-cosino_mega2560.dts
··· 32 32 status = "okay"; 33 33 }; 34 34 35 - 36 - tsadcc: tsadcc@f804c000 { 37 - status = "okay"; 38 - }; 39 - 40 35 rtc@fffffeb0 { 41 36 status = "okay"; 42 37 };
+8
arch/arm/boot/dts/at91-sama5d3_xplained.dts
··· 21 21 reg = <0x20000000 0x10000000>; 22 22 }; 23 23 24 + slow_xtal { 25 + clock-frequency = <32768>; 26 + }; 27 + 28 + main_xtal { 29 + clock-frequency = <12000000>; 30 + }; 31 + 24 32 ahb { 25 33 apb { 26 34 mmc0: mmc@f0000000 {
+21 -2
arch/arm/boot/dts/at91sam9261.dtsi
··· 46 46 reg = <0x20000000 0x08000000>; 47 47 }; 48 48 49 + main_xtal: main_xtal { 50 + compatible = "fixed-clock"; 51 + #clock-cells = <0>; 52 + clock-frequency = <0>; 53 + }; 54 + 55 + slow_xtal: slow_xtal { 56 + compatible = "fixed-clock"; 57 + #clock-cells = <0>; 58 + clock-frequency = <0>; 59 + }; 60 + 49 61 ahb { 50 62 compatible = "simple-bus"; 51 63 #address-cells = <1>; ··· 568 556 #size-cells = <0>; 569 557 #interrupt-cells = <1>; 570 558 571 - clk32k: slck { 559 + slow_rc_osc: slow_rc_osc { 572 560 compatible = "fixed-clock"; 573 561 #clock-cells = <0>; 574 562 clock-frequency = <32768>; 563 + clock-accuracy = <50000000>; 564 + }; 565 + 566 + clk32k: slck { 567 + compatible = "atmel,at91sam9260-clk-slow"; 568 + #clock-cells = <0>; 569 + clocks = <&slow_rc_osc &slow_xtal>; 575 570 }; 576 571 577 572 main: mainck { 578 573 compatible = "atmel,at91rm9200-clk-main"; 579 574 #clock-cells = <0>; 580 575 interrupts-extended = <&pmc AT91_PMC_MOSCS>; 581 - clocks = <&clk32k>; 576 + clocks = <&main_xtal>; 582 577 }; 583 578 584 579 plla: pllack {
+4
arch/arm/boot/dts/at91sam9261ek.dts
··· 20 20 reg = <0x20000000 0x4000000>; 21 21 }; 22 22 23 + main_xtal { 24 + clock-frequency = <18432000>; 25 + }; 26 + 23 27 clocks { 24 28 #address-cells = <1>; 25 29 #size-cells = <1>;
+39 -7
arch/arm/boot/dts/at91sam9rl.dtsi
··· 50 50 reg = <0x20000000 0x04000000>; 51 51 }; 52 52 53 + slow_xtal: slow_xtal { 54 + compatible = "fixed-clock"; 55 + #clock-cells = <0>; 56 + clock-frequency = <0>; 57 + }; 58 + 59 + main_xtal: main_xtal { 60 + compatible = "fixed-clock"; 61 + #clock-cells = <0>; 62 + clock-frequency = <0>; 63 + }; 64 + 53 65 clocks { 54 66 adc_op_clk: adc_op_clk{ 55 67 compatible = "fixed-clock"; ··· 807 795 #size-cells = <0>; 808 796 #interrupt-cells = <1>; 809 797 810 - clk32k: slck { 811 - compatible = "fixed-clock"; 812 - #clock-cells = <0>; 813 - clock-frequency = <32768>; 814 - }; 815 - 816 798 main: mainck { 817 799 compatible = "atmel,at91rm9200-clk-main"; 818 800 #clock-cells = <0>; 819 801 interrupts-extended = <&pmc AT91_PMC_MOSCS>; 820 - clocks = <&clk32k>; 802 + clocks = <&main_xtal>; 821 803 }; 822 804 823 805 plla: pllack { ··· 1022 1016 reg = <0xfffffd40 0x10>; 1023 1017 interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>; 1024 1018 status = "disabled"; 1019 + }; 1020 + 1021 + sckc@fffffd50 { 1022 + compatible = "atmel,at91sam9x5-sckc"; 1023 + reg = <0xfffffd50 0x4>; 1024 + 1025 + slow_osc: slow_osc { 1026 + compatible = "atmel,at91sam9x5-clk-slow-osc"; 1027 + #clock-cells = <0>; 1028 + atmel,startup-time-usec = <1200000>; 1029 + clocks = <&slow_xtal>; 1030 + }; 1031 + 1032 + slow_rc_osc: slow_rc_osc { 1033 + compatible = "atmel,at91sam9x5-clk-slow-rc-osc"; 1034 + #clock-cells = <0>; 1035 + atmel,startup-time-usec = <75>; 1036 + clock-frequency = <32768>; 1037 + clock-accuracy = <50000000>; 1038 + }; 1039 + 1040 + clk32k: slck { 1041 + compatible = "atmel,at91sam9x5-clk-slow"; 1042 + #clock-cells = <0>; 1043 + clocks = <&slow_rc_osc &slow_osc>; 1044 + }; 1025 1045 }; 1026 1046 }; 1027 1047 };
+9
arch/arm/boot/dts/at91sam9rlek.dts
··· 20 20 reg = <0x20000000 0x4000000>; 21 21 }; 22 22 23 + 24 + slow_xtal { 25 + clock-frequency = <32768>; 26 + }; 27 + 28 + main_xtal { 29 + clock-frequency = <12000000>; 30 + }; 31 + 23 32 clocks { 24 33 #address-cells = <1>; 25 34 #size-cells = <1>;
+55 -6
arch/arm/boot/dts/sama5d3.dtsi
··· 58 58 reg = <0x20000000 0x8000000>; 59 59 }; 60 60 61 + slow_xtal: slow_xtal { 62 + compatible = "fixed-clock"; 63 + #clock-cells = <0>; 64 + clock-frequency = <0>; 65 + }; 66 + 67 + main_xtal: main_xtal { 68 + compatible = "fixed-clock"; 69 + #clock-cells = <0>; 70 + clock-frequency = <0>; 71 + }; 72 + 61 73 clocks { 62 74 adc_op_clk: adc_op_clk{ 63 75 compatible = "fixed-clock"; ··· 845 833 #size-cells = <0>; 846 834 #interrupt-cells = <1>; 847 835 848 - clk32k: slck { 849 - compatible = "fixed-clock"; 836 + main_rc_osc: main_rc_osc { 837 + compatible = "atmel,at91sam9x5-clk-main-rc-osc"; 850 838 #clock-cells = <0>; 851 - clock-frequency = <32768>; 839 + interrupt-parent = <&pmc>; 840 + interrupts = <AT91_PMC_MOSCRCS>; 841 + clock-frequency = <12000000>; 842 + clock-accuracy = <50000000>; 852 843 }; 853 844 854 - main: mainck { 855 - compatible = "atmel,at91rm9200-clk-main"; 845 + main_osc: main_osc { 846 + compatible = "atmel,at91rm9200-clk-main-osc"; 856 847 #clock-cells = <0>; 857 848 interrupt-parent = <&pmc>; 858 849 interrupts = <AT91_PMC_MOSCS>; 859 - clocks = <&clk32k>; 850 + clocks = <&main_xtal>; 851 + }; 852 + 853 + main: mainck { 854 + compatible = "atmel,at91sam9x5-clk-main"; 855 + #clock-cells = <0>; 856 + interrupt-parent = <&pmc>; 857 + interrupts = <AT91_PMC_MOSCSELS>; 858 + clocks = <&main_rc_osc &main_osc>; 860 859 }; 861 860 862 861 plla: pllack { ··· 1194 1171 atmel,dbg-halt; 1195 1172 atmel,idle-halt; 1196 1173 status = "disabled"; 1174 + }; 1175 + 1176 + sckc@fffffe50 { 1177 + compatible = "atmel,at91sam9x5-sckc"; 1178 + reg = <0xfffffe50 0x4>; 1179 + 1180 + slow_rc_osc: slow_rc_osc { 1181 + compatible = "atmel,at91sam9x5-clk-slow-rc-osc"; 1182 + #clock-cells = <0>; 1183 + clock-frequency = <32768>; 1184 + clock-accuracy = <50000000>; 1185 + atmel,startup-time-usec = <75>; 1186 + }; 1187 + 1188 + slow_osc: slow_osc { 1189 + compatible = "atmel,at91sam9x5-clk-slow-osc"; 1190 + #clock-cells = <0>; 1191 + clocks = <&slow_xtal>; 1192 + atmel,startup-time-usec = <1200000>; 1193 + }; 1194 + 1195 + clk32k: slowck { 1196 + compatible = "atmel,at91sam9x5-clk-slow"; 1197 + #clock-cells = <0>; 1198 + clocks = <&slow_rc_osc &slow_osc>; 1199 + }; 1197 1200 }; 1198 1201 1199 1202 rtc@fffffeb0 {
+8
arch/arm/boot/dts/sama5d3xcm.dtsi
··· 18 18 reg = <0x20000000 0x20000000>; 19 19 }; 20 20 21 + slow_xtal { 22 + clock-frequency = <32768>; 23 + }; 24 + 25 + main_xtal { 26 + clock-frequency = <12000000>; 27 + }; 28 + 21 29 ahb { 22 30 apb { 23 31 spi0: spi@f0004000 {
+2 -1
arch/arm/configs/at91sam9g45_defconfig
··· 83 83 # CONFIG_INPUT_MOUSE is not set 84 84 CONFIG_INPUT_TOUCHSCREEN=y 85 85 CONFIG_TOUCHSCREEN_ATMEL_MXT=m 86 - CONFIG_TOUCHSCREEN_ATMEL_TSADCC=y 87 86 # CONFIG_SERIO is not set 88 87 # CONFIG_LEGACY_PTYS is not set 89 88 CONFIG_SERIAL_ATMEL=y ··· 145 146 CONFIG_AT_HDMAC=y 146 147 CONFIG_DMATEST=m 147 148 # CONFIG_IOMMU_SUPPORT is not set 149 + CONFIG_IIO=y 150 + CONFIG_AT91_ADC=y 148 151 CONFIG_EXT4_FS=y 149 152 CONFIG_FANOTIFY=y 150 153 CONFIG_VFAT_FS=y
+2 -1
arch/arm/configs/at91sam9rl_defconfig
··· 45 45 # CONFIG_INPUT_KEYBOARD is not set 46 46 # CONFIG_INPUT_MOUSE is not set 47 47 CONFIG_INPUT_TOUCHSCREEN=y 48 - CONFIG_TOUCHSCREEN_ATMEL_TSADCC=y 49 48 # CONFIG_SERIO is not set 50 49 CONFIG_SERIAL_ATMEL=y 51 50 CONFIG_SERIAL_ATMEL_CONSOLE=y ··· 64 65 CONFIG_MMC_ATMELMCI=m 65 66 CONFIG_RTC_CLASS=y 66 67 CONFIG_RTC_DRV_AT91SAM9=y 68 + CONFIG_IIO=y 69 + CONFIG_AT91_ADC=y 67 70 CONFIG_EXT2_FS=y 68 71 CONFIG_MSDOS_FS=y 69 72 CONFIG_VFAT_FS=y
-1
arch/arm/configs/sama5_defconfig
··· 122 122 # CONFIG_INPUT_MOUSE is not set 123 123 CONFIG_INPUT_TOUCHSCREEN=y 124 124 CONFIG_TOUCHSCREEN_ATMEL_MXT=y 125 - CONFIG_TOUCHSCREEN_ATMEL_TSADCC=y 126 125 # CONFIG_SERIO is not set 127 126 CONFIG_LEGACY_PTY_COUNT=4 128 127 CONFIG_SERIAL_ATMEL=y
+1
arch/arm/mach-at91/at91rm9200_devices.c
··· 25 25 26 26 #include "board.h" 27 27 #include "generic.h" 28 + #include "gpio.h" 28 29 29 30 30 31 /* --------------------------------------------------------------------
+1 -11
arch/arm/mach-at91/at91sam9260_devices.c
··· 24 24 #include <mach/at91sam9260_matrix.h> 25 25 #include <mach/at91_matrix.h> 26 26 #include <mach/at91sam9_smc.h> 27 - #include <mach/at91_adc.h> 28 27 #include <mach/hardware.h> 29 28 30 29 #include "board.h" 31 30 #include "generic.h" 32 - 31 + #include "gpio.h" 33 32 34 33 /* -------------------------------------------------------------------- 35 34 * USB Host ··· 1324 1325 }, 1325 1326 }; 1326 1327 1327 - static struct at91_adc_reg_desc at91_adc_register_g20 = { 1328 - .channel_base = AT91_ADC_CHR(0), 1329 - .drdy_mask = AT91_ADC_DRDY, 1330 - .status_register = AT91_ADC_SR, 1331 - .trigger_register = AT91_ADC_MR, 1332 - }; 1333 - 1334 1328 void __init at91_add_device_adc(struct at91_adc_data *data) 1335 1329 { 1336 1330 if (!data) ··· 1341 1349 if (data->use_external_triggers) 1342 1350 at91_set_A_periph(AT91_PIN_PA22, 0); 1343 1351 1344 - data->num_channels = 4; 1345 1352 data->startup_time = 10; 1346 - data->registers = &at91_adc_register_g20; 1347 1353 data->trigger_number = 4; 1348 1354 data->trigger_list = at91_adc_triggers; 1349 1355
+1 -1
arch/arm/mach-at91/at91sam9261_devices.c
··· 29 29 30 30 #include "board.h" 31 31 #include "generic.h" 32 - 32 + #include "gpio.h" 33 33 34 34 /* -------------------------------------------------------------------- 35 35 * USB Host
+1
arch/arm/mach-at91/at91sam9263_devices.c
··· 28 28 29 29 #include "board.h" 30 30 #include "generic.h" 31 + #include "gpio.h" 31 32 32 33 33 34 /* --------------------------------------------------------------------
+1 -1
arch/arm/mach-at91/at91sam9g45.c
··· 182 182 static struct clk adc_op_clk = { 183 183 .name = "adc_op_clk", 184 184 .type = CLK_TYPE_PERIPHERAL, 185 - .rate_hz = 13200000, 185 + .rate_hz = 300000, 186 186 }; 187 187 188 188 /* AES/TDES/SHA clock - Only for sam9m11/sam9g56 */
+2 -62
arch/arm/mach-at91/at91sam9g45_devices.c
··· 25 25 #include <linux/fb.h> 26 26 #include <video/atmel_lcdc.h> 27 27 28 - #include <mach/at91_adc.h> 29 28 #include <mach/at91sam9g45.h> 30 29 #include <mach/at91sam9g45_matrix.h> 31 30 #include <mach/at91_matrix.h> ··· 38 39 #include "board.h" 39 40 #include "generic.h" 40 41 #include "clock.h" 42 + #include "gpio.h" 41 43 42 44 43 45 /* -------------------------------------------------------------------- ··· 1133 1133 1134 1134 1135 1135 /* -------------------------------------------------------------------- 1136 - * Touchscreen 1137 - * -------------------------------------------------------------------- */ 1138 - 1139 - #if defined(CONFIG_TOUCHSCREEN_ATMEL_TSADCC) || defined(CONFIG_TOUCHSCREEN_ATMEL_TSADCC_MODULE) 1140 - static u64 tsadcc_dmamask = DMA_BIT_MASK(32); 1141 - static struct at91_tsadcc_data tsadcc_data; 1142 - 1143 - static struct resource tsadcc_resources[] = { 1144 - [0] = { 1145 - .start = AT91SAM9G45_BASE_TSC, 1146 - .end = AT91SAM9G45_BASE_TSC + SZ_16K - 1, 1147 - .flags = IORESOURCE_MEM, 1148 - }, 1149 - [1] = { 1150 - .start = NR_IRQS_LEGACY + AT91SAM9G45_ID_TSC, 1151 - .end = NR_IRQS_LEGACY + AT91SAM9G45_ID_TSC, 1152 - .flags = IORESOURCE_IRQ, 1153 - } 1154 - }; 1155 - 1156 - static struct platform_device at91sam9g45_tsadcc_device = { 1157 - .name = "atmel_tsadcc", 1158 - .id = -1, 1159 - .dev = { 1160 - .dma_mask = &tsadcc_dmamask, 1161 - .coherent_dma_mask = DMA_BIT_MASK(32), 1162 - .platform_data = &tsadcc_data, 1163 - }, 1164 - .resource = tsadcc_resources, 1165 - .num_resources = ARRAY_SIZE(tsadcc_resources), 1166 - }; 1167 - 1168 - void __init at91_add_device_tsadcc(struct at91_tsadcc_data *data) 1169 - { 1170 - if (!data) 1171 - return; 1172 - 1173 - at91_set_gpio_input(AT91_PIN_PD20, 0); /* AD0_XR */ 1174 - at91_set_gpio_input(AT91_PIN_PD21, 0); /* AD1_XL */ 1175 - at91_set_gpio_input(AT91_PIN_PD22, 0); /* AD2_YT */ 1176 - at91_set_gpio_input(AT91_PIN_PD23, 0); /* AD3_TB */ 1177 - 1178 - tsadcc_data = *data; 1179 - platform_device_register(&at91sam9g45_tsadcc_device); 1180 - } 1181 - #else 1182 - void __init at91_add_device_tsadcc(struct at91_tsadcc_data *data) {} 1183 - #endif 1184 - 1185 - 1186 - /* -------------------------------------------------------------------- 1187 - * ADC 1136 + * ADC and touchscreen 1188 1137 * -------------------------------------------------------------------- */ 1189 1138 1190 1139 #if IS_ENABLED(CONFIG_AT91_ADC) ··· 1185 1236 }, 1186 1237 }; 1187 1238 1188 - static struct at91_adc_reg_desc at91_adc_register_g45 = { 1189 - .channel_base = AT91_ADC_CHR(0), 1190 - .drdy_mask = AT91_ADC_DRDY, 1191 - .status_register = AT91_ADC_SR, 1192 - .trigger_register = 0x08, 1193 - }; 1194 - 1195 1239 void __init at91_add_device_adc(struct at91_adc_data *data) 1196 1240 { 1197 1241 if (!data) ··· 1210 1268 if (data->use_external_triggers) 1211 1269 at91_set_A_periph(AT91_PIN_PD28, 0); 1212 1270 1213 - data->num_channels = 8; 1214 1271 data->startup_time = 40; 1215 - data->registers = &at91_adc_register_g45; 1216 1272 data->trigger_number = 4; 1217 1273 data->trigger_list = at91_adc_triggers; 1218 1274
+7
arch/arm/mach-at91/at91sam9rl.c
··· 153 153 .pmc_mask = 1 << AT91SAM9RL_ID_AC97C, 154 154 .type = CLK_TYPE_PERIPHERAL, 155 155 }; 156 + static struct clk adc_op_clk = { 157 + .name = "adc_op_clk", 158 + .type = CLK_TYPE_PERIPHERAL, 159 + .rate_hz = 1000000, 160 + }; 156 161 157 162 static struct clk *periph_clocks[] __initdata = { 158 163 &pioA_clk, ··· 183 178 &udphs_clk, 184 179 &lcdc_clk, 185 180 &ac97_clk, 181 + &adc_op_clk, 186 182 // irq0 187 183 }; 188 184 ··· 222 216 CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioB_clk), 223 217 CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioC_clk), 224 218 CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioD_clk), 219 + CLKDEV_CON_ID("adc_clk", &tsc_clk), 225 220 }; 226 221 227 222 static struct clk_lookup usart_clocks_lookups[] = {
+59 -23
arch/arm/mach-at91/at91sam9rl_devices.c
··· 23 23 #include <mach/at91sam9_smc.h> 24 24 #include <mach/hardware.h> 25 25 #include <linux/platform_data/dma-atmel.h> 26 + #include <linux/platform_data/at91_adc.h> 26 27 27 28 #include "board.h" 28 29 #include "generic.h" 30 + #include "gpio.h" 29 31 30 32 31 33 /* -------------------------------------------------------------------- ··· 610 608 611 609 612 610 /* -------------------------------------------------------------------- 613 - * Touchscreen 611 + * ADC and Touchscreen 614 612 * -------------------------------------------------------------------- */ 615 613 616 - #if defined(CONFIG_TOUCHSCREEN_ATMEL_TSADCC) || defined(CONFIG_TOUCHSCREEN_ATMEL_TSADCC_MODULE) 617 - static u64 tsadcc_dmamask = DMA_BIT_MASK(32); 618 - static struct at91_tsadcc_data tsadcc_data; 614 + #if IS_ENABLED(CONFIG_AT91_ADC) 615 + static struct at91_adc_data adc_data; 619 616 620 - static struct resource tsadcc_resources[] = { 617 + static struct resource adc_resources[] = { 621 618 [0] = { 622 619 .start = AT91SAM9RL_BASE_TSC, 623 620 .end = AT91SAM9RL_BASE_TSC + SZ_16K - 1, ··· 629 628 } 630 629 }; 631 630 632 - static struct platform_device at91sam9rl_tsadcc_device = { 633 - .name = "atmel_tsadcc", 634 - .id = -1, 635 - .dev = { 636 - .dma_mask = &tsadcc_dmamask, 637 - .coherent_dma_mask = DMA_BIT_MASK(32), 638 - .platform_data = &tsadcc_data, 631 + static struct platform_device at91_adc_device = { 632 + .name = "at91sam9rl-adc", 633 + .id = -1, 634 + .dev = { 635 + .platform_data = &adc_data, 639 636 }, 640 - .resource = tsadcc_resources, 641 - .num_resources = ARRAY_SIZE(tsadcc_resources), 637 + .resource = adc_resources, 638 + .num_resources = ARRAY_SIZE(adc_resources), 642 639 }; 643 640 644 - void __init at91_add_device_tsadcc(struct at91_tsadcc_data *data) 641 + static struct at91_adc_trigger at91_adc_triggers[] = { 642 + [0] = { 643 + .name = "external-rising", 644 + .value = 1, 645 + .is_external = true, 646 + }, 647 + [1] = { 648 + .name = "external-falling", 649 + .value = 2, 650 + .is_external = true, 651 + }, 652 + [2] = { 653 + .name = "external-any", 654 + .value = 3, 655 + .is_external = true, 656 + }, 657 + [3] = { 658 + .name = "continuous", 659 + .value = 6, 660 + .is_external = false, 661 + }, 662 + }; 663 + 664 + void __init at91_add_device_adc(struct at91_adc_data *data) 645 665 { 646 666 if (!data) 647 667 return; 648 668 649 - at91_set_A_periph(AT91_PIN_PA17, 0); /* AD0_XR */ 650 - at91_set_A_periph(AT91_PIN_PA18, 0); /* AD1_XL */ 651 - at91_set_A_periph(AT91_PIN_PA19, 0); /* AD2_YT */ 652 - at91_set_A_periph(AT91_PIN_PA20, 0); /* AD3_TB */ 669 + if (test_bit(0, &data->channels_used)) 670 + at91_set_A_periph(AT91_PIN_PA17, 0); 671 + if (test_bit(1, &data->channels_used)) 672 + at91_set_A_periph(AT91_PIN_PA18, 0); 673 + if (test_bit(2, &data->channels_used)) 674 + at91_set_A_periph(AT91_PIN_PA19, 0); 675 + if (test_bit(3, &data->channels_used)) 676 + at91_set_A_periph(AT91_PIN_PA20, 0); 677 + if (test_bit(4, &data->channels_used)) 678 + at91_set_A_periph(AT91_PIN_PD6, 0); 679 + if (test_bit(5, &data->channels_used)) 680 + at91_set_A_periph(AT91_PIN_PD7, 0); 653 681 654 - tsadcc_data = *data; 655 - platform_device_register(&at91sam9rl_tsadcc_device); 682 + if (data->use_external_triggers) 683 + at91_set_A_periph(AT91_PIN_PB15, 0); 684 + 685 + data->startup_time = 40; 686 + data->trigger_number = 4; 687 + data->trigger_list = at91_adc_triggers; 688 + 689 + adc_data = *data; 690 + platform_device_register(&at91_adc_device); 656 691 } 657 692 #else 658 - void __init at91_add_device_tsadcc(struct at91_tsadcc_data *data) {} 693 + void __init at91_add_device_adc(struct at91_adc_data *data) {} 659 694 #endif 660 - 661 695 662 696 /* -------------------------------------------------------------------- 663 697 * RTC
+1 -1
arch/arm/mach-at91/board-1arm.c
··· 39 39 #include "at91_aic.h" 40 40 #include "board.h" 41 41 #include "generic.h" 42 - 42 + #include "gpio.h" 43 43 44 44 static void __init onearm_init_early(void) 45 45 {
+1
arch/arm/mach-at91/board-afeb-9260v1.c
··· 46 46 #include "at91_aic.h" 47 47 #include "board.h" 48 48 #include "generic.h" 49 + #include "gpio.h" 49 50 50 51 51 52 static void __init afeb9260_init_early(void)
+1
arch/arm/mach-at91/board-cam60.c
··· 44 44 #include "board.h" 45 45 #include "sam9_smc.h" 46 46 #include "generic.h" 47 + #include "gpio.h" 47 48 48 49 49 50 static void __init cam60_init_early(void)
+1
arch/arm/mach-at91/board-carmeva.c
··· 39 39 #include "at91_aic.h" 40 40 #include "board.h" 41 41 #include "generic.h" 42 + #include "gpio.h" 42 43 43 44 44 45 static void __init carmeva_init_early(void)
+1
arch/arm/mach-at91/board-cpu9krea.c
··· 48 48 #include "board.h" 49 49 #include "sam9_smc.h" 50 50 #include "generic.h" 51 + #include "gpio.h" 51 52 52 53 static void __init cpu9krea_init_early(void) 53 54 {
+2
arch/arm/mach-at91/board-cpuat91.c
··· 43 43 #include "at91_aic.h" 44 44 #include "board.h" 45 45 #include "generic.h" 46 + #include "gpio.h" 47 + 46 48 47 49 static struct gpio_led cpuat91_leds[] = { 48 50 {
+1 -1
arch/arm/mach-at91/board-csb337.c
··· 42 42 #include "at91_aic.h" 43 43 #include "board.h" 44 44 #include "generic.h" 45 - 45 + #include "gpio.h" 46 46 47 47 static void __init csb337_init_early(void) 48 48 {
+1
arch/arm/mach-at91/board-csb637.c
··· 39 39 #include "at91_aic.h" 40 40 #include "board.h" 41 41 #include "generic.h" 42 + #include "gpio.h" 42 43 43 44 44 45 static void __init csb637_init_early(void)
+1
arch/arm/mach-at91/board-eb9200.c
··· 38 38 #include "at91_aic.h" 39 39 #include "board.h" 40 40 #include "generic.h" 41 + #include "gpio.h" 41 42 42 43 43 44 static void __init eb9200_init_early(void)
+1
arch/arm/mach-at91/board-ecbat91.c
··· 42 42 #include "at91_aic.h" 43 43 #include "board.h" 44 44 #include "generic.h" 45 + #include "gpio.h" 45 46 46 47 47 48 static void __init ecb_at91init_early(void)
+2
arch/arm/mach-at91/board-eco920.c
··· 31 31 #include "at91_aic.h" 32 32 #include "board.h" 33 33 #include "generic.h" 34 + #include "gpio.h" 35 + 34 36 35 37 static void __init eco920_init_early(void) 36 38 {
+1
arch/arm/mach-at91/board-flexibity.c
··· 37 37 #include "at91_aic.h" 38 38 #include "board.h" 39 39 #include "generic.h" 40 + #include "gpio.h" 40 41 41 42 static void __init flexibity_init_early(void) 42 43 {
+1
arch/arm/mach-at91/board-foxg20.c
··· 47 47 #include "board.h" 48 48 #include "sam9_smc.h" 49 49 #include "generic.h" 50 + #include "gpio.h" 50 51 51 52 /* 52 53 * The FOX Board G20 hardware comes as the "Netus G20" board with
+1
arch/arm/mach-at91/board-gsia18s.c
··· 39 39 #include "generic.h" 40 40 #include "gsia18s.h" 41 41 #include "stamp9g20.h" 42 + #include "gpio.h" 42 43 43 44 static void __init gsia18s_init_early(void) 44 45 {
+1
arch/arm/mach-at91/board-kafa.c
··· 39 39 #include "at91_aic.h" 40 40 #include "board.h" 41 41 #include "generic.h" 42 + #include "gpio.h" 42 43 43 44 44 45 static void __init kafa_init_early(void)
+1
arch/arm/mach-at91/board-kb9202.c
··· 42 42 #include "at91_aic.h" 43 43 #include "board.h" 44 44 #include "generic.h" 45 + #include "gpio.h" 45 46 46 47 47 48 static void __init kb9202_init_early(void)
+1
arch/arm/mach-at91/board-pcontrol-g20.c
··· 37 37 #include "sam9_smc.h" 38 38 #include "generic.h" 39 39 #include "stamp9g20.h" 40 + #include "gpio.h" 40 41 41 42 42 43 static void __init pcontrol_g20_init_early(void)
+1
arch/arm/mach-at91/board-picotux200.c
··· 43 43 #include "at91_aic.h" 44 44 #include "board.h" 45 45 #include "generic.h" 46 + #include "gpio.h" 46 47 47 48 48 49 static void __init picotux200_init_early(void)
+1
arch/arm/mach-at91/board-rm9200ek.c
··· 45 45 #include "at91_aic.h" 46 46 #include "board.h" 47 47 #include "generic.h" 48 + #include "gpio.h" 48 49 49 50 50 51 static void __init ek_init_early(void)
+1
arch/arm/mach-at91/board-rsi-ews.c
··· 31 31 #include "at91_aic.h" 32 32 #include "board.h" 33 33 #include "generic.h" 34 + #include "gpio.h" 34 35 35 36 static void __init rsi_ews_init_early(void) 36 37 {
+1
arch/arm/mach-at91/board-sam9-l9260.c
··· 43 43 #include "board.h" 44 44 #include "sam9_smc.h" 45 45 #include "generic.h" 46 + #include "gpio.h" 46 47 47 48 48 49 static void __init ek_init_early(void)
+1
arch/arm/mach-at91/board-sam9260ek.c
··· 49 49 #include "board.h" 50 50 #include "sam9_smc.h" 51 51 #include "generic.h" 52 + #include "gpio.h" 52 53 53 54 54 55 static void __init ek_init_early(void)
+1
arch/arm/mach-at91/board-sam9261ek.c
··· 53 53 #include "board.h" 54 54 #include "sam9_smc.h" 55 55 #include "generic.h" 56 + #include "gpio.h" 56 57 57 58 58 59 static void __init ek_init_early(void)
+1
arch/arm/mach-at91/board-sam9263ek.c
··· 52 52 #include "board.h" 53 53 #include "sam9_smc.h" 54 54 #include "generic.h" 55 + #include "gpio.h" 55 56 56 57 57 58 static void __init ek_init_early(void)
+1
arch/arm/mach-at91/board-sam9g20ek.c
··· 50 50 #include "board.h" 51 51 #include "sam9_smc.h" 52 52 #include "generic.h" 53 + #include "gpio.h" 53 54 54 55 /* 55 56 * board revision encoding
+4 -13
arch/arm/mach-at91/board-sam9m10g45ek.c
··· 50 50 #include "board.h" 51 51 #include "sam9_smc.h" 52 52 #include "generic.h" 53 + #include "gpio.h" 53 54 54 55 55 56 static void __init ek_init_early(void) ··· 301 300 302 301 303 302 /* 304 - * Touchscreen 305 - */ 306 - static struct at91_tsadcc_data ek_tsadcc_data = { 307 - .adc_clock = 300000, 308 - .pendet_debounce = 0x0d, 309 - .ts_sample_hold_time = 0x0a, 310 - }; 311 - 312 - /* 313 - * ADCs 303 + * ADCs and touchscreen 314 304 */ 315 305 static struct at91_adc_data ek_adc_data = { 316 306 .channels_used = BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5) | BIT(6) | BIT(7), 317 307 .use_external_triggers = true, 318 308 .vref = 3300, 309 + .touchscreen_type = ATMEL_ADC_TOUCHSCREEN_4WIRE, 319 310 }; 320 311 321 312 /* ··· 478 485 at91_add_device_isi(&isi_data, true); 479 486 /* LCD Controller */ 480 487 at91_add_device_lcdc(&ek_lcdc_data); 481 - /* Touch Screen */ 482 - at91_add_device_tsadcc(&ek_tsadcc_data); 483 - /* ADC */ 488 + /* ADC and touchscreen */ 484 489 at91_add_device_adc(&ek_adc_data); 485 490 /* Push Buttons */ 486 491 ek_add_device_buttons();
+10 -7
arch/arm/mach-at91/board-sam9rlek.c
··· 18 18 #include <linux/clk.h> 19 19 #include <linux/input.h> 20 20 #include <linux/gpio_keys.h> 21 + #include <linux/platform_data/at91_adc.h> 21 22 22 23 #include <video/atmel_lcdc.h> 23 24 ··· 39 38 #include "board.h" 40 39 #include "sam9_smc.h" 41 40 #include "generic.h" 41 + #include "gpio.h" 42 42 43 43 44 44 static void __init ek_init_early(void) ··· 231 229 232 230 233 231 /* 234 - * Touchscreen 232 + * ADC + Touchscreen 235 233 */ 236 - static struct at91_tsadcc_data ek_tsadcc_data = { 237 - .adc_clock = 1000000, 238 - .pendet_debounce = 0x0f, 239 - .ts_sample_hold_time = 0x03, 234 + static struct at91_adc_data ek_adc_data = { 235 + .channels_used = BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5), 236 + .use_external_triggers = true, 237 + .vref = 3300, 238 + .touchscreen_type = ATMEL_ADC_TOUCHSCREEN_4WIRE, 240 239 }; 241 240 242 241 ··· 313 310 at91_add_device_lcdc(&ek_lcdc_data); 314 311 /* AC97 */ 315 312 at91_add_device_ac97(&ek_ac97_data); 316 - /* Touch Screen Controller */ 317 - at91_add_device_tsadcc(&ek_tsadcc_data); 313 + /* Touch Screen Controller + ADC */ 314 + at91_add_device_adc(&ek_adc_data); 318 315 /* LEDs */ 319 316 at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds)); 320 317 /* Push Buttons */
+1
arch/arm/mach-at91/board-snapper9260.c
··· 38 38 #include "board.h" 39 39 #include "sam9_smc.h" 40 40 #include "generic.h" 41 + #include "gpio.h" 41 42 42 43 #define SNAPPER9260_IO_EXP_GPIO(x) (NR_BUILTIN_GPIO + (x)) 43 44
+1
arch/arm/mach-at91/board-stamp9g20.c
··· 32 32 #include "board.h" 33 33 #include "sam9_smc.h" 34 34 #include "generic.h" 35 + #include "gpio.h" 35 36 36 37 37 38 void __init stamp9g20_init_early(void)
+1
arch/arm/mach-at91/board-yl-9200.c
··· 50 50 #include "at91_aic.h" 51 51 #include "board.h" 52 52 #include "generic.h" 53 + #include "gpio.h" 53 54 54 55 55 56 static void __init yl9200_init_early(void)
-3
arch/arm/mach-at91/board.h
··· 118 118 extern void __init at91_add_device_isi(struct isi_platform_data *data, 119 119 bool use_pck_as_mck); 120 120 121 - /* Touchscreen Controller */ 122 - extern void __init at91_add_device_tsadcc(struct at91_tsadcc_data *data); 123 - 124 121 /* CAN */ 125 122 extern void __init at91_add_device_can(struct at91_can_data *data); 126 123
+1
arch/arm/mach-at91/gpio.c
··· 29 29 #include <mach/at91_pio.h> 30 30 31 31 #include "generic.h" 32 + #include "gpio.h" 32 33 33 34 #define MAX_NB_GPIO_PER_BANK 32 34 35
-107
arch/arm/mach-at91/include/mach/at91_adc.h
··· 1 - /* 2 - * arch/arm/mach-at91/include/mach/at91_adc.h 3 - * 4 - * Copyright (C) SAN People 5 - * 6 - * Analog-to-Digital Converter (ADC) registers. 7 - * Based on AT91SAM9260 datasheet revision D. 8 - * 9 - * This program is free software; you can redistribute it and/or modify 10 - * it under the terms of the GNU General Public License as published by 11 - * the Free Software Foundation; either version 2 of the License, or 12 - * (at your option) any later version. 13 - */ 14 - 15 - #ifndef AT91_ADC_H 16 - #define AT91_ADC_H 17 - 18 - #define AT91_ADC_CR 0x00 /* Control Register */ 19 - #define AT91_ADC_SWRST (1 << 0) /* Software Reset */ 20 - #define AT91_ADC_START (1 << 1) /* Start Conversion */ 21 - 22 - #define AT91_ADC_MR 0x04 /* Mode Register */ 23 - #define AT91_ADC_TRGEN (1 << 0) /* Trigger Enable */ 24 - #define AT91_ADC_TRGSEL (7 << 1) /* Trigger Selection */ 25 - #define AT91_ADC_TRGSEL_TC0 (0 << 1) 26 - #define AT91_ADC_TRGSEL_TC1 (1 << 1) 27 - #define AT91_ADC_TRGSEL_TC2 (2 << 1) 28 - #define AT91_ADC_TRGSEL_EXTERNAL (6 << 1) 29 - #define AT91_ADC_LOWRES (1 << 4) /* Low Resolution */ 30 - #define AT91_ADC_SLEEP (1 << 5) /* Sleep Mode */ 31 - #define AT91_ADC_PRESCAL_9260 (0x3f << 8) /* Prescalar Rate Selection */ 32 - #define AT91_ADC_PRESCAL_9G45 (0xff << 8) 33 - #define AT91_ADC_PRESCAL_(x) ((x) << 8) 34 - #define AT91_ADC_STARTUP_9260 (0x1f << 16) /* Startup Up Time */ 35 - #define AT91_ADC_STARTUP_9G45 (0x7f << 16) 36 - #define AT91_ADC_STARTUP_9X5 (0xf << 16) 37 - #define AT91_ADC_STARTUP_(x) ((x) << 16) 38 - #define AT91_ADC_SHTIM (0xf << 24) /* Sample & Hold Time */ 39 - #define AT91_ADC_SHTIM_(x) ((x) << 24) 40 - 41 - #define AT91_ADC_CHER 0x10 /* Channel Enable Register */ 42 - #define AT91_ADC_CHDR 0x14 /* Channel Disable Register */ 43 - #define AT91_ADC_CHSR 0x18 /* Channel Status Register */ 44 - #define AT91_ADC_CH(n) (1 << (n)) /* Channel Number */ 45 - 46 - #define AT91_ADC_SR 0x1C /* Status Register */ 47 - #define AT91_ADC_EOC(n) (1 << (n)) /* End of Conversion on Channel N */ 48 - #define AT91_ADC_OVRE(n) (1 << ((n) + 8))/* Overrun Error on Channel N */ 49 - #define AT91_ADC_DRDY (1 << 16) /* Data Ready */ 50 - #define AT91_ADC_GOVRE (1 << 17) /* General Overrun Error */ 51 - #define AT91_ADC_ENDRX (1 << 18) /* End of RX Buffer */ 52 - #define AT91_ADC_RXFUFF (1 << 19) /* RX Buffer Full */ 53 - 54 - #define AT91_ADC_SR_9X5 0x30 /* Status Register for 9x5 */ 55 - #define AT91_ADC_SR_DRDY_9X5 (1 << 24) /* Data Ready */ 56 - 57 - #define AT91_ADC_LCDR 0x20 /* Last Converted Data Register */ 58 - #define AT91_ADC_LDATA (0x3ff) 59 - 60 - #define AT91_ADC_IER 0x24 /* Interrupt Enable Register */ 61 - #define AT91_ADC_IDR 0x28 /* Interrupt Disable Register */ 62 - #define AT91_ADC_IMR 0x2C /* Interrupt Mask Register */ 63 - #define AT91_ADC_IER_PEN (1 << 29) 64 - #define AT91_ADC_IER_NOPEN (1 << 30) 65 - #define AT91_ADC_IER_XRDY (1 << 20) 66 - #define AT91_ADC_IER_YRDY (1 << 21) 67 - #define AT91_ADC_IER_PRDY (1 << 22) 68 - #define AT91_ADC_ISR_PENS (1 << 31) 69 - 70 - #define AT91_ADC_CHR(n) (0x30 + ((n) * 4)) /* Channel Data Register N */ 71 - #define AT91_ADC_DATA (0x3ff) 72 - 73 - #define AT91_ADC_CDR0_9X5 (0x50) /* Channel Data Register 0 for 9X5 */ 74 - 75 - #define AT91_ADC_ACR 0x94 /* Analog Control Register */ 76 - #define AT91_ADC_ACR_PENDETSENS (0x3 << 0) /* pull-up resistor */ 77 - 78 - #define AT91_ADC_TSMR 0xB0 79 - #define AT91_ADC_TSMR_TSMODE (3 << 0) /* Touch Screen Mode */ 80 - #define AT91_ADC_TSMR_TSMODE_NONE (0 << 0) 81 - #define AT91_ADC_TSMR_TSMODE_4WIRE_NO_PRESS (1 << 0) 82 - #define AT91_ADC_TSMR_TSMODE_4WIRE_PRESS (2 << 0) 83 - #define AT91_ADC_TSMR_TSMODE_5WIRE (3 << 0) 84 - #define AT91_ADC_TSMR_TSAV (3 << 4) /* Averages samples */ 85 - #define AT91_ADC_TSMR_TSAV_(x) ((x) << 4) 86 - #define AT91_ADC_TSMR_SCTIM (0x0f << 16) /* Switch closure time */ 87 - #define AT91_ADC_TSMR_PENDBC (0x0f << 28) /* Pen Debounce time */ 88 - #define AT91_ADC_TSMR_PENDBC_(x) ((x) << 28) 89 - #define AT91_ADC_TSMR_NOTSDMA (1 << 22) /* No Touchscreen DMA */ 90 - #define AT91_ADC_TSMR_PENDET_DIS (0 << 24) /* Pen contact detection disable */ 91 - #define AT91_ADC_TSMR_PENDET_ENA (1 << 24) /* Pen contact detection enable */ 92 - 93 - #define AT91_ADC_TSXPOSR 0xB4 94 - #define AT91_ADC_TSYPOSR 0xB8 95 - #define AT91_ADC_TSPRESSR 0xBC 96 - 97 - #define AT91_ADC_TRGR_9260 AT91_ADC_MR 98 - #define AT91_ADC_TRGR_9G45 0x08 99 - #define AT91_ADC_TRGR_9X5 0xC0 100 - 101 - /* Trigger Register bit field */ 102 - #define AT91_ADC_TRGR_TRGPER (0xffff << 16) 103 - #define AT91_ADC_TRGR_TRGPER_(x) ((x) << 16) 104 - #define AT91_ADC_TRGR_TRGMOD (0x7 << 0) 105 - #define AT91_ADC_TRGR_MOD_PERIOD_TRIG (5 << 0) 106 - 107 - #endif
-8
arch/arm/mach-at91/include/mach/gpio.h arch/arm/mach-at91/gpio.h
··· 209 209 extern void at91_gpio_suspend(void); 210 210 extern void at91_gpio_resume(void); 211 211 212 - #ifdef CONFIG_PINCTRL_AT91 213 - extern void at91_pinctrl_gpio_suspend(void); 214 - extern void at91_pinctrl_gpio_resume(void); 215 - #else 216 - static inline void at91_pinctrl_gpio_suspend(void) {} 217 - static inline void at91_pinctrl_gpio_resume(void) {} 218 - #endif 219 - 220 212 #endif /* __ASSEMBLY__ */ 221 213 222 214 #endif
+15
arch/arm/mach-at91/include/mach/hardware.h
··· 104 104 /* Clocks */ 105 105 #define AT91_SLOW_CLOCK 32768 /* slow clock */ 106 106 107 + /* 108 + * FIXME: this is needed to communicate between the pinctrl driver and 109 + * the PM implementation in the machine. Possibly part of the PM 110 + * implementation should be moved down into the pinctrl driver and get 111 + * called as part of the generic suspend/resume path. 112 + */ 113 + #ifndef __ASSEMBLY__ 114 + #ifdef CONFIG_PINCTRL_AT91 115 + extern void at91_pinctrl_gpio_suspend(void); 116 + extern void at91_pinctrl_gpio_resume(void); 117 + #else 118 + static inline void at91_pinctrl_gpio_suspend(void) {} 119 + static inline void at91_pinctrl_gpio_resume(void) {} 120 + #endif 121 + #endif 107 122 108 123 #endif
+1
arch/arm/mach-at91/leds.c
··· 16 16 #include <linux/platform_device.h> 17 17 18 18 #include "board.h" 19 + #include "gpio.h" 19 20 20 21 21 22 /* ------------------------------------------------------------------------- */
+1
arch/arm/mach-at91/pm.c
··· 32 32 #include "at91_aic.h" 33 33 #include "generic.h" 34 34 #include "pm.h" 35 + #include "gpio.h" 35 36 36 37 /* 37 38 * Show the reason for the previous system reset.
+2 -2
drivers/clk/at91/Makefile
··· 2 2 # Makefile for at91 specific clk 3 3 # 4 4 5 - obj-y += pmc.o 6 - obj-y += clk-main.o clk-pll.o clk-plldiv.o clk-master.o 5 + obj-y += pmc.o sckc.o 6 + obj-y += clk-slow.o clk-main.o clk-pll.o clk-plldiv.o clk-master.o 7 7 obj-y += clk-system.o clk-peripheral.o clk-programmable.o 8 8 9 9 obj-$(CONFIG_HAVE_AT91_UTMI) += clk-utmi.o
+525 -74
drivers/clk/at91/clk-main.c
··· 30 30 #define MAINF_LOOP_MIN_WAIT (USEC_PER_SEC / SLOW_CLOCK_FREQ) 31 31 #define MAINF_LOOP_MAX_WAIT MAINFRDY_TIMEOUT 32 32 33 - struct clk_main { 33 + #define MOR_KEY_MASK (0xff << 16) 34 + 35 + struct clk_main_osc { 34 36 struct clk_hw hw; 35 37 struct at91_pmc *pmc; 36 - unsigned long rate; 37 38 unsigned int irq; 38 39 wait_queue_head_t wait; 39 40 }; 40 41 41 - #define to_clk_main(hw) container_of(hw, struct clk_main, hw) 42 + #define to_clk_main_osc(hw) container_of(hw, struct clk_main_osc, hw) 42 43 43 - static irqreturn_t clk_main_irq_handler(int irq, void *dev_id) 44 + struct clk_main_rc_osc { 45 + struct clk_hw hw; 46 + struct at91_pmc *pmc; 47 + unsigned int irq; 48 + wait_queue_head_t wait; 49 + unsigned long frequency; 50 + unsigned long accuracy; 51 + }; 52 + 53 + #define to_clk_main_rc_osc(hw) container_of(hw, struct clk_main_rc_osc, hw) 54 + 55 + struct clk_rm9200_main { 56 + struct clk_hw hw; 57 + struct at91_pmc *pmc; 58 + }; 59 + 60 + #define to_clk_rm9200_main(hw) container_of(hw, struct clk_rm9200_main, hw) 61 + 62 + struct clk_sam9x5_main { 63 + struct clk_hw hw; 64 + struct at91_pmc *pmc; 65 + unsigned int irq; 66 + wait_queue_head_t wait; 67 + u8 parent; 68 + }; 69 + 70 + #define to_clk_sam9x5_main(hw) container_of(hw, struct clk_sam9x5_main, hw) 71 + 72 + static irqreturn_t clk_main_osc_irq_handler(int irq, void *dev_id) 44 73 { 45 - struct clk_main *clkmain = (struct clk_main *)dev_id; 74 + struct clk_main_osc *osc = dev_id; 46 75 47 - wake_up(&clkmain->wait); 48 - disable_irq_nosync(clkmain->irq); 76 + wake_up(&osc->wait); 77 + disable_irq_nosync(osc->irq); 49 78 50 79 return IRQ_HANDLED; 51 80 } 52 81 53 - static int clk_main_prepare(struct clk_hw *hw) 82 + static int clk_main_osc_prepare(struct clk_hw *hw) 54 83 { 55 - struct clk_main *clkmain = to_clk_main(hw); 56 - struct at91_pmc *pmc = clkmain->pmc; 57 - unsigned long halt_time, timeout; 84 + struct clk_main_osc *osc = to_clk_main_osc(hw); 85 + struct at91_pmc *pmc = osc->pmc; 58 86 u32 tmp; 59 87 60 - while (!(pmc_read(pmc, AT91_PMC_SR) & AT91_PMC_MOSCS)) { 61 - enable_irq(clkmain->irq); 62 - wait_event(clkmain->wait, 63 - pmc_read(pmc, AT91_PMC_SR) & AT91_PMC_MOSCS); 64 - } 65 - 66 - if (clkmain->rate) 88 + tmp = pmc_read(pmc, AT91_CKGR_MOR) & ~MOR_KEY_MASK; 89 + if (tmp & AT91_PMC_OSCBYPASS) 67 90 return 0; 68 91 69 - timeout = jiffies + usecs_to_jiffies(MAINFRDY_TIMEOUT); 70 - do { 71 - halt_time = jiffies; 72 - tmp = pmc_read(pmc, AT91_CKGR_MCFR); 73 - if (tmp & AT91_PMC_MAINRDY) 74 - return 0; 75 - usleep_range(MAINF_LOOP_MIN_WAIT, MAINF_LOOP_MAX_WAIT); 76 - } while (time_before(halt_time, timeout)); 92 + if (!(tmp & AT91_PMC_MOSCEN)) { 93 + tmp |= AT91_PMC_MOSCEN | AT91_PMC_KEY; 94 + pmc_write(pmc, AT91_CKGR_MOR, tmp); 95 + } 96 + 97 + while (!(pmc_read(pmc, AT91_PMC_SR) & AT91_PMC_MOSCS)) { 98 + enable_irq(osc->irq); 99 + wait_event(osc->wait, 100 + pmc_read(pmc, AT91_PMC_SR) & AT91_PMC_MOSCS); 101 + } 77 102 78 103 return 0; 79 104 } 80 105 81 - static int clk_main_is_prepared(struct clk_hw *hw) 106 + static void clk_main_osc_unprepare(struct clk_hw *hw) 82 107 { 83 - struct clk_main *clkmain = to_clk_main(hw); 108 + struct clk_main_osc *osc = to_clk_main_osc(hw); 109 + struct at91_pmc *pmc = osc->pmc; 110 + u32 tmp = pmc_read(pmc, AT91_CKGR_MOR); 84 111 85 - return !!(pmc_read(clkmain->pmc, AT91_PMC_SR) & AT91_PMC_MOSCS); 112 + if (tmp & AT91_PMC_OSCBYPASS) 113 + return; 114 + 115 + if (!(tmp & AT91_PMC_MOSCEN)) 116 + return; 117 + 118 + tmp &= ~(AT91_PMC_KEY | AT91_PMC_MOSCEN); 119 + pmc_write(pmc, AT91_CKGR_MOR, tmp | AT91_PMC_KEY); 86 120 } 87 121 88 - static unsigned long clk_main_recalc_rate(struct clk_hw *hw, 89 - unsigned long parent_rate) 122 + static int clk_main_osc_is_prepared(struct clk_hw *hw) 90 123 { 91 - u32 tmp; 92 - struct clk_main *clkmain = to_clk_main(hw); 93 - struct at91_pmc *pmc = clkmain->pmc; 124 + struct clk_main_osc *osc = to_clk_main_osc(hw); 125 + struct at91_pmc *pmc = osc->pmc; 126 + u32 tmp = pmc_read(pmc, AT91_CKGR_MOR); 94 127 95 - if (clkmain->rate) 96 - return clkmain->rate; 128 + if (tmp & AT91_PMC_OSCBYPASS) 129 + return 1; 97 130 98 - tmp = pmc_read(pmc, AT91_CKGR_MCFR) & AT91_PMC_MAINF; 99 - clkmain->rate = (tmp * parent_rate) / MAINF_DIV; 100 - 101 - return clkmain->rate; 131 + return !!((pmc_read(pmc, AT91_PMC_SR) & AT91_PMC_MOSCS) && 132 + (pmc_read(pmc, AT91_CKGR_MOR) & AT91_PMC_MOSCEN)); 102 133 } 103 134 104 - static const struct clk_ops main_ops = { 105 - .prepare = clk_main_prepare, 106 - .is_prepared = clk_main_is_prepared, 107 - .recalc_rate = clk_main_recalc_rate, 135 + static const struct clk_ops main_osc_ops = { 136 + .prepare = clk_main_osc_prepare, 137 + .unprepare = clk_main_osc_unprepare, 138 + .is_prepared = clk_main_osc_is_prepared, 108 139 }; 109 140 110 141 static struct clk * __init 111 - at91_clk_register_main(struct at91_pmc *pmc, 112 - unsigned int irq, 113 - const char *name, 114 - const char *parent_name, 115 - unsigned long rate) 142 + at91_clk_register_main_osc(struct at91_pmc *pmc, 143 + unsigned int irq, 144 + const char *name, 145 + const char *parent_name, 146 + bool bypass) 116 147 { 117 148 int ret; 118 - struct clk_main *clkmain; 149 + struct clk_main_osc *osc; 119 150 struct clk *clk = NULL; 120 151 struct clk_init_data init; 121 152 122 - if (!pmc || !irq || !name) 153 + if (!pmc || !irq || !name || !parent_name) 123 154 return ERR_PTR(-EINVAL); 124 155 125 - if (!rate && !parent_name) 156 + osc = kzalloc(sizeof(*osc), GFP_KERNEL); 157 + if (!osc) 158 + return ERR_PTR(-ENOMEM); 159 + 160 + init.name = name; 161 + init.ops = &main_osc_ops; 162 + init.parent_names = &parent_name; 163 + init.num_parents = 1; 164 + init.flags = CLK_IGNORE_UNUSED; 165 + 166 + osc->hw.init = &init; 167 + osc->pmc = pmc; 168 + osc->irq = irq; 169 + 170 + init_waitqueue_head(&osc->wait); 171 + irq_set_status_flags(osc->irq, IRQ_NOAUTOEN); 172 + ret = request_irq(osc->irq, clk_main_osc_irq_handler, 173 + IRQF_TRIGGER_HIGH, name, osc); 174 + if (ret) 175 + return ERR_PTR(ret); 176 + 177 + if (bypass) 178 + pmc_write(pmc, AT91_CKGR_MOR, 179 + (pmc_read(pmc, AT91_CKGR_MOR) & 180 + ~(MOR_KEY_MASK | AT91_PMC_MOSCEN)) | 181 + AT91_PMC_OSCBYPASS | AT91_PMC_KEY); 182 + 183 + clk = clk_register(NULL, &osc->hw); 184 + if (IS_ERR(clk)) { 185 + free_irq(irq, osc); 186 + kfree(osc); 187 + } 188 + 189 + return clk; 190 + } 191 + 192 + void __init of_at91rm9200_clk_main_osc_setup(struct device_node *np, 193 + struct at91_pmc *pmc) 194 + { 195 + struct clk *clk; 196 + unsigned int irq; 197 + const char *name = np->name; 198 + const char *parent_name; 199 + bool bypass; 200 + 201 + of_property_read_string(np, "clock-output-names", &name); 202 + bypass = of_property_read_bool(np, "atmel,osc-bypass"); 203 + parent_name = of_clk_get_parent_name(np, 0); 204 + 205 + irq = irq_of_parse_and_map(np, 0); 206 + if (!irq) 207 + return; 208 + 209 + clk = at91_clk_register_main_osc(pmc, irq, name, parent_name, bypass); 210 + if (IS_ERR(clk)) 211 + return; 212 + 213 + of_clk_add_provider(np, of_clk_src_simple_get, clk); 214 + } 215 + 216 + static irqreturn_t clk_main_rc_osc_irq_handler(int irq, void *dev_id) 217 + { 218 + struct clk_main_rc_osc *osc = dev_id; 219 + 220 + wake_up(&osc->wait); 221 + disable_irq_nosync(osc->irq); 222 + 223 + return IRQ_HANDLED; 224 + } 225 + 226 + static int clk_main_rc_osc_prepare(struct clk_hw *hw) 227 + { 228 + struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw); 229 + struct at91_pmc *pmc = osc->pmc; 230 + u32 tmp; 231 + 232 + tmp = pmc_read(pmc, AT91_CKGR_MOR) & ~MOR_KEY_MASK; 233 + 234 + if (!(tmp & AT91_PMC_MOSCRCEN)) { 235 + tmp |= AT91_PMC_MOSCRCEN | AT91_PMC_KEY; 236 + pmc_write(pmc, AT91_CKGR_MOR, tmp); 237 + } 238 + 239 + while (!(pmc_read(pmc, AT91_PMC_SR) & AT91_PMC_MOSCRCS)) { 240 + enable_irq(osc->irq); 241 + wait_event(osc->wait, 242 + pmc_read(pmc, AT91_PMC_SR) & AT91_PMC_MOSCRCS); 243 + } 244 + 245 + return 0; 246 + } 247 + 248 + static void clk_main_rc_osc_unprepare(struct clk_hw *hw) 249 + { 250 + struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw); 251 + struct at91_pmc *pmc = osc->pmc; 252 + u32 tmp = pmc_read(pmc, AT91_CKGR_MOR); 253 + 254 + if (!(tmp & AT91_PMC_MOSCRCEN)) 255 + return; 256 + 257 + tmp &= ~(MOR_KEY_MASK | AT91_PMC_MOSCRCEN); 258 + pmc_write(pmc, AT91_CKGR_MOR, tmp | AT91_PMC_KEY); 259 + } 260 + 261 + static int clk_main_rc_osc_is_prepared(struct clk_hw *hw) 262 + { 263 + struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw); 264 + struct at91_pmc *pmc = osc->pmc; 265 + 266 + return !!((pmc_read(pmc, AT91_PMC_SR) & AT91_PMC_MOSCRCS) && 267 + (pmc_read(pmc, AT91_CKGR_MOR) & AT91_PMC_MOSCRCEN)); 268 + } 269 + 270 + static unsigned long clk_main_rc_osc_recalc_rate(struct clk_hw *hw, 271 + unsigned long parent_rate) 272 + { 273 + struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw); 274 + 275 + return osc->frequency; 276 + } 277 + 278 + static unsigned long clk_main_rc_osc_recalc_accuracy(struct clk_hw *hw, 279 + unsigned long parent_acc) 280 + { 281 + struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw); 282 + 283 + return osc->accuracy; 284 + } 285 + 286 + static const struct clk_ops main_rc_osc_ops = { 287 + .prepare = clk_main_rc_osc_prepare, 288 + .unprepare = clk_main_rc_osc_unprepare, 289 + .is_prepared = clk_main_rc_osc_is_prepared, 290 + .recalc_rate = clk_main_rc_osc_recalc_rate, 291 + .recalc_accuracy = clk_main_rc_osc_recalc_accuracy, 292 + }; 293 + 294 + static struct clk * __init 295 + at91_clk_register_main_rc_osc(struct at91_pmc *pmc, 296 + unsigned int irq, 297 + const char *name, 298 + u32 frequency, u32 accuracy) 299 + { 300 + int ret; 301 + struct clk_main_rc_osc *osc; 302 + struct clk *clk = NULL; 303 + struct clk_init_data init; 304 + 305 + if (!pmc || !irq || !name || !frequency) 306 + return ERR_PTR(-EINVAL); 307 + 308 + osc = kzalloc(sizeof(*osc), GFP_KERNEL); 309 + if (!osc) 310 + return ERR_PTR(-ENOMEM); 311 + 312 + init.name = name; 313 + init.ops = &main_rc_osc_ops; 314 + init.parent_names = NULL; 315 + init.num_parents = 0; 316 + init.flags = CLK_IS_ROOT | CLK_IGNORE_UNUSED; 317 + 318 + osc->hw.init = &init; 319 + osc->pmc = pmc; 320 + osc->irq = irq; 321 + osc->frequency = frequency; 322 + osc->accuracy = accuracy; 323 + 324 + init_waitqueue_head(&osc->wait); 325 + irq_set_status_flags(osc->irq, IRQ_NOAUTOEN); 326 + ret = request_irq(osc->irq, clk_main_rc_osc_irq_handler, 327 + IRQF_TRIGGER_HIGH, name, osc); 328 + if (ret) 329 + return ERR_PTR(ret); 330 + 331 + clk = clk_register(NULL, &osc->hw); 332 + if (IS_ERR(clk)) { 333 + free_irq(irq, osc); 334 + kfree(osc); 335 + } 336 + 337 + return clk; 338 + } 339 + 340 + void __init of_at91sam9x5_clk_main_rc_osc_setup(struct device_node *np, 341 + struct at91_pmc *pmc) 342 + { 343 + struct clk *clk; 344 + unsigned int irq; 345 + u32 frequency = 0; 346 + u32 accuracy = 0; 347 + const char *name = np->name; 348 + 349 + of_property_read_string(np, "clock-output-names", &name); 350 + of_property_read_u32(np, "clock-frequency", &frequency); 351 + of_property_read_u32(np, "clock-accuracy", &accuracy); 352 + 353 + irq = irq_of_parse_and_map(np, 0); 354 + if (!irq) 355 + return; 356 + 357 + clk = at91_clk_register_main_rc_osc(pmc, irq, name, frequency, 358 + accuracy); 359 + if (IS_ERR(clk)) 360 + return; 361 + 362 + of_clk_add_provider(np, of_clk_src_simple_get, clk); 363 + } 364 + 365 + 366 + static int clk_main_probe_frequency(struct at91_pmc *pmc) 367 + { 368 + unsigned long prep_time, timeout; 369 + u32 tmp; 370 + 371 + timeout = jiffies + usecs_to_jiffies(MAINFRDY_TIMEOUT); 372 + do { 373 + prep_time = jiffies; 374 + tmp = pmc_read(pmc, AT91_CKGR_MCFR); 375 + if (tmp & AT91_PMC_MAINRDY) 376 + return 0; 377 + usleep_range(MAINF_LOOP_MIN_WAIT, MAINF_LOOP_MAX_WAIT); 378 + } while (time_before(prep_time, timeout)); 379 + 380 + return -ETIMEDOUT; 381 + } 382 + 383 + static unsigned long clk_main_recalc_rate(struct at91_pmc *pmc, 384 + unsigned long parent_rate) 385 + { 386 + u32 tmp; 387 + 388 + if (parent_rate) 389 + return parent_rate; 390 + 391 + tmp = pmc_read(pmc, AT91_CKGR_MCFR); 392 + if (!(tmp & AT91_PMC_MAINRDY)) 393 + return 0; 394 + 395 + return ((tmp & AT91_PMC_MAINF) * SLOW_CLOCK_FREQ) / MAINF_DIV; 396 + } 397 + 398 + static int clk_rm9200_main_prepare(struct clk_hw *hw) 399 + { 400 + struct clk_rm9200_main *clkmain = to_clk_rm9200_main(hw); 401 + 402 + return clk_main_probe_frequency(clkmain->pmc); 403 + } 404 + 405 + static int clk_rm9200_main_is_prepared(struct clk_hw *hw) 406 + { 407 + struct clk_rm9200_main *clkmain = to_clk_rm9200_main(hw); 408 + 409 + return !!(pmc_read(clkmain->pmc, AT91_CKGR_MCFR) & AT91_PMC_MAINRDY); 410 + } 411 + 412 + static unsigned long clk_rm9200_main_recalc_rate(struct clk_hw *hw, 413 + unsigned long parent_rate) 414 + { 415 + struct clk_rm9200_main *clkmain = to_clk_rm9200_main(hw); 416 + 417 + return clk_main_recalc_rate(clkmain->pmc, parent_rate); 418 + } 419 + 420 + static const struct clk_ops rm9200_main_ops = { 421 + .prepare = clk_rm9200_main_prepare, 422 + .is_prepared = clk_rm9200_main_is_prepared, 423 + .recalc_rate = clk_rm9200_main_recalc_rate, 424 + }; 425 + 426 + static struct clk * __init 427 + at91_clk_register_rm9200_main(struct at91_pmc *pmc, 428 + const char *name, 429 + const char *parent_name) 430 + { 431 + struct clk_rm9200_main *clkmain; 432 + struct clk *clk = NULL; 433 + struct clk_init_data init; 434 + 435 + if (!pmc || !name) 436 + return ERR_PTR(-EINVAL); 437 + 438 + if (!parent_name) 126 439 return ERR_PTR(-EINVAL); 127 440 128 441 clkmain = kzalloc(sizeof(*clkmain), GFP_KERNEL); ··· 443 130 return ERR_PTR(-ENOMEM); 444 131 445 132 init.name = name; 446 - init.ops = &main_ops; 447 - init.parent_names = parent_name ? &parent_name : NULL; 448 - init.num_parents = parent_name ? 1 : 0; 449 - init.flags = parent_name ? 0 : CLK_IS_ROOT; 133 + init.ops = &rm9200_main_ops; 134 + init.parent_names = &parent_name; 135 + init.num_parents = 1; 136 + init.flags = 0; 450 137 451 138 clkmain->hw.init = &init; 452 - clkmain->rate = rate; 139 + clkmain->pmc = pmc; 140 + 141 + clk = clk_register(NULL, &clkmain->hw); 142 + if (IS_ERR(clk)) 143 + kfree(clkmain); 144 + 145 + return clk; 146 + } 147 + 148 + void __init of_at91rm9200_clk_main_setup(struct device_node *np, 149 + struct at91_pmc *pmc) 150 + { 151 + struct clk *clk; 152 + const char *parent_name; 153 + const char *name = np->name; 154 + 155 + parent_name = of_clk_get_parent_name(np, 0); 156 + of_property_read_string(np, "clock-output-names", &name); 157 + 158 + clk = at91_clk_register_rm9200_main(pmc, name, parent_name); 159 + if (IS_ERR(clk)) 160 + return; 161 + 162 + of_clk_add_provider(np, of_clk_src_simple_get, clk); 163 + } 164 + 165 + static irqreturn_t clk_sam9x5_main_irq_handler(int irq, void *dev_id) 166 + { 167 + struct clk_sam9x5_main *clkmain = dev_id; 168 + 169 + wake_up(&clkmain->wait); 170 + disable_irq_nosync(clkmain->irq); 171 + 172 + return IRQ_HANDLED; 173 + } 174 + 175 + static int clk_sam9x5_main_prepare(struct clk_hw *hw) 176 + { 177 + struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw); 178 + struct at91_pmc *pmc = clkmain->pmc; 179 + 180 + while (!(pmc_read(pmc, AT91_PMC_SR) & AT91_PMC_MOSCSELS)) { 181 + enable_irq(clkmain->irq); 182 + wait_event(clkmain->wait, 183 + pmc_read(pmc, AT91_PMC_SR) & AT91_PMC_MOSCSELS); 184 + } 185 + 186 + return clk_main_probe_frequency(pmc); 187 + } 188 + 189 + static int clk_sam9x5_main_is_prepared(struct clk_hw *hw) 190 + { 191 + struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw); 192 + 193 + return !!(pmc_read(clkmain->pmc, AT91_PMC_SR) & AT91_PMC_MOSCSELS); 194 + } 195 + 196 + static unsigned long clk_sam9x5_main_recalc_rate(struct clk_hw *hw, 197 + unsigned long parent_rate) 198 + { 199 + struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw); 200 + 201 + return clk_main_recalc_rate(clkmain->pmc, parent_rate); 202 + } 203 + 204 + static int clk_sam9x5_main_set_parent(struct clk_hw *hw, u8 index) 205 + { 206 + struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw); 207 + struct at91_pmc *pmc = clkmain->pmc; 208 + u32 tmp; 209 + 210 + if (index > 1) 211 + return -EINVAL; 212 + 213 + tmp = pmc_read(pmc, AT91_CKGR_MOR) & ~MOR_KEY_MASK; 214 + 215 + if (index && !(tmp & AT91_PMC_MOSCSEL)) 216 + pmc_write(pmc, AT91_CKGR_MOR, tmp | AT91_PMC_MOSCSEL); 217 + else if (!index && (tmp & AT91_PMC_MOSCSEL)) 218 + pmc_write(pmc, AT91_CKGR_MOR, tmp & ~AT91_PMC_MOSCSEL); 219 + 220 + while (!(pmc_read(pmc, AT91_PMC_SR) & AT91_PMC_MOSCSELS)) { 221 + enable_irq(clkmain->irq); 222 + wait_event(clkmain->wait, 223 + pmc_read(pmc, AT91_PMC_SR) & AT91_PMC_MOSCSELS); 224 + } 225 + 226 + return 0; 227 + } 228 + 229 + static u8 clk_sam9x5_main_get_parent(struct clk_hw *hw) 230 + { 231 + struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw); 232 + 233 + return !!(pmc_read(clkmain->pmc, AT91_CKGR_MOR) & AT91_PMC_MOSCEN); 234 + } 235 + 236 + static const struct clk_ops sam9x5_main_ops = { 237 + .prepare = clk_sam9x5_main_prepare, 238 + .is_prepared = clk_sam9x5_main_is_prepared, 239 + .recalc_rate = clk_sam9x5_main_recalc_rate, 240 + .set_parent = clk_sam9x5_main_set_parent, 241 + .get_parent = clk_sam9x5_main_get_parent, 242 + }; 243 + 244 + static struct clk * __init 245 + at91_clk_register_sam9x5_main(struct at91_pmc *pmc, 246 + unsigned int irq, 247 + const char *name, 248 + const char **parent_names, 249 + int num_parents) 250 + { 251 + int ret; 252 + struct clk_sam9x5_main *clkmain; 253 + struct clk *clk = NULL; 254 + struct clk_init_data init; 255 + 256 + if (!pmc || !irq || !name) 257 + return ERR_PTR(-EINVAL); 258 + 259 + if (!parent_names || !num_parents) 260 + return ERR_PTR(-EINVAL); 261 + 262 + clkmain = kzalloc(sizeof(*clkmain), GFP_KERNEL); 263 + if (!clkmain) 264 + return ERR_PTR(-ENOMEM); 265 + 266 + init.name = name; 267 + init.ops = &sam9x5_main_ops; 268 + init.parent_names = parent_names; 269 + init.num_parents = num_parents; 270 + init.flags = CLK_SET_PARENT_GATE; 271 + 272 + clkmain->hw.init = &init; 453 273 clkmain->pmc = pmc; 454 274 clkmain->irq = irq; 275 + clkmain->parent = !!(pmc_read(clkmain->pmc, AT91_CKGR_MOR) & 276 + AT91_PMC_MOSCEN); 455 277 init_waitqueue_head(&clkmain->wait); 456 278 irq_set_status_flags(clkmain->irq, IRQ_NOAUTOEN); 457 - ret = request_irq(clkmain->irq, clk_main_irq_handler, 458 - IRQF_TRIGGER_HIGH, "clk-main", clkmain); 279 + ret = request_irq(clkmain->irq, clk_sam9x5_main_irq_handler, 280 + IRQF_TRIGGER_HIGH, name, clkmain); 459 281 if (ret) 460 282 return ERR_PTR(ret); 461 283 ··· 603 155 return clk; 604 156 } 605 157 606 - 607 - 608 - static void __init 609 - of_at91_clk_main_setup(struct device_node *np, struct at91_pmc *pmc) 158 + void __init of_at91sam9x5_clk_main_setup(struct device_node *np, 159 + struct at91_pmc *pmc) 610 160 { 611 161 struct clk *clk; 162 + const char *parent_names[2]; 163 + int num_parents; 612 164 unsigned int irq; 613 - const char *parent_name; 614 165 const char *name = np->name; 615 - u32 rate = 0; 166 + int i; 616 167 617 - parent_name = of_clk_get_parent_name(np, 0); 168 + num_parents = of_count_phandle_with_args(np, "clocks", "#clock-cells"); 169 + if (num_parents <= 0 || num_parents > 2) 170 + return; 171 + 172 + for (i = 0; i < num_parents; ++i) { 173 + parent_names[i] = of_clk_get_parent_name(np, i); 174 + if (!parent_names[i]) 175 + return; 176 + } 177 + 618 178 of_property_read_string(np, "clock-output-names", &name); 619 - of_property_read_u32(np, "clock-frequency", &rate); 179 + 620 180 irq = irq_of_parse_and_map(np, 0); 621 181 if (!irq) 622 182 return; 623 183 624 - clk = at91_clk_register_main(pmc, irq, name, parent_name, rate); 184 + clk = at91_clk_register_sam9x5_main(pmc, irq, name, parent_names, 185 + num_parents); 625 186 if (IS_ERR(clk)) 626 187 return; 627 188 628 189 of_clk_add_provider(np, of_clk_src_simple_get, clk); 629 - } 630 - 631 - void __init of_at91rm9200_clk_main_setup(struct device_node *np, 632 - struct at91_pmc *pmc) 633 - { 634 - of_at91_clk_main_setup(np, pmc); 635 190 }
+467
drivers/clk/at91/clk-slow.c
··· 1 + /* 2 + * drivers/clk/at91/clk-slow.c 3 + * 4 + * Copyright (C) 2013 Boris BREZILLON <b.brezillon@overkiz.com> 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License as published by 8 + * the Free Software Foundation; either version 2 of the License, or 9 + * (at your option) any later version. 10 + * 11 + */ 12 + 13 + #include <linux/clk-provider.h> 14 + #include <linux/clkdev.h> 15 + #include <linux/clk/at91_pmc.h> 16 + #include <linux/delay.h> 17 + #include <linux/of.h> 18 + #include <linux/of_address.h> 19 + #include <linux/of_irq.h> 20 + #include <linux/io.h> 21 + #include <linux/interrupt.h> 22 + #include <linux/irq.h> 23 + #include <linux/sched.h> 24 + #include <linux/wait.h> 25 + 26 + #include "pmc.h" 27 + #include "sckc.h" 28 + 29 + #define SLOW_CLOCK_FREQ 32768 30 + #define SLOWCK_SW_CYCLES 5 31 + #define SLOWCK_SW_TIME_USEC ((SLOWCK_SW_CYCLES * USEC_PER_SEC) / \ 32 + SLOW_CLOCK_FREQ) 33 + 34 + #define AT91_SCKC_CR 0x00 35 + #define AT91_SCKC_RCEN (1 << 0) 36 + #define AT91_SCKC_OSC32EN (1 << 1) 37 + #define AT91_SCKC_OSC32BYP (1 << 2) 38 + #define AT91_SCKC_OSCSEL (1 << 3) 39 + 40 + struct clk_slow_osc { 41 + struct clk_hw hw; 42 + void __iomem *sckcr; 43 + unsigned long startup_usec; 44 + }; 45 + 46 + #define to_clk_slow_osc(hw) container_of(hw, struct clk_slow_osc, hw) 47 + 48 + struct clk_slow_rc_osc { 49 + struct clk_hw hw; 50 + void __iomem *sckcr; 51 + unsigned long frequency; 52 + unsigned long accuracy; 53 + unsigned long startup_usec; 54 + }; 55 + 56 + #define to_clk_slow_rc_osc(hw) container_of(hw, struct clk_slow_rc_osc, hw) 57 + 58 + struct clk_sam9260_slow { 59 + struct clk_hw hw; 60 + struct at91_pmc *pmc; 61 + }; 62 + 63 + #define to_clk_sam9260_slow(hw) container_of(hw, struct clk_sam9260_slow, hw) 64 + 65 + struct clk_sam9x5_slow { 66 + struct clk_hw hw; 67 + void __iomem *sckcr; 68 + u8 parent; 69 + }; 70 + 71 + #define to_clk_sam9x5_slow(hw) container_of(hw, struct clk_sam9x5_slow, hw) 72 + 73 + 74 + static int clk_slow_osc_prepare(struct clk_hw *hw) 75 + { 76 + struct clk_slow_osc *osc = to_clk_slow_osc(hw); 77 + void __iomem *sckcr = osc->sckcr; 78 + u32 tmp = readl(sckcr); 79 + 80 + if (tmp & AT91_SCKC_OSC32BYP) 81 + return 0; 82 + 83 + writel(tmp | AT91_SCKC_OSC32EN, sckcr); 84 + 85 + usleep_range(osc->startup_usec, osc->startup_usec + 1); 86 + 87 + return 0; 88 + } 89 + 90 + static void clk_slow_osc_unprepare(struct clk_hw *hw) 91 + { 92 + struct clk_slow_osc *osc = to_clk_slow_osc(hw); 93 + void __iomem *sckcr = osc->sckcr; 94 + u32 tmp = readl(sckcr); 95 + 96 + if (tmp & AT91_SCKC_OSC32BYP) 97 + return; 98 + 99 + writel(tmp & ~AT91_SCKC_OSC32EN, sckcr); 100 + } 101 + 102 + static int clk_slow_osc_is_prepared(struct clk_hw *hw) 103 + { 104 + struct clk_slow_osc *osc = to_clk_slow_osc(hw); 105 + void __iomem *sckcr = osc->sckcr; 106 + u32 tmp = readl(sckcr); 107 + 108 + if (tmp & AT91_SCKC_OSC32BYP) 109 + return 1; 110 + 111 + return !!(tmp & AT91_SCKC_OSC32EN); 112 + } 113 + 114 + static const struct clk_ops slow_osc_ops = { 115 + .prepare = clk_slow_osc_prepare, 116 + .unprepare = clk_slow_osc_unprepare, 117 + .is_prepared = clk_slow_osc_is_prepared, 118 + }; 119 + 120 + static struct clk * __init 121 + at91_clk_register_slow_osc(void __iomem *sckcr, 122 + const char *name, 123 + const char *parent_name, 124 + unsigned long startup, 125 + bool bypass) 126 + { 127 + struct clk_slow_osc *osc; 128 + struct clk *clk = NULL; 129 + struct clk_init_data init; 130 + 131 + if (!sckcr || !name || !parent_name) 132 + return ERR_PTR(-EINVAL); 133 + 134 + osc = kzalloc(sizeof(*osc), GFP_KERNEL); 135 + if (!osc) 136 + return ERR_PTR(-ENOMEM); 137 + 138 + init.name = name; 139 + init.ops = &slow_osc_ops; 140 + init.parent_names = &parent_name; 141 + init.num_parents = 1; 142 + init.flags = CLK_IGNORE_UNUSED; 143 + 144 + osc->hw.init = &init; 145 + osc->sckcr = sckcr; 146 + osc->startup_usec = startup; 147 + 148 + if (bypass) 149 + writel((readl(sckcr) & ~AT91_SCKC_OSC32EN) | AT91_SCKC_OSC32BYP, 150 + sckcr); 151 + 152 + clk = clk_register(NULL, &osc->hw); 153 + if (IS_ERR(clk)) 154 + kfree(osc); 155 + 156 + return clk; 157 + } 158 + 159 + void __init of_at91sam9x5_clk_slow_osc_setup(struct device_node *np, 160 + void __iomem *sckcr) 161 + { 162 + struct clk *clk; 163 + const char *parent_name; 164 + const char *name = np->name; 165 + u32 startup; 166 + bool bypass; 167 + 168 + parent_name = of_clk_get_parent_name(np, 0); 169 + of_property_read_string(np, "clock-output-names", &name); 170 + of_property_read_u32(np, "atmel,startup-time-usec", &startup); 171 + bypass = of_property_read_bool(np, "atmel,osc-bypass"); 172 + 173 + clk = at91_clk_register_slow_osc(sckcr, name, parent_name, startup, 174 + bypass); 175 + if (IS_ERR(clk)) 176 + return; 177 + 178 + of_clk_add_provider(np, of_clk_src_simple_get, clk); 179 + } 180 + 181 + static unsigned long clk_slow_rc_osc_recalc_rate(struct clk_hw *hw, 182 + unsigned long parent_rate) 183 + { 184 + struct clk_slow_rc_osc *osc = to_clk_slow_rc_osc(hw); 185 + 186 + return osc->frequency; 187 + } 188 + 189 + static unsigned long clk_slow_rc_osc_recalc_accuracy(struct clk_hw *hw, 190 + unsigned long parent_acc) 191 + { 192 + struct clk_slow_rc_osc *osc = to_clk_slow_rc_osc(hw); 193 + 194 + return osc->accuracy; 195 + } 196 + 197 + static int clk_slow_rc_osc_prepare(struct clk_hw *hw) 198 + { 199 + struct clk_slow_rc_osc *osc = to_clk_slow_rc_osc(hw); 200 + void __iomem *sckcr = osc->sckcr; 201 + 202 + writel(readl(sckcr) | AT91_SCKC_RCEN, sckcr); 203 + 204 + usleep_range(osc->startup_usec, osc->startup_usec + 1); 205 + 206 + return 0; 207 + } 208 + 209 + static void clk_slow_rc_osc_unprepare(struct clk_hw *hw) 210 + { 211 + struct clk_slow_rc_osc *osc = to_clk_slow_rc_osc(hw); 212 + void __iomem *sckcr = osc->sckcr; 213 + 214 + writel(readl(sckcr) & ~AT91_SCKC_RCEN, sckcr); 215 + } 216 + 217 + static int clk_slow_rc_osc_is_prepared(struct clk_hw *hw) 218 + { 219 + struct clk_slow_rc_osc *osc = to_clk_slow_rc_osc(hw); 220 + 221 + return !!(readl(osc->sckcr) & AT91_SCKC_RCEN); 222 + } 223 + 224 + static const struct clk_ops slow_rc_osc_ops = { 225 + .prepare = clk_slow_rc_osc_prepare, 226 + .unprepare = clk_slow_rc_osc_unprepare, 227 + .is_prepared = clk_slow_rc_osc_is_prepared, 228 + .recalc_rate = clk_slow_rc_osc_recalc_rate, 229 + .recalc_accuracy = clk_slow_rc_osc_recalc_accuracy, 230 + }; 231 + 232 + static struct clk * __init 233 + at91_clk_register_slow_rc_osc(void __iomem *sckcr, 234 + const char *name, 235 + unsigned long frequency, 236 + unsigned long accuracy, 237 + unsigned long startup) 238 + { 239 + struct clk_slow_rc_osc *osc; 240 + struct clk *clk = NULL; 241 + struct clk_init_data init; 242 + 243 + if (!sckcr || !name) 244 + return ERR_PTR(-EINVAL); 245 + 246 + osc = kzalloc(sizeof(*osc), GFP_KERNEL); 247 + if (!osc) 248 + return ERR_PTR(-ENOMEM); 249 + 250 + init.name = name; 251 + init.ops = &slow_rc_osc_ops; 252 + init.parent_names = NULL; 253 + init.num_parents = 0; 254 + init.flags = CLK_IS_ROOT | CLK_IGNORE_UNUSED; 255 + 256 + osc->hw.init = &init; 257 + osc->sckcr = sckcr; 258 + osc->frequency = frequency; 259 + osc->accuracy = accuracy; 260 + osc->startup_usec = startup; 261 + 262 + clk = clk_register(NULL, &osc->hw); 263 + if (IS_ERR(clk)) 264 + kfree(osc); 265 + 266 + return clk; 267 + } 268 + 269 + void __init of_at91sam9x5_clk_slow_rc_osc_setup(struct device_node *np, 270 + void __iomem *sckcr) 271 + { 272 + struct clk *clk; 273 + u32 frequency = 0; 274 + u32 accuracy = 0; 275 + u32 startup = 0; 276 + const char *name = np->name; 277 + 278 + of_property_read_string(np, "clock-output-names", &name); 279 + of_property_read_u32(np, "clock-frequency", &frequency); 280 + of_property_read_u32(np, "clock-accuracy", &accuracy); 281 + of_property_read_u32(np, "atmel,startup-time-usec", &startup); 282 + 283 + clk = at91_clk_register_slow_rc_osc(sckcr, name, frequency, accuracy, 284 + startup); 285 + if (IS_ERR(clk)) 286 + return; 287 + 288 + of_clk_add_provider(np, of_clk_src_simple_get, clk); 289 + } 290 + 291 + static int clk_sam9x5_slow_set_parent(struct clk_hw *hw, u8 index) 292 + { 293 + struct clk_sam9x5_slow *slowck = to_clk_sam9x5_slow(hw); 294 + void __iomem *sckcr = slowck->sckcr; 295 + u32 tmp; 296 + 297 + if (index > 1) 298 + return -EINVAL; 299 + 300 + tmp = readl(sckcr); 301 + 302 + if ((!index && !(tmp & AT91_SCKC_OSCSEL)) || 303 + (index && (tmp & AT91_SCKC_OSCSEL))) 304 + return 0; 305 + 306 + if (index) 307 + tmp |= AT91_SCKC_OSCSEL; 308 + else 309 + tmp &= ~AT91_SCKC_OSCSEL; 310 + 311 + writel(tmp, sckcr); 312 + 313 + usleep_range(SLOWCK_SW_TIME_USEC, SLOWCK_SW_TIME_USEC + 1); 314 + 315 + return 0; 316 + } 317 + 318 + static u8 clk_sam9x5_slow_get_parent(struct clk_hw *hw) 319 + { 320 + struct clk_sam9x5_slow *slowck = to_clk_sam9x5_slow(hw); 321 + 322 + return !!(readl(slowck->sckcr) & AT91_SCKC_OSCSEL); 323 + } 324 + 325 + static const struct clk_ops sam9x5_slow_ops = { 326 + .set_parent = clk_sam9x5_slow_set_parent, 327 + .get_parent = clk_sam9x5_slow_get_parent, 328 + }; 329 + 330 + static struct clk * __init 331 + at91_clk_register_sam9x5_slow(void __iomem *sckcr, 332 + const char *name, 333 + const char **parent_names, 334 + int num_parents) 335 + { 336 + struct clk_sam9x5_slow *slowck; 337 + struct clk *clk = NULL; 338 + struct clk_init_data init; 339 + 340 + if (!sckcr || !name || !parent_names || !num_parents) 341 + return ERR_PTR(-EINVAL); 342 + 343 + slowck = kzalloc(sizeof(*slowck), GFP_KERNEL); 344 + if (!slowck) 345 + return ERR_PTR(-ENOMEM); 346 + 347 + init.name = name; 348 + init.ops = &sam9x5_slow_ops; 349 + init.parent_names = parent_names; 350 + init.num_parents = num_parents; 351 + init.flags = 0; 352 + 353 + slowck->hw.init = &init; 354 + slowck->sckcr = sckcr; 355 + slowck->parent = !!(readl(sckcr) & AT91_SCKC_OSCSEL); 356 + 357 + clk = clk_register(NULL, &slowck->hw); 358 + if (IS_ERR(clk)) 359 + kfree(slowck); 360 + 361 + return clk; 362 + } 363 + 364 + void __init of_at91sam9x5_clk_slow_setup(struct device_node *np, 365 + void __iomem *sckcr) 366 + { 367 + struct clk *clk; 368 + const char *parent_names[2]; 369 + int num_parents; 370 + const char *name = np->name; 371 + int i; 372 + 373 + num_parents = of_count_phandle_with_args(np, "clocks", "#clock-cells"); 374 + if (num_parents <= 0 || num_parents > 2) 375 + return; 376 + 377 + for (i = 0; i < num_parents; ++i) { 378 + parent_names[i] = of_clk_get_parent_name(np, i); 379 + if (!parent_names[i]) 380 + return; 381 + } 382 + 383 + of_property_read_string(np, "clock-output-names", &name); 384 + 385 + clk = at91_clk_register_sam9x5_slow(sckcr, name, parent_names, 386 + num_parents); 387 + if (IS_ERR(clk)) 388 + return; 389 + 390 + of_clk_add_provider(np, of_clk_src_simple_get, clk); 391 + } 392 + 393 + static u8 clk_sam9260_slow_get_parent(struct clk_hw *hw) 394 + { 395 + struct clk_sam9260_slow *slowck = to_clk_sam9260_slow(hw); 396 + 397 + return !!(pmc_read(slowck->pmc, AT91_PMC_SR) & AT91_PMC_OSCSEL); 398 + } 399 + 400 + static const struct clk_ops sam9260_slow_ops = { 401 + .get_parent = clk_sam9260_slow_get_parent, 402 + }; 403 + 404 + static struct clk * __init 405 + at91_clk_register_sam9260_slow(struct at91_pmc *pmc, 406 + const char *name, 407 + const char **parent_names, 408 + int num_parents) 409 + { 410 + struct clk_sam9260_slow *slowck; 411 + struct clk *clk = NULL; 412 + struct clk_init_data init; 413 + 414 + if (!pmc || !name) 415 + return ERR_PTR(-EINVAL); 416 + 417 + if (!parent_names || !num_parents) 418 + return ERR_PTR(-EINVAL); 419 + 420 + slowck = kzalloc(sizeof(*slowck), GFP_KERNEL); 421 + if (!slowck) 422 + return ERR_PTR(-ENOMEM); 423 + 424 + init.name = name; 425 + init.ops = &sam9260_slow_ops; 426 + init.parent_names = parent_names; 427 + init.num_parents = num_parents; 428 + init.flags = 0; 429 + 430 + slowck->hw.init = &init; 431 + slowck->pmc = pmc; 432 + 433 + clk = clk_register(NULL, &slowck->hw); 434 + if (IS_ERR(clk)) 435 + kfree(slowck); 436 + 437 + return clk; 438 + } 439 + 440 + void __init of_at91sam9260_clk_slow_setup(struct device_node *np, 441 + struct at91_pmc *pmc) 442 + { 443 + struct clk *clk; 444 + const char *parent_names[2]; 445 + int num_parents; 446 + const char *name = np->name; 447 + int i; 448 + 449 + num_parents = of_count_phandle_with_args(np, "clocks", "#clock-cells"); 450 + if (num_parents <= 0 || num_parents > 1) 451 + return; 452 + 453 + for (i = 0; i < num_parents; ++i) { 454 + parent_names[i] = of_clk_get_parent_name(np, i); 455 + if (!parent_names[i]) 456 + return; 457 + } 458 + 459 + of_property_read_string(np, "clock-output-names", &name); 460 + 461 + clk = at91_clk_register_sam9260_slow(pmc, name, parent_names, 462 + num_parents); 463 + if (IS_ERR(clk)) 464 + return; 465 + 466 + of_clk_add_provider(np, of_clk_src_simple_get, clk); 467 + }
+17
drivers/clk/at91/pmc.c
··· 229 229 } 230 230 231 231 static const struct of_device_id pmc_clk_ids[] __initconst = { 232 + /* Slow oscillator */ 233 + { 234 + .compatible = "atmel,at91sam9260-clk-slow", 235 + .data = of_at91sam9260_clk_slow_setup, 236 + }, 232 237 /* Main clock */ 238 + { 239 + .compatible = "atmel,at91rm9200-clk-main-osc", 240 + .data = of_at91rm9200_clk_main_osc_setup, 241 + }, 242 + { 243 + .compatible = "atmel,at91sam9x5-clk-main-rc-osc", 244 + .data = of_at91sam9x5_clk_main_rc_osc_setup, 245 + }, 233 246 { 234 247 .compatible = "atmel,at91rm9200-clk-main", 235 248 .data = of_at91rm9200_clk_main_setup, 249 + }, 250 + { 251 + .compatible = "atmel,at91sam9x5-clk-main", 252 + .data = of_at91sam9x5_clk_main_setup, 236 253 }, 237 254 /* PLL clocks */ 238 255 {
+9
drivers/clk/at91/pmc.h
··· 58 58 int of_at91_get_clk_range(struct device_node *np, const char *propname, 59 59 struct clk_range *range); 60 60 61 + extern void __init of_at91sam9260_clk_slow_setup(struct device_node *np, 62 + struct at91_pmc *pmc); 63 + 64 + extern void __init of_at91rm9200_clk_main_osc_setup(struct device_node *np, 65 + struct at91_pmc *pmc); 66 + extern void __init of_at91sam9x5_clk_main_rc_osc_setup(struct device_node *np, 67 + struct at91_pmc *pmc); 61 68 extern void __init of_at91rm9200_clk_main_setup(struct device_node *np, 69 + struct at91_pmc *pmc); 70 + extern void __init of_at91sam9x5_clk_main_setup(struct device_node *np, 62 71 struct at91_pmc *pmc); 63 72 64 73 extern void __init of_at91rm9200_clk_pll_setup(struct device_node *np,
+57
drivers/clk/at91/sckc.c
··· 1 + /* 2 + * drivers/clk/at91/sckc.c 3 + * 4 + * Copyright (C) 2013 Boris BREZILLON <b.brezillon@overkiz.com> 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License as published by 8 + * the Free Software Foundation; either version 2 of the License, or 9 + * (at your option) any later version. 10 + * 11 + */ 12 + 13 + #include <linux/clk-provider.h> 14 + #include <linux/clkdev.h> 15 + #include <linux/of.h> 16 + #include <linux/of_address.h> 17 + #include <linux/io.h> 18 + 19 + #include "sckc.h" 20 + 21 + static const struct of_device_id sckc_clk_ids[] __initconst = { 22 + /* Slow clock */ 23 + { 24 + .compatible = "atmel,at91sam9x5-clk-slow-osc", 25 + .data = of_at91sam9x5_clk_slow_osc_setup, 26 + }, 27 + { 28 + .compatible = "atmel,at91sam9x5-clk-slow-rc-osc", 29 + .data = of_at91sam9x5_clk_slow_rc_osc_setup, 30 + }, 31 + { 32 + .compatible = "atmel,at91sam9x5-clk-slow", 33 + .data = of_at91sam9x5_clk_slow_setup, 34 + }, 35 + { /*sentinel*/ } 36 + }; 37 + 38 + static void __init of_at91sam9x5_sckc_setup(struct device_node *np) 39 + { 40 + struct device_node *childnp; 41 + void (*clk_setup)(struct device_node *, void __iomem *); 42 + const struct of_device_id *clk_id; 43 + void __iomem *regbase = of_iomap(np, 0); 44 + 45 + if (!regbase) 46 + return; 47 + 48 + for_each_child_of_node(np, childnp) { 49 + clk_id = of_match_node(sckc_clk_ids, childnp); 50 + if (!clk_id) 51 + continue; 52 + clk_setup = clk_id->data; 53 + clk_setup(childnp, regbase); 54 + } 55 + } 56 + CLK_OF_DECLARE(at91sam9x5_clk_sckc, "atmel,at91sam9x5-sckc", 57 + of_at91sam9x5_sckc_setup);
+22
drivers/clk/at91/sckc.h
··· 1 + /* 2 + * drivers/clk/at91/sckc.h 3 + * 4 + * Copyright (C) 2013 Boris BREZILLON <b.brezillon@overkiz.com> 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License as published by 8 + * the Free Software Foundation; either version 2 of the License, or 9 + * (at your option) any later version. 10 + */ 11 + 12 + #ifndef __AT91_SCKC_H_ 13 + #define __AT91_SCKC_H_ 14 + 15 + extern void __init of_at91sam9x5_clk_slow_osc_setup(struct device_node *np, 16 + void __iomem *sckcr); 17 + extern void __init of_at91sam9x5_clk_slow_rc_osc_setup(struct device_node *np, 18 + void __iomem *sckcr); 19 + extern void __init of_at91sam9x5_clk_slow_setup(struct device_node *np, 20 + void __iomem *sckcr); 21 + 22 + #endif /* __AT91_SCKC_H_ */
+295 -51
drivers/iio/adc/at91_adc.c
··· 31 31 #include <linux/iio/trigger_consumer.h> 32 32 #include <linux/iio/triggered_buffer.h> 33 33 34 - #include <mach/at91_adc.h> 34 + /* Registers */ 35 + #define AT91_ADC_CR 0x00 /* Control Register */ 36 + #define AT91_ADC_SWRST (1 << 0) /* Software Reset */ 37 + #define AT91_ADC_START (1 << 1) /* Start Conversion */ 38 + 39 + #define AT91_ADC_MR 0x04 /* Mode Register */ 40 + #define AT91_ADC_TSAMOD (3 << 0) /* ADC mode */ 41 + #define AT91_ADC_TSAMOD_ADC_ONLY_MODE (0 << 0) /* ADC Mode */ 42 + #define AT91_ADC_TSAMOD_TS_ONLY_MODE (1 << 0) /* Touch Screen Only Mode */ 43 + #define AT91_ADC_TRGEN (1 << 0) /* Trigger Enable */ 44 + #define AT91_ADC_TRGSEL (7 << 1) /* Trigger Selection */ 45 + #define AT91_ADC_TRGSEL_TC0 (0 << 1) 46 + #define AT91_ADC_TRGSEL_TC1 (1 << 1) 47 + #define AT91_ADC_TRGSEL_TC2 (2 << 1) 48 + #define AT91_ADC_TRGSEL_EXTERNAL (6 << 1) 49 + #define AT91_ADC_LOWRES (1 << 4) /* Low Resolution */ 50 + #define AT91_ADC_SLEEP (1 << 5) /* Sleep Mode */ 51 + #define AT91_ADC_PENDET (1 << 6) /* Pen contact detection enable */ 52 + #define AT91_ADC_PRESCAL_9260 (0x3f << 8) /* Prescalar Rate Selection */ 53 + #define AT91_ADC_PRESCAL_9G45 (0xff << 8) 54 + #define AT91_ADC_PRESCAL_(x) ((x) << 8) 55 + #define AT91_ADC_STARTUP_9260 (0x1f << 16) /* Startup Up Time */ 56 + #define AT91_ADC_STARTUP_9G45 (0x7f << 16) 57 + #define AT91_ADC_STARTUP_9X5 (0xf << 16) 58 + #define AT91_ADC_STARTUP_(x) ((x) << 16) 59 + #define AT91_ADC_SHTIM (0xf << 24) /* Sample & Hold Time */ 60 + #define AT91_ADC_SHTIM_(x) ((x) << 24) 61 + #define AT91_ADC_PENDBC (0x0f << 28) /* Pen Debounce time */ 62 + #define AT91_ADC_PENDBC_(x) ((x) << 28) 63 + 64 + #define AT91_ADC_TSR 0x0C 65 + #define AT91_ADC_TSR_SHTIM (0xf << 24) /* Sample & Hold Time */ 66 + #define AT91_ADC_TSR_SHTIM_(x) ((x) << 24) 67 + 68 + #define AT91_ADC_CHER 0x10 /* Channel Enable Register */ 69 + #define AT91_ADC_CHDR 0x14 /* Channel Disable Register */ 70 + #define AT91_ADC_CHSR 0x18 /* Channel Status Register */ 71 + #define AT91_ADC_CH(n) (1 << (n)) /* Channel Number */ 72 + 73 + #define AT91_ADC_SR 0x1C /* Status Register */ 74 + #define AT91_ADC_EOC(n) (1 << (n)) /* End of Conversion on Channel N */ 75 + #define AT91_ADC_OVRE(n) (1 << ((n) + 8))/* Overrun Error on Channel N */ 76 + #define AT91_ADC_DRDY (1 << 16) /* Data Ready */ 77 + #define AT91_ADC_GOVRE (1 << 17) /* General Overrun Error */ 78 + #define AT91_ADC_ENDRX (1 << 18) /* End of RX Buffer */ 79 + #define AT91_ADC_RXFUFF (1 << 19) /* RX Buffer Full */ 80 + 81 + #define AT91_ADC_SR_9X5 0x30 /* Status Register for 9x5 */ 82 + #define AT91_ADC_SR_DRDY_9X5 (1 << 24) /* Data Ready */ 83 + 84 + #define AT91_ADC_LCDR 0x20 /* Last Converted Data Register */ 85 + #define AT91_ADC_LDATA (0x3ff) 86 + 87 + #define AT91_ADC_IER 0x24 /* Interrupt Enable Register */ 88 + #define AT91_ADC_IDR 0x28 /* Interrupt Disable Register */ 89 + #define AT91_ADC_IMR 0x2C /* Interrupt Mask Register */ 90 + #define AT91RL_ADC_IER_PEN (1 << 20) 91 + #define AT91RL_ADC_IER_NOPEN (1 << 21) 92 + #define AT91_ADC_IER_PEN (1 << 29) 93 + #define AT91_ADC_IER_NOPEN (1 << 30) 94 + #define AT91_ADC_IER_XRDY (1 << 20) 95 + #define AT91_ADC_IER_YRDY (1 << 21) 96 + #define AT91_ADC_IER_PRDY (1 << 22) 97 + #define AT91_ADC_ISR_PENS (1 << 31) 98 + 99 + #define AT91_ADC_CHR(n) (0x30 + ((n) * 4)) /* Channel Data Register N */ 100 + #define AT91_ADC_DATA (0x3ff) 101 + 102 + #define AT91_ADC_CDR0_9X5 (0x50) /* Channel Data Register 0 for 9X5 */ 103 + 104 + #define AT91_ADC_ACR 0x94 /* Analog Control Register */ 105 + #define AT91_ADC_ACR_PENDETSENS (0x3 << 0) /* pull-up resistor */ 106 + 107 + #define AT91_ADC_TSMR 0xB0 108 + #define AT91_ADC_TSMR_TSMODE (3 << 0) /* Touch Screen Mode */ 109 + #define AT91_ADC_TSMR_TSMODE_NONE (0 << 0) 110 + #define AT91_ADC_TSMR_TSMODE_4WIRE_NO_PRESS (1 << 0) 111 + #define AT91_ADC_TSMR_TSMODE_4WIRE_PRESS (2 << 0) 112 + #define AT91_ADC_TSMR_TSMODE_5WIRE (3 << 0) 113 + #define AT91_ADC_TSMR_TSAV (3 << 4) /* Averages samples */ 114 + #define AT91_ADC_TSMR_TSAV_(x) ((x) << 4) 115 + #define AT91_ADC_TSMR_SCTIM (0x0f << 16) /* Switch closure time */ 116 + #define AT91_ADC_TSMR_PENDBC (0x0f << 28) /* Pen Debounce time */ 117 + #define AT91_ADC_TSMR_PENDBC_(x) ((x) << 28) 118 + #define AT91_ADC_TSMR_NOTSDMA (1 << 22) /* No Touchscreen DMA */ 119 + #define AT91_ADC_TSMR_PENDET_DIS (0 << 24) /* Pen contact detection disable */ 120 + #define AT91_ADC_TSMR_PENDET_ENA (1 << 24) /* Pen contact detection enable */ 121 + 122 + #define AT91_ADC_TSXPOSR 0xB4 123 + #define AT91_ADC_TSYPOSR 0xB8 124 + #define AT91_ADC_TSPRESSR 0xBC 125 + 126 + #define AT91_ADC_TRGR_9260 AT91_ADC_MR 127 + #define AT91_ADC_TRGR_9G45 0x08 128 + #define AT91_ADC_TRGR_9X5 0xC0 129 + 130 + /* Trigger Register bit field */ 131 + #define AT91_ADC_TRGR_TRGPER (0xffff << 16) 132 + #define AT91_ADC_TRGR_TRGPER_(x) ((x) << 16) 133 + #define AT91_ADC_TRGR_TRGMOD (0x7 << 0) 134 + #define AT91_ADC_TRGR_NONE (0 << 0) 135 + #define AT91_ADC_TRGR_MOD_PERIOD_TRIG (5 << 0) 35 136 36 137 #define AT91_ADC_CHAN(st, ch) \ 37 138 (st->registers->channel_base + (ch * 4)) ··· 146 45 147 46 #define TOUCH_SAMPLE_PERIOD_US 2000 /* 2ms */ 148 47 #define TOUCH_PEN_DETECT_DEBOUNCE_US 200 48 + 49 + #define MAX_RLPOS_BITS 10 50 + #define TOUCH_SAMPLE_PERIOD_US_RL 10000 /* 10ms, the SoC can't keep up with 2ms */ 51 + #define TOUCH_SHTIM 0xa 52 + 53 + /** 54 + * struct at91_adc_reg_desc - Various informations relative to registers 55 + * @channel_base: Base offset for the channel data registers 56 + * @drdy_mask: Mask of the DRDY field in the relevant registers 57 + (Interruptions registers mostly) 58 + * @status_register: Offset of the Interrupt Status Register 59 + * @trigger_register: Offset of the Trigger setup register 60 + * @mr_prescal_mask: Mask of the PRESCAL field in the adc MR register 61 + * @mr_startup_mask: Mask of the STARTUP field in the adc MR register 62 + */ 63 + struct at91_adc_reg_desc { 64 + u8 channel_base; 65 + u32 drdy_mask; 66 + u8 status_register; 67 + u8 trigger_register; 68 + u32 mr_prescal_mask; 69 + u32 mr_startup_mask; 70 + }; 149 71 150 72 struct at91_adc_caps { 151 73 bool has_ts; /* Support touch screen */ ··· 186 62 187 63 u8 num_channels; 188 64 struct at91_adc_reg_desc registers; 189 - }; 190 - 191 - enum atmel_adc_ts_type { 192 - ATMEL_ADC_TOUCHSCREEN_NONE = 0, 193 - ATMEL_ADC_TOUCHSCREEN_4WIRE = 4, 194 - ATMEL_ADC_TOUCHSCREEN_5WIRE = 5, 195 65 }; 196 66 197 67 struct at91_adc_state { ··· 232 114 233 115 u16 ts_sample_period_val; 234 116 u32 ts_pressure_threshold; 117 + u16 ts_pendbc; 118 + 119 + bool ts_bufferedmeasure; 120 + u32 ts_prev_absx; 121 + u32 ts_prev_absy; 235 122 }; 236 123 237 124 static irqreturn_t at91_adc_trigger_handler(int irq, void *p) ··· 343 220 return 0; 344 221 } 345 222 346 - static irqreturn_t at91_adc_interrupt(int irq, void *private) 223 + static irqreturn_t at91_adc_rl_interrupt(int irq, void *private) 224 + { 225 + struct iio_dev *idev = private; 226 + struct at91_adc_state *st = iio_priv(idev); 227 + u32 status = at91_adc_readl(st, st->registers->status_register); 228 + unsigned int reg; 229 + 230 + status &= at91_adc_readl(st, AT91_ADC_IMR); 231 + if (status & st->registers->drdy_mask) 232 + handle_adc_eoc_trigger(irq, idev); 233 + 234 + if (status & AT91RL_ADC_IER_PEN) { 235 + /* Disabling pen debounce is required to get a NOPEN irq */ 236 + reg = at91_adc_readl(st, AT91_ADC_MR); 237 + reg &= ~AT91_ADC_PENDBC; 238 + at91_adc_writel(st, AT91_ADC_MR, reg); 239 + 240 + at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_PEN); 241 + at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_NOPEN 242 + | AT91_ADC_EOC(3)); 243 + /* Set up period trigger for sampling */ 244 + at91_adc_writel(st, st->registers->trigger_register, 245 + AT91_ADC_TRGR_MOD_PERIOD_TRIG | 246 + AT91_ADC_TRGR_TRGPER_(st->ts_sample_period_val)); 247 + } else if (status & AT91RL_ADC_IER_NOPEN) { 248 + reg = at91_adc_readl(st, AT91_ADC_MR); 249 + reg |= AT91_ADC_PENDBC_(st->ts_pendbc) & AT91_ADC_PENDBC; 250 + at91_adc_writel(st, AT91_ADC_MR, reg); 251 + at91_adc_writel(st, st->registers->trigger_register, 252 + AT91_ADC_TRGR_NONE); 253 + 254 + at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_NOPEN 255 + | AT91_ADC_EOC(3)); 256 + at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_PEN); 257 + st->ts_bufferedmeasure = false; 258 + input_report_key(st->ts_input, BTN_TOUCH, 0); 259 + input_sync(st->ts_input); 260 + } else if (status & AT91_ADC_EOC(3)) { 261 + /* Conversion finished */ 262 + if (st->ts_bufferedmeasure) { 263 + /* 264 + * Last measurement is always discarded, since it can 265 + * be erroneous. 266 + * Always report previous measurement 267 + */ 268 + input_report_abs(st->ts_input, ABS_X, st->ts_prev_absx); 269 + input_report_abs(st->ts_input, ABS_Y, st->ts_prev_absy); 270 + input_report_key(st->ts_input, BTN_TOUCH, 1); 271 + input_sync(st->ts_input); 272 + } else 273 + st->ts_bufferedmeasure = true; 274 + 275 + /* Now make new measurement */ 276 + st->ts_prev_absx = at91_adc_readl(st, AT91_ADC_CHAN(st, 3)) 277 + << MAX_RLPOS_BITS; 278 + st->ts_prev_absx /= at91_adc_readl(st, AT91_ADC_CHAN(st, 2)); 279 + 280 + st->ts_prev_absy = at91_adc_readl(st, AT91_ADC_CHAN(st, 1)) 281 + << MAX_RLPOS_BITS; 282 + st->ts_prev_absy /= at91_adc_readl(st, AT91_ADC_CHAN(st, 0)); 283 + } 284 + 285 + return IRQ_HANDLED; 286 + } 287 + 288 + static irqreturn_t at91_adc_9x5_interrupt(int irq, void *private) 347 289 { 348 290 struct iio_dev *idev = private; 349 291 struct at91_adc_state *st = iio_priv(idev); ··· 841 653 return -EINVAL; 842 654 } 843 655 656 + if (!st->caps->has_tsmr) 657 + return 0; 844 658 prop = 0; 845 659 of_property_read_u32(node, "atmel,adc-ts-pressure-threshold", &prop); 846 660 st->ts_pressure_threshold = prop; ··· 966 776 st->trigger_number = pdata->trigger_number; 967 777 st->trigger_list = pdata->trigger_list; 968 778 st->registers = &st->caps->registers; 779 + st->touchscreen_type = pdata->touchscreen_type; 969 780 970 781 return 0; 971 782 } ··· 981 790 { 982 791 struct at91_adc_state *st = input_get_drvdata(dev); 983 792 984 - at91_adc_writel(st, AT91_ADC_IER, AT91_ADC_IER_PEN); 793 + if (st->caps->has_tsmr) 794 + at91_adc_writel(st, AT91_ADC_IER, AT91_ADC_IER_PEN); 795 + else 796 + at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_PEN); 985 797 return 0; 986 798 } 987 799 ··· 992 798 { 993 799 struct at91_adc_state *st = input_get_drvdata(dev); 994 800 995 - at91_adc_writel(st, AT91_ADC_IDR, AT91_ADC_IER_PEN); 801 + if (st->caps->has_tsmr) 802 + at91_adc_writel(st, AT91_ADC_IDR, AT91_ADC_IER_PEN); 803 + else 804 + at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_PEN); 996 805 } 997 806 998 807 static int at91_ts_hw_init(struct at91_adc_state *st, u32 adc_clk_khz) 999 808 { 1000 - u32 reg = 0, pendbc; 809 + u32 reg = 0; 1001 810 int i = 0; 811 + 812 + /* a Pen Detect Debounce Time is necessary for the ADC Touch to avoid 813 + * pen detect noise. 814 + * The formula is : Pen Detect Debounce Time = (2 ^ pendbc) / ADCClock 815 + */ 816 + st->ts_pendbc = round_up(TOUCH_PEN_DETECT_DEBOUNCE_US * adc_clk_khz / 817 + 1000, 1); 818 + 819 + while (st->ts_pendbc >> ++i) 820 + ; /* Empty! Find the shift offset */ 821 + if (abs(st->ts_pendbc - (1 << i)) < abs(st->ts_pendbc - (1 << (i - 1)))) 822 + st->ts_pendbc = i; 823 + else 824 + st->ts_pendbc = i - 1; 825 + 826 + if (!st->caps->has_tsmr) { 827 + reg = at91_adc_readl(st, AT91_ADC_MR); 828 + reg |= AT91_ADC_TSAMOD_TS_ONLY_MODE | AT91_ADC_PENDET; 829 + 830 + reg |= AT91_ADC_PENDBC_(st->ts_pendbc) & AT91_ADC_PENDBC; 831 + at91_adc_writel(st, AT91_ADC_MR, reg); 832 + 833 + reg = AT91_ADC_TSR_SHTIM_(TOUCH_SHTIM) & AT91_ADC_TSR_SHTIM; 834 + at91_adc_writel(st, AT91_ADC_TSR, reg); 835 + 836 + st->ts_sample_period_val = round_up((TOUCH_SAMPLE_PERIOD_US_RL * 837 + adc_clk_khz / 1000) - 1, 1); 838 + 839 + return 0; 840 + } 1002 841 1003 842 if (st->touchscreen_type == ATMEL_ADC_TOUCHSCREEN_4WIRE) 1004 843 reg = AT91_ADC_TSMR_TSMODE_4WIRE_PRESS; 1005 844 else 1006 845 reg = AT91_ADC_TSMR_TSMODE_5WIRE; 1007 846 1008 - /* a Pen Detect Debounce Time is necessary for the ADC Touch to avoid 1009 - * pen detect noise. 1010 - * The formula is : Pen Detect Debounce Time = (2 ^ pendbc) / ADCClock 1011 - */ 1012 - pendbc = round_up(TOUCH_PEN_DETECT_DEBOUNCE_US * adc_clk_khz / 1000, 1); 847 + reg |= AT91_ADC_TSMR_TSAV_(st->caps->ts_filter_average) 848 + & AT91_ADC_TSMR_TSAV; 849 + reg |= AT91_ADC_TSMR_PENDBC_(st->ts_pendbc) & AT91_ADC_TSMR_PENDBC; 850 + reg |= AT91_ADC_TSMR_NOTSDMA; 851 + reg |= AT91_ADC_TSMR_PENDET_ENA; 852 + reg |= 0x03 << 8; /* TSFREQ, needs to be bigger than TSAV */ 1013 853 1014 - while (pendbc >> ++i) 1015 - ; /* Empty! Find the shift offset */ 1016 - if (abs(pendbc - (1 << i)) < abs(pendbc - (1 << (i - 1)))) 1017 - pendbc = i; 1018 - else 1019 - pendbc = i - 1; 1020 - 1021 - if (st->caps->has_tsmr) { 1022 - reg |= AT91_ADC_TSMR_TSAV_(st->caps->ts_filter_average) 1023 - & AT91_ADC_TSMR_TSAV; 1024 - reg |= AT91_ADC_TSMR_PENDBC_(pendbc) & AT91_ADC_TSMR_PENDBC; 1025 - reg |= AT91_ADC_TSMR_NOTSDMA; 1026 - reg |= AT91_ADC_TSMR_PENDET_ENA; 1027 - reg |= 0x03 << 8; /* TSFREQ, need bigger than TSAV */ 1028 - 1029 - at91_adc_writel(st, AT91_ADC_TSMR, reg); 1030 - } else { 1031 - /* TODO: for 9g45 which has no TSMR */ 1032 - } 854 + at91_adc_writel(st, AT91_ADC_TSMR, reg); 1033 855 1034 856 /* Change adc internal resistor value for better pen detection, 1035 857 * default value is 100 kOhm. ··· 1055 845 at91_adc_writel(st, AT91_ADC_ACR, st->caps->ts_pen_detect_sensitivity 1056 846 & AT91_ADC_ACR_PENDETSENS); 1057 847 1058 - /* Sample Peroid Time = (TRGPER + 1) / ADCClock */ 848 + /* Sample Period Time = (TRGPER + 1) / ADCClock */ 1059 849 st->ts_sample_period_val = round_up((TOUCH_SAMPLE_PERIOD_US * 1060 850 adc_clk_khz / 1000) - 1, 1); 1061 851 ··· 1084 874 __set_bit(EV_ABS, input->evbit); 1085 875 __set_bit(EV_KEY, input->evbit); 1086 876 __set_bit(BTN_TOUCH, input->keybit); 1087 - input_set_abs_params(input, ABS_X, 0, (1 << MAX_POS_BITS) - 1, 0, 0); 1088 - input_set_abs_params(input, ABS_Y, 0, (1 << MAX_POS_BITS) - 1, 0, 0); 1089 - input_set_abs_params(input, ABS_PRESSURE, 0, 0xffffff, 0, 0); 877 + if (st->caps->has_tsmr) { 878 + input_set_abs_params(input, ABS_X, 0, (1 << MAX_POS_BITS) - 1, 879 + 0, 0); 880 + input_set_abs_params(input, ABS_Y, 0, (1 << MAX_POS_BITS) - 1, 881 + 0, 0); 882 + input_set_abs_params(input, ABS_PRESSURE, 0, 0xffffff, 0, 0); 883 + } else { 884 + if (st->touchscreen_type != ATMEL_ADC_TOUCHSCREEN_4WIRE) { 885 + dev_err(&pdev->dev, 886 + "This touchscreen controller only support 4 wires\n"); 887 + ret = -EINVAL; 888 + goto err; 889 + } 890 + 891 + input_set_abs_params(input, ABS_X, 0, (1 << MAX_RLPOS_BITS) - 1, 892 + 0, 0); 893 + input_set_abs_params(input, ABS_Y, 0, (1 << MAX_RLPOS_BITS) - 1, 894 + 0, 0); 895 + } 1090 896 1091 897 st->ts_input = input; 1092 898 input_set_drvdata(input, st); 1093 899 1094 900 ret = input_register_device(input); 1095 901 if (ret) 1096 - input_free_device(st->ts_input); 902 + goto err; 1097 903 904 + return ret; 905 + 906 + err: 907 + input_free_device(st->ts_input); 1098 908 return ret; 1099 909 } 1100 910 ··· 1173 943 */ 1174 944 at91_adc_writel(st, AT91_ADC_CR, AT91_ADC_SWRST); 1175 945 at91_adc_writel(st, AT91_ADC_IDR, 0xFFFFFFFF); 1176 - ret = request_irq(st->irq, 1177 - at91_adc_interrupt, 1178 - 0, 1179 - pdev->dev.driver->name, 1180 - idev); 946 + 947 + if (st->caps->has_tsmr) 948 + ret = request_irq(st->irq, at91_adc_9x5_interrupt, 0, 949 + pdev->dev.driver->name, idev); 950 + else 951 + ret = request_irq(st->irq, at91_adc_rl_interrupt, 0, 952 + pdev->dev.driver->name, idev); 1181 953 if (ret) { 1182 954 dev_err(&pdev->dev, "Failed to allocate IRQ.\n"); 1183 955 return ret; ··· 1283 1051 goto error_disable_adc_clk; 1284 1052 } 1285 1053 } else { 1286 - if (!st->caps->has_tsmr) { 1287 - dev_err(&pdev->dev, "We don't support non-TSMR adc\n"); 1288 - ret = -ENODEV; 1289 - goto error_disable_adc_clk; 1290 - } 1291 - 1292 1054 ret = at91_ts_register(st, pdev); 1293 1055 if (ret) 1294 1056 goto error_disable_adc_clk; ··· 1346 1120 }, 1347 1121 }; 1348 1122 1123 + static struct at91_adc_caps at91sam9rl_caps = { 1124 + .has_ts = true, 1125 + .calc_startup_ticks = calc_startup_ticks_9260, /* same as 9260 */ 1126 + .num_channels = 6, 1127 + .registers = { 1128 + .channel_base = AT91_ADC_CHR(0), 1129 + .drdy_mask = AT91_ADC_DRDY, 1130 + .status_register = AT91_ADC_SR, 1131 + .trigger_register = AT91_ADC_TRGR_9G45, 1132 + .mr_prescal_mask = AT91_ADC_PRESCAL_9260, 1133 + .mr_startup_mask = AT91_ADC_STARTUP_9G45, 1134 + }, 1135 + }; 1136 + 1349 1137 static struct at91_adc_caps at91sam9g45_caps = { 1350 1138 .has_ts = true, 1351 1139 .calc_startup_ticks = calc_startup_ticks_9260, /* same as 9260 */ ··· 1394 1154 1395 1155 static const struct of_device_id at91_adc_dt_ids[] = { 1396 1156 { .compatible = "atmel,at91sam9260-adc", .data = &at91sam9260_caps }, 1157 + { .compatible = "atmel,at91sam9rl-adc", .data = &at91sam9rl_caps }, 1397 1158 { .compatible = "atmel,at91sam9g45-adc", .data = &at91sam9g45_caps }, 1398 1159 { .compatible = "atmel,at91sam9x5-adc", .data = &at91sam9x5_caps }, 1399 1160 {}, ··· 1405 1164 { 1406 1165 .name = "at91sam9260-adc", 1407 1166 .driver_data = (unsigned long)&at91sam9260_caps, 1167 + }, { 1168 + .name = "at91sam9rl-adc", 1169 + .driver_data = (unsigned long)&at91sam9rl_caps, 1408 1170 }, { 1409 1171 .name = "at91sam9g45-adc", 1410 1172 .driver_data = (unsigned long)&at91sam9g45_caps,
-12
drivers/input/touchscreen/Kconfig
··· 550 550 To compile this driver as a module, choose M here: the 551 551 module will be called ti_am335x_tsc. 552 552 553 - config TOUCHSCREEN_ATMEL_TSADCC 554 - tristate "Atmel Touchscreen Interface" 555 - depends on ARCH_AT91 556 - help 557 - Say Y here if you have a 4-wire touchscreen connected to the 558 - ADC Controller on your Atmel SoC. 559 - 560 - If unsure, say N. 561 - 562 - To compile this driver as a module, choose M here: the 563 - module will be called atmel_tsadcc. 564 - 565 553 config TOUCHSCREEN_UCB1400 566 554 tristate "Philips UCB1400 touchscreen" 567 555 depends on AC97_BUS
-1
drivers/input/touchscreen/Makefile
··· 13 13 obj-$(CONFIG_TOUCHSCREEN_AD7879_SPI) += ad7879-spi.o 14 14 obj-$(CONFIG_TOUCHSCREEN_ADS7846) += ads7846.o 15 15 obj-$(CONFIG_TOUCHSCREEN_ATMEL_MXT) += atmel_mxt_ts.o 16 - obj-$(CONFIG_TOUCHSCREEN_ATMEL_TSADCC) += atmel_tsadcc.o 17 16 obj-$(CONFIG_TOUCHSCREEN_AUO_PIXCIR) += auo-pixcir-ts.o 18 17 obj-$(CONFIG_TOUCHSCREEN_BU21013) += bu21013_ts.o 19 18 obj-$(CONFIG_TOUCHSCREEN_CY8CTMG110) += cy8ctmg110_ts.o
-358
drivers/input/touchscreen/atmel_tsadcc.c
··· 1 - /* 2 - * Atmel Touch Screen Driver 3 - * 4 - * Copyright (c) 2008 ATMEL 5 - * Copyright (c) 2008 Dan Liang 6 - * Copyright (c) 2008 TimeSys Corporation 7 - * Copyright (c) 2008 Justin Waters 8 - * 9 - * Based on touchscreen code from Atmel Corporation. 10 - * 11 - * This program is free software; you can redistribute it and/or modify 12 - * it under the terms of the GNU General Public License version 2 as 13 - * published by the Free Software Foundation. 14 - */ 15 - #include <linux/err.h> 16 - #include <linux/kernel.h> 17 - #include <linux/module.h> 18 - #include <linux/input.h> 19 - #include <linux/slab.h> 20 - #include <linux/interrupt.h> 21 - #include <linux/clk.h> 22 - #include <linux/platform_device.h> 23 - #include <linux/io.h> 24 - #include <linux/platform_data/atmel.h> 25 - #include <mach/cpu.h> 26 - 27 - /* Register definitions based on AT91SAM9RL64 preliminary draft datasheet */ 28 - 29 - #define ATMEL_TSADCC_CR 0x00 /* Control register */ 30 - #define ATMEL_TSADCC_SWRST (1 << 0) /* Software Reset*/ 31 - #define ATMEL_TSADCC_START (1 << 1) /* Start conversion */ 32 - 33 - #define ATMEL_TSADCC_MR 0x04 /* Mode register */ 34 - #define ATMEL_TSADCC_TSAMOD (3 << 0) /* ADC mode */ 35 - #define ATMEL_TSADCC_TSAMOD_ADC_ONLY_MODE (0x0) /* ADC Mode */ 36 - #define ATMEL_TSADCC_TSAMOD_TS_ONLY_MODE (0x1) /* Touch Screen Only Mode */ 37 - #define ATMEL_TSADCC_LOWRES (1 << 4) /* Resolution selection */ 38 - #define ATMEL_TSADCC_SLEEP (1 << 5) /* Sleep mode */ 39 - #define ATMEL_TSADCC_PENDET (1 << 6) /* Pen Detect selection */ 40 - #define ATMEL_TSADCC_PRES (1 << 7) /* Pressure Measurement Selection */ 41 - #define ATMEL_TSADCC_PRESCAL (0x3f << 8) /* Prescalar Rate Selection */ 42 - #define ATMEL_TSADCC_EPRESCAL (0xff << 8) /* Prescalar Rate Selection (Extended) */ 43 - #define ATMEL_TSADCC_STARTUP (0x7f << 16) /* Start Up time */ 44 - #define ATMEL_TSADCC_SHTIM (0xf << 24) /* Sample & Hold time */ 45 - #define ATMEL_TSADCC_PENDBC (0xf << 28) /* Pen Detect debouncing time */ 46 - 47 - #define ATMEL_TSADCC_TRGR 0x08 /* Trigger register */ 48 - #define ATMEL_TSADCC_TRGMOD (7 << 0) /* Trigger mode */ 49 - #define ATMEL_TSADCC_TRGMOD_NONE (0 << 0) 50 - #define ATMEL_TSADCC_TRGMOD_EXT_RISING (1 << 0) 51 - #define ATMEL_TSADCC_TRGMOD_EXT_FALLING (2 << 0) 52 - #define ATMEL_TSADCC_TRGMOD_EXT_ANY (3 << 0) 53 - #define ATMEL_TSADCC_TRGMOD_PENDET (4 << 0) 54 - #define ATMEL_TSADCC_TRGMOD_PERIOD (5 << 0) 55 - #define ATMEL_TSADCC_TRGMOD_CONTINUOUS (6 << 0) 56 - #define ATMEL_TSADCC_TRGPER (0xffff << 16) /* Trigger period */ 57 - 58 - #define ATMEL_TSADCC_TSR 0x0C /* Touch Screen register */ 59 - #define ATMEL_TSADCC_TSFREQ (0xf << 0) /* TS Frequency in Interleaved mode */ 60 - #define ATMEL_TSADCC_TSSHTIM (0xf << 24) /* Sample & Hold time */ 61 - 62 - #define ATMEL_TSADCC_CHER 0x10 /* Channel Enable register */ 63 - #define ATMEL_TSADCC_CHDR 0x14 /* Channel Disable register */ 64 - #define ATMEL_TSADCC_CHSR 0x18 /* Channel Status register */ 65 - #define ATMEL_TSADCC_CH(n) (1 << (n)) /* Channel number */ 66 - 67 - #define ATMEL_TSADCC_SR 0x1C /* Status register */ 68 - #define ATMEL_TSADCC_EOC(n) (1 << ((n)+0)) /* End of conversion for channel N */ 69 - #define ATMEL_TSADCC_OVRE(n) (1 << ((n)+8)) /* Overrun error for channel N */ 70 - #define ATMEL_TSADCC_DRDY (1 << 16) /* Data Ready */ 71 - #define ATMEL_TSADCC_GOVRE (1 << 17) /* General Overrun Error */ 72 - #define ATMEL_TSADCC_ENDRX (1 << 18) /* End of RX Buffer */ 73 - #define ATMEL_TSADCC_RXBUFF (1 << 19) /* TX Buffer full */ 74 - #define ATMEL_TSADCC_PENCNT (1 << 20) /* Pen contact */ 75 - #define ATMEL_TSADCC_NOCNT (1 << 21) /* No contact */ 76 - 77 - #define ATMEL_TSADCC_LCDR 0x20 /* Last Converted Data register */ 78 - #define ATMEL_TSADCC_DATA (0x3ff << 0) /* Channel data */ 79 - 80 - #define ATMEL_TSADCC_IER 0x24 /* Interrupt Enable register */ 81 - #define ATMEL_TSADCC_IDR 0x28 /* Interrupt Disable register */ 82 - #define ATMEL_TSADCC_IMR 0x2C /* Interrupt Mask register */ 83 - #define ATMEL_TSADCC_CDR0 0x30 /* Channel Data 0 */ 84 - #define ATMEL_TSADCC_CDR1 0x34 /* Channel Data 1 */ 85 - #define ATMEL_TSADCC_CDR2 0x38 /* Channel Data 2 */ 86 - #define ATMEL_TSADCC_CDR3 0x3C /* Channel Data 3 */ 87 - #define ATMEL_TSADCC_CDR4 0x40 /* Channel Data 4 */ 88 - #define ATMEL_TSADCC_CDR5 0x44 /* Channel Data 5 */ 89 - 90 - #define ATMEL_TSADCC_XPOS 0x50 91 - #define ATMEL_TSADCC_Z1DAT 0x54 92 - #define ATMEL_TSADCC_Z2DAT 0x58 93 - 94 - #define PRESCALER_VAL(x) ((x) >> 8) 95 - 96 - #define ADC_DEFAULT_CLOCK 100000 97 - 98 - struct atmel_tsadcc { 99 - struct input_dev *input; 100 - char phys[32]; 101 - struct clk *clk; 102 - int irq; 103 - unsigned int prev_absx; 104 - unsigned int prev_absy; 105 - unsigned char bufferedmeasure; 106 - }; 107 - 108 - static void __iomem *tsc_base; 109 - 110 - #define atmel_tsadcc_read(reg) __raw_readl(tsc_base + (reg)) 111 - #define atmel_tsadcc_write(reg, val) __raw_writel((val), tsc_base + (reg)) 112 - 113 - static irqreturn_t atmel_tsadcc_interrupt(int irq, void *dev) 114 - { 115 - struct atmel_tsadcc *ts_dev = (struct atmel_tsadcc *)dev; 116 - struct input_dev *input_dev = ts_dev->input; 117 - 118 - unsigned int status; 119 - unsigned int reg; 120 - 121 - status = atmel_tsadcc_read(ATMEL_TSADCC_SR); 122 - status &= atmel_tsadcc_read(ATMEL_TSADCC_IMR); 123 - 124 - if (status & ATMEL_TSADCC_NOCNT) { 125 - /* Contact lost */ 126 - reg = atmel_tsadcc_read(ATMEL_TSADCC_MR) | ATMEL_TSADCC_PENDBC; 127 - 128 - atmel_tsadcc_write(ATMEL_TSADCC_MR, reg); 129 - atmel_tsadcc_write(ATMEL_TSADCC_TRGR, ATMEL_TSADCC_TRGMOD_NONE); 130 - atmel_tsadcc_write(ATMEL_TSADCC_IDR, 131 - ATMEL_TSADCC_EOC(3) | ATMEL_TSADCC_NOCNT); 132 - atmel_tsadcc_write(ATMEL_TSADCC_IER, ATMEL_TSADCC_PENCNT); 133 - 134 - input_report_key(input_dev, BTN_TOUCH, 0); 135 - ts_dev->bufferedmeasure = 0; 136 - input_sync(input_dev); 137 - 138 - } else if (status & ATMEL_TSADCC_PENCNT) { 139 - /* Pen detected */ 140 - reg = atmel_tsadcc_read(ATMEL_TSADCC_MR); 141 - reg &= ~ATMEL_TSADCC_PENDBC; 142 - 143 - atmel_tsadcc_write(ATMEL_TSADCC_IDR, ATMEL_TSADCC_PENCNT); 144 - atmel_tsadcc_write(ATMEL_TSADCC_MR, reg); 145 - atmel_tsadcc_write(ATMEL_TSADCC_IER, 146 - ATMEL_TSADCC_EOC(3) | ATMEL_TSADCC_NOCNT); 147 - atmel_tsadcc_write(ATMEL_TSADCC_TRGR, 148 - ATMEL_TSADCC_TRGMOD_PERIOD | (0x0FFF << 16)); 149 - 150 - } else if (status & ATMEL_TSADCC_EOC(3)) { 151 - /* Conversion finished */ 152 - 153 - if (ts_dev->bufferedmeasure) { 154 - /* Last measurement is always discarded, since it can 155 - * be erroneous. 156 - * Always report previous measurement */ 157 - input_report_abs(input_dev, ABS_X, ts_dev->prev_absx); 158 - input_report_abs(input_dev, ABS_Y, ts_dev->prev_absy); 159 - input_report_key(input_dev, BTN_TOUCH, 1); 160 - input_sync(input_dev); 161 - } else 162 - ts_dev->bufferedmeasure = 1; 163 - 164 - /* Now make new measurement */ 165 - ts_dev->prev_absx = atmel_tsadcc_read(ATMEL_TSADCC_CDR3) << 10; 166 - ts_dev->prev_absx /= atmel_tsadcc_read(ATMEL_TSADCC_CDR2); 167 - 168 - ts_dev->prev_absy = atmel_tsadcc_read(ATMEL_TSADCC_CDR1) << 10; 169 - ts_dev->prev_absy /= atmel_tsadcc_read(ATMEL_TSADCC_CDR0); 170 - } 171 - 172 - return IRQ_HANDLED; 173 - } 174 - 175 - /* 176 - * The functions for inserting/removing us as a module. 177 - */ 178 - 179 - static int atmel_tsadcc_probe(struct platform_device *pdev) 180 - { 181 - struct atmel_tsadcc *ts_dev; 182 - struct input_dev *input_dev; 183 - struct resource *res; 184 - struct at91_tsadcc_data *pdata = dev_get_platdata(&pdev->dev); 185 - int err; 186 - unsigned int prsc; 187 - unsigned int reg; 188 - 189 - if (!pdata) 190 - return -EINVAL; 191 - 192 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 193 - if (!res) { 194 - dev_err(&pdev->dev, "no mmio resource defined.\n"); 195 - return -ENXIO; 196 - } 197 - 198 - /* Allocate memory for device */ 199 - ts_dev = kzalloc(sizeof(struct atmel_tsadcc), GFP_KERNEL); 200 - if (!ts_dev) { 201 - dev_err(&pdev->dev, "failed to allocate memory.\n"); 202 - return -ENOMEM; 203 - } 204 - platform_set_drvdata(pdev, ts_dev); 205 - 206 - input_dev = input_allocate_device(); 207 - if (!input_dev) { 208 - dev_err(&pdev->dev, "failed to allocate input device.\n"); 209 - err = -EBUSY; 210 - goto err_free_mem; 211 - } 212 - 213 - ts_dev->irq = platform_get_irq(pdev, 0); 214 - if (ts_dev->irq < 0) { 215 - dev_err(&pdev->dev, "no irq ID is designated.\n"); 216 - err = -ENODEV; 217 - goto err_free_dev; 218 - } 219 - 220 - if (!request_mem_region(res->start, resource_size(res), 221 - "atmel tsadcc regs")) { 222 - dev_err(&pdev->dev, "resources is unavailable.\n"); 223 - err = -EBUSY; 224 - goto err_free_dev; 225 - } 226 - 227 - tsc_base = ioremap(res->start, resource_size(res)); 228 - if (!tsc_base) { 229 - dev_err(&pdev->dev, "failed to map registers.\n"); 230 - err = -ENOMEM; 231 - goto err_release_mem; 232 - } 233 - 234 - err = request_irq(ts_dev->irq, atmel_tsadcc_interrupt, 0, 235 - pdev->dev.driver->name, ts_dev); 236 - if (err) { 237 - dev_err(&pdev->dev, "failed to allocate irq.\n"); 238 - goto err_unmap_regs; 239 - } 240 - 241 - ts_dev->clk = clk_get(&pdev->dev, "tsc_clk"); 242 - if (IS_ERR(ts_dev->clk)) { 243 - dev_err(&pdev->dev, "failed to get ts_clk\n"); 244 - err = PTR_ERR(ts_dev->clk); 245 - goto err_free_irq; 246 - } 247 - 248 - ts_dev->input = input_dev; 249 - ts_dev->bufferedmeasure = 0; 250 - 251 - snprintf(ts_dev->phys, sizeof(ts_dev->phys), 252 - "%s/input0", dev_name(&pdev->dev)); 253 - 254 - input_dev->name = "atmel touch screen controller"; 255 - input_dev->phys = ts_dev->phys; 256 - input_dev->dev.parent = &pdev->dev; 257 - 258 - __set_bit(EV_ABS, input_dev->evbit); 259 - input_set_abs_params(input_dev, ABS_X, 0, 0x3FF, 0, 0); 260 - input_set_abs_params(input_dev, ABS_Y, 0, 0x3FF, 0, 0); 261 - 262 - input_set_capability(input_dev, EV_KEY, BTN_TOUCH); 263 - 264 - /* clk_enable() always returns 0, no need to check it */ 265 - clk_enable(ts_dev->clk); 266 - 267 - prsc = clk_get_rate(ts_dev->clk); 268 - dev_info(&pdev->dev, "Master clock is set at: %d Hz\n", prsc); 269 - 270 - if (!pdata->adc_clock) 271 - pdata->adc_clock = ADC_DEFAULT_CLOCK; 272 - 273 - prsc = (prsc / (2 * pdata->adc_clock)) - 1; 274 - 275 - /* saturate if this value is too high */ 276 - if (cpu_is_at91sam9rl()) { 277 - if (prsc > PRESCALER_VAL(ATMEL_TSADCC_PRESCAL)) 278 - prsc = PRESCALER_VAL(ATMEL_TSADCC_PRESCAL); 279 - } else { 280 - if (prsc > PRESCALER_VAL(ATMEL_TSADCC_EPRESCAL)) 281 - prsc = PRESCALER_VAL(ATMEL_TSADCC_EPRESCAL); 282 - } 283 - 284 - dev_info(&pdev->dev, "Prescaler is set at: %d\n", prsc); 285 - 286 - reg = ATMEL_TSADCC_TSAMOD_TS_ONLY_MODE | 287 - ((0x00 << 5) & ATMEL_TSADCC_SLEEP) | /* Normal Mode */ 288 - ((0x01 << 6) & ATMEL_TSADCC_PENDET) | /* Enable Pen Detect */ 289 - (prsc << 8) | 290 - ((0x26 << 16) & ATMEL_TSADCC_STARTUP) | 291 - ((pdata->pendet_debounce << 28) & ATMEL_TSADCC_PENDBC); 292 - 293 - atmel_tsadcc_write(ATMEL_TSADCC_CR, ATMEL_TSADCC_SWRST); 294 - atmel_tsadcc_write(ATMEL_TSADCC_MR, reg); 295 - atmel_tsadcc_write(ATMEL_TSADCC_TRGR, ATMEL_TSADCC_TRGMOD_NONE); 296 - atmel_tsadcc_write(ATMEL_TSADCC_TSR, 297 - (pdata->ts_sample_hold_time << 24) & ATMEL_TSADCC_TSSHTIM); 298 - 299 - atmel_tsadcc_read(ATMEL_TSADCC_SR); 300 - atmel_tsadcc_write(ATMEL_TSADCC_IER, ATMEL_TSADCC_PENCNT); 301 - 302 - /* All went ok, so register to the input system */ 303 - err = input_register_device(input_dev); 304 - if (err) 305 - goto err_fail; 306 - 307 - return 0; 308 - 309 - err_fail: 310 - clk_disable(ts_dev->clk); 311 - clk_put(ts_dev->clk); 312 - err_free_irq: 313 - free_irq(ts_dev->irq, ts_dev); 314 - err_unmap_regs: 315 - iounmap(tsc_base); 316 - err_release_mem: 317 - release_mem_region(res->start, resource_size(res)); 318 - err_free_dev: 319 - input_free_device(input_dev); 320 - err_free_mem: 321 - kfree(ts_dev); 322 - return err; 323 - } 324 - 325 - static int atmel_tsadcc_remove(struct platform_device *pdev) 326 - { 327 - struct atmel_tsadcc *ts_dev = platform_get_drvdata(pdev); 328 - struct resource *res; 329 - 330 - free_irq(ts_dev->irq, ts_dev); 331 - 332 - input_unregister_device(ts_dev->input); 333 - 334 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 335 - iounmap(tsc_base); 336 - release_mem_region(res->start, resource_size(res)); 337 - 338 - clk_disable(ts_dev->clk); 339 - clk_put(ts_dev->clk); 340 - 341 - kfree(ts_dev); 342 - 343 - return 0; 344 - } 345 - 346 - static struct platform_driver atmel_tsadcc_driver = { 347 - .probe = atmel_tsadcc_probe, 348 - .remove = atmel_tsadcc_remove, 349 - .driver = { 350 - .name = "atmel_tsadcc", 351 - }, 352 - }; 353 - module_platform_driver(atmel_tsadcc_driver); 354 - 355 - MODULE_LICENSE("GPL"); 356 - MODULE_DESCRIPTION("Atmel TouchScreen Driver"); 357 - MODULE_AUTHOR("Dan Liang <dan.liang@atmel.com>"); 358 -
+1
include/linux/clk/at91_pmc.h
··· 155 155 #define AT91_PMC_LOCKB (1 << 2) /* PLLB Lock */ 156 156 #define AT91_PMC_MCKRDY (1 << 3) /* Master Clock */ 157 157 #define AT91_PMC_LOCKU (1 << 6) /* UPLL Lock [some SAM9] */ 158 + #define AT91_PMC_OSCSEL (1 << 7) /* Slow Oscillator Selection [some SAM9] */ 158 159 #define AT91_PMC_PCK0RDY (1 << 8) /* Programmable Clock 0 */ 159 160 #define AT91_PMC_PCK1RDY (1 << 9) /* Programmable Clock 1 */ 160 161 #define AT91_PMC_PCK2RDY (1 << 10) /* Programmable Clock 2 */
+6 -21
include/linux/platform_data/at91_adc.h
··· 7 7 #ifndef _AT91_ADC_H_ 8 8 #define _AT91_ADC_H_ 9 9 10 - /** 11 - * struct at91_adc_reg_desc - Various informations relative to registers 12 - * @channel_base: Base offset for the channel data registers 13 - * @drdy_mask: Mask of the DRDY field in the relevant registers 14 - (Interruptions registers mostly) 15 - * @status_register: Offset of the Interrupt Status Register 16 - * @trigger_register: Offset of the Trigger setup register 17 - * @mr_prescal_mask: Mask of the PRESCAL field in the adc MR register 18 - * @mr_startup_mask: Mask of the STARTUP field in the adc MR register 19 - */ 20 - struct at91_adc_reg_desc { 21 - u8 channel_base; 22 - u32 drdy_mask; 23 - u8 status_register; 24 - u8 trigger_register; 25 - u32 mr_prescal_mask; 26 - u32 mr_startup_mask; 10 + enum atmel_adc_ts_type { 11 + ATMEL_ADC_TOUCHSCREEN_NONE = 0, 12 + ATMEL_ADC_TOUCHSCREEN_4WIRE = 4, 13 + ATMEL_ADC_TOUCHSCREEN_5WIRE = 5, 27 14 }; 28 15 29 16 /** ··· 29 42 /** 30 43 * struct at91_adc_data - platform data for ADC driver 31 44 * @channels_used: channels in use on the board as a bitmask 32 - * @num_channels: global number of channels available on the board 33 - * @registers: Registers definition on the board 34 45 * @startup_time: startup time of the ADC in microseconds 35 46 * @trigger_list: Triggers available in the ADC 36 47 * @trigger_number: Number of triggers available in the ADC 37 48 * @use_external_triggers: does the board has external triggers availables 38 49 * @vref: Reference voltage for the ADC in millivolts 50 + * @touchscreen_type: If a touchscreen is connected, its type (4 or 5 wires) 39 51 */ 40 52 struct at91_adc_data { 41 53 unsigned long channels_used; 42 - u8 num_channels; 43 - struct at91_adc_reg_desc *registers; 44 54 u8 startup_time; 45 55 struct at91_adc_trigger *trigger_list; 46 56 u8 trigger_number; 47 57 bool use_external_triggers; 48 58 u16 vref; 59 + enum atmel_adc_ts_type touchscreen_type; 49 60 }; 50 61 51 62 extern void __init at91_add_device_adc(struct at91_adc_data *data);
-7
include/linux/platform_data/atmel.h
··· 87 87 int rts_gpio; /* optional RTS GPIO */ 88 88 }; 89 89 90 - /* Touchscreen Controller */ 91 - struct at91_tsadcc_data { 92 - unsigned int adc_clock; 93 - u8 pendet_debounce; 94 - u8 ts_sample_hold_time; 95 - }; 96 - 97 90 /* CAN */ 98 91 struct at91_can_data { 99 92 void (*transceiver_switch)(int on);
-1
sound/soc/atmel/sam9g20_wm8731.c
··· 48 48 49 49 #include <asm/mach-types.h> 50 50 #include <mach/hardware.h> 51 - #include <mach/gpio.h> 52 51 53 52 #include "../codecs/wm8731.h" 54 53 #include "atmel-pcm.h"