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

Merge branch 'samsung/cleanup' into next/drivers

Dependency for the samsung/drivers branch

Conflicts:
arch/arm/mach-exynos/Makefile

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

+3418 -3588
+8
Documentation/devicetree/bindings/arm/insignal-boards.txt
··· 1 + * Insignal's Exynos4210 based Origen evaluation board 2 + 3 + Origen low-cost evaluation board is based on Samsung's Exynos4210 SoC. 4 + 5 + Required root node properties: 6 + - compatible = should be one or more of the following. 7 + (a) "samsung,smdkv310" - for Samsung's SMDKV310 eval board. 8 + (b) "samsung,exynos4210" - for boards based on Exynos4210 SoC.
+8
Documentation/devicetree/bindings/arm/samsung-boards.txt
··· 1 + * Samsung's Exynos4210 based SMDKV310 evaluation board 2 + 3 + SMDKV310 evaluation board is based on Samsung's Exynos4210 SoC. 4 + 5 + Required root node properties: 6 + - compatible = should be one or more of the following. 7 + (a) "samsung,smdkv310" - for Samsung's SMDKV310 eval board. 8 + (b) "samsung,exynos4210" - for boards based on Exynos4210 SoC.
+30
Documentation/devicetree/bindings/dma/arm-pl330.txt
··· 1 + * ARM PrimeCell PL330 DMA Controller 2 + 3 + The ARM PrimeCell PL330 DMA controller can move blocks of memory contents 4 + between memory and peripherals or memory to memory. 5 + 6 + Required properties: 7 + - compatible: should include both "arm,pl330" and "arm,primecell". 8 + - reg: physical base address of the controller and length of memory mapped 9 + region. 10 + - interrupts: interrupt number to the cpu. 11 + 12 + Example: 13 + 14 + pdma0: pdma@12680000 { 15 + compatible = "arm,pl330", "arm,primecell"; 16 + reg = <0x12680000 0x1000>; 17 + interrupts = <99>; 18 + }; 19 + 20 + Client drivers (device nodes requiring dma transfers from dev-to-mem or 21 + mem-to-dev) should specify the DMA channel numbers using a two-value pair 22 + as shown below. 23 + 24 + [property name] = <[phandle of the dma controller] [dma request id]>; 25 + 26 + where 'dma request id' is the dma request number which is connected 27 + to the client controller. The 'property name' is recommended to be 28 + of the form <name>-dma-channel. 29 + 30 + Example: tx-dma-channel = <&pdma0 12>;
+40
Documentation/devicetree/bindings/gpio/gpio-samsung.txt
··· 1 + Samsung Exynos4 GPIO Controller 2 + 3 + Required properties: 4 + - compatible: Compatible property value should be "samsung,exynos4-gpio>". 5 + 6 + - reg: Physical base address of the controller and length of memory mapped 7 + region. 8 + 9 + - #gpio-cells: Should be 4. The syntax of the gpio specifier used by client nodes 10 + should be the following with values derived from the SoC user manual. 11 + <[phandle of the gpio controller node] 12 + [pin number within the gpio controller] 13 + [mux function] 14 + [pull up/down] 15 + [drive strength]> 16 + 17 + Values for gpio specifier: 18 + - Pin number: is a value between 0 to 7. 19 + - Pull Up/Down: 0 - Pull Up/Down Disabled. 20 + 1 - Pull Down Enabled. 21 + 3 - Pull Up Enabled. 22 + - Drive Strength: 0 - 1x, 23 + 1 - 3x, 24 + 2 - 2x, 25 + 3 - 4x 26 + 27 + - gpio-controller: Specifies that the node is a gpio controller. 28 + - #address-cells: should be 1. 29 + - #size-cells: should be 1. 30 + 31 + Example: 32 + 33 + gpa0: gpio-controller@11400000 { 34 + #address-cells = <1>; 35 + #size-cells = <1>; 36 + compatible = "samsung,exynos4-gpio"; 37 + reg = <0x11400000 0x20>; 38 + #gpio-cells = <4>; 39 + gpio-controller; 40 + };
+88
Documentation/devicetree/bindings/input/samsung-keypad.txt
··· 1 + * Samsung's Keypad Controller device tree bindings 2 + 3 + Samsung's Keypad controller is used to interface a SoC with a matrix-type 4 + keypad device. The keypad controller supports multiple row and column lines. 5 + A key can be placed at each intersection of a unique row and a unique column. 6 + The keypad controller can sense a key-press and key-release and report the 7 + event using a interrupt to the cpu. 8 + 9 + Required SoC Specific Properties: 10 + - compatible: should be one of the following 11 + - "samsung,s3c6410-keypad": For controllers compatible with s3c6410 keypad 12 + controller. 13 + - "samsung,s5pv210-keypad": For controllers compatible with s5pv210 keypad 14 + controller. 15 + 16 + - reg: physical base address of the controller and length of memory mapped 17 + region. 18 + 19 + - interrupts: The interrupt number to the cpu. 20 + 21 + Required Board Specific Properties: 22 + - samsung,keypad-num-rows: Number of row lines connected to the keypad 23 + controller. 24 + 25 + - samsung,keypad-num-columns: Number of column lines connected to the 26 + keypad controller. 27 + 28 + - row-gpios: List of gpios used as row lines. The gpio specifier for 29 + this property depends on the gpio controller to which these row lines 30 + are connected. 31 + 32 + - col-gpios: List of gpios used as column lines. The gpio specifier for 33 + this property depends on the gpio controller to which these column 34 + lines are connected. 35 + 36 + - Keys represented as child nodes: Each key connected to the keypad 37 + controller is represented as a child node to the keypad controller 38 + device node and should include the following properties. 39 + - keypad,row: the row number to which the key is connected. 40 + - keypad,column: the column number to which the key is connected. 41 + - linux,code: the key-code to be reported when the key is pressed 42 + and released. 43 + 44 + Optional Properties specific to linux: 45 + - linux,keypad-no-autorepeat: do no enable autorepeat feature. 46 + - linux,keypad-wakeup: use any event on keypad as wakeup event. 47 + 48 + 49 + Example: 50 + keypad@100A0000 { 51 + compatible = "samsung,s5pv210-keypad"; 52 + reg = <0x100A0000 0x100>; 53 + interrupts = <173>; 54 + samsung,keypad-num-rows = <2>; 55 + samsung,keypad-num-columns = <8>; 56 + linux,input-no-autorepeat; 57 + linux,input-wakeup; 58 + 59 + row-gpios = <&gpx2 0 3 3 0 60 + &gpx2 1 3 3 0>; 61 + 62 + col-gpios = <&gpx1 0 3 0 0 63 + &gpx1 1 3 0 0 64 + &gpx1 2 3 0 0 65 + &gpx1 3 3 0 0 66 + &gpx1 4 3 0 0 67 + &gpx1 5 3 0 0 68 + &gpx1 6 3 0 0 69 + &gpx1 7 3 0 0>; 70 + 71 + key_1 { 72 + keypad,row = <0>; 73 + keypad,column = <3>; 74 + linux,code = <2>; 75 + }; 76 + 77 + key_2 { 78 + keypad,row = <0>; 79 + keypad,column = <4>; 80 + linux,code = <3>; 81 + }; 82 + 83 + key_3 { 84 + keypad,row = <0>; 85 + keypad,column = <5>; 86 + linux,code = <4>; 87 + }; 88 + };
+20
Documentation/devicetree/bindings/rtc/s3c-rtc.txt
··· 1 + * Samsung's S3C Real Time Clock controller 2 + 3 + Required properties: 4 + - compatible: should be one of the following. 5 + * "samsung,s3c2410-rtc" - for controllers compatible with s3c2410 rtc. 6 + * "samsung,s3c6410-rtc" - for controllers compatible with s3c6410 rtc. 7 + - reg: physical base address of the controller and length of memory mapped 8 + region. 9 + - interrupts: Two interrupt numbers to the cpu should be specified. First 10 + interrupt number is the rtc alarm interupt and second interrupt number 11 + is the rtc tick interrupt. The number of cells representing a interrupt 12 + depends on the parent interrupt controller. 13 + 14 + Example: 15 + 16 + rtc@10070000 { 17 + compatible = "samsung,s3c6410-rtc"; 18 + reg = <0x10070000 0x100>; 19 + interrupts = <44 0 45 0>; 20 + };
+14
Documentation/devicetree/bindings/serial/samsung_uart.txt
··· 1 + * Samsung's UART Controller 2 + 3 + The Samsung's UART controller is used for interfacing SoC with serial communicaion 4 + devices. 5 + 6 + Required properties: 7 + - compatible: should be 8 + - "samsung,exynos4210-uart", for UART's compatible with Exynos4210 uart ports. 9 + 10 + - reg: base physical address of the controller and length of memory mapped 11 + region. 12 + 13 + - interrupts: interrupt number to the cpu. The interrupt specifier format depends 14 + on the interrupt controller parent.
+137
arch/arm/boot/dts/exynos4210-origen.dts
··· 1 + /* 2 + * Samsung's Exynos4210 based Origen board device tree source 3 + * 4 + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. 5 + * http://www.samsung.com 6 + * Copyright (c) 2010-2011 Linaro Ltd. 7 + * www.linaro.org 8 + * 9 + * Device tree source file for Insignal's Origen board which is based on 10 + * Samsung's Exynos4210 SoC. 11 + * 12 + * This program is free software; you can redistribute it and/or modify 13 + * it under the terms of the GNU General Public License version 2 as 14 + * published by the Free Software Foundation. 15 + */ 16 + 17 + /dts-v1/; 18 + /include/ "exynos4210.dtsi" 19 + 20 + / { 21 + model = "Insignal Origen evaluation board based on Exynos4210"; 22 + compatible = "insignal,origen", "samsung,exynos4210"; 23 + 24 + memory { 25 + reg = <0x40000000 0x40000000>; 26 + }; 27 + 28 + chosen { 29 + bootargs ="root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC2,115200 init=/linuxrc"; 30 + }; 31 + 32 + sdhci@12530000 { 33 + samsung,sdhci-bus-width = <4>; 34 + linux,mmc_cap_4_bit_data; 35 + samsung,sdhci-cd-internal; 36 + gpio-cd = <&gpk2 2 2 3 3>; 37 + gpios = <&gpk2 0 2 0 3>, 38 + <&gpk2 1 2 0 3>, 39 + <&gpk2 3 2 3 3>, 40 + <&gpk2 4 2 3 3>, 41 + <&gpk2 5 2 3 3>, 42 + <&gpk2 6 2 3 3>; 43 + }; 44 + 45 + sdhci@12510000 { 46 + samsung,sdhci-bus-width = <4>; 47 + linux,mmc_cap_4_bit_data; 48 + samsung,sdhci-cd-internal; 49 + gpio-cd = <&gpk0 2 2 3 3>; 50 + gpios = <&gpk0 0 2 0 3>, 51 + <&gpk0 1 2 0 3>, 52 + <&gpk0 3 2 3 3>, 53 + <&gpk0 4 2 3 3>, 54 + <&gpk0 5 2 3 3>, 55 + <&gpk0 6 2 3 3>; 56 + }; 57 + 58 + gpio_keys { 59 + compatible = "gpio-keys"; 60 + #address-cells = <1>; 61 + #size-cells = <0>; 62 + 63 + up { 64 + label = "Up"; 65 + gpios = <&gpx2 0 0 0 2>; 66 + linux,code = <103>; 67 + }; 68 + 69 + down { 70 + label = "Down"; 71 + gpios = <&gpx2 1 0 0 2>; 72 + linux,code = <108>; 73 + }; 74 + 75 + back { 76 + label = "Back"; 77 + gpios = <&gpx1 7 0 0 2>; 78 + linux,code = <158>; 79 + }; 80 + 81 + home { 82 + label = "Home"; 83 + gpios = <&gpx1 6 0 0 2>; 84 + linux,code = <102>; 85 + }; 86 + 87 + menu { 88 + label = "Menu"; 89 + gpios = <&gpx1 5 0 0 2>; 90 + linux,code = <139>; 91 + }; 92 + }; 93 + 94 + keypad@100A0000 { 95 + status = "disabled"; 96 + }; 97 + 98 + sdhci@12520000 { 99 + status = "disabled"; 100 + }; 101 + 102 + sdhci@12540000 { 103 + status = "disabled"; 104 + }; 105 + 106 + i2c@13860000 { 107 + status = "disabled"; 108 + }; 109 + 110 + i2c@13870000 { 111 + status = "disabled"; 112 + }; 113 + 114 + i2c@13880000 { 115 + status = "disabled"; 116 + }; 117 + 118 + i2c@13890000 { 119 + status = "disabled"; 120 + }; 121 + 122 + i2c@138A0000 { 123 + status = "disabled"; 124 + }; 125 + 126 + i2c@138B0000 { 127 + status = "disabled"; 128 + }; 129 + 130 + i2c@138C0000 { 131 + status = "disabled"; 132 + }; 133 + 134 + i2c@138D0000 { 135 + status = "disabled"; 136 + }; 137 + };
+182
arch/arm/boot/dts/exynos4210-smdkv310.dts
··· 1 + /* 2 + * Samsung's Exynos4210 based SMDKV310 board device tree source 3 + * 4 + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. 5 + * http://www.samsung.com 6 + * Copyright (c) 2010-2011 Linaro Ltd. 7 + * www.linaro.org 8 + * 9 + * Device tree source file for Samsung's SMDKV310 board which is based on 10 + * Samsung's Exynos4210 SoC. 11 + * 12 + * This program is free software; you can redistribute it and/or modify 13 + * it under the terms of the GNU General Public License version 2 as 14 + * published by the Free Software Foundation. 15 + */ 16 + 17 + /dts-v1/; 18 + /include/ "exynos4210.dtsi" 19 + 20 + / { 21 + model = "Samsung smdkv310 evaluation board based on Exynos4210"; 22 + compatible = "samsung,smdkv310", "samsung,exynos4210"; 23 + 24 + memory { 25 + reg = <0x40000000 0x80000000>; 26 + }; 27 + 28 + chosen { 29 + bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc"; 30 + }; 31 + 32 + sdhci@12530000 { 33 + samsung,sdhci-bus-width = <4>; 34 + linux,mmc_cap_4_bit_data; 35 + samsung,sdhci-cd-internal; 36 + gpio-cd = <&gpk2 2 2 3 3>; 37 + gpios = <&gpk2 0 2 0 3>, 38 + <&gpk2 1 2 0 3>, 39 + <&gpk2 3 2 3 3>, 40 + <&gpk2 4 2 3 3>, 41 + <&gpk2 5 2 3 3>, 42 + <&gpk2 6 2 3 3>; 43 + }; 44 + 45 + keypad@100A0000 { 46 + samsung,keypad-num-rows = <2>; 47 + samsung,keypad-num-columns = <8>; 48 + linux,keypad-no-autorepeat; 49 + linux,keypad-wakeup; 50 + 51 + row-gpios = <&gpx2 0 3 3 0>, 52 + <&gpx2 1 3 3 0>; 53 + 54 + col-gpios = <&gpx1 0 3 0 0>, 55 + <&gpx1 1 3 0 0>, 56 + <&gpx1 2 3 0 0>, 57 + <&gpx1 3 3 0 0>, 58 + <&gpx1 4 3 0 0>, 59 + <&gpx1 5 3 0 0>, 60 + <&gpx1 6 3 0 0>, 61 + <&gpx1 7 3 0 0>; 62 + 63 + key_1 { 64 + keypad,row = <0>; 65 + keypad,column = <3>; 66 + linux,code = <2>; 67 + }; 68 + 69 + key_2 { 70 + keypad,row = <0>; 71 + keypad,column = <4>; 72 + linux,code = <3>; 73 + }; 74 + 75 + key_3 { 76 + keypad,row = <0>; 77 + keypad,column = <5>; 78 + linux,code = <4>; 79 + }; 80 + 81 + key_4 { 82 + keypad,row = <0>; 83 + keypad,column = <6>; 84 + linux,code = <5>; 85 + }; 86 + 87 + key_5 { 88 + keypad,row = <0>; 89 + keypad,column = <7>; 90 + linux,code = <6>; 91 + }; 92 + 93 + key_a { 94 + keypad,row = <1>; 95 + keypad,column = <3>; 96 + linux,code = <30>; 97 + }; 98 + 99 + key_b { 100 + keypad,row = <1>; 101 + keypad,column = <4>; 102 + linux,code = <48>; 103 + }; 104 + 105 + key_c { 106 + keypad,row = <1>; 107 + keypad,column = <5>; 108 + linux,code = <46>; 109 + }; 110 + 111 + key_d { 112 + keypad,row = <1>; 113 + keypad,column = <6>; 114 + linux,code = <32>; 115 + }; 116 + 117 + key_e { 118 + keypad,row = <1>; 119 + keypad,column = <7>; 120 + linux,code = <18>; 121 + }; 122 + }; 123 + 124 + i2c@13860000 { 125 + #address-cells = <1>; 126 + #size-cells = <0>; 127 + samsung,i2c-sda-delay = <100>; 128 + samsung,i2c-max-bus-freq = <20000>; 129 + gpios = <&gpd1 0 2 3 0>, 130 + <&gpd1 1 2 3 0>; 131 + 132 + eeprom@50 { 133 + compatible = "samsung,24ad0xd1"; 134 + reg = <0x50>; 135 + }; 136 + 137 + eeprom@52 { 138 + compatible = "samsung,24ad0xd1"; 139 + reg = <0x52>; 140 + }; 141 + }; 142 + 143 + sdhci@12510000 { 144 + status = "disabled"; 145 + }; 146 + 147 + sdhci@12520000 { 148 + status = "disabled"; 149 + }; 150 + 151 + sdhci@12540000 { 152 + status = "disabled"; 153 + }; 154 + 155 + i2c@13870000 { 156 + status = "disabled"; 157 + }; 158 + 159 + i2c@13880000 { 160 + status = "disabled"; 161 + }; 162 + 163 + i2c@13890000 { 164 + status = "disabled"; 165 + }; 166 + 167 + i2c@138A0000 { 168 + status = "disabled"; 169 + }; 170 + 171 + i2c@138B0000 { 172 + status = "disabled"; 173 + }; 174 + 175 + i2c@138C0000 { 176 + status = "disabled"; 177 + }; 178 + 179 + i2c@138D0000 { 180 + status = "disabled"; 181 + }; 182 + };
+397
arch/arm/boot/dts/exynos4210.dtsi
··· 1 + /* 2 + * Samsung's Exynos4210 SoC device tree source 3 + * 4 + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. 5 + * http://www.samsung.com 6 + * Copyright (c) 2010-2011 Linaro Ltd. 7 + * www.linaro.org 8 + * 9 + * Samsung's Exynos4210 SoC device nodes are listed in this file. Exynos4210 10 + * based board files can include this file and provide values for board specfic 11 + * bindings. 12 + * 13 + * Note: This file does not include device nodes for all the controllers in 14 + * Exynos4210 SoC. As device tree coverage for Exynos4210 increases, additional 15 + * nodes can be added to this file. 16 + * 17 + * This program is free software; you can redistribute it and/or modify 18 + * it under the terms of the GNU General Public License version 2 as 19 + * published by the Free Software Foundation. 20 + */ 21 + 22 + /include/ "skeleton.dtsi" 23 + 24 + / { 25 + compatible = "samsung,exynos4210"; 26 + interrupt-parent = <&gic>; 27 + 28 + gic:interrupt-controller@10490000 { 29 + compatible = "arm,cortex-a9-gic"; 30 + #interrupt-cells = <3>; 31 + interrupt-controller; 32 + reg = <0x10490000 0x1000>, <0x10480000 0x100>; 33 + }; 34 + 35 + watchdog@10060000 { 36 + compatible = "samsung,s3c2410-wdt"; 37 + reg = <0x10060000 0x100>; 38 + interrupts = <0 43 0>; 39 + }; 40 + 41 + rtc@10070000 { 42 + compatible = "samsung,s3c6410-rtc"; 43 + reg = <0x10070000 0x100>; 44 + interrupts = <0 44 0>, <0 45 0>; 45 + }; 46 + 47 + keypad@100A0000 { 48 + compatible = "samsung,s5pv210-keypad"; 49 + reg = <0x100A0000 0x100>; 50 + interrupts = <0 109 0>; 51 + }; 52 + 53 + sdhci@12510000 { 54 + compatible = "samsung,exynos4210-sdhci"; 55 + reg = <0x12510000 0x100>; 56 + interrupts = <0 73 0>; 57 + }; 58 + 59 + sdhci@12520000 { 60 + compatible = "samsung,exynos4210-sdhci"; 61 + reg = <0x12520000 0x100>; 62 + interrupts = <0 74 0>; 63 + }; 64 + 65 + sdhci@12530000 { 66 + compatible = "samsung,exynos4210-sdhci"; 67 + reg = <0x12530000 0x100>; 68 + interrupts = <0 75 0>; 69 + }; 70 + 71 + sdhci@12540000 { 72 + compatible = "samsung,exynos4210-sdhci"; 73 + reg = <0x12540000 0x100>; 74 + interrupts = <0 76 0>; 75 + }; 76 + 77 + serial@13800000 { 78 + compatible = "samsung,exynos4210-uart"; 79 + reg = <0x13800000 0x100>; 80 + interrupts = <0 52 0>; 81 + }; 82 + 83 + serial@13810000 { 84 + compatible = "samsung,exynos4210-uart"; 85 + reg = <0x13810000 0x100>; 86 + interrupts = <0 53 0>; 87 + }; 88 + 89 + serial@13820000 { 90 + compatible = "samsung,exynos4210-uart"; 91 + reg = <0x13820000 0x100>; 92 + interrupts = <0 54 0>; 93 + }; 94 + 95 + serial@13830000 { 96 + compatible = "samsung,exynos4210-uart"; 97 + reg = <0x13830000 0x100>; 98 + interrupts = <0 55 0>; 99 + }; 100 + 101 + i2c@13860000 { 102 + compatible = "samsung,s3c2440-i2c"; 103 + reg = <0x13860000 0x100>; 104 + interrupts = <0 58 0>; 105 + }; 106 + 107 + i2c@13870000 { 108 + compatible = "samsung,s3c2440-i2c"; 109 + reg = <0x13870000 0x100>; 110 + interrupts = <0 59 0>; 111 + }; 112 + 113 + i2c@13880000 { 114 + compatible = "samsung,s3c2440-i2c"; 115 + reg = <0x13880000 0x100>; 116 + interrupts = <0 60 0>; 117 + }; 118 + 119 + i2c@13890000 { 120 + compatible = "samsung,s3c2440-i2c"; 121 + reg = <0x13890000 0x100>; 122 + interrupts = <0 61 0>; 123 + }; 124 + 125 + i2c@138A0000 { 126 + compatible = "samsung,s3c2440-i2c"; 127 + reg = <0x138A0000 0x100>; 128 + interrupts = <0 62 0>; 129 + }; 130 + 131 + i2c@138B0000 { 132 + compatible = "samsung,s3c2440-i2c"; 133 + reg = <0x138B0000 0x100>; 134 + interrupts = <0 63 0>; 135 + }; 136 + 137 + i2c@138C0000 { 138 + compatible = "samsung,s3c2440-i2c"; 139 + reg = <0x138C0000 0x100>; 140 + interrupts = <0 64 0>; 141 + }; 142 + 143 + i2c@138D0000 { 144 + compatible = "samsung,s3c2440-i2c"; 145 + reg = <0x138D0000 0x100>; 146 + interrupts = <0 65 0>; 147 + }; 148 + 149 + amba { 150 + #address-cells = <1>; 151 + #size-cells = <1>; 152 + compatible = "arm,amba-bus"; 153 + interrupt-parent = <&gic>; 154 + ranges; 155 + 156 + pdma0: pdma@12680000 { 157 + compatible = "arm,pl330", "arm,primecell"; 158 + reg = <0x12680000 0x1000>; 159 + interrupts = <0 35 0>; 160 + }; 161 + 162 + pdma1: pdma@12690000 { 163 + compatible = "arm,pl330", "arm,primecell"; 164 + reg = <0x12690000 0x1000>; 165 + interrupts = <0 36 0>; 166 + }; 167 + }; 168 + 169 + gpio-controllers { 170 + #address-cells = <1>; 171 + #size-cells = <1>; 172 + gpio-controller; 173 + ranges; 174 + 175 + gpa0: gpio-controller@11400000 { 176 + compatible = "samsung,exynos4-gpio"; 177 + reg = <0x11400000 0x20>; 178 + #gpio-cells = <4>; 179 + }; 180 + 181 + gpa1: gpio-controller@11400020 { 182 + compatible = "samsung,exynos4-gpio"; 183 + reg = <0x11400020 0x20>; 184 + #gpio-cells = <4>; 185 + }; 186 + 187 + gpb: gpio-controller@11400040 { 188 + compatible = "samsung,exynos4-gpio"; 189 + reg = <0x11400040 0x20>; 190 + #gpio-cells = <4>; 191 + }; 192 + 193 + gpc0: gpio-controller@11400060 { 194 + compatible = "samsung,exynos4-gpio"; 195 + reg = <0x11400060 0x20>; 196 + #gpio-cells = <4>; 197 + }; 198 + 199 + gpc1: gpio-controller@11400080 { 200 + compatible = "samsung,exynos4-gpio"; 201 + reg = <0x11400080 0x20>; 202 + #gpio-cells = <4>; 203 + }; 204 + 205 + gpd0: gpio-controller@114000A0 { 206 + compatible = "samsung,exynos4-gpio"; 207 + reg = <0x114000A0 0x20>; 208 + #gpio-cells = <4>; 209 + }; 210 + 211 + gpd1: gpio-controller@114000C0 { 212 + compatible = "samsung,exynos4-gpio"; 213 + reg = <0x114000C0 0x20>; 214 + #gpio-cells = <4>; 215 + }; 216 + 217 + gpe0: gpio-controller@114000E0 { 218 + compatible = "samsung,exynos4-gpio"; 219 + reg = <0x114000E0 0x20>; 220 + #gpio-cells = <4>; 221 + }; 222 + 223 + gpe1: gpio-controller@11400100 { 224 + compatible = "samsung,exynos4-gpio"; 225 + reg = <0x11400100 0x20>; 226 + #gpio-cells = <4>; 227 + }; 228 + 229 + gpe2: gpio-controller@11400120 { 230 + compatible = "samsung,exynos4-gpio"; 231 + reg = <0x11400120 0x20>; 232 + #gpio-cells = <4>; 233 + }; 234 + 235 + gpe3: gpio-controller@11400140 { 236 + compatible = "samsung,exynos4-gpio"; 237 + reg = <0x11400140 0x20>; 238 + #gpio-cells = <4>; 239 + }; 240 + 241 + gpe4: gpio-controller@11400160 { 242 + compatible = "samsung,exynos4-gpio"; 243 + reg = <0x11400160 0x20>; 244 + #gpio-cells = <4>; 245 + }; 246 + 247 + gpf0: gpio-controller@11400180 { 248 + compatible = "samsung,exynos4-gpio"; 249 + reg = <0x11400180 0x20>; 250 + #gpio-cells = <4>; 251 + }; 252 + 253 + gpf1: gpio-controller@114001A0 { 254 + compatible = "samsung,exynos4-gpio"; 255 + reg = <0x114001A0 0x20>; 256 + #gpio-cells = <4>; 257 + }; 258 + 259 + gpf2: gpio-controller@114001C0 { 260 + compatible = "samsung,exynos4-gpio"; 261 + reg = <0x114001C0 0x20>; 262 + #gpio-cells = <4>; 263 + }; 264 + 265 + gpf3: gpio-controller@114001E0 { 266 + compatible = "samsung,exynos4-gpio"; 267 + reg = <0x114001E0 0x20>; 268 + #gpio-cells = <4>; 269 + }; 270 + 271 + gpj0: gpio-controller@11000000 { 272 + compatible = "samsung,exynos4-gpio"; 273 + reg = <0x11000000 0x20>; 274 + #gpio-cells = <4>; 275 + }; 276 + 277 + gpj1: gpio-controller@11000020 { 278 + compatible = "samsung,exynos4-gpio"; 279 + reg = <0x11000020 0x20>; 280 + #gpio-cells = <4>; 281 + }; 282 + 283 + gpk0: gpio-controller@11000040 { 284 + compatible = "samsung,exynos4-gpio"; 285 + reg = <0x11000040 0x20>; 286 + #gpio-cells = <4>; 287 + }; 288 + 289 + gpk1: gpio-controller@11000060 { 290 + compatible = "samsung,exynos4-gpio"; 291 + reg = <0x11000060 0x20>; 292 + #gpio-cells = <4>; 293 + }; 294 + 295 + gpk2: gpio-controller@11000080 { 296 + compatible = "samsung,exynos4-gpio"; 297 + reg = <0x11000080 0x20>; 298 + #gpio-cells = <4>; 299 + }; 300 + 301 + gpk3: gpio-controller@110000A0 { 302 + compatible = "samsung,exynos4-gpio"; 303 + reg = <0x110000A0 0x20>; 304 + #gpio-cells = <4>; 305 + }; 306 + 307 + gpl0: gpio-controller@110000C0 { 308 + compatible = "samsung,exynos4-gpio"; 309 + reg = <0x110000C0 0x20>; 310 + #gpio-cells = <4>; 311 + }; 312 + 313 + gpl1: gpio-controller@110000E0 { 314 + compatible = "samsung,exynos4-gpio"; 315 + reg = <0x110000E0 0x20>; 316 + #gpio-cells = <4>; 317 + }; 318 + 319 + gpl2: gpio-controller@11000100 { 320 + compatible = "samsung,exynos4-gpio"; 321 + reg = <0x11000100 0x20>; 322 + #gpio-cells = <4>; 323 + }; 324 + 325 + gpy0: gpio-controller@11000120 { 326 + compatible = "samsung,exynos4-gpio"; 327 + reg = <0x11000120 0x20>; 328 + #gpio-cells = <4>; 329 + }; 330 + 331 + gpy1: gpio-controller@11000140 { 332 + compatible = "samsung,exynos4-gpio"; 333 + reg = <0x11000140 0x20>; 334 + #gpio-cells = <4>; 335 + }; 336 + 337 + gpy2: gpio-controller@11000160 { 338 + compatible = "samsung,exynos4-gpio"; 339 + reg = <0x11000160 0x20>; 340 + #gpio-cells = <4>; 341 + }; 342 + 343 + gpy3: gpio-controller@11000180 { 344 + compatible = "samsung,exynos4-gpio"; 345 + reg = <0x11000180 0x20>; 346 + #gpio-cells = <4>; 347 + }; 348 + 349 + gpy4: gpio-controller@110001A0 { 350 + compatible = "samsung,exynos4-gpio"; 351 + reg = <0x110001A0 0x20>; 352 + #gpio-cells = <4>; 353 + }; 354 + 355 + gpy5: gpio-controller@110001C0 { 356 + compatible = "samsung,exynos4-gpio"; 357 + reg = <0x110001C0 0x20>; 358 + #gpio-cells = <4>; 359 + }; 360 + 361 + gpy6: gpio-controller@110001E0 { 362 + compatible = "samsung,exynos4-gpio"; 363 + reg = <0x110001E0 0x20>; 364 + #gpio-cells = <4>; 365 + }; 366 + 367 + gpx0: gpio-controller@11000C00 { 368 + compatible = "samsung,exynos4-gpio"; 369 + reg = <0x11000C00 0x20>; 370 + #gpio-cells = <4>; 371 + }; 372 + 373 + gpx1: gpio-controller@11000C20 { 374 + compatible = "samsung,exynos4-gpio"; 375 + reg = <0x11000C20 0x20>; 376 + #gpio-cells = <4>; 377 + }; 378 + 379 + gpx2: gpio-controller@11000C40 { 380 + compatible = "samsung,exynos4-gpio"; 381 + reg = <0x11000C40 0x20>; 382 + #gpio-cells = <4>; 383 + }; 384 + 385 + gpx3: gpio-controller@11000C60 { 386 + compatible = "samsung,exynos4-gpio"; 387 + reg = <0x11000C60 0x20>; 388 + #gpio-cells = <4>; 389 + }; 390 + 391 + gpz: gpio-controller@03860000 { 392 + compatible = "samsung,exynos4-gpio"; 393 + reg = <0x03860000 0x20>; 394 + #gpio-cells = <4>; 395 + }; 396 + }; 397 + };
+24
arch/arm/mach-exynos/Kconfig
··· 57 57 help 58 58 Use MCT (Multi Core Timer) as kernel timers 59 59 60 + config EXYNOS4_DEV_DMA 61 + bool 62 + help 63 + Compile in amba device definitions for DMA controller 64 + 60 65 config EXYNOS4_DEV_AHCI 61 66 bool 62 67 help ··· 187 182 select SAMSUNG_DEV_BACKLIGHT 188 183 select EXYNOS4_DEV_AHCI 189 184 select SAMSUNG_DEV_KEYPAD 185 + select EXYNOS4_DEV_DMA 190 186 select EXYNOS4_DEV_PD 191 187 select SAMSUNG_DEV_PWM 192 188 select EXYNOS4_DEV_USB_OHCI ··· 209 203 select S3C_DEV_HSMMC2 210 204 select S3C_DEV_HSMMC3 211 205 select EXYNOS4_DEV_AHCI 206 + select EXYNOS4_DEV_DMA 212 207 select EXYNOS4_DEV_SYSMMU 213 208 select EXYNOS4_SETUP_SDHCI 214 209 help ··· 235 228 select S5P_DEV_MFC 236 229 select S5P_DEV_ONENAND 237 230 select S5P_DEV_TV 231 + select EXYNOS4_DEV_DMA 238 232 select EXYNOS4_DEV_PD 239 233 select EXYNOS4_SETUP_FIMD0 240 234 select EXYNOS4_SETUP_I2C1 ··· 269 261 select S5P_DEV_MFC 270 262 select S5P_DEV_USB_EHCI 271 263 select S5P_SETUP_MIPIPHY 264 + select EXYNOS4_DEV_DMA 272 265 select EXYNOS4_DEV_PD 273 266 select EXYNOS4_SETUP_FIMC 274 267 select EXYNOS4_SETUP_FIMD0 ··· 302 293 select S5P_DEV_USB_EHCI 303 294 select SAMSUNG_DEV_BACKLIGHT 304 295 select SAMSUNG_DEV_PWM 296 + select EXYNOS4_DEV_DMA 305 297 select EXYNOS4_DEV_PD 306 298 select EXYNOS4_DEV_USB_OHCI 307 299 select EXYNOS4_SETUP_FIMD0 ··· 343 333 help 344 334 Machine support for Samsung SMDK4412 345 335 endif 336 + 337 + comment "Flattened Device Tree based board for Exynos4 based SoC" 338 + 339 + config MACH_EXYNOS4_DT 340 + bool "Samsung Exynos4 Machine using device tree" 341 + select CPU_EXYNOS4210 342 + select USE_OF 343 + select ARM_AMBA 344 + select HAVE_SAMSUNG_KEYPAD if INPUT_KEYBOARD 345 + help 346 + Machine support for Samsung Exynos4 machine with device tree enabled. 347 + Select this if a fdt blob is available for the Exynos4 SoC based board. 348 + Note: This is under development and not all peripherals can be supported 349 + with this machine file. 346 350 347 351 if ARCH_EXYNOS4 348 352
+4 -2
arch/arm/mach-exynos/Makefile
··· 13 13 # Core support for EXYNOS4 system 14 14 15 15 obj-$(CONFIG_ARCH_EXYNOS4) += cpu.o init.o clock.o irq-combiner.o setup-i2c0.o 16 - obj-$(CONFIG_ARCH_EXYNOS4) += irq-eint.o dma.o pmu.o 16 + obj-$(CONFIG_ARCH_EXYNOS4) += irq-eint.o pmu.o 17 17 obj-$(CONFIG_CPU_EXYNOS4210) += clock-exynos4210.o 18 18 obj-$(CONFIG_SOC_EXYNOS4212) += clock-exynos4212.o 19 19 obj-$(CONFIG_PM) += pm.o ··· 37 37 obj-$(CONFIG_MACH_SMDK4212) += mach-smdk4x12.o 38 38 obj-$(CONFIG_MACH_SMDK4412) += mach-smdk4x12.o 39 39 40 + obj-$(CONFIG_MACH_EXYNOS4_DT) += mach-exynos4-dt.o 41 + 40 42 # device support 41 43 42 44 obj-$(CONFIG_ARCH_EXYNOS4) += dev-audio.o ··· 46 44 obj-$(CONFIG_EXYNOS4_DEV_PD) += dev-pd.o 47 45 obj-$(CONFIG_EXYNOS4_DEV_SYSMMU) += dev-sysmmu.o 48 46 obj-$(CONFIG_EXYNOS4_DEV_DWMCI) += dev-dwmci.o 47 + obj-$(CONFIG_EXYNOS4_DEV_DMA) += dma.o 49 48 obj-$(CONFIG_EXYNOS4_DEV_USB_OHCI) += dev-ohci.o 50 49 51 50 obj-$(CONFIG_EXYNOS4_SETUP_FIMC) += setup-fimc.o ··· 59 56 obj-$(CONFIG_EXYNOS4_SETUP_I2C6) += setup-i2c6.o 60 57 obj-$(CONFIG_EXYNOS4_SETUP_I2C7) += setup-i2c7.o 61 58 obj-$(CONFIG_EXYNOS4_SETUP_KEYPAD) += setup-keypad.o 62 - obj-$(CONFIG_EXYNOS4_SETUP_SDHCI) += setup-sdhci.o 63 59 obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o 64 60 obj-$(CONFIG_EXYNOS4_SETUP_USB_PHY) += setup-usb-phy.o
+143 -86
arch/arm/mach-exynos/clock.c
··· 553 553 .enable = exynos4_clk_dac_ctrl, 554 554 .ctrlbit = (1 << 0), 555 555 }, { 556 - .name = "dma", 557 - .devname = "dma-pl330.0", 558 - .enable = exynos4_clk_ip_fsys_ctrl, 559 - .ctrlbit = (1 << 0), 560 - }, { 561 - .name = "dma", 562 - .devname = "dma-pl330.1", 563 - .enable = exynos4_clk_ip_fsys_ctrl, 564 - .ctrlbit = (1 << 1), 565 - }, { 566 556 .name = "adc", 567 557 .enable = exynos4_clk_ip_peril_ctrl, 568 558 .ctrlbit = (1 << 15), ··· 766 776 .enable = exynos4_clk_ip_peril_ctrl, 767 777 .ctrlbit = (1 << 5), 768 778 } 779 + }; 780 + 781 + static struct clk clk_pdma0 = { 782 + .name = "dma", 783 + .devname = "dma-pl330.0", 784 + .enable = exynos4_clk_ip_fsys_ctrl, 785 + .ctrlbit = (1 << 0), 786 + }; 787 + 788 + static struct clk clk_pdma1 = { 789 + .name = "dma", 790 + .devname = "dma-pl330.1", 791 + .enable = exynos4_clk_ip_fsys_ctrl, 792 + .ctrlbit = (1 << 1), 769 793 }; 770 794 771 795 struct clk *clkset_group_list[] = { ··· 1013 1009 1014 1010 static struct clksrc_clk clksrcs[] = { 1015 1011 { 1016 - .clk = { 1017 - .name = "uclk1", 1018 - .devname = "s5pv210-uart.0", 1019 - .enable = exynos4_clksrc_mask_peril0_ctrl, 1020 - .ctrlbit = (1 << 0), 1021 - }, 1022 - .sources = &clkset_group, 1023 - .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 0, .size = 4 }, 1024 - .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 0, .size = 4 }, 1025 - }, { 1026 - .clk = { 1027 - .name = "uclk1", 1028 - .devname = "s5pv210-uart.1", 1029 - .enable = exynos4_clksrc_mask_peril0_ctrl, 1030 - .ctrlbit = (1 << 4), 1031 - }, 1032 - .sources = &clkset_group, 1033 - .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 4, .size = 4 }, 1034 - .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 4, .size = 4 }, 1035 - }, { 1036 - .clk = { 1037 - .name = "uclk1", 1038 - .devname = "s5pv210-uart.2", 1039 - .enable = exynos4_clksrc_mask_peril0_ctrl, 1040 - .ctrlbit = (1 << 8), 1041 - }, 1042 - .sources = &clkset_group, 1043 - .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 8, .size = 4 }, 1044 - .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 8, .size = 4 }, 1045 - }, { 1046 - .clk = { 1047 - .name = "uclk1", 1048 - .devname = "s5pv210-uart.3", 1049 - .enable = exynos4_clksrc_mask_peril0_ctrl, 1050 - .ctrlbit = (1 << 12), 1051 - }, 1052 - .sources = &clkset_group, 1053 - .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 12, .size = 4 }, 1054 - .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 12, .size = 4 }, 1055 - }, { 1056 1012 .clk = { 1057 1013 .name = "sclk_pwm", 1058 1014 .enable = exynos4_clksrc_mask_peril0_ctrl, ··· 1156 1192 .reg_div = { .reg = S5P_CLKDIV_MFC, .shift = 0, .size = 4 }, 1157 1193 }, { 1158 1194 .clk = { 1159 - .name = "sclk_mmc", 1160 - .devname = "s3c-sdhci.0", 1161 - .parent = &clk_dout_mmc0.clk, 1162 - .enable = exynos4_clksrc_mask_fsys_ctrl, 1163 - .ctrlbit = (1 << 0), 1164 - }, 1165 - .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 8, .size = 8 }, 1166 - }, { 1167 - .clk = { 1168 - .name = "sclk_mmc", 1169 - .devname = "s3c-sdhci.1", 1170 - .parent = &clk_dout_mmc1.clk, 1171 - .enable = exynos4_clksrc_mask_fsys_ctrl, 1172 - .ctrlbit = (1 << 4), 1173 - }, 1174 - .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 24, .size = 8 }, 1175 - }, { 1176 - .clk = { 1177 - .name = "sclk_mmc", 1178 - .devname = "s3c-sdhci.2", 1179 - .parent = &clk_dout_mmc2.clk, 1180 - .enable = exynos4_clksrc_mask_fsys_ctrl, 1181 - .ctrlbit = (1 << 8), 1182 - }, 1183 - .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 8, .size = 8 }, 1184 - }, { 1185 - .clk = { 1186 - .name = "sclk_mmc", 1187 - .devname = "s3c-sdhci.3", 1188 - .parent = &clk_dout_mmc3.clk, 1189 - .enable = exynos4_clksrc_mask_fsys_ctrl, 1190 - .ctrlbit = (1 << 12), 1191 - }, 1192 - .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 24, .size = 8 }, 1193 - }, { 1194 - .clk = { 1195 1195 .name = "sclk_dwmmc", 1196 1196 .parent = &clk_dout_mmc4.clk, 1197 1197 .enable = exynos4_clksrc_mask_fsys_ctrl, ··· 1163 1235 }, 1164 1236 .reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 8, .size = 8 }, 1165 1237 } 1238 + }; 1239 + 1240 + static struct clksrc_clk clk_sclk_uart0 = { 1241 + .clk = { 1242 + .name = "uclk1", 1243 + .devname = "exynos4210-uart.0", 1244 + .enable = exynos4_clksrc_mask_peril0_ctrl, 1245 + .ctrlbit = (1 << 0), 1246 + }, 1247 + .sources = &clkset_group, 1248 + .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 0, .size = 4 }, 1249 + .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 0, .size = 4 }, 1250 + }; 1251 + 1252 + static struct clksrc_clk clk_sclk_uart1 = { 1253 + .clk = { 1254 + .name = "uclk1", 1255 + .devname = "exynos4210-uart.1", 1256 + .enable = exynos4_clksrc_mask_peril0_ctrl, 1257 + .ctrlbit = (1 << 4), 1258 + }, 1259 + .sources = &clkset_group, 1260 + .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 4, .size = 4 }, 1261 + .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 4, .size = 4 }, 1262 + }; 1263 + 1264 + static struct clksrc_clk clk_sclk_uart2 = { 1265 + .clk = { 1266 + .name = "uclk1", 1267 + .devname = "exynos4210-uart.2", 1268 + .enable = exynos4_clksrc_mask_peril0_ctrl, 1269 + .ctrlbit = (1 << 8), 1270 + }, 1271 + .sources = &clkset_group, 1272 + .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 8, .size = 4 }, 1273 + .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 8, .size = 4 }, 1274 + }; 1275 + 1276 + static struct clksrc_clk clk_sclk_uart3 = { 1277 + .clk = { 1278 + .name = "uclk1", 1279 + .devname = "exynos4210-uart.3", 1280 + .enable = exynos4_clksrc_mask_peril0_ctrl, 1281 + .ctrlbit = (1 << 12), 1282 + }, 1283 + .sources = &clkset_group, 1284 + .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 12, .size = 4 }, 1285 + .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 12, .size = 4 }, 1286 + }; 1287 + 1288 + static struct clksrc_clk clk_sclk_mmc0 = { 1289 + .clk = { 1290 + .name = "sclk_mmc", 1291 + .devname = "s3c-sdhci.0", 1292 + .parent = &clk_dout_mmc0.clk, 1293 + .enable = exynos4_clksrc_mask_fsys_ctrl, 1294 + .ctrlbit = (1 << 0), 1295 + }, 1296 + .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 8, .size = 8 }, 1297 + }; 1298 + 1299 + static struct clksrc_clk clk_sclk_mmc1 = { 1300 + .clk = { 1301 + .name = "sclk_mmc", 1302 + .devname = "s3c-sdhci.1", 1303 + .parent = &clk_dout_mmc1.clk, 1304 + .enable = exynos4_clksrc_mask_fsys_ctrl, 1305 + .ctrlbit = (1 << 4), 1306 + }, 1307 + .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 24, .size = 8 }, 1308 + }; 1309 + 1310 + static struct clksrc_clk clk_sclk_mmc2 = { 1311 + .clk = { 1312 + .name = "sclk_mmc", 1313 + .devname = "s3c-sdhci.2", 1314 + .parent = &clk_dout_mmc2.clk, 1315 + .enable = exynos4_clksrc_mask_fsys_ctrl, 1316 + .ctrlbit = (1 << 8), 1317 + }, 1318 + .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 8, .size = 8 }, 1319 + }; 1320 + 1321 + static struct clksrc_clk clk_sclk_mmc3 = { 1322 + .clk = { 1323 + .name = "sclk_mmc", 1324 + .devname = "s3c-sdhci.3", 1325 + .parent = &clk_dout_mmc3.clk, 1326 + .enable = exynos4_clksrc_mask_fsys_ctrl, 1327 + .ctrlbit = (1 << 12), 1328 + }, 1329 + .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 24, .size = 8 }, 1166 1330 }; 1167 1331 1168 1332 /* Clock initialization code */ ··· 1289 1269 &clk_dout_mmc4, 1290 1270 &clk_mout_mfc0, 1291 1271 &clk_mout_mfc1, 1272 + }; 1273 + 1274 + static struct clk *clk_cdev[] = { 1275 + &clk_pdma0, 1276 + &clk_pdma1, 1277 + }; 1278 + 1279 + static struct clksrc_clk *clksrc_cdev[] = { 1280 + &clk_sclk_uart0, 1281 + &clk_sclk_uart1, 1282 + &clk_sclk_uart2, 1283 + &clk_sclk_uart3, 1284 + &clk_sclk_mmc0, 1285 + &clk_sclk_mmc1, 1286 + &clk_sclk_mmc2, 1287 + &clk_sclk_mmc3, 1288 + }; 1289 + 1290 + static struct clk_lookup exynos4_clk_lookup[] = { 1291 + CLKDEV_INIT("exynos4210-uart.0", "clk_uart_baud0", &clk_sclk_uart0.clk), 1292 + CLKDEV_INIT("exynos4210-uart.1", "clk_uart_baud0", &clk_sclk_uart1.clk), 1293 + CLKDEV_INIT("exynos4210-uart.2", "clk_uart_baud0", &clk_sclk_uart2.clk), 1294 + CLKDEV_INIT("exynos4210-uart.3", "clk_uart_baud0", &clk_sclk_uart3.clk), 1295 + CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk), 1296 + CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk), 1297 + CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk), 1298 + CLKDEV_INIT("s3c-sdhci.3", "mmc_busclk.2", &clk_sclk_mmc3.clk), 1299 + CLKDEV_INIT("dma-pl330.0", "apb_pclk", &clk_pdma0), 1300 + CLKDEV_INIT("dma-pl330.1", "apb_pclk", &clk_pdma1), 1292 1301 }; 1293 1302 1294 1303 static int xtal_rate; ··· 1527 1478 for (ptr = 0; ptr < ARRAY_SIZE(sclk_tv); ptr++) 1528 1479 s3c_register_clksrc(sclk_tv[ptr], 1); 1529 1480 1481 + for (ptr = 0; ptr < ARRAY_SIZE(clksrc_cdev); ptr++) 1482 + s3c_register_clksrc(clksrc_cdev[ptr], 1); 1483 + 1530 1484 s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs)); 1531 1485 s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks)); 1532 1486 1487 + s3c24xx_register_clocks(clk_cdev, ARRAY_SIZE(clk_cdev)); 1488 + for (ptr = 0; ptr < ARRAY_SIZE(clk_cdev); ptr++) 1489 + s3c_disable_clocks(clk_cdev[ptr], 1); 1490 + 1533 1491 s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 1534 1492 s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 1493 + clkdev_add_table(exynos4_clk_lookup, ARRAY_SIZE(exynos4_clk_lookup)); 1535 1494 1536 1495 register_syscore_ops(&exynos4_clock_syscore_ops); 1537 1496 s3c24xx_register_clock(&dummy_apb_pclk);
+16 -1
arch/arm/mach-exynos/cpu.c
··· 10 10 11 11 #include <linux/sched.h> 12 12 #include <linux/sysdev.h> 13 + #include <linux/of.h> 14 + #include <linux/of_irq.h> 13 15 14 16 #include <asm/mach/map.h> 15 17 #include <asm/mach/irq.h> ··· 220 218 (gic_bank_offset * smp_processor_id()); 221 219 } 222 220 221 + #ifdef CONFIG_OF 222 + static const struct of_device_id exynos4_dt_irq_match[] = { 223 + { .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, 224 + {}, 225 + }; 226 + #endif 227 + 223 228 void __init exynos4_init_irq(void) 224 229 { 225 230 int irq; 226 231 227 232 gic_bank_offset = soc_is_exynos4412() ? 0x4000 : 0x8000; 228 233 229 - gic_init(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU); 234 + if (!of_have_populated_dt()) 235 + gic_init(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU); 236 + #ifdef CONFIG_OF 237 + else 238 + of_irq_init(exynos4_dt_irq_match); 239 + #endif 240 + 230 241 gic_arch_extn.irq_eoi = exynos4_gic_irq_fix_base; 231 242 gic_arch_extn.irq_unmask = exynos4_gic_irq_fix_base; 232 243 gic_arch_extn.irq_mask = exynos4_gic_irq_fix_base;
+68 -161
arch/arm/mach-exynos/dma.c
··· 24 24 #include <linux/dma-mapping.h> 25 25 #include <linux/amba/bus.h> 26 26 #include <linux/amba/pl330.h> 27 + #include <linux/of.h> 27 28 28 29 #include <asm/irq.h> 29 30 #include <plat/devs.h> ··· 36 35 37 36 static u64 dma_dmamask = DMA_BIT_MASK(32); 38 37 39 - struct dma_pl330_peri pdma0_peri[28] = { 40 - { 41 - .peri_id = (u8)DMACH_PCM0_RX, 42 - .rqtype = DEVTOMEM, 43 - }, { 44 - .peri_id = (u8)DMACH_PCM0_TX, 45 - .rqtype = MEMTODEV, 46 - }, { 47 - .peri_id = (u8)DMACH_PCM2_RX, 48 - .rqtype = DEVTOMEM, 49 - }, { 50 - .peri_id = (u8)DMACH_PCM2_TX, 51 - .rqtype = MEMTODEV, 52 - }, { 53 - .peri_id = (u8)DMACH_MSM_REQ0, 54 - }, { 55 - .peri_id = (u8)DMACH_MSM_REQ2, 56 - }, { 57 - .peri_id = (u8)DMACH_SPI0_RX, 58 - .rqtype = DEVTOMEM, 59 - }, { 60 - .peri_id = (u8)DMACH_SPI0_TX, 61 - .rqtype = MEMTODEV, 62 - }, { 63 - .peri_id = (u8)DMACH_SPI2_RX, 64 - .rqtype = DEVTOMEM, 65 - }, { 66 - .peri_id = (u8)DMACH_SPI2_TX, 67 - .rqtype = MEMTODEV, 68 - }, { 69 - .peri_id = (u8)DMACH_I2S0S_TX, 70 - .rqtype = MEMTODEV, 71 - }, { 72 - .peri_id = (u8)DMACH_I2S0_RX, 73 - .rqtype = DEVTOMEM, 74 - }, { 75 - .peri_id = (u8)DMACH_I2S0_TX, 76 - .rqtype = MEMTODEV, 77 - }, { 78 - .peri_id = (u8)DMACH_UART0_RX, 79 - .rqtype = DEVTOMEM, 80 - }, { 81 - .peri_id = (u8)DMACH_UART0_TX, 82 - .rqtype = MEMTODEV, 83 - }, { 84 - .peri_id = (u8)DMACH_UART2_RX, 85 - .rqtype = DEVTOMEM, 86 - }, { 87 - .peri_id = (u8)DMACH_UART2_TX, 88 - .rqtype = MEMTODEV, 89 - }, { 90 - .peri_id = (u8)DMACH_UART4_RX, 91 - .rqtype = DEVTOMEM, 92 - }, { 93 - .peri_id = (u8)DMACH_UART4_TX, 94 - .rqtype = MEMTODEV, 95 - }, { 96 - .peri_id = (u8)DMACH_SLIMBUS0_RX, 97 - .rqtype = DEVTOMEM, 98 - }, { 99 - .peri_id = (u8)DMACH_SLIMBUS0_TX, 100 - .rqtype = MEMTODEV, 101 - }, { 102 - .peri_id = (u8)DMACH_SLIMBUS2_RX, 103 - .rqtype = DEVTOMEM, 104 - }, { 105 - .peri_id = (u8)DMACH_SLIMBUS2_TX, 106 - .rqtype = MEMTODEV, 107 - }, { 108 - .peri_id = (u8)DMACH_SLIMBUS4_RX, 109 - .rqtype = DEVTOMEM, 110 - }, { 111 - .peri_id = (u8)DMACH_SLIMBUS4_TX, 112 - .rqtype = MEMTODEV, 113 - }, { 114 - .peri_id = (u8)DMACH_AC97_MICIN, 115 - .rqtype = DEVTOMEM, 116 - }, { 117 - .peri_id = (u8)DMACH_AC97_PCMIN, 118 - .rqtype = DEVTOMEM, 119 - }, { 120 - .peri_id = (u8)DMACH_AC97_PCMOUT, 121 - .rqtype = MEMTODEV, 122 - }, 38 + u8 pdma0_peri[] = { 39 + DMACH_PCM0_RX, 40 + DMACH_PCM0_TX, 41 + DMACH_PCM2_RX, 42 + DMACH_PCM2_TX, 43 + DMACH_MSM_REQ0, 44 + DMACH_MSM_REQ2, 45 + DMACH_SPI0_RX, 46 + DMACH_SPI0_TX, 47 + DMACH_SPI2_RX, 48 + DMACH_SPI2_TX, 49 + DMACH_I2S0S_TX, 50 + DMACH_I2S0_RX, 51 + DMACH_I2S0_TX, 52 + DMACH_I2S2_RX, 53 + DMACH_I2S2_TX, 54 + DMACH_UART0_RX, 55 + DMACH_UART0_TX, 56 + DMACH_UART2_RX, 57 + DMACH_UART2_TX, 58 + DMACH_UART4_RX, 59 + DMACH_UART4_TX, 60 + DMACH_SLIMBUS0_RX, 61 + DMACH_SLIMBUS0_TX, 62 + DMACH_SLIMBUS2_RX, 63 + DMACH_SLIMBUS2_TX, 64 + DMACH_SLIMBUS4_RX, 65 + DMACH_SLIMBUS4_TX, 66 + DMACH_AC97_MICIN, 67 + DMACH_AC97_PCMIN, 68 + DMACH_AC97_PCMOUT, 123 69 }; 124 70 125 71 struct dma_pl330_platdata exynos4_pdma0_pdata = { 126 72 .nr_valid_peri = ARRAY_SIZE(pdma0_peri), 127 - .peri = pdma0_peri, 73 + .peri_id = pdma0_peri, 128 74 }; 129 75 130 76 struct amba_device exynos4_device_pdma0 = { ··· 90 142 .periphid = 0x00041330, 91 143 }; 92 144 93 - struct dma_pl330_peri pdma1_peri[25] = { 94 - { 95 - .peri_id = (u8)DMACH_PCM0_RX, 96 - .rqtype = DEVTOMEM, 97 - }, { 98 - .peri_id = (u8)DMACH_PCM0_TX, 99 - .rqtype = MEMTODEV, 100 - }, { 101 - .peri_id = (u8)DMACH_PCM1_RX, 102 - .rqtype = DEVTOMEM, 103 - }, { 104 - .peri_id = (u8)DMACH_PCM1_TX, 105 - .rqtype = MEMTODEV, 106 - }, { 107 - .peri_id = (u8)DMACH_MSM_REQ1, 108 - }, { 109 - .peri_id = (u8)DMACH_MSM_REQ3, 110 - }, { 111 - .peri_id = (u8)DMACH_SPI1_RX, 112 - .rqtype = DEVTOMEM, 113 - }, { 114 - .peri_id = (u8)DMACH_SPI1_TX, 115 - .rqtype = MEMTODEV, 116 - }, { 117 - .peri_id = (u8)DMACH_I2S0S_TX, 118 - .rqtype = MEMTODEV, 119 - }, { 120 - .peri_id = (u8)DMACH_I2S0_RX, 121 - .rqtype = DEVTOMEM, 122 - }, { 123 - .peri_id = (u8)DMACH_I2S0_TX, 124 - .rqtype = MEMTODEV, 125 - }, { 126 - .peri_id = (u8)DMACH_I2S1_RX, 127 - .rqtype = DEVTOMEM, 128 - }, { 129 - .peri_id = (u8)DMACH_I2S1_TX, 130 - .rqtype = MEMTODEV, 131 - }, { 132 - .peri_id = (u8)DMACH_UART0_RX, 133 - .rqtype = DEVTOMEM, 134 - }, { 135 - .peri_id = (u8)DMACH_UART0_TX, 136 - .rqtype = MEMTODEV, 137 - }, { 138 - .peri_id = (u8)DMACH_UART1_RX, 139 - .rqtype = DEVTOMEM, 140 - }, { 141 - .peri_id = (u8)DMACH_UART1_TX, 142 - .rqtype = MEMTODEV, 143 - }, { 144 - .peri_id = (u8)DMACH_UART3_RX, 145 - .rqtype = DEVTOMEM, 146 - }, { 147 - .peri_id = (u8)DMACH_UART3_TX, 148 - .rqtype = MEMTODEV, 149 - }, { 150 - .peri_id = (u8)DMACH_SLIMBUS1_RX, 151 - .rqtype = DEVTOMEM, 152 - }, { 153 - .peri_id = (u8)DMACH_SLIMBUS1_TX, 154 - .rqtype = MEMTODEV, 155 - }, { 156 - .peri_id = (u8)DMACH_SLIMBUS3_RX, 157 - .rqtype = DEVTOMEM, 158 - }, { 159 - .peri_id = (u8)DMACH_SLIMBUS3_TX, 160 - .rqtype = MEMTODEV, 161 - }, { 162 - .peri_id = (u8)DMACH_SLIMBUS5_RX, 163 - .rqtype = DEVTOMEM, 164 - }, { 165 - .peri_id = (u8)DMACH_SLIMBUS5_TX, 166 - .rqtype = MEMTODEV, 167 - }, 145 + u8 pdma1_peri[] = { 146 + DMACH_PCM0_RX, 147 + DMACH_PCM0_TX, 148 + DMACH_PCM1_RX, 149 + DMACH_PCM1_TX, 150 + DMACH_MSM_REQ1, 151 + DMACH_MSM_REQ3, 152 + DMACH_SPI1_RX, 153 + DMACH_SPI1_TX, 154 + DMACH_I2S0S_TX, 155 + DMACH_I2S0_RX, 156 + DMACH_I2S0_TX, 157 + DMACH_I2S1_RX, 158 + DMACH_I2S1_TX, 159 + DMACH_UART0_RX, 160 + DMACH_UART0_TX, 161 + DMACH_UART1_RX, 162 + DMACH_UART1_TX, 163 + DMACH_UART3_RX, 164 + DMACH_UART3_TX, 165 + DMACH_SLIMBUS1_RX, 166 + DMACH_SLIMBUS1_TX, 167 + DMACH_SLIMBUS3_RX, 168 + DMACH_SLIMBUS3_TX, 169 + DMACH_SLIMBUS5_RX, 170 + DMACH_SLIMBUS5_TX, 168 171 }; 169 172 170 173 struct dma_pl330_platdata exynos4_pdma1_pdata = { 171 174 .nr_valid_peri = ARRAY_SIZE(pdma1_peri), 172 - .peri = pdma1_peri, 175 + .peri_id = pdma1_peri, 173 176 }; 174 177 175 178 struct amba_device exynos4_device_pdma1 = { ··· 141 242 142 243 static int __init exynos4_dma_init(void) 143 244 { 245 + if (of_have_populated_dt()) 246 + return 0; 247 + 248 + dma_cap_set(DMA_SLAVE, exynos4_pdma0_pdata.cap_mask); 249 + dma_cap_set(DMA_CYCLIC, exynos4_pdma0_pdata.cap_mask); 144 250 amba_device_register(&exynos4_device_pdma0, &iomem_resource); 251 + 252 + dma_cap_set(DMA_SLAVE, exynos4_pdma1_pdata.cap_mask); 253 + dma_cap_set(DMA_CYCLIC, exynos4_pdma1_pdata.cap_mask); 145 254 amba_device_register(&exynos4_device_pdma1, &iomem_resource); 146 255 147 256 return 0;
-1
arch/arm/mach-exynos/include/mach/entry-macro.S
··· 72 72 cmpcc \irqnr, \irqnr 73 73 cmpne \irqnr, \tmp 74 74 cmpcs \irqnr, \irqnr 75 - addne \irqnr, \irqnr, #32 76 75 77 76 .endm 78 77
+5 -3
arch/arm/mach-exynos/include/mach/irqs.h
··· 17 17 18 18 /* PPI: Private Peripheral Interrupt */ 19 19 20 - #define IRQ_PPI(x) S5P_IRQ(x+16) 20 + #define IRQ_PPI(x) (x+16) 21 21 22 22 #define IRQ_MCT_LOCALTIMER IRQ_PPI(12) 23 23 24 24 /* SPI: Shared Peripheral Interrupt */ 25 25 26 - #define IRQ_SPI(x) S5P_IRQ(x+32) 26 + #define IRQ_SPI(x) (x+32) 27 27 28 28 #define IRQ_EINT0 IRQ_SPI(16) 29 29 #define IRQ_EINT1 IRQ_SPI(17) ··· 163 163 #define IRQ_GPIO2_NR_GROUPS 9 164 164 #define IRQ_GPIO_END (S5P_GPIOINT_BASE + S5P_GPIOINT_COUNT) 165 165 166 + #define IRQ_TIMER_BASE (IRQ_GPIO_END + 64) 167 + 166 168 /* Set the default NR_IRQS */ 167 - #define NR_IRQS (IRQ_GPIO_END + 64) 169 + #define NR_IRQS (IRQ_TIMER_BASE + IRQ_TIMER_COUNT) 168 170 169 171 #endif /* __ASM_ARCH_IRQS_H */
+3 -18
arch/arm/mach-exynos/init.c
··· 14 14 #include <plat/devs.h> 15 15 #include <plat/regs-serial.h> 16 16 17 - static struct s3c24xx_uart_clksrc exynos4_serial_clocks[] = { 18 - [0] = { 19 - .name = "uclk1", 20 - .divisor = 1, 21 - .min_baud = 0, 22 - .max_baud = 0, 23 - }, 24 - }; 25 - 26 17 /* uart registration process */ 27 18 void __init exynos4_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) 28 19 { 29 20 struct s3c2410_uartcfg *tcfg = cfg; 30 21 u32 ucnt; 31 22 32 - for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { 33 - if (!tcfg->clocks) { 34 - tcfg->has_fracval = 1; 35 - tcfg->clocks = exynos4_serial_clocks; 36 - tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks); 37 - } 38 - tcfg->flags |= NO_NEED_CHECK_CLKSRC; 39 - } 23 + for (ucnt = 0; ucnt < no; ucnt++, tcfg++) 24 + tcfg->has_fracval = 1; 40 25 41 - s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); 26 + s3c24xx_init_uartdevs("exynos4210-uart", s5p_uart_resources, cfg, no); 42 27 }
+85
arch/arm/mach-exynos/mach-exynos4-dt.c
··· 1 + /* 2 + * Samsung's Exynos4210 flattened device tree enabled machine 3 + * 4 + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. 5 + * http://www.samsung.com 6 + * Copyright (c) 2010-2011 Linaro Ltd. 7 + * www.linaro.org 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 version 2 as 11 + * published by the Free Software Foundation. 12 + */ 13 + 14 + #include <linux/of_platform.h> 15 + #include <linux/serial_core.h> 16 + 17 + #include <asm/mach/arch.h> 18 + #include <mach/map.h> 19 + 20 + #include <plat/cpu.h> 21 + #include <plat/regs-serial.h> 22 + #include <plat/exynos4.h> 23 + 24 + /* 25 + * The following lookup table is used to override device names when devices 26 + * are registered from device tree. This is temporarily added to enable 27 + * device tree support addition for the Exynos4 architecture. 28 + * 29 + * For drivers that require platform data to be provided from the machine 30 + * file, a platform data pointer can also be supplied along with the 31 + * devices names. Usually, the platform data elements that cannot be parsed 32 + * from the device tree by the drivers (example: function pointers) are 33 + * supplied. But it should be noted that this is a temporary mechanism and 34 + * at some point, the drivers should be capable of parsing all the platform 35 + * data from the device tree. 36 + */ 37 + static const struct of_dev_auxdata exynos4210_auxdata_lookup[] __initconst = { 38 + OF_DEV_AUXDATA("samsung,exynos4210-uart", S5P_PA_UART0, 39 + "exynos4210-uart.0", NULL), 40 + OF_DEV_AUXDATA("samsung,exynos4210-uart", S5P_PA_UART1, 41 + "exynos4210-uart.1", NULL), 42 + OF_DEV_AUXDATA("samsung,exynos4210-uart", S5P_PA_UART2, 43 + "exynos4210-uart.2", NULL), 44 + OF_DEV_AUXDATA("samsung,exynos4210-uart", S5P_PA_UART3, 45 + "exynos4210-uart.3", NULL), 46 + OF_DEV_AUXDATA("samsung,exynos4210-sdhci", EXYNOS4_PA_HSMMC(0), 47 + "exynos4-sdhci.0", NULL), 48 + OF_DEV_AUXDATA("samsung,exynos4210-sdhci", EXYNOS4_PA_HSMMC(1), 49 + "exynos4-sdhci.1", NULL), 50 + OF_DEV_AUXDATA("samsung,exynos4210-sdhci", EXYNOS4_PA_HSMMC(2), 51 + "exynos4-sdhci.2", NULL), 52 + OF_DEV_AUXDATA("samsung,exynos4210-sdhci", EXYNOS4_PA_HSMMC(3), 53 + "exynos4-sdhci.3", NULL), 54 + OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS4_PA_IIC(0), 55 + "s3c2440-i2c.0", NULL), 56 + OF_DEV_AUXDATA("arm,pl330", EXYNOS4_PA_PDMA0, "dma-pl330.0", NULL), 57 + OF_DEV_AUXDATA("arm,pl330", EXYNOS4_PA_PDMA1, "dma-pl330.1", NULL), 58 + {}, 59 + }; 60 + 61 + static void __init exynos4210_dt_map_io(void) 62 + { 63 + s5p_init_io(NULL, 0, S5P_VA_CHIPID); 64 + s3c24xx_init_clocks(24000000); 65 + } 66 + 67 + static void __init exynos4210_dt_machine_init(void) 68 + { 69 + of_platform_populate(NULL, of_default_bus_match_table, 70 + exynos4210_auxdata_lookup, NULL); 71 + } 72 + 73 + static char const *exynos4210_dt_compat[] __initdata = { 74 + "samsung,exynos4210", 75 + NULL 76 + }; 77 + 78 + DT_MACHINE_START(EXYNOS4210_DT, "Samsung Exynos4 (Flattened Device Tree)") 79 + /* Maintainer: Thomas Abraham <thomas.abraham@linaro.org> */ 80 + .init_irq = exynos4_init_irq, 81 + .map_io = exynos4210_dt_map_io, 82 + .init_machine = exynos4210_dt_machine_init, 83 + .timer = &exynos4_timer, 84 + .dt_compat = exynos4210_dt_compat, 85 + MACHINE_END
-22
arch/arm/mach-exynos/setup-sdhci.c
··· 1 - /* linux/arch/arm/mach-exynos4/setup-sdhci.c 2 - * 3 - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. 4 - * http://www.samsung.com 5 - * 6 - * EXYNOS4 - Helper functions for settign up SDHCI device(s) (HSMMC) 7 - * 8 - * This program is free software; you can redistribute it and/or modify 9 - * it under the terms of the GNU General Public License version 2 as 10 - * published by the Free Software Foundation. 11 - */ 12 - 13 - #include <linux/types.h> 14 - 15 - /* clock sources for the mmc bus clock, order as for the ctrl2[5..4] */ 16 - 17 - char *exynos4_hsmmc_clksrcs[4] = { 18 - [0] = NULL, 19 - [1] = NULL, 20 - [2] = "sclk_mmc", /* mmc_bus */ 21 - [3] = NULL, 22 - };
-22
arch/arm/mach-s3c2410/mach-bast.c
··· 164 164 #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB 165 165 #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE 166 166 167 - static struct s3c24xx_uart_clksrc bast_serial_clocks[] = { 168 - [0] = { 169 - .name = "uclk", 170 - .divisor = 1, 171 - .min_baud = 0, 172 - .max_baud = 0, 173 - }, 174 - [1] = { 175 - .name = "pclk", 176 - .divisor = 1, 177 - .min_baud = 0, 178 - .max_baud = 0, 179 - } 180 - }; 181 - 182 - 183 167 static struct s3c2410_uartcfg bast_uartcfgs[] __initdata = { 184 168 [0] = { 185 169 .hwport = 0, ··· 171 187 .ucon = UCON, 172 188 .ulcon = ULCON, 173 189 .ufcon = UFCON, 174 - .clocks = bast_serial_clocks, 175 - .clocks_size = ARRAY_SIZE(bast_serial_clocks), 176 190 }, 177 191 [1] = { 178 192 .hwport = 1, ··· 178 196 .ucon = UCON, 179 197 .ulcon = ULCON, 180 198 .ufcon = UFCON, 181 - .clocks = bast_serial_clocks, 182 - .clocks_size = ARRAY_SIZE(bast_serial_clocks), 183 199 }, 184 200 /* port 2 is not actually used */ 185 201 [2] = { ··· 186 206 .ucon = UCON, 187 207 .ulcon = ULCON, 188 208 .ufcon = UFCON, 189 - .clocks = bast_serial_clocks, 190 - .clocks_size = ARRAY_SIZE(bast_serial_clocks), 191 209 } 192 210 }; 193 211
-24
arch/arm/mach-s3c2410/mach-vr1000.c
··· 109 109 #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB 110 110 #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE 111 111 112 - /* uart clock source(s) */ 113 - 114 - static struct s3c24xx_uart_clksrc vr1000_serial_clocks[] = { 115 - [0] = { 116 - .name = "uclk", 117 - .divisor = 1, 118 - .min_baud = 0, 119 - .max_baud = 0, 120 - }, 121 - [1] = { 122 - .name = "pclk", 123 - .divisor = 1, 124 - .min_baud = 0, 125 - .max_baud = 0. 126 - } 127 - }; 128 - 129 112 static struct s3c2410_uartcfg vr1000_uartcfgs[] __initdata = { 130 113 [0] = { 131 114 .hwport = 0, ··· 116 133 .ucon = UCON, 117 134 .ulcon = ULCON, 118 135 .ufcon = UFCON, 119 - .clocks = vr1000_serial_clocks, 120 - .clocks_size = ARRAY_SIZE(vr1000_serial_clocks), 121 136 }, 122 137 [1] = { 123 138 .hwport = 1, ··· 123 142 .ucon = UCON, 124 143 .ulcon = ULCON, 125 144 .ufcon = UFCON, 126 - .clocks = vr1000_serial_clocks, 127 - .clocks_size = ARRAY_SIZE(vr1000_serial_clocks), 128 145 }, 129 146 /* port 2 is not actually used */ 130 147 [2] = { ··· 131 152 .ucon = UCON, 132 153 .ulcon = ULCON, 133 154 .ufcon = UFCON, 134 - .clocks = vr1000_serial_clocks, 135 - .clocks_size = ARRAY_SIZE(vr1000_serial_clocks), 136 - 137 155 } 138 156 }; 139 157
+6
arch/arm/mach-s3c2410/s3c2410.c
··· 123 123 .id = -1, 124 124 }; 125 125 126 + static struct clk_lookup s3c2410_clk_lookup[] = { 127 + CLKDEV_INIT(NULL, "clk_uart_baud0", &clk_p), 128 + CLKDEV_INIT(NULL, "clk_uart_baud1", &s3c24xx_uclk), 129 + }; 130 + 126 131 void __init s3c2410_init_clocks(int xtal) 127 132 { 128 133 s3c24xx_register_baseclocks(xtal); 129 134 s3c2410_setup_clocks(); 130 135 s3c2410_baseclk_add(); 131 136 s3c24xx_register_clock(&s3c2410_armclk); 137 + clkdev_add_table(s3c2410_clk_lookup, ARRAY_SIZE(s3c2410_clk_lookup)); 132 138 } 133 139 134 140 struct sysdev_class s3c2410_sysclass = {
+7
arch/arm/mach-s3c2412/clock.c
··· 659 659 &clk_armclk, 660 660 }; 661 661 662 + static struct clk_lookup s3c2412_clk_lookup[] = { 663 + CLKDEV_INIT(NULL, "clk_uart_baud1", &s3c24xx_uclk), 664 + CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p), 665 + CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_usysclk), 666 + }; 667 + 662 668 int __init s3c2412_baseclk_add(void) 663 669 { 664 670 unsigned long clkcon = __raw_readl(S3C2410_CLKCON); ··· 757 751 s3c2412_clkcon_enable(clkp, 0); 758 752 } 759 753 754 + clkdev_add_table(s3c2412_clk_lookup, ARRAY_SIZE(s3c2412_clk_lookup)); 760 755 s3c_pwmclk_init(); 761 756 return 0; 762 757 }
-1
arch/arm/mach-s3c2416/Makefile
··· 15 15 #obj-$(CONFIG_S3C2416_DMA) += dma.o 16 16 17 17 # Device setup 18 - obj-$(CONFIG_S3C2416_SETUP_SDHCI) += setup-sdhci.o 19 18 obj-$(CONFIG_S3C2416_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o 20 19 21 20 # Machine support
+38 -32
arch/arm/mach-s3c2416/clock.c
··· 90 90 }, 91 91 }; 92 92 93 - static struct clksrc_clk hsmmc_mux[] = { 94 - [0] = { 95 - .clk = { 96 - .name = "hsmmc-if", 97 - .devname = "s3c-sdhci.0", 98 - .ctrlbit = (1 << 6), 99 - .enable = s3c2443_clkcon_enable_s, 100 - }, 101 - .sources = &(struct clksrc_sources) { 102 - .nr_sources = 2, 103 - .sources = (struct clk *[]) { 104 - [0] = &hsmmc_div[0].clk, 105 - [1] = NULL, /* to fix */ 106 - }, 107 - }, 108 - .reg_src = { .reg = S3C2443_CLKSRC, .size = 1, .shift = 16 }, 93 + static struct clksrc_clk hsmmc_mux0 = { 94 + .clk = { 95 + .name = "hsmmc-if", 96 + .devname = "s3c-sdhci.0", 97 + .ctrlbit = (1 << 6), 98 + .enable = s3c2443_clkcon_enable_s, 109 99 }, 110 - [1] = { 111 - .clk = { 112 - .name = "hsmmc-if", 113 - .devname = "s3c-sdhci.1", 114 - .ctrlbit = (1 << 12), 115 - .enable = s3c2443_clkcon_enable_s, 100 + .sources = &(struct clksrc_sources) { 101 + .nr_sources = 2, 102 + .sources = (struct clk * []) { 103 + [0] = &hsmmc_div[0].clk, 104 + [1] = NULL, /* to fix */ 116 105 }, 117 - .sources = &(struct clksrc_sources) { 118 - .nr_sources = 2, 119 - .sources = (struct clk *[]) { 120 - [0] = &hsmmc_div[1].clk, 121 - [1] = NULL, /* to fix */ 122 - }, 123 - }, 124 - .reg_src = { .reg = S3C2443_CLKSRC, .size = 1, .shift = 17 }, 125 106 }, 107 + .reg_src = { .reg = S3C2443_CLKSRC, .size = 1, .shift = 16 }, 108 + }; 109 + 110 + static struct clksrc_clk hsmmc_mux1 = { 111 + .clk = { 112 + .name = "hsmmc-if", 113 + .devname = "s3c-sdhci.1", 114 + .ctrlbit = (1 << 12), 115 + .enable = s3c2443_clkcon_enable_s, 116 + }, 117 + .sources = &(struct clksrc_sources) { 118 + .nr_sources = 2, 119 + .sources = (struct clk * []) { 120 + [0] = &hsmmc_div[1].clk, 121 + [1] = NULL, /* to fix */ 122 + }, 123 + }, 124 + .reg_src = { .reg = S3C2443_CLKSRC, .size = 1, .shift = 17 }, 126 125 }; 127 126 128 127 static struct clk hsmmc0_clk = { ··· 143 144 &hsspi_mux, 144 145 &hsmmc_div[0], 145 146 &hsmmc_div[1], 146 - &hsmmc_mux[0], 147 - &hsmmc_mux[1], 147 + &hsmmc_mux0, 148 + &hsmmc_mux1, 149 + }; 150 + 151 + static struct clk_lookup s3c2416_clk_lookup[] = { 152 + CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.0", &hsmmc0_clk), 153 + CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &hsmmc_mux0.clk), 154 + CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &hsmmc_mux1.clk), 148 155 }; 149 156 150 157 void __init s3c2416_init_clocks(int xtal) ··· 172 167 s3c_register_clksrc(clksrcs[ptr], 1); 173 168 174 169 s3c24xx_register_clock(&hsmmc0_clk); 170 + clkdev_add_table(s3c2416_clk_lookup, ARRAY_SIZE(s3c2416_clk_lookup)); 175 171 176 172 s3c_pwmclk_init(); 177 173
-24
arch/arm/mach-s3c2416/setup-sdhci.c
··· 1 - /* linux/arch/arm/mach-s3c2416/setup-sdhci.c 2 - * 3 - * Copyright 2010 Promwad Innovation Company 4 - * Yauhen Kharuzhy <yauhen.kharuzhy@promwad.com> 5 - * 6 - * S3C2416 - Helper functions for settign up SDHCI device(s) (HSMMC) 7 - * 8 - * Based on mach-s3c64xx/setup-sdhci.c 9 - * 10 - * This program is free software; you can redistribute it and/or modify 11 - * it under the terms of the GNU General Public License version 2 as 12 - * published by the Free Software Foundation. 13 - */ 14 - 15 - #include <linux/types.h> 16 - 17 - /* clock sources for the mmc bus clock, order as for the ctrl2[5..4] */ 18 - 19 - char *s3c2416_hsmmc_clksrcs[4] = { 20 - [0] = "hsmmc", 21 - [1] = "hsmmc", 22 - [2] = "hsmmc-if", 23 - /* [3] = "48m", - note not successfully used yet */ 24 - };
+44
arch/arm/mach-s3c2440/clock.c
··· 34 34 #include <linux/mutex.h> 35 35 #include <linux/clk.h> 36 36 #include <linux/io.h> 37 + #include <linux/serial_core.h> 37 38 38 39 #include <mach/hardware.h> 39 40 #include <linux/atomic.h> ··· 44 43 45 44 #include <plat/clock.h> 46 45 #include <plat/cpu.h> 46 + #include <plat/regs-serial.h> 47 47 48 48 /* S3C2440 extended clock support */ 49 49 ··· 110 108 .ctrlbit = S3C2440_CLKCON_CAMERA, 111 109 }; 112 110 111 + static unsigned long s3c2440_fclk_n_getrate(struct clk *clk) 112 + { 113 + unsigned long ucon0, ucon1, ucon2, divisor; 114 + 115 + /* the fun of calculating the uart divisors on the s3c2440 */ 116 + ucon0 = __raw_readl(S3C24XX_VA_UART0 + S3C2410_UCON); 117 + ucon1 = __raw_readl(S3C24XX_VA_UART1 + S3C2410_UCON); 118 + ucon2 = __raw_readl(S3C24XX_VA_UART2 + S3C2410_UCON); 119 + 120 + ucon0 &= S3C2440_UCON0_DIVMASK; 121 + ucon1 &= S3C2440_UCON1_DIVMASK; 122 + ucon2 &= S3C2440_UCON2_DIVMASK; 123 + 124 + if (ucon0 != 0) 125 + divisor = (ucon0 >> S3C2440_UCON_DIVSHIFT) + 6; 126 + else if (ucon1 != 0) 127 + divisor = (ucon1 >> S3C2440_UCON_DIVSHIFT) + 21; 128 + else if (ucon2 != 0) 129 + divisor = (ucon2 >> S3C2440_UCON_DIVSHIFT) + 36; 130 + else 131 + /* manual calims 44, seems to be 9 */ 132 + divisor = 9; 133 + 134 + return clk_get_rate(clk->parent) / divisor; 135 + } 136 + 137 + static struct clk s3c2440_clk_fclk_n = { 138 + .name = "fclk_n", 139 + .parent = &clk_f, 140 + .ops = &(struct clk_ops) { 141 + .get_rate = s3c2440_fclk_n_getrate, 142 + }, 143 + }; 144 + 145 + static struct clk_lookup s3c2440_clk_lookup[] = { 146 + CLKDEV_INIT(NULL, "clk_uart_baud1", &s3c24xx_uclk), 147 + CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p), 148 + CLKDEV_INIT(NULL, "clk_uart_baud3", &s3c2440_clk_fclk_n), 149 + }; 150 + 113 151 static int s3c2440_clk_add(struct sys_device *sysdev) 114 152 { 115 153 struct clk *clock_upll; ··· 168 126 s3c2440_clk_cam.parent = clock_h; 169 127 s3c2440_clk_ac97.parent = clock_p; 170 128 s3c2440_clk_cam_upll.parent = clock_upll; 129 + s3c24xx_register_clock(&s3c2440_clk_fclk_n); 171 130 172 131 s3c24xx_register_clock(&s3c2440_clk_ac97); 173 132 s3c24xx_register_clock(&s3c2440_clk_cam); 174 133 s3c24xx_register_clock(&s3c2440_clk_cam_upll); 134 + clkdev_add_table(s3c2440_clk_lookup, ARRAY_SIZE(s3c2440_clk_lookup)); 175 135 176 136 clk_disable(&s3c2440_clk_ac97); 177 137 clk_disable(&s3c2440_clk_cam);
+2 -20
arch/arm/mach-s3c2440/mach-anubis.c
··· 96 96 #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB 97 97 #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE 98 98 99 - static struct s3c24xx_uart_clksrc anubis_serial_clocks[] = { 100 - [0] = { 101 - .name = "uclk", 102 - .divisor = 1, 103 - .min_baud = 0, 104 - .max_baud = 0, 105 - }, 106 - [1] = { 107 - .name = "pclk", 108 - .divisor = 1, 109 - .min_baud = 0, 110 - .max_baud = 0, 111 - } 112 - }; 113 - 114 - 115 99 static struct s3c2410_uartcfg anubis_uartcfgs[] __initdata = { 116 100 [0] = { 117 101 .hwport = 0, ··· 103 119 .ucon = UCON, 104 120 .ulcon = ULCON, 105 121 .ufcon = UFCON, 106 - .clocks = anubis_serial_clocks, 107 - .clocks_size = ARRAY_SIZE(anubis_serial_clocks), 122 + .clk_sel = S3C2410_UCON_CLKSEL1 | S3C2410_UCON_CLKSEL2, 108 123 }, 109 124 [1] = { 110 125 .hwport = 2, ··· 111 128 .ucon = UCON, 112 129 .ulcon = ULCON, 113 130 .ufcon = UFCON, 114 - .clocks = anubis_serial_clocks, 115 - .clocks_size = ARRAY_SIZE(anubis_serial_clocks), 131 + .clk_sel = S3C2410_UCON_CLKSEL1 | S3C2410_UCON_CLKSEL2, 116 132 }, 117 133 }; 118 134
+2 -20
arch/arm/mach-s3c2440/mach-at2440evb.c
··· 57 57 #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE) 58 58 #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) 59 59 60 - static struct s3c24xx_uart_clksrc at2440evb_serial_clocks[] = { 61 - [0] = { 62 - .name = "uclk", 63 - .divisor = 1, 64 - .min_baud = 0, 65 - .max_baud = 0, 66 - }, 67 - [1] = { 68 - .name = "pclk", 69 - .divisor = 1, 70 - .min_baud = 0, 71 - .max_baud = 0, 72 - } 73 - }; 74 - 75 - 76 60 static struct s3c2410_uartcfg at2440evb_uartcfgs[] __initdata = { 77 61 [0] = { 78 62 .hwport = 0, ··· 64 80 .ucon = UCON, 65 81 .ulcon = ULCON, 66 82 .ufcon = UFCON, 67 - .clocks = at2440evb_serial_clocks, 68 - .clocks_size = ARRAY_SIZE(at2440evb_serial_clocks), 83 + .clk_sel = S3C2410_UCON_CLKSEL1 | S3C2410_UCON_CLKSEL2, 69 84 }, 70 85 [1] = { 71 86 .hwport = 1, ··· 72 89 .ucon = UCON, 73 90 .ulcon = ULCON, 74 91 .ufcon = UFCON, 75 - .clocks = at2440evb_serial_clocks, 76 - .clocks_size = ARRAY_SIZE(at2440evb_serial_clocks), 92 + .clk_sel = S3C2410_UCON_CLKSEL1 | S3C2410_UCON_CLKSEL2, 77 93 }, 78 94 }; 79 95
+3 -21
arch/arm/mach-s3c2440/mach-osiris.c
··· 100 100 #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB 101 101 #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE 102 102 103 - static struct s3c24xx_uart_clksrc osiris_serial_clocks[] = { 104 - [0] = { 105 - .name = "uclk", 106 - .divisor = 1, 107 - .min_baud = 0, 108 - .max_baud = 0, 109 - }, 110 - [1] = { 111 - .name = "pclk", 112 - .divisor = 1, 113 - .min_baud = 0, 114 - .max_baud = 0, 115 - } 116 - }; 117 - 118 103 static struct s3c2410_uartcfg osiris_uartcfgs[] __initdata = { 119 104 [0] = { 120 105 .hwport = 0, ··· 107 122 .ucon = UCON, 108 123 .ulcon = ULCON, 109 124 .ufcon = UFCON, 110 - .clocks = osiris_serial_clocks, 111 - .clocks_size = ARRAY_SIZE(osiris_serial_clocks), 125 + .clk_sel = S3C2410_UCON_CLKSEL1 | S3C2410_UCON_CLKSEL2, 112 126 }, 113 127 [1] = { 114 128 .hwport = 1, ··· 115 131 .ucon = UCON, 116 132 .ulcon = ULCON, 117 133 .ufcon = UFCON, 118 - .clocks = osiris_serial_clocks, 119 - .clocks_size = ARRAY_SIZE(osiris_serial_clocks), 134 + .clk_sel = S3C2410_UCON_CLKSEL1 | S3C2410_UCON_CLKSEL2, 120 135 }, 121 136 [2] = { 122 137 .hwport = 2, ··· 123 140 .ucon = UCON, 124 141 .ulcon = ULCON, 125 142 .ufcon = UFCON, 126 - .clocks = osiris_serial_clocks, 127 - .clocks_size = ARRAY_SIZE(osiris_serial_clocks), 143 + .clk_sel = S3C2410_UCON_CLKSEL1 | S3C2410_UCON_CLKSEL2, 128 144 } 129 145 }; 130 146
+3 -15
arch/arm/mach-s3c2440/mach-rx1950.c
··· 68 68 static struct map_desc rx1950_iodesc[] __initdata = { 69 69 }; 70 70 71 - static struct s3c24xx_uart_clksrc rx1950_serial_clocks[] = { 72 - [0] = { 73 - .name = "fclk", 74 - .divisor = 0x0a, 75 - .min_baud = 0, 76 - .max_baud = 0, 77 - }, 78 - }; 79 - 80 71 static struct s3c2410_uartcfg rx1950_uartcfgs[] __initdata = { 81 72 [0] = { 82 73 .hwport = 0, ··· 75 84 .ucon = 0x3c5, 76 85 .ulcon = 0x03, 77 86 .ufcon = 0x51, 78 - .clocks = rx1950_serial_clocks, 79 - .clocks_size = ARRAY_SIZE(rx1950_serial_clocks), 87 + .clk_sel = S3C2410_UCON_CLKSEL3, 80 88 }, 81 89 [1] = { 82 90 .hwport = 1, ··· 83 93 .ucon = 0x3c5, 84 94 .ulcon = 0x03, 85 95 .ufcon = 0x51, 86 - .clocks = rx1950_serial_clocks, 87 - .clocks_size = ARRAY_SIZE(rx1950_serial_clocks), 96 + .clk_sel = S3C2410_UCON_CLKSEL3, 88 97 }, 89 98 /* IR port */ 90 99 [2] = { ··· 92 103 .ucon = 0x3c5, 93 104 .ulcon = 0x43, 94 105 .ufcon = 0xf1, 95 - .clocks = rx1950_serial_clocks, 96 - .clocks_size = ARRAY_SIZE(rx1950_serial_clocks), 106 + .clk_sel = S3C2410_UCON_CLKSEL3, 97 107 }, 98 108 }; 99 109
+3 -16
arch/arm/mach-s3c2440/mach-rx3715.c
··· 67 67 }, 68 68 }; 69 69 70 - 71 - static struct s3c24xx_uart_clksrc rx3715_serial_clocks[] = { 72 - [0] = { 73 - .name = "fclk", 74 - .divisor = 0, 75 - .min_baud = 0, 76 - .max_baud = 0, 77 - } 78 - }; 79 - 80 70 static struct s3c2410_uartcfg rx3715_uartcfgs[] = { 81 71 [0] = { 82 72 .hwport = 0, ··· 74 84 .ucon = 0x3c5, 75 85 .ulcon = 0x03, 76 86 .ufcon = 0x51, 77 - .clocks = rx3715_serial_clocks, 78 - .clocks_size = ARRAY_SIZE(rx3715_serial_clocks), 87 + .clk_sel = S3C2410_UCON_CLKSEL3, 79 88 }, 80 89 [1] = { 81 90 .hwport = 1, ··· 82 93 .ucon = 0x3c5, 83 94 .ulcon = 0x03, 84 95 .ufcon = 0x00, 85 - .clocks = rx3715_serial_clocks, 86 - .clocks_size = ARRAY_SIZE(rx3715_serial_clocks), 96 + .clk_sel = S3C2410_UCON_CLKSEL3, 87 97 }, 88 98 /* IR port */ 89 99 [2] = { ··· 91 103 .ucon = 0x3c5, 92 104 .ulcon = 0x43, 93 105 .ufcon = 0x51, 94 - .clocks = rx3715_serial_clocks, 95 - .clocks_size = ARRAY_SIZE(rx3715_serial_clocks), 106 + .clk_sel = S3C2410_UCON_CLKSEL3, 96 107 } 97 108 }; 98 109
+7 -1
arch/arm/mach-s3c64xx/Kconfig
··· 77 77 help 78 78 Common setup code for S3C64XX SDHCI GPIO configurations 79 79 80 + config S3C64XX_SETUP_SPI 81 + bool 82 + help 83 + Common setup code for SPI GPIO configurations 84 + 80 85 # S36400 Macchine support 81 86 82 87 config MACH_SMDK6400 ··· 281 276 select S3C64XX_SETUP_IDE 282 277 select S3C64XX_SETUP_FB_24BPP 283 278 select S3C64XX_SETUP_KEYPAD 279 + select S3C64XX_SETUP_SPI 284 280 select SAMSUNG_DEV_ADC 285 281 select SAMSUNG_DEV_KEYPAD 286 282 select S3C_DEV_USB_HOST ··· 292 286 select S3C_DEV_I2C1 293 287 select S3C_DEV_WDT 294 288 select S3C_DEV_RTC 295 - select S3C64XX_DEV_SPI 289 + select S3C64XX_DEV_SPI0 296 290 select S3C24XX_GPIO_EXTRA128 297 291 select I2C 298 292 help
+1 -2
arch/arm/mach-s3c64xx/Makefile
··· 32 32 obj-$(CONFIG_S3C64XX_SETUP_I2C1) += setup-i2c1.o 33 33 obj-$(CONFIG_S3C64XX_SETUP_IDE) += setup-ide.o 34 34 obj-$(CONFIG_S3C64XX_SETUP_KEYPAD) += setup-keypad.o 35 - obj-$(CONFIG_S3C64XX_SETUP_SDHCI) += setup-sdhci.o 36 35 obj-$(CONFIG_S3C64XX_SETUP_FB_24BPP) += setup-fb-24bpp.o 37 36 obj-$(CONFIG_S3C64XX_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o 37 + obj-$(CONFIG_S3C64XX_SETUP_SPI) += setup-spi.o 38 38 39 39 # PM 40 40 ··· 60 60 61 61 obj-y += dev-uart.o 62 62 obj-y += dev-audio.o 63 - obj-$(CONFIG_S3C64XX_DEV_SPI) += dev-spi.o
+154 -89
arch/arm/mach-s3c64xx/clock.c
··· 184 184 .enable = s3c64xx_pclk_ctrl, 185 185 .ctrlbit = S3C_CLKCON_PCLK_SPI1, 186 186 }, { 187 - .name = "spi_48m", 188 - .devname = "s3c64xx-spi.0", 189 - .parent = &clk_48m, 190 - .enable = s3c64xx_sclk_ctrl, 191 - .ctrlbit = S3C_CLKCON_SCLK_SPI0_48, 192 - }, { 193 - .name = "spi_48m", 194 - .devname = "s3c64xx-spi.1", 195 - .parent = &clk_48m, 196 - .enable = s3c64xx_sclk_ctrl, 197 - .ctrlbit = S3C_CLKCON_SCLK_SPI1_48, 198 - }, { 199 187 .name = "48m", 200 188 .devname = "s3c-sdhci.0", 201 189 .parent = &clk_48m, ··· 214 226 }, 215 227 }; 216 228 229 + static struct clk clk_48m_spi0 = { 230 + .name = "spi_48m", 231 + .devname = "s3c64xx-spi.0", 232 + .parent = &clk_48m, 233 + .enable = s3c64xx_sclk_ctrl, 234 + .ctrlbit = S3C_CLKCON_SCLK_SPI0_48, 235 + }; 236 + 237 + static struct clk clk_48m_spi1 = { 238 + .name = "spi_48m", 239 + .devname = "s3c64xx-spi.1", 240 + .parent = &clk_48m, 241 + .enable = s3c64xx_sclk_ctrl, 242 + .ctrlbit = S3C_CLKCON_SCLK_SPI1_48, 243 + }; 244 + 217 245 static struct clk init_clocks[] = { 218 246 { 219 247 .name = "lcd", ··· 246 242 .parent = &clk_h, 247 243 .enable = s3c64xx_hclk_ctrl, 248 244 .ctrlbit = S3C_CLKCON_HCLK_UHOST, 249 - }, { 250 - .name = "hsmmc", 251 - .devname = "s3c-sdhci.0", 252 - .parent = &clk_h, 253 - .enable = s3c64xx_hclk_ctrl, 254 - .ctrlbit = S3C_CLKCON_HCLK_HSMMC0, 255 - }, { 256 - .name = "hsmmc", 257 - .devname = "s3c-sdhci.1", 258 - .parent = &clk_h, 259 - .enable = s3c64xx_hclk_ctrl, 260 - .ctrlbit = S3C_CLKCON_HCLK_HSMMC1, 261 - }, { 262 - .name = "hsmmc", 263 - .devname = "s3c-sdhci.2", 264 - .parent = &clk_h, 265 - .enable = s3c64xx_hclk_ctrl, 266 - .ctrlbit = S3C_CLKCON_HCLK_HSMMC2, 267 245 }, { 268 246 .name = "otg", 269 247 .parent = &clk_h, ··· 296 310 } 297 311 }; 298 312 313 + static struct clk clk_hsmmc0 = { 314 + .name = "hsmmc", 315 + .devname = "s3c-sdhci.0", 316 + .parent = &clk_h, 317 + .enable = s3c64xx_hclk_ctrl, 318 + .ctrlbit = S3C_CLKCON_HCLK_HSMMC0, 319 + }; 320 + 321 + static struct clk clk_hsmmc1 = { 322 + .name = "hsmmc", 323 + .devname = "s3c-sdhci.1", 324 + .parent = &clk_h, 325 + .enable = s3c64xx_hclk_ctrl, 326 + .ctrlbit = S3C_CLKCON_HCLK_HSMMC1, 327 + }; 328 + 329 + static struct clk clk_hsmmc2 = { 330 + .name = "hsmmc", 331 + .devname = "s3c-sdhci.2", 332 + .parent = &clk_h, 333 + .enable = s3c64xx_hclk_ctrl, 334 + .ctrlbit = S3C_CLKCON_HCLK_HSMMC2, 335 + }; 299 336 300 337 static struct clk clk_fout_apll = { 301 338 .name = "fout_apll", ··· 587 578 static struct clksrc_clk clksrcs[] = { 588 579 { 589 580 .clk = { 590 - .name = "mmc_bus", 591 - .devname = "s3c-sdhci.0", 592 - .ctrlbit = S3C_CLKCON_SCLK_MMC0, 593 - .enable = s3c64xx_sclk_ctrl, 594 - }, 595 - .reg_src = { .reg = S3C_CLK_SRC, .shift = 18, .size = 2 }, 596 - .reg_div = { .reg = S3C_CLK_DIV1, .shift = 0, .size = 4 }, 597 - .sources = &clkset_spi_mmc, 598 - }, { 599 - .clk = { 600 - .name = "mmc_bus", 601 - .devname = "s3c-sdhci.1", 602 - .ctrlbit = S3C_CLKCON_SCLK_MMC1, 603 - .enable = s3c64xx_sclk_ctrl, 604 - }, 605 - .reg_src = { .reg = S3C_CLK_SRC, .shift = 20, .size = 2 }, 606 - .reg_div = { .reg = S3C_CLK_DIV1, .shift = 4, .size = 4 }, 607 - .sources = &clkset_spi_mmc, 608 - }, { 609 - .clk = { 610 - .name = "mmc_bus", 611 - .devname = "s3c-sdhci.2", 612 - .ctrlbit = S3C_CLKCON_SCLK_MMC2, 613 - .enable = s3c64xx_sclk_ctrl, 614 - }, 615 - .reg_src = { .reg = S3C_CLK_SRC, .shift = 22, .size = 2 }, 616 - .reg_div = { .reg = S3C_CLK_DIV1, .shift = 8, .size = 4 }, 617 - .sources = &clkset_spi_mmc, 618 - }, { 619 - .clk = { 620 581 .name = "usb-bus-host", 621 582 .ctrlbit = S3C_CLKCON_SCLK_UHOST, 622 583 .enable = s3c64xx_sclk_ctrl, ··· 594 615 .reg_src = { .reg = S3C_CLK_SRC, .shift = 5, .size = 2 }, 595 616 .reg_div = { .reg = S3C_CLK_DIV1, .shift = 20, .size = 4 }, 596 617 .sources = &clkset_uhost, 597 - }, { 598 - .clk = { 599 - .name = "uclk1", 600 - .ctrlbit = S3C_CLKCON_SCLK_UART, 601 - .enable = s3c64xx_sclk_ctrl, 602 - }, 603 - .reg_src = { .reg = S3C_CLK_SRC, .shift = 13, .size = 1 }, 604 - .reg_div = { .reg = S3C_CLK_DIV2, .shift = 16, .size = 4 }, 605 - .sources = &clkset_uart, 606 - }, { 607 - /* Where does UCLK0 come from? */ 608 - .clk = { 609 - .name = "spi-bus", 610 - .devname = "s3c64xx-spi.0", 611 - .ctrlbit = S3C_CLKCON_SCLK_SPI0, 612 - .enable = s3c64xx_sclk_ctrl, 613 - }, 614 - .reg_src = { .reg = S3C_CLK_SRC, .shift = 14, .size = 2 }, 615 - .reg_div = { .reg = S3C_CLK_DIV2, .shift = 0, .size = 4 }, 616 - .sources = &clkset_spi_mmc, 617 - }, { 618 - .clk = { 619 - .name = "spi-bus", 620 - .devname = "s3c64xx-spi.1", 621 - .enable = s3c64xx_sclk_ctrl, 622 - }, 623 - .reg_src = { .reg = S3C_CLK_SRC, .shift = 16, .size = 2 }, 624 - .reg_div = { .reg = S3C_CLK_DIV2, .shift = 4, .size = 4 }, 625 - .sources = &clkset_spi_mmc, 626 618 }, { 627 619 .clk = { 628 620 .name = "audio-bus", ··· 645 695 }, 646 696 }; 647 697 698 + /* Where does UCLK0 come from? */ 699 + static struct clksrc_clk clk_sclk_uclk = { 700 + .clk = { 701 + .name = "uclk1", 702 + .ctrlbit = S3C_CLKCON_SCLK_UART, 703 + .enable = s3c64xx_sclk_ctrl, 704 + }, 705 + .reg_src = { .reg = S3C_CLK_SRC, .shift = 13, .size = 1 }, 706 + .reg_div = { .reg = S3C_CLK_DIV2, .shift = 16, .size = 4 }, 707 + .sources = &clkset_uart, 708 + }; 709 + 710 + static struct clksrc_clk clk_sclk_mmc0 = { 711 + .clk = { 712 + .name = "mmc_bus", 713 + .devname = "s3c-sdhci.0", 714 + .ctrlbit = S3C_CLKCON_SCLK_MMC0, 715 + .enable = s3c64xx_sclk_ctrl, 716 + }, 717 + .reg_src = { .reg = S3C_CLK_SRC, .shift = 18, .size = 2 }, 718 + .reg_div = { .reg = S3C_CLK_DIV1, .shift = 0, .size = 4 }, 719 + .sources = &clkset_spi_mmc, 720 + }; 721 + 722 + static struct clksrc_clk clk_sclk_mmc1 = { 723 + .clk = { 724 + .name = "mmc_bus", 725 + .devname = "s3c-sdhci.1", 726 + .ctrlbit = S3C_CLKCON_SCLK_MMC1, 727 + .enable = s3c64xx_sclk_ctrl, 728 + }, 729 + .reg_src = { .reg = S3C_CLK_SRC, .shift = 20, .size = 2 }, 730 + .reg_div = { .reg = S3C_CLK_DIV1, .shift = 4, .size = 4 }, 731 + .sources = &clkset_spi_mmc, 732 + }; 733 + 734 + static struct clksrc_clk clk_sclk_mmc2 = { 735 + .clk = { 736 + .name = "mmc_bus", 737 + .devname = "s3c-sdhci.2", 738 + .ctrlbit = S3C_CLKCON_SCLK_MMC2, 739 + .enable = s3c64xx_sclk_ctrl, 740 + }, 741 + .reg_src = { .reg = S3C_CLK_SRC, .shift = 22, .size = 2 }, 742 + .reg_div = { .reg = S3C_CLK_DIV1, .shift = 8, .size = 4 }, 743 + .sources = &clkset_spi_mmc, 744 + }; 745 + 746 + static struct clksrc_clk clk_sclk_spi0 = { 747 + .clk = { 748 + .name = "spi-bus", 749 + .devname = "s3c64xx-spi.0", 750 + .ctrlbit = S3C_CLKCON_SCLK_SPI0, 751 + .enable = s3c64xx_sclk_ctrl, 752 + }, 753 + .reg_src = { .reg = S3C_CLK_SRC, .shift = 14, .size = 2 }, 754 + .reg_div = { .reg = S3C_CLK_DIV2, .shift = 0, .size = 4 }, 755 + .sources = &clkset_spi_mmc, 756 + }; 757 + 758 + static struct clksrc_clk clk_sclk_spi1 = { 759 + .clk = { 760 + .name = "spi-bus", 761 + .devname = "s3c64xx-spi.1", 762 + .ctrlbit = S3C_CLKCON_SCLK_SPI1, 763 + .enable = s3c64xx_sclk_ctrl, 764 + }, 765 + .reg_src = { .reg = S3C_CLK_SRC, .shift = 16, .size = 2 }, 766 + .reg_div = { .reg = S3C_CLK_DIV2, .shift = 4, .size = 4 }, 767 + .sources = &clkset_spi_mmc, 768 + }; 769 + 648 770 /* Clock initialisation code */ 649 771 650 772 static struct clksrc_clk *init_parents[] = { 651 773 &clk_mout_apll, 652 774 &clk_mout_epll, 653 775 &clk_mout_mpll, 776 + }; 777 + 778 + static struct clksrc_clk *clksrc_cdev[] = { 779 + &clk_sclk_uclk, 780 + &clk_sclk_mmc0, 781 + &clk_sclk_mmc1, 782 + &clk_sclk_mmc2, 783 + &clk_sclk_spi0, 784 + &clk_sclk_spi1, 785 + }; 786 + 787 + static struct clk *clk_cdev[] = { 788 + &clk_hsmmc0, 789 + &clk_hsmmc1, 790 + &clk_hsmmc2, 791 + &clk_48m_spi0, 792 + &clk_48m_spi1, 793 + }; 794 + 795 + static struct clk_lookup s3c64xx_clk_lookup[] = { 796 + CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p), 797 + CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_sclk_uclk.clk), 798 + CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.0", &clk_hsmmc0), 799 + CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.0", &clk_hsmmc1), 800 + CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.0", &clk_hsmmc2), 801 + CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk), 802 + CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk), 803 + CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk), 804 + CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), 805 + CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), 806 + CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk2", &clk_48m_spi0), 807 + CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), 808 + CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk2", &clk_48m_spi1), 654 809 }; 655 810 656 811 #define GET_DIV(clk, field) ((((clk) & field##_MASK) >> field##_SHIFT) + 1) ··· 866 811 void __init s3c64xx_register_clocks(unsigned long xtal, 867 812 unsigned armclk_divlimit) 868 813 { 814 + unsigned int cnt; 815 + 869 816 armclk_mask = armclk_divlimit; 870 817 871 818 s3c24xx_register_baseclocks(xtal); ··· 878 821 s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 879 822 s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 880 823 824 + s3c24xx_register_clocks(clk_cdev, ARRAY_SIZE(clk_cdev)); 825 + for (cnt = 0; cnt < ARRAY_SIZE(clk_cdev); cnt++) 826 + s3c_disable_clocks(clk_cdev[cnt], 1); 827 + 881 828 s3c24xx_register_clocks(clks1, ARRAY_SIZE(clks1)); 882 829 s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs)); 830 + for (cnt = 0; cnt < ARRAY_SIZE(clksrc_cdev); cnt++) 831 + s3c_register_clksrc(clksrc_cdev[cnt], 1); 832 + clkdev_add_table(s3c64xx_clk_lookup, ARRAY_SIZE(s3c64xx_clk_lookup)); 833 + 883 834 s3c_pwmclk_init(); 884 835 }
-180
arch/arm/mach-s3c64xx/dev-spi.c
··· 1 - /* linux/arch/arm/plat-s3c64xx/dev-spi.c 2 - * 3 - * Copyright (C) 2009 Samsung Electronics Ltd. 4 - * Jaswinder Singh <jassi.brar@samsung.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 version 2 as 8 - * published by the Free Software Foundation. 9 - */ 10 - 11 - #include <linux/kernel.h> 12 - #include <linux/string.h> 13 - #include <linux/export.h> 14 - #include <linux/platform_device.h> 15 - #include <linux/dma-mapping.h> 16 - #include <linux/gpio.h> 17 - 18 - #include <mach/dma.h> 19 - #include <mach/map.h> 20 - #include <mach/spi-clocks.h> 21 - #include <mach/irqs.h> 22 - 23 - #include <plat/s3c64xx-spi.h> 24 - #include <plat/gpio-cfg.h> 25 - #include <plat/devs.h> 26 - 27 - static char *spi_src_clks[] = { 28 - [S3C64XX_SPI_SRCCLK_PCLK] = "pclk", 29 - [S3C64XX_SPI_SRCCLK_SPIBUS] = "spi-bus", 30 - [S3C64XX_SPI_SRCCLK_48M] = "spi_48m", 31 - }; 32 - 33 - /* SPI Controller platform_devices */ 34 - 35 - /* Since we emulate multi-cs capability, we do not touch the GPC-3,7. 36 - * The emulated CS is toggled by board specific mechanism, as it can 37 - * be either some immediate GPIO or some signal out of some other 38 - * chip in between ... or some yet another way. 39 - * We simply do not assume anything about CS. 40 - */ 41 - static int s3c64xx_spi_cfg_gpio(struct platform_device *pdev) 42 - { 43 - unsigned int base; 44 - 45 - switch (pdev->id) { 46 - case 0: 47 - base = S3C64XX_GPC(0); 48 - break; 49 - 50 - case 1: 51 - base = S3C64XX_GPC(4); 52 - break; 53 - 54 - default: 55 - dev_err(&pdev->dev, "Invalid SPI Controller number!"); 56 - return -EINVAL; 57 - } 58 - 59 - s3c_gpio_cfgall_range(base, 3, 60 - S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 61 - 62 - return 0; 63 - } 64 - 65 - static struct resource s3c64xx_spi0_resource[] = { 66 - [0] = { 67 - .start = S3C64XX_PA_SPI0, 68 - .end = S3C64XX_PA_SPI0 + 0x100 - 1, 69 - .flags = IORESOURCE_MEM, 70 - }, 71 - [1] = { 72 - .start = DMACH_SPI0_TX, 73 - .end = DMACH_SPI0_TX, 74 - .flags = IORESOURCE_DMA, 75 - }, 76 - [2] = { 77 - .start = DMACH_SPI0_RX, 78 - .end = DMACH_SPI0_RX, 79 - .flags = IORESOURCE_DMA, 80 - }, 81 - [3] = { 82 - .start = IRQ_SPI0, 83 - .end = IRQ_SPI0, 84 - .flags = IORESOURCE_IRQ, 85 - }, 86 - }; 87 - 88 - static struct s3c64xx_spi_info s3c64xx_spi0_pdata = { 89 - .cfg_gpio = s3c64xx_spi_cfg_gpio, 90 - .fifo_lvl_mask = 0x7f, 91 - .rx_lvl_offset = 13, 92 - .tx_st_done = 21, 93 - }; 94 - 95 - static u64 spi_dmamask = DMA_BIT_MASK(32); 96 - 97 - struct platform_device s3c64xx_device_spi0 = { 98 - .name = "s3c64xx-spi", 99 - .id = 0, 100 - .num_resources = ARRAY_SIZE(s3c64xx_spi0_resource), 101 - .resource = s3c64xx_spi0_resource, 102 - .dev = { 103 - .dma_mask = &spi_dmamask, 104 - .coherent_dma_mask = DMA_BIT_MASK(32), 105 - .platform_data = &s3c64xx_spi0_pdata, 106 - }, 107 - }; 108 - EXPORT_SYMBOL(s3c64xx_device_spi0); 109 - 110 - static struct resource s3c64xx_spi1_resource[] = { 111 - [0] = { 112 - .start = S3C64XX_PA_SPI1, 113 - .end = S3C64XX_PA_SPI1 + 0x100 - 1, 114 - .flags = IORESOURCE_MEM, 115 - }, 116 - [1] = { 117 - .start = DMACH_SPI1_TX, 118 - .end = DMACH_SPI1_TX, 119 - .flags = IORESOURCE_DMA, 120 - }, 121 - [2] = { 122 - .start = DMACH_SPI1_RX, 123 - .end = DMACH_SPI1_RX, 124 - .flags = IORESOURCE_DMA, 125 - }, 126 - [3] = { 127 - .start = IRQ_SPI1, 128 - .end = IRQ_SPI1, 129 - .flags = IORESOURCE_IRQ, 130 - }, 131 - }; 132 - 133 - static struct s3c64xx_spi_info s3c64xx_spi1_pdata = { 134 - .cfg_gpio = s3c64xx_spi_cfg_gpio, 135 - .fifo_lvl_mask = 0x7f, 136 - .rx_lvl_offset = 13, 137 - .tx_st_done = 21, 138 - }; 139 - 140 - struct platform_device s3c64xx_device_spi1 = { 141 - .name = "s3c64xx-spi", 142 - .id = 1, 143 - .num_resources = ARRAY_SIZE(s3c64xx_spi1_resource), 144 - .resource = s3c64xx_spi1_resource, 145 - .dev = { 146 - .dma_mask = &spi_dmamask, 147 - .coherent_dma_mask = DMA_BIT_MASK(32), 148 - .platform_data = &s3c64xx_spi1_pdata, 149 - }, 150 - }; 151 - EXPORT_SYMBOL(s3c64xx_device_spi1); 152 - 153 - void __init s3c64xx_spi_set_info(int cntrlr, int src_clk_nr, int num_cs) 154 - { 155 - struct s3c64xx_spi_info *pd; 156 - 157 - /* Reject invalid configuration */ 158 - if (!num_cs || src_clk_nr < 0 159 - || src_clk_nr > S3C64XX_SPI_SRCCLK_48M) { 160 - printk(KERN_ERR "%s: Invalid SPI configuration\n", __func__); 161 - return; 162 - } 163 - 164 - switch (cntrlr) { 165 - case 0: 166 - pd = &s3c64xx_spi0_pdata; 167 - break; 168 - case 1: 169 - pd = &s3c64xx_spi1_pdata; 170 - break; 171 - default: 172 - printk(KERN_ERR "%s: Invalid SPI controller(%d)\n", 173 - __func__, cntrlr); 174 - return; 175 - } 176 - 177 - pd->num_cs = num_cs; 178 - pd->src_clk_nr = src_clk_nr; 179 - pd->src_clk_name = spi_src_clks[src_clk_nr]; 180 - }
+2
arch/arm/mach-s3c64xx/include/mach/map.h
··· 115 115 #define S3C_PA_USB_HSOTG S3C64XX_PA_USB_HSOTG 116 116 #define S3C_PA_RTC S3C64XX_PA_RTC 117 117 #define S3C_PA_WDT S3C64XX_PA_WATCHDOG 118 + #define S3C_PA_SPI0 S3C64XX_PA_SPI0 119 + #define S3C_PA_SPI1 S3C64XX_PA_SPI1 118 120 119 121 #define SAMSUNG_PA_ADC S3C64XX_PA_ADC 120 122 #define SAMSUNG_PA_CFCON S3C64XX_PA_CFCON
-24
arch/arm/mach-s3c64xx/setup-sdhci.c
··· 1 - /* linux/arch/arm/mach-s3c64xx/setup-sdhci.c 2 - * 3 - * Copyright 2008 Simtec Electronics 4 - * Copyright 2008 Simtec Electronics 5 - * Ben Dooks <ben@simtec.co.uk> 6 - * http://armlinux.simtec.co.uk/ 7 - * 8 - * S3C6400/S3C6410 - Helper functions for settign up SDHCI device(s) (HSMMC) 9 - * 10 - * This program is free software; you can redistribute it and/or modify 11 - * it under the terms of the GNU General Public License version 2 as 12 - * published by the Free Software Foundation. 13 - */ 14 - 15 - #include <linux/types.h> 16 - 17 - /* clock sources for the mmc bus clock, order as for the ctrl2[5..4] */ 18 - 19 - char *s3c64xx_hsmmc_clksrcs[4] = { 20 - [0] = "hsmmc", 21 - [1] = "hsmmc", 22 - [2] = "mmc_bus", 23 - /* [3] = "48m", - note not successfully used yet */ 24 - };
+45
arch/arm/mach-s3c64xx/setup-spi.c
··· 1 + /* linux/arch/arm/mach-s3c64xx/setup-spi.c 2 + * 3 + * Copyright (C) 2011 Samsung Electronics Ltd. 4 + * http://www.samsung.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 version 2 as 8 + * published by the Free Software Foundation. 9 + */ 10 + 11 + #include <linux/gpio.h> 12 + #include <linux/platform_device.h> 13 + 14 + #include <plat/gpio-cfg.h> 15 + #include <plat/s3c64xx-spi.h> 16 + 17 + #ifdef CONFIG_S3C64XX_DEV_SPI0 18 + struct s3c64xx_spi_info s3c64xx_spi0_pdata __initdata = { 19 + .fifo_lvl_mask = 0x7f, 20 + .rx_lvl_offset = 13, 21 + .tx_st_done = 21, 22 + }; 23 + 24 + int s3c64xx_spi0_cfg_gpio(struct platform_device *dev) 25 + { 26 + s3c_gpio_cfgall_range(S3C64XX_GPC(0), 3, 27 + S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 28 + return 0; 29 + } 30 + #endif 31 + 32 + #ifdef CONFIG_S3C64XX_DEV_SPI1 33 + struct s3c64xx_spi_info s3c64xx_spi1_pdata __initdata = { 34 + .fifo_lvl_mask = 0x7f, 35 + .rx_lvl_offset = 13, 36 + .tx_st_done = 21, 37 + }; 38 + 39 + int s3c64xx_spi1_cfg_gpio(struct platform_device *dev) 40 + { 41 + s3c_gpio_cfgall_range(S3C64XX_GPC(4), 3, 42 + S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 43 + return 0; 44 + } 45 + #endif
+5 -2
arch/arm/mach-s5p64x0/Kconfig
··· 36 36 help 37 37 Common setup code for i2c bus 1. 38 38 39 + config S5P64X0_SETUP_SPI 40 + bool 41 + help 42 + Common setup code for SPI GPIO configurations 43 + 39 44 # machine support 40 45 41 46 config MACH_SMDK6440 ··· 50 45 select S3C_DEV_I2C1 51 46 select S3C_DEV_RTC 52 47 select S3C_DEV_WDT 53 - select S3C64XX_DEV_SPI 54 48 select SAMSUNG_DEV_ADC 55 49 select SAMSUNG_DEV_BACKLIGHT 56 50 select SAMSUNG_DEV_PWM ··· 66 62 select S3C_DEV_I2C1 67 63 select S3C_DEV_RTC 68 64 select S3C_DEV_WDT 69 - select S3C64XX_DEV_SPI 70 65 select SAMSUNG_DEV_ADC 71 66 select SAMSUNG_DEV_BACKLIGHT 72 67 select SAMSUNG_DEV_PWM
+1 -1
arch/arm/mach-s5p64x0/Makefile
··· 26 26 # device support 27 27 28 28 obj-y += dev-audio.o 29 - obj-$(CONFIG_S3C64XX_DEV_SPI) += dev-spi.o 30 29 31 30 obj-$(CONFIG_S5P64X0_SETUP_I2C1) += setup-i2c1.o 32 31 obj-$(CONFIG_S5P64X0_SETUP_FB_24BPP) += setup-fb-24bpp.o 32 + obj-$(CONFIG_S5P64X0_SETUP_SPI) += setup-spi.o
+52 -41
arch/arm/mach-s5p64x0/clock-s5p6440.c
··· 268 268 .enable = s5p64x0_pclk_ctrl, 269 269 .ctrlbit = (1 << 31), 270 270 }, { 271 - .name = "sclk_spi_48", 272 - .devname = "s3c64xx-spi.0", 273 - .parent = &clk_48m, 274 - .enable = s5p64x0_sclk_ctrl, 275 - .ctrlbit = (1 << 22), 276 - }, { 277 - .name = "sclk_spi_48", 278 - .devname = "s3c64xx-spi.1", 279 - .parent = &clk_48m, 280 - .enable = s5p64x0_sclk_ctrl, 281 - .ctrlbit = (1 << 23), 282 - }, { 283 271 .name = "mmc_48m", 284 272 .devname = "s3c-sdhci.0", 285 273 .parent = &clk_48m, ··· 409 421 .reg_div = { .reg = S5P64X0_CLK_DIV1, .shift = 8, .size = 4 }, 410 422 }, { 411 423 .clk = { 412 - .name = "uclk1", 413 - .ctrlbit = (1 << 5), 414 - .enable = s5p64x0_sclk_ctrl, 415 - }, 416 - .sources = &clkset_uart, 417 - .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 13, .size = 1 }, 418 - .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 16, .size = 4 }, 419 - }, { 420 - .clk = { 421 - .name = "sclk_spi", 422 - .devname = "s3c64xx-spi.0", 423 - .ctrlbit = (1 << 20), 424 - .enable = s5p64x0_sclk_ctrl, 425 - }, 426 - .sources = &clkset_group1, 427 - .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 14, .size = 2 }, 428 - .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 0, .size = 4 }, 429 - }, { 430 - .clk = { 431 - .name = "sclk_spi", 432 - .devname = "s3c64xx-spi.1", 433 - .ctrlbit = (1 << 21), 434 - .enable = s5p64x0_sclk_ctrl, 435 - }, 436 - .sources = &clkset_group1, 437 - .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 16, .size = 2 }, 438 - .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 4, .size = 4 }, 439 - }, { 440 - .clk = { 441 424 .name = "sclk_post", 442 425 .ctrlbit = (1 << 10), 443 426 .enable = s5p64x0_sclk_ctrl, ··· 446 487 }, 447 488 }; 448 489 490 + static struct clksrc_clk clk_sclk_uclk = { 491 + .clk = { 492 + .name = "uclk1", 493 + .ctrlbit = (1 << 5), 494 + .enable = s5p64x0_sclk_ctrl, 495 + }, 496 + .sources = &clkset_uart, 497 + .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 13, .size = 1 }, 498 + .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 16, .size = 4 }, 499 + }; 500 + 501 + static struct clksrc_clk clk_sclk_spi0 = { 502 + .clk = { 503 + .name = "sclk_spi", 504 + .devname = "s3c64xx-spi.0", 505 + .ctrlbit = (1 << 20), 506 + .enable = s5p64x0_sclk_ctrl, 507 + }, 508 + .sources = &clkset_group1, 509 + .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 14, .size = 2 }, 510 + .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 0, .size = 4 }, 511 + }; 512 + 513 + static struct clksrc_clk clk_sclk_spi1 = { 514 + .clk = { 515 + .name = "sclk_spi", 516 + .devname = "s3c64xx-spi.1", 517 + .ctrlbit = (1 << 21), 518 + .enable = s5p64x0_sclk_ctrl, 519 + }, 520 + .sources = &clkset_group1, 521 + .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 16, .size = 2 }, 522 + .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 4, .size = 4 }, 523 + }; 524 + 449 525 /* Clock initialization code */ 450 526 static struct clksrc_clk *sysclks[] = { 451 527 &clk_mout_apll, ··· 497 503 static struct clk dummy_apb_pclk = { 498 504 .name = "apb_pclk", 499 505 .id = -1, 506 + }; 507 + 508 + static struct clksrc_clk *clksrc_cdev[] = { 509 + &clk_sclk_uclk, 510 + &clk_sclk_spi0, 511 + &clk_sclk_spi1, 512 + }; 513 + 514 + static struct clk_lookup s5p6440_clk_lookup[] = { 515 + CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_pclk_low.clk), 516 + CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_sclk_uclk.clk), 517 + CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), 518 + CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), 519 + CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), 500 520 }; 501 521 502 522 void __init_or_cpufreq s5p6440_setup_clocks(void) ··· 591 583 592 584 s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs)); 593 585 s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks)); 586 + for (ptr = 0; ptr < ARRAY_SIZE(clksrc_cdev); ptr++) 587 + s3c_register_clksrc(clksrc_cdev[ptr], 1); 594 588 595 589 s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 596 590 s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 591 + clkdev_add_table(s5p6440_clk_lookup, ARRAY_SIZE(s5p6440_clk_lookup)); 597 592 598 593 s3c24xx_register_clock(&dummy_apb_pclk); 599 594
+52 -29
arch/arm/mach-s5p64x0/clock-s5p6450.c
··· 443 443 .reg_div = { .reg = S5P64X0_CLK_DIV1, .shift = 8, .size = 4 }, 444 444 }, { 445 445 .clk = { 446 - .name = "uclk1", 447 - .ctrlbit = (1 << 5), 448 - .enable = s5p64x0_sclk_ctrl, 449 - }, 450 - .sources = &clkset_uart, 451 - .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 13, .size = 1 }, 452 - .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 16, .size = 4 }, 453 - }, { 454 - .clk = { 455 - .name = "sclk_spi", 456 - .devname = "s3c64xx-spi.0", 457 - .ctrlbit = (1 << 20), 458 - .enable = s5p64x0_sclk_ctrl, 459 - }, 460 - .sources = &clkset_group2, 461 - .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 14, .size = 2 }, 462 - .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 0, .size = 4 }, 463 - }, { 464 - .clk = { 465 - .name = "sclk_spi", 466 - .devname = "s3c64xx-spi.1", 467 - .ctrlbit = (1 << 21), 468 - .enable = s5p64x0_sclk_ctrl, 469 - }, 470 - .sources = &clkset_group2, 471 - .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 16, .size = 2 }, 472 - .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 4, .size = 4 }, 473 - }, { 474 - .clk = { 475 446 .name = "sclk_fimc", 476 447 .ctrlbit = (1 << 10), 477 448 .enable = s5p64x0_sclk_ctrl, ··· 505 534 .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 6, .size = 3 }, 506 535 .reg_div = { .reg = S5P64X0_CLK_DIV1, .shift = 28, .size = 4 }, 507 536 }, 537 + }; 538 + 539 + static struct clksrc_clk clk_sclk_uclk = { 540 + .clk = { 541 + .name = "uclk1", 542 + .ctrlbit = (1 << 5), 543 + .enable = s5p64x0_sclk_ctrl, 544 + }, 545 + .sources = &clkset_uart, 546 + .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 13, .size = 1 }, 547 + .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 16, .size = 4 }, 548 + }; 549 + 550 + static struct clksrc_clk clk_sclk_spi0 = { 551 + .clk = { 552 + .name = "sclk_spi", 553 + .devname = "s3c64xx-spi.0", 554 + .ctrlbit = (1 << 20), 555 + .enable = s5p64x0_sclk_ctrl, 556 + }, 557 + .sources = &clkset_group2, 558 + .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 14, .size = 2 }, 559 + .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 0, .size = 4 }, 560 + }; 561 + 562 + static struct clksrc_clk clk_sclk_spi1 = { 563 + .clk = { 564 + .name = "sclk_spi", 565 + .devname = "s3c64xx-spi.1", 566 + .ctrlbit = (1 << 21), 567 + .enable = s5p64x0_sclk_ctrl, 568 + }, 569 + .sources = &clkset_group2, 570 + .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 16, .size = 2 }, 571 + .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 4, .size = 4 }, 572 + }; 573 + 574 + static struct clksrc_clk *clksrc_cdev[] = { 575 + &clk_sclk_uclk, 576 + &clk_sclk_spi0, 577 + &clk_sclk_spi1, 578 + }; 579 + 580 + static struct clk_lookup s5p6450_clk_lookup[] = { 581 + CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_pclk_low.clk), 582 + CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_sclk_uclk.clk), 583 + CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), 584 + CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), 585 + CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), 508 586 }; 509 587 510 588 /* Clock initialization code */ ··· 654 634 655 635 s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs)); 656 636 s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks)); 637 + for (ptr = 0; ptr < ARRAY_SIZE(clksrc_cdev); ptr++) 638 + s3c_register_clksrc(clksrc_cdev[ptr], 1); 657 639 658 640 s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 659 641 s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 642 + clkdev_add_table(s5p6450_clk_lookup, ARRAY_SIZE(s5p6450_clk_lookup)); 660 643 661 644 s3c24xx_register_clock(&dummy_apb_pclk); 662 645
-224
arch/arm/mach-s5p64x0/dev-spi.c
··· 1 - /* linux/arch/arm/mach-s5p64x0/dev-spi.c 2 - * 3 - * Copyright (c) 2010 Samsung Electronics Co., Ltd. 4 - * http://www.samsung.com 5 - * 6 - * Copyright (C) 2010 Samsung Electronics Co. Ltd. 7 - * Jaswinder Singh <jassi.brar@samsung.com> 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 version 2 as 11 - * published by the Free Software Foundation. 12 - */ 13 - 14 - #include <linux/platform_device.h> 15 - #include <linux/dma-mapping.h> 16 - #include <linux/gpio.h> 17 - 18 - #include <mach/dma.h> 19 - #include <mach/map.h> 20 - #include <mach/irqs.h> 21 - #include <mach/regs-clock.h> 22 - #include <mach/spi-clocks.h> 23 - 24 - #include <plat/cpu.h> 25 - #include <plat/s3c64xx-spi.h> 26 - #include <plat/gpio-cfg.h> 27 - 28 - static char *s5p64x0_spi_src_clks[] = { 29 - [S5P64X0_SPI_SRCCLK_PCLK] = "pclk", 30 - [S5P64X0_SPI_SRCCLK_SCLK] = "sclk_spi", 31 - }; 32 - 33 - /* SPI Controller platform_devices */ 34 - 35 - /* Since we emulate multi-cs capability, we do not touch the CS. 36 - * The emulated CS is toggled by board specific mechanism, as it can 37 - * be either some immediate GPIO or some signal out of some other 38 - * chip in between ... or some yet another way. 39 - * We simply do not assume anything about CS. 40 - */ 41 - static int s5p6440_spi_cfg_gpio(struct platform_device *pdev) 42 - { 43 - unsigned int base; 44 - 45 - switch (pdev->id) { 46 - case 0: 47 - base = S5P6440_GPC(0); 48 - break; 49 - 50 - case 1: 51 - base = S5P6440_GPC(4); 52 - break; 53 - 54 - default: 55 - dev_err(&pdev->dev, "Invalid SPI Controller number!"); 56 - return -EINVAL; 57 - } 58 - 59 - s3c_gpio_cfgall_range(base, 3, 60 - S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 61 - 62 - return 0; 63 - } 64 - 65 - static int s5p6450_spi_cfg_gpio(struct platform_device *pdev) 66 - { 67 - unsigned int base; 68 - 69 - switch (pdev->id) { 70 - case 0: 71 - base = S5P6450_GPC(0); 72 - break; 73 - 74 - case 1: 75 - base = S5P6450_GPC(4); 76 - break; 77 - 78 - default: 79 - dev_err(&pdev->dev, "Invalid SPI Controller number!"); 80 - return -EINVAL; 81 - } 82 - 83 - s3c_gpio_cfgall_range(base, 3, 84 - S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 85 - 86 - return 0; 87 - } 88 - 89 - static struct resource s5p64x0_spi0_resource[] = { 90 - [0] = { 91 - .start = S5P64X0_PA_SPI0, 92 - .end = S5P64X0_PA_SPI0 + 0x100 - 1, 93 - .flags = IORESOURCE_MEM, 94 - }, 95 - [1] = { 96 - .start = DMACH_SPI0_TX, 97 - .end = DMACH_SPI0_TX, 98 - .flags = IORESOURCE_DMA, 99 - }, 100 - [2] = { 101 - .start = DMACH_SPI0_RX, 102 - .end = DMACH_SPI0_RX, 103 - .flags = IORESOURCE_DMA, 104 - }, 105 - [3] = { 106 - .start = IRQ_SPI0, 107 - .end = IRQ_SPI0, 108 - .flags = IORESOURCE_IRQ, 109 - }, 110 - }; 111 - 112 - static struct s3c64xx_spi_info s5p6440_spi0_pdata = { 113 - .cfg_gpio = s5p6440_spi_cfg_gpio, 114 - .fifo_lvl_mask = 0x1ff, 115 - .rx_lvl_offset = 15, 116 - .tx_st_done = 25, 117 - }; 118 - 119 - static struct s3c64xx_spi_info s5p6450_spi0_pdata = { 120 - .cfg_gpio = s5p6450_spi_cfg_gpio, 121 - .fifo_lvl_mask = 0x1ff, 122 - .rx_lvl_offset = 15, 123 - .tx_st_done = 25, 124 - }; 125 - 126 - static u64 spi_dmamask = DMA_BIT_MASK(32); 127 - 128 - struct platform_device s5p64x0_device_spi0 = { 129 - .name = "s3c64xx-spi", 130 - .id = 0, 131 - .num_resources = ARRAY_SIZE(s5p64x0_spi0_resource), 132 - .resource = s5p64x0_spi0_resource, 133 - .dev = { 134 - .dma_mask = &spi_dmamask, 135 - .coherent_dma_mask = DMA_BIT_MASK(32), 136 - }, 137 - }; 138 - 139 - static struct resource s5p64x0_spi1_resource[] = { 140 - [0] = { 141 - .start = S5P64X0_PA_SPI1, 142 - .end = S5P64X0_PA_SPI1 + 0x100 - 1, 143 - .flags = IORESOURCE_MEM, 144 - }, 145 - [1] = { 146 - .start = DMACH_SPI1_TX, 147 - .end = DMACH_SPI1_TX, 148 - .flags = IORESOURCE_DMA, 149 - }, 150 - [2] = { 151 - .start = DMACH_SPI1_RX, 152 - .end = DMACH_SPI1_RX, 153 - .flags = IORESOURCE_DMA, 154 - }, 155 - [3] = { 156 - .start = IRQ_SPI1, 157 - .end = IRQ_SPI1, 158 - .flags = IORESOURCE_IRQ, 159 - }, 160 - }; 161 - 162 - static struct s3c64xx_spi_info s5p6440_spi1_pdata = { 163 - .cfg_gpio = s5p6440_spi_cfg_gpio, 164 - .fifo_lvl_mask = 0x7f, 165 - .rx_lvl_offset = 15, 166 - .tx_st_done = 25, 167 - }; 168 - 169 - static struct s3c64xx_spi_info s5p6450_spi1_pdata = { 170 - .cfg_gpio = s5p6450_spi_cfg_gpio, 171 - .fifo_lvl_mask = 0x7f, 172 - .rx_lvl_offset = 15, 173 - .tx_st_done = 25, 174 - }; 175 - 176 - struct platform_device s5p64x0_device_spi1 = { 177 - .name = "s3c64xx-spi", 178 - .id = 1, 179 - .num_resources = ARRAY_SIZE(s5p64x0_spi1_resource), 180 - .resource = s5p64x0_spi1_resource, 181 - .dev = { 182 - .dma_mask = &spi_dmamask, 183 - .coherent_dma_mask = DMA_BIT_MASK(32), 184 - }, 185 - }; 186 - 187 - void __init s5p64x0_spi_set_info(int cntrlr, int src_clk_nr, int num_cs) 188 - { 189 - struct s3c64xx_spi_info *pd; 190 - 191 - /* Reject invalid configuration */ 192 - if (!num_cs || src_clk_nr < 0 193 - || src_clk_nr > S5P64X0_SPI_SRCCLK_SCLK) { 194 - printk(KERN_ERR "%s: Invalid SPI configuration\n", __func__); 195 - return; 196 - } 197 - 198 - switch (cntrlr) { 199 - case 0: 200 - if (soc_is_s5p6450()) 201 - pd = &s5p6450_spi0_pdata; 202 - else 203 - pd = &s5p6440_spi0_pdata; 204 - 205 - s5p64x0_device_spi0.dev.platform_data = pd; 206 - break; 207 - case 1: 208 - if (soc_is_s5p6450()) 209 - pd = &s5p6450_spi1_pdata; 210 - else 211 - pd = &s5p6440_spi1_pdata; 212 - 213 - s5p64x0_device_spi1.dev.platform_data = pd; 214 - break; 215 - default: 216 - printk(KERN_ERR "%s: Invalid SPI controller(%d)\n", 217 - __func__, cntrlr); 218 - return; 219 - } 220 - 221 - pd->num_cs = num_cs; 222 - pd->src_clk_nr = src_clk_nr; 223 - pd->src_clk_name = s5p64x0_spi_src_clks[src_clk_nr]; 224 - }
+65 -162
arch/arm/mach-s5p64x0/dma.c
··· 38 38 39 39 static u64 dma_dmamask = DMA_BIT_MASK(32); 40 40 41 - struct dma_pl330_peri s5p6440_pdma_peri[22] = { 42 - { 43 - .peri_id = (u8)DMACH_UART0_RX, 44 - .rqtype = DEVTOMEM, 45 - }, { 46 - .peri_id = (u8)DMACH_UART0_TX, 47 - .rqtype = MEMTODEV, 48 - }, { 49 - .peri_id = (u8)DMACH_UART1_RX, 50 - .rqtype = DEVTOMEM, 51 - }, { 52 - .peri_id = (u8)DMACH_UART1_TX, 53 - .rqtype = MEMTODEV, 54 - }, { 55 - .peri_id = (u8)DMACH_UART2_RX, 56 - .rqtype = DEVTOMEM, 57 - }, { 58 - .peri_id = (u8)DMACH_UART2_TX, 59 - .rqtype = MEMTODEV, 60 - }, { 61 - .peri_id = (u8)DMACH_UART3_RX, 62 - .rqtype = DEVTOMEM, 63 - }, { 64 - .peri_id = (u8)DMACH_UART3_TX, 65 - .rqtype = MEMTODEV, 66 - }, { 67 - .peri_id = DMACH_MAX, 68 - }, { 69 - .peri_id = DMACH_MAX, 70 - }, { 71 - .peri_id = (u8)DMACH_PCM0_TX, 72 - .rqtype = MEMTODEV, 73 - }, { 74 - .peri_id = (u8)DMACH_PCM0_RX, 75 - .rqtype = DEVTOMEM, 76 - }, { 77 - .peri_id = (u8)DMACH_I2S0_TX, 78 - .rqtype = MEMTODEV, 79 - }, { 80 - .peri_id = (u8)DMACH_I2S0_RX, 81 - .rqtype = DEVTOMEM, 82 - }, { 83 - .peri_id = (u8)DMACH_SPI0_TX, 84 - .rqtype = MEMTODEV, 85 - }, { 86 - .peri_id = (u8)DMACH_SPI0_RX, 87 - .rqtype = DEVTOMEM, 88 - }, { 89 - .peri_id = (u8)DMACH_MAX, 90 - }, { 91 - .peri_id = (u8)DMACH_MAX, 92 - }, { 93 - .peri_id = (u8)DMACH_MAX, 94 - }, { 95 - .peri_id = (u8)DMACH_MAX, 96 - }, { 97 - .peri_id = (u8)DMACH_SPI1_TX, 98 - .rqtype = MEMTODEV, 99 - }, { 100 - .peri_id = (u8)DMACH_SPI1_RX, 101 - .rqtype = DEVTOMEM, 102 - }, 41 + u8 s5p6440_pdma_peri[] = { 42 + DMACH_UART0_RX, 43 + DMACH_UART0_TX, 44 + DMACH_UART1_RX, 45 + DMACH_UART1_TX, 46 + DMACH_UART2_RX, 47 + DMACH_UART2_TX, 48 + DMACH_UART3_RX, 49 + DMACH_UART3_TX, 50 + DMACH_MAX, 51 + DMACH_MAX, 52 + DMACH_PCM0_TX, 53 + DMACH_PCM0_RX, 54 + DMACH_I2S0_TX, 55 + DMACH_I2S0_RX, 56 + DMACH_SPI0_TX, 57 + DMACH_SPI0_RX, 58 + DMACH_MAX, 59 + DMACH_MAX, 60 + DMACH_MAX, 61 + DMACH_MAX, 62 + DMACH_SPI1_TX, 63 + DMACH_SPI1_RX, 103 64 }; 104 65 105 66 struct dma_pl330_platdata s5p6440_pdma_pdata = { 106 67 .nr_valid_peri = ARRAY_SIZE(s5p6440_pdma_peri), 107 - .peri = s5p6440_pdma_peri, 68 + .peri_id = s5p6440_pdma_peri, 108 69 }; 109 70 110 - struct dma_pl330_peri s5p6450_pdma_peri[32] = { 111 - { 112 - .peri_id = (u8)DMACH_UART0_RX, 113 - .rqtype = DEVTOMEM, 114 - }, { 115 - .peri_id = (u8)DMACH_UART0_TX, 116 - .rqtype = MEMTODEV, 117 - }, { 118 - .peri_id = (u8)DMACH_UART1_RX, 119 - .rqtype = DEVTOMEM, 120 - }, { 121 - .peri_id = (u8)DMACH_UART1_TX, 122 - .rqtype = MEMTODEV, 123 - }, { 124 - .peri_id = (u8)DMACH_UART2_RX, 125 - .rqtype = DEVTOMEM, 126 - }, { 127 - .peri_id = (u8)DMACH_UART2_TX, 128 - .rqtype = MEMTODEV, 129 - }, { 130 - .peri_id = (u8)DMACH_UART3_RX, 131 - .rqtype = DEVTOMEM, 132 - }, { 133 - .peri_id = (u8)DMACH_UART3_TX, 134 - .rqtype = MEMTODEV, 135 - }, { 136 - .peri_id = (u8)DMACH_UART4_RX, 137 - .rqtype = DEVTOMEM, 138 - }, { 139 - .peri_id = (u8)DMACH_UART4_TX, 140 - .rqtype = MEMTODEV, 141 - }, { 142 - .peri_id = (u8)DMACH_PCM0_TX, 143 - .rqtype = MEMTODEV, 144 - }, { 145 - .peri_id = (u8)DMACH_PCM0_RX, 146 - .rqtype = DEVTOMEM, 147 - }, { 148 - .peri_id = (u8)DMACH_I2S0_TX, 149 - .rqtype = MEMTODEV, 150 - }, { 151 - .peri_id = (u8)DMACH_I2S0_RX, 152 - .rqtype = DEVTOMEM, 153 - }, { 154 - .peri_id = (u8)DMACH_SPI0_TX, 155 - .rqtype = MEMTODEV, 156 - }, { 157 - .peri_id = (u8)DMACH_SPI0_RX, 158 - .rqtype = DEVTOMEM, 159 - }, { 160 - .peri_id = (u8)DMACH_PCM1_TX, 161 - .rqtype = MEMTODEV, 162 - }, { 163 - .peri_id = (u8)DMACH_PCM1_RX, 164 - .rqtype = DEVTOMEM, 165 - }, { 166 - .peri_id = (u8)DMACH_PCM2_TX, 167 - .rqtype = MEMTODEV, 168 - }, { 169 - .peri_id = (u8)DMACH_PCM2_RX, 170 - .rqtype = DEVTOMEM, 171 - }, { 172 - .peri_id = (u8)DMACH_SPI1_TX, 173 - .rqtype = MEMTODEV, 174 - }, { 175 - .peri_id = (u8)DMACH_SPI1_RX, 176 - .rqtype = DEVTOMEM, 177 - }, { 178 - .peri_id = (u8)DMACH_USI_TX, 179 - .rqtype = MEMTODEV, 180 - }, { 181 - .peri_id = (u8)DMACH_USI_RX, 182 - .rqtype = DEVTOMEM, 183 - }, { 184 - .peri_id = (u8)DMACH_MAX, 185 - }, { 186 - .peri_id = (u8)DMACH_I2S1_TX, 187 - .rqtype = MEMTODEV, 188 - }, { 189 - .peri_id = (u8)DMACH_I2S1_RX, 190 - .rqtype = DEVTOMEM, 191 - }, { 192 - .peri_id = (u8)DMACH_I2S2_TX, 193 - .rqtype = MEMTODEV, 194 - }, { 195 - .peri_id = (u8)DMACH_I2S2_RX, 196 - .rqtype = DEVTOMEM, 197 - }, { 198 - .peri_id = (u8)DMACH_PWM, 199 - }, { 200 - .peri_id = (u8)DMACH_UART5_RX, 201 - .rqtype = DEVTOMEM, 202 - }, { 203 - .peri_id = (u8)DMACH_UART5_TX, 204 - .rqtype = MEMTODEV, 205 - }, 71 + u8 s5p6450_pdma_peri[] = { 72 + DMACH_UART0_RX, 73 + DMACH_UART0_TX, 74 + DMACH_UART1_RX, 75 + DMACH_UART1_TX, 76 + DMACH_UART2_RX, 77 + DMACH_UART2_TX, 78 + DMACH_UART3_RX, 79 + DMACH_UART3_TX, 80 + DMACH_UART4_RX, 81 + DMACH_UART4_TX, 82 + DMACH_PCM0_TX, 83 + DMACH_PCM0_RX, 84 + DMACH_I2S0_TX, 85 + DMACH_I2S0_RX, 86 + DMACH_SPI0_TX, 87 + DMACH_SPI0_RX, 88 + DMACH_PCM1_TX, 89 + DMACH_PCM1_RX, 90 + DMACH_PCM2_TX, 91 + DMACH_PCM2_RX, 92 + DMACH_SPI1_TX, 93 + DMACH_SPI1_RX, 94 + DMACH_USI_TX, 95 + DMACH_USI_RX, 96 + DMACH_MAX, 97 + DMACH_I2S1_TX, 98 + DMACH_I2S1_RX, 99 + DMACH_I2S2_TX, 100 + DMACH_I2S2_RX, 101 + DMACH_PWM, 102 + DMACH_UART5_RX, 103 + DMACH_UART5_TX, 206 104 }; 207 105 208 106 struct dma_pl330_platdata s5p6450_pdma_pdata = { 209 107 .nr_valid_peri = ARRAY_SIZE(s5p6450_pdma_peri), 210 - .peri = s5p6450_pdma_peri, 108 + .peri_id = s5p6450_pdma_peri, 211 109 }; 212 110 213 111 struct amba_device s5p64x0_device_pdma = { ··· 125 227 126 228 static int __init s5p64x0_dma_init(void) 127 229 { 128 - if (soc_is_s5p6450()) 230 + if (soc_is_s5p6450()) { 231 + dma_cap_set(DMA_SLAVE, s5p6450_pdma_pdata.cap_mask); 232 + dma_cap_set(DMA_CYCLIC, s5p6450_pdma_pdata.cap_mask); 129 233 s5p64x0_device_pdma.dev.platform_data = &s5p6450_pdma_pdata; 130 - else 234 + } else { 235 + dma_cap_set(DMA_SLAVE, s5p6440_pdma_pdata.cap_mask); 236 + dma_cap_set(DMA_CYCLIC, s5p6440_pdma_pdata.cap_mask); 131 237 s5p64x0_device_pdma.dev.platform_data = &s5p6440_pdma_pdata; 238 + } 132 239 133 240 amba_device_register(&s5p64x0_device_pdma, &iomem_resource); 134 241
+2
arch/arm/mach-s5p64x0/include/mach/irqs.h
··· 141 141 142 142 #define IRQ_EINT_GROUP(grp, x) (IRQ_EINT_GROUP##grp##_BASE + (x)) 143 143 144 + #define IRQ_TIMER_BASE (11) 145 + 144 146 /* Set the default NR_IRQS */ 145 147 146 148 #define NR_IRQS (IRQ_EINT_GROUP8_BASE + IRQ_EINT_GROUP8_NR + 1)
+2
arch/arm/mach-s5p64x0/include/mach/map.h
··· 67 67 #define S3C_PA_RTC S5P64X0_PA_RTC 68 68 #define S3C_PA_WDT S5P64X0_PA_WDT 69 69 #define S3C_PA_FB S5P64X0_PA_FB 70 + #define S3C_PA_SPI0 S5P64X0_PA_SPI0 71 + #define S3C_PA_SPI1 S5P64X0_PA_SPI1 70 72 71 73 #define S5P_PA_CHIPID S5P64X0_PA_CHIPID 72 74 #define S5P_PA_SROMC S5P64X0_PA_SROMC
-31
arch/arm/mach-s5p64x0/init.c
··· 23 23 #include <plat/s5p6450.h> 24 24 #include <plat/regs-serial.h> 25 25 26 - static struct s3c24xx_uart_clksrc s5p64x0_serial_clocks[] = { 27 - [0] = { 28 - .name = "pclk_low", 29 - .divisor = 1, 30 - .min_baud = 0, 31 - .max_baud = 0, 32 - }, 33 - [1] = { 34 - .name = "uclk1", 35 - .divisor = 1, 36 - .min_baud = 0, 37 - .max_baud = 0, 38 - }, 39 - }; 40 - 41 26 /* uart registration process */ 42 - 43 - void __init s5p64x0_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) 44 - { 45 - struct s3c2410_uartcfg *tcfg = cfg; 46 - u32 ucnt; 47 - 48 - for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { 49 - if (!tcfg->clocks) { 50 - tcfg->clocks = s5p64x0_serial_clocks; 51 - tcfg->clocks_size = ARRAY_SIZE(s5p64x0_serial_clocks); 52 - } 53 - } 54 - } 55 - 56 27 void __init s5p6440_init_uarts(struct s3c2410_uartcfg *cfg, int no) 57 28 { 58 29 int uart; ··· 33 62 s5p_uart_resources[uart].resources->end = S5P6440_PA_UART(uart) + S5P_SZ_UART; 34 63 } 35 64 36 - s5p64x0_common_init_uarts(cfg, no); 37 65 s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); 38 66 } 39 67 40 68 void __init s5p6450_init_uarts(struct s3c2410_uartcfg *cfg, int no) 41 69 { 42 - s5p64x0_common_init_uarts(cfg, no); 43 70 s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); 44 71 }
+55
arch/arm/mach-s5p64x0/setup-spi.c
··· 1 + /* linux/arch/arm/mach-s5p64x0/setup-spi.c 2 + * 3 + * Copyright (C) 2011 Samsung Electronics Ltd. 4 + * http://www.samsung.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 version 2 as 8 + * published by the Free Software Foundation. 9 + */ 10 + 11 + #include <linux/gpio.h> 12 + #include <linux/platform_device.h> 13 + #include <linux/io.h> 14 + 15 + #include <plat/gpio-cfg.h> 16 + #include <plat/cpu.h> 17 + #include <plat/s3c64xx-spi.h> 18 + 19 + #ifdef CONFIG_S3C64XX_DEV_SPI0 20 + struct s3c64xx_spi_info s3c64xx_spi0_pdata __initdata = { 21 + .fifo_lvl_mask = 0x1ff, 22 + .rx_lvl_offset = 15, 23 + .tx_st_done = 25, 24 + }; 25 + 26 + int s3c64xx_spi0_cfg_gpio(struct platform_device *dev) 27 + { 28 + if (soc_is_s5p6450()) 29 + s3c_gpio_cfgall_range(S5P6450_GPC(0), 3, 30 + S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 31 + else 32 + s3c_gpio_cfgall_range(S5P6440_GPC(0), 3, 33 + S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 34 + return 0; 35 + } 36 + #endif 37 + 38 + #ifdef CONFIG_S3C64XX_DEV_SPI1 39 + struct s3c64xx_spi_info s3c64xx_spi1_pdata __initdata = { 40 + .fifo_lvl_mask = 0x7f, 41 + .rx_lvl_offset = 15, 42 + .tx_st_done = 25, 43 + }; 44 + 45 + int s3c64xx_spi1_cfg_gpio(struct platform_device *dev) 46 + { 47 + if (soc_is_s5p6450()) 48 + s3c_gpio_cfgall_range(S5P6450_GPC(4), 3, 49 + S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 50 + else 51 + s3c_gpio_cfgall_range(S5P6440_GPC(4), 3, 52 + S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 53 + return 0; 54 + } 55 + #endif
+5
arch/arm/mach-s5pc100/Kconfig
··· 45 45 help 46 46 Common setup code for SDHCI gpio. 47 47 48 + config S5PC100_SETUP_SPI 49 + bool 50 + help 51 + Common setup code for SPI GPIO configurations. 52 + 48 53 config MACH_SMDKC100 49 54 bool "SMDKC100" 50 55 select CPU_S5PC100
+1 -2
arch/arm/mach-s5pc100/Makefile
··· 21 21 obj-$(CONFIG_S5PC100_SETUP_I2C1) += setup-i2c1.o 22 22 obj-$(CONFIG_S5PC100_SETUP_IDE) += setup-ide.o 23 23 obj-$(CONFIG_S5PC100_SETUP_KEYPAD) += setup-keypad.o 24 - obj-$(CONFIG_S5PC100_SETUP_SDHCI) += setup-sdhci.o 25 24 obj-$(CONFIG_S5PC100_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o 25 + obj-$(CONFIG_S5PC100_SETUP_SPI) += setup-spi.o 26 26 27 27 # device support 28 28 obj-y += dev-audio.o 29 - obj-$(CONFIG_S3C64XX_DEV_SPI) += dev-spi.o 30 29 31 30 # machine support 32 31
+175 -112
arch/arm/mach-s5pc100/clock.c
··· 426 426 .enable = s5pc100_d0_2_ctrl, 427 427 .ctrlbit = (1 << 1), 428 428 }, { 429 - .name = "hsmmc", 430 - .devname = "s3c-sdhci.2", 431 - .parent = &clk_div_d1_bus.clk, 432 - .enable = s5pc100_d1_0_ctrl, 433 - .ctrlbit = (1 << 7), 434 - }, { 435 - .name = "hsmmc", 436 - .devname = "s3c-sdhci.1", 437 - .parent = &clk_div_d1_bus.clk, 438 - .enable = s5pc100_d1_0_ctrl, 439 - .ctrlbit = (1 << 6), 440 - }, { 441 - .name = "hsmmc", 442 - .devname = "s3c-sdhci.0", 443 - .parent = &clk_div_d1_bus.clk, 444 - .enable = s5pc100_d1_0_ctrl, 445 - .ctrlbit = (1 << 5), 446 - }, { 447 429 .name = "modemif", 448 430 .parent = &clk_div_d1_bus.clk, 449 431 .enable = s5pc100_d1_0_ctrl, ··· 655 673 .enable = s5pc100_d1_5_ctrl, 656 674 .ctrlbit = (1 << 8), 657 675 }, { 658 - .name = "spi_48m", 659 - .devname = "s3c64xx-spi.0", 660 - .parent = &clk_mout_48m.clk, 661 - .enable = s5pc100_sclk0_ctrl, 662 - .ctrlbit = (1 << 7), 663 - }, { 664 - .name = "spi_48m", 665 - .devname = "s3c64xx-spi.1", 666 - .parent = &clk_mout_48m.clk, 667 - .enable = s5pc100_sclk0_ctrl, 668 - .ctrlbit = (1 << 8), 669 - }, { 670 - .name = "spi_48m", 671 - .devname = "s3c64xx-spi.2", 672 - .parent = &clk_mout_48m.clk, 673 - .enable = s5pc100_sclk0_ctrl, 674 - .ctrlbit = (1 << 9), 675 - }, { 676 676 .name = "mmc_48m", 677 677 .devname = "s3c-sdhci.0", 678 678 .parent = &clk_mout_48m.clk, ··· 673 709 .enable = s5pc100_sclk0_ctrl, 674 710 .ctrlbit = (1 << 17), 675 711 }, 712 + }; 713 + 714 + static struct clk clk_hsmmc2 = { 715 + .name = "hsmmc", 716 + .devname = "s3c-sdhci.2", 717 + .parent = &clk_div_d1_bus.clk, 718 + .enable = s5pc100_d1_0_ctrl, 719 + .ctrlbit = (1 << 7), 720 + }; 721 + 722 + static struct clk clk_hsmmc1 = { 723 + .name = "hsmmc", 724 + .devname = "s3c-sdhci.1", 725 + .parent = &clk_div_d1_bus.clk, 726 + .enable = s5pc100_d1_0_ctrl, 727 + .ctrlbit = (1 << 6), 728 + }; 729 + 730 + static struct clk clk_hsmmc0 = { 731 + .name = "hsmmc", 732 + .devname = "s3c-sdhci.0", 733 + .parent = &clk_div_d1_bus.clk, 734 + .enable = s5pc100_d1_0_ctrl, 735 + .ctrlbit = (1 << 5), 736 + }; 737 + 738 + static struct clk clk_48m_spi0 = { 739 + .name = "spi_48m", 740 + .devname = "s3c64xx-spi.0", 741 + .parent = &clk_mout_48m.clk, 742 + .enable = s5pc100_sclk0_ctrl, 743 + .ctrlbit = (1 << 7), 744 + }; 745 + 746 + static struct clk clk_48m_spi1 = { 747 + .name = "spi_48m", 748 + .devname = "s3c64xx-spi.1", 749 + .parent = &clk_mout_48m.clk, 750 + .enable = s5pc100_sclk0_ctrl, 751 + .ctrlbit = (1 << 8), 752 + }; 753 + 754 + static struct clk clk_48m_spi2 = { 755 + .name = "spi_48m", 756 + .devname = "s3c64xx-spi.2", 757 + .parent = &clk_mout_48m.clk, 758 + .enable = s5pc100_sclk0_ctrl, 759 + .ctrlbit = (1 << 9), 676 760 }; 677 761 678 762 static struct clk clk_vclk54m = { ··· 941 929 static struct clksrc_clk clksrcs[] = { 942 930 { 943 931 .clk = { 944 - .name = "sclk_spi", 945 - .devname = "s3c64xx-spi.0", 946 - .ctrlbit = (1 << 4), 947 - .enable = s5pc100_sclk0_ctrl, 948 - 949 - }, 950 - .sources = &clk_src_group1, 951 - .reg_src = { .reg = S5P_CLK_SRC1, .shift = 4, .size = 2 }, 952 - .reg_div = { .reg = S5P_CLK_DIV2, .shift = 4, .size = 4 }, 953 - }, { 954 - .clk = { 955 - .name = "sclk_spi", 956 - .devname = "s3c64xx-spi.1", 957 - .ctrlbit = (1 << 5), 958 - .enable = s5pc100_sclk0_ctrl, 959 - 960 - }, 961 - .sources = &clk_src_group1, 962 - .reg_src = { .reg = S5P_CLK_SRC1, .shift = 8, .size = 2 }, 963 - .reg_div = { .reg = S5P_CLK_DIV2, .shift = 8, .size = 4 }, 964 - }, { 965 - .clk = { 966 - .name = "sclk_spi", 967 - .devname = "s3c64xx-spi.2", 968 - .ctrlbit = (1 << 6), 969 - .enable = s5pc100_sclk0_ctrl, 970 - 971 - }, 972 - .sources = &clk_src_group1, 973 - .reg_src = { .reg = S5P_CLK_SRC1, .shift = 12, .size = 2 }, 974 - .reg_div = { .reg = S5P_CLK_DIV2, .shift = 12, .size = 4 }, 975 - }, { 976 - .clk = { 977 - .name = "uclk1", 978 - .ctrlbit = (1 << 3), 979 - .enable = s5pc100_sclk0_ctrl, 980 - 981 - }, 982 - .sources = &clk_src_group2, 983 - .reg_src = { .reg = S5P_CLK_SRC1, .shift = 0, .size = 1 }, 984 - .reg_div = { .reg = S5P_CLK_DIV2, .shift = 0, .size = 4 }, 985 - }, { 986 - .clk = { 987 932 .name = "sclk_mixer", 988 933 .ctrlbit = (1 << 6), 989 934 .enable = s5pc100_sclk0_ctrl, ··· 993 1024 .reg_div = { .reg = S5P_CLK_DIV3, .shift = 24, .size = 4 }, 994 1025 }, { 995 1026 .clk = { 996 - .name = "sclk_mmc", 997 - .devname = "s3c-sdhci.0", 998 - .ctrlbit = (1 << 12), 999 - .enable = s5pc100_sclk1_ctrl, 1000 - 1001 - }, 1002 - .sources = &clk_src_mmc0, 1003 - .reg_src = { .reg = S5P_CLK_SRC2, .shift = 0, .size = 2 }, 1004 - .reg_div = { .reg = S5P_CLK_DIV3, .shift = 0, .size = 4 }, 1005 - }, { 1006 - .clk = { 1007 - .name = "sclk_mmc", 1008 - .devname = "s3c-sdhci.1", 1009 - .ctrlbit = (1 << 13), 1010 - .enable = s5pc100_sclk1_ctrl, 1011 - 1012 - }, 1013 - .sources = &clk_src_mmc12, 1014 - .reg_src = { .reg = S5P_CLK_SRC2, .shift = 4, .size = 2 }, 1015 - .reg_div = { .reg = S5P_CLK_DIV3, .shift = 4, .size = 4 }, 1016 - }, { 1017 - .clk = { 1018 - .name = "sclk_mmc", 1019 - .devname = "s3c-sdhci.2", 1020 - .ctrlbit = (1 << 14), 1021 - .enable = s5pc100_sclk1_ctrl, 1022 - 1023 - }, 1024 - .sources = &clk_src_mmc12, 1025 - .reg_src = { .reg = S5P_CLK_SRC2, .shift = 8, .size = 2 }, 1026 - .reg_div = { .reg = S5P_CLK_DIV3, .shift = 8, .size = 4 }, 1027 - }, { 1028 - .clk = { 1029 1027 .name = "sclk_irda", 1030 1028 .ctrlbit = (1 << 10), 1031 1029 .enable = s5pc100_sclk0_ctrl, ··· 1034 1098 }, 1035 1099 }; 1036 1100 1101 + static struct clksrc_clk clk_sclk_uart = { 1102 + .clk = { 1103 + .name = "uclk1", 1104 + .ctrlbit = (1 << 3), 1105 + .enable = s5pc100_sclk0_ctrl, 1106 + }, 1107 + .sources = &clk_src_group2, 1108 + .reg_src = { .reg = S5P_CLK_SRC1, .shift = 0, .size = 1 }, 1109 + .reg_div = { .reg = S5P_CLK_DIV2, .shift = 0, .size = 4 }, 1110 + }; 1111 + 1112 + static struct clksrc_clk clk_sclk_mmc0 = { 1113 + .clk = { 1114 + .name = "sclk_mmc", 1115 + .devname = "s3c-sdhci.0", 1116 + .ctrlbit = (1 << 12), 1117 + .enable = s5pc100_sclk1_ctrl, 1118 + }, 1119 + .sources = &clk_src_mmc0, 1120 + .reg_src = { .reg = S5P_CLK_SRC2, .shift = 0, .size = 2 }, 1121 + .reg_div = { .reg = S5P_CLK_DIV3, .shift = 0, .size = 4 }, 1122 + }; 1123 + 1124 + static struct clksrc_clk clk_sclk_mmc1 = { 1125 + .clk = { 1126 + .name = "sclk_mmc", 1127 + .devname = "s3c-sdhci.1", 1128 + .ctrlbit = (1 << 13), 1129 + .enable = s5pc100_sclk1_ctrl, 1130 + }, 1131 + .sources = &clk_src_mmc12, 1132 + .reg_src = { .reg = S5P_CLK_SRC2, .shift = 4, .size = 2 }, 1133 + .reg_div = { .reg = S5P_CLK_DIV3, .shift = 4, .size = 4 }, 1134 + }; 1135 + 1136 + static struct clksrc_clk clk_sclk_mmc2 = { 1137 + .clk = { 1138 + .name = "sclk_mmc", 1139 + .devname = "s3c-sdhci.2", 1140 + .ctrlbit = (1 << 14), 1141 + .enable = s5pc100_sclk1_ctrl, 1142 + }, 1143 + .sources = &clk_src_mmc12, 1144 + .reg_src = { .reg = S5P_CLK_SRC2, .shift = 8, .size = 2 }, 1145 + .reg_div = { .reg = S5P_CLK_DIV3, .shift = 8, .size = 4 }, 1146 + }; 1147 + 1148 + static struct clksrc_clk clk_sclk_spi0 = { 1149 + .clk = { 1150 + .name = "sclk_spi", 1151 + .devname = "s3c64xx-spi.0", 1152 + .ctrlbit = (1 << 4), 1153 + .enable = s5pc100_sclk0_ctrl, 1154 + }, 1155 + .sources = &clk_src_group1, 1156 + .reg_src = { .reg = S5P_CLK_SRC1, .shift = 4, .size = 2 }, 1157 + .reg_div = { .reg = S5P_CLK_DIV2, .shift = 4, .size = 4 }, 1158 + }; 1159 + 1160 + static struct clksrc_clk clk_sclk_spi1 = { 1161 + .clk = { 1162 + .name = "sclk_spi", 1163 + .devname = "s3c64xx-spi.1", 1164 + .ctrlbit = (1 << 5), 1165 + .enable = s5pc100_sclk0_ctrl, 1166 + }, 1167 + .sources = &clk_src_group1, 1168 + .reg_src = { .reg = S5P_CLK_SRC1, .shift = 8, .size = 2 }, 1169 + .reg_div = { .reg = S5P_CLK_DIV2, .shift = 8, .size = 4 }, 1170 + }; 1171 + 1172 + static struct clksrc_clk clk_sclk_spi2 = { 1173 + .clk = { 1174 + .name = "sclk_spi", 1175 + .devname = "s3c64xx-spi.2", 1176 + .ctrlbit = (1 << 6), 1177 + .enable = s5pc100_sclk0_ctrl, 1178 + }, 1179 + .sources = &clk_src_group1, 1180 + .reg_src = { .reg = S5P_CLK_SRC1, .shift = 12, .size = 2 }, 1181 + .reg_div = { .reg = S5P_CLK_DIV2, .shift = 12, .size = 4 }, 1182 + }; 1183 + 1037 1184 /* Clock initialisation code */ 1038 1185 static struct clksrc_clk *sysclks[] = { 1039 1186 &clk_mout_apll, ··· 1144 1125 &clk_sclk_audio1, 1145 1126 &clk_sclk_audio2, 1146 1127 &clk_sclk_spdif, 1128 + }; 1129 + 1130 + static struct clk *clk_cdev[] = { 1131 + &clk_hsmmc0, 1132 + &clk_hsmmc1, 1133 + &clk_hsmmc2, 1134 + &clk_48m_spi0, 1135 + &clk_48m_spi1, 1136 + &clk_48m_spi2, 1137 + }; 1138 + 1139 + static struct clksrc_clk *clksrc_cdev[] = { 1140 + &clk_sclk_uart, 1141 + &clk_sclk_mmc0, 1142 + &clk_sclk_mmc1, 1143 + &clk_sclk_mmc2, 1144 + &clk_sclk_spi0, 1145 + &clk_sclk_spi1, 1146 + &clk_sclk_spi2, 1147 1147 }; 1148 1148 1149 1149 void __init_or_cpufreq s5pc100_setup_clocks(void) ··· 1304 1266 &clk_pcmcdclk1, 1305 1267 }; 1306 1268 1269 + static struct clk_lookup s5pc100_clk_lookup[] = { 1270 + CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p), 1271 + CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_sclk_uart.clk), 1272 + CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.0", &clk_hsmmc0), 1273 + CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.0", &clk_hsmmc1), 1274 + CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.0", &clk_hsmmc2), 1275 + CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk), 1276 + CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk), 1277 + CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk), 1278 + CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), 1279 + CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_48m_spi0), 1280 + CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk2", &clk_sclk_spi0.clk), 1281 + CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_48m_spi1), 1282 + CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk2", &clk_sclk_spi1.clk), 1283 + CLKDEV_INIT("s3c64xx-spi.2", "spi_busclk1", &clk_48m_spi2), 1284 + CLKDEV_INIT("s3c64xx-spi.2", "spi_busclk2", &clk_sclk_spi2.clk), 1285 + }; 1286 + 1307 1287 void __init s5pc100_register_clocks(void) 1308 1288 { 1309 1289 int ptr; ··· 1333 1277 1334 1278 s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs)); 1335 1279 s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks)); 1280 + for (ptr = 0; ptr < ARRAY_SIZE(clksrc_cdev); ptr++) 1281 + s3c_register_clksrc(clksrc_cdev[ptr], 1); 1336 1282 1337 1283 s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 1338 1284 s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 1285 + clkdev_add_table(s5pc100_clk_lookup, ARRAY_SIZE(s5pc100_clk_lookup)); 1286 + 1287 + s3c24xx_register_clocks(clk_cdev, ARRAY_SIZE(clk_cdev)); 1288 + for (ptr = 0; ptr < ARRAY_SIZE(clk_cdev); ptr++) 1289 + s3c_disable_clocks(clk_cdev[ptr], 1); 1339 1290 1340 1291 s3c24xx_register_clock(&dummy_apb_pclk); 1341 1292
-227
arch/arm/mach-s5pc100/dev-spi.c
··· 1 - /* linux/arch/arm/mach-s5pc100/dev-spi.c 2 - * 3 - * Copyright (C) 2010 Samsung Electronics Co. Ltd. 4 - * Jaswinder Singh <jassi.brar@samsung.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 version 2 as 8 - * published by the Free Software Foundation. 9 - */ 10 - 11 - #include <linux/platform_device.h> 12 - #include <linux/dma-mapping.h> 13 - #include <linux/gpio.h> 14 - 15 - #include <mach/dma.h> 16 - #include <mach/map.h> 17 - #include <mach/spi-clocks.h> 18 - #include <mach/irqs.h> 19 - 20 - #include <plat/s3c64xx-spi.h> 21 - #include <plat/gpio-cfg.h> 22 - #include <plat/irqs.h> 23 - 24 - static char *spi_src_clks[] = { 25 - [S5PC100_SPI_SRCCLK_PCLK] = "pclk", 26 - [S5PC100_SPI_SRCCLK_48M] = "spi_48m", 27 - [S5PC100_SPI_SRCCLK_SPIBUS] = "spi_bus", 28 - }; 29 - 30 - /* SPI Controller platform_devices */ 31 - 32 - /* Since we emulate multi-cs capability, we do not touch the CS. 33 - * The emulated CS is toggled by board specific mechanism, as it can 34 - * be either some immediate GPIO or some signal out of some other 35 - * chip in between ... or some yet another way. 36 - * We simply do not assume anything about CS. 37 - */ 38 - static int s5pc100_spi_cfg_gpio(struct platform_device *pdev) 39 - { 40 - switch (pdev->id) { 41 - case 0: 42 - s3c_gpio_cfgall_range(S5PC100_GPB(0), 3, 43 - S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 44 - break; 45 - 46 - case 1: 47 - s3c_gpio_cfgall_range(S5PC100_GPB(4), 3, 48 - S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 49 - break; 50 - 51 - case 2: 52 - s3c_gpio_cfgpin(S5PC100_GPG3(0), S3C_GPIO_SFN(3)); 53 - s3c_gpio_setpull(S5PC100_GPG3(0), S3C_GPIO_PULL_UP); 54 - s3c_gpio_cfgall_range(S5PC100_GPB(2), 2, 55 - S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP); 56 - break; 57 - 58 - default: 59 - dev_err(&pdev->dev, "Invalid SPI Controller number!"); 60 - return -EINVAL; 61 - } 62 - 63 - return 0; 64 - } 65 - 66 - static struct resource s5pc100_spi0_resource[] = { 67 - [0] = { 68 - .start = S5PC100_PA_SPI0, 69 - .end = S5PC100_PA_SPI0 + 0x100 - 1, 70 - .flags = IORESOURCE_MEM, 71 - }, 72 - [1] = { 73 - .start = DMACH_SPI0_TX, 74 - .end = DMACH_SPI0_TX, 75 - .flags = IORESOURCE_DMA, 76 - }, 77 - [2] = { 78 - .start = DMACH_SPI0_RX, 79 - .end = DMACH_SPI0_RX, 80 - .flags = IORESOURCE_DMA, 81 - }, 82 - [3] = { 83 - .start = IRQ_SPI0, 84 - .end = IRQ_SPI0, 85 - .flags = IORESOURCE_IRQ, 86 - }, 87 - }; 88 - 89 - static struct s3c64xx_spi_info s5pc100_spi0_pdata = { 90 - .cfg_gpio = s5pc100_spi_cfg_gpio, 91 - .fifo_lvl_mask = 0x7f, 92 - .rx_lvl_offset = 13, 93 - .high_speed = 1, 94 - .tx_st_done = 21, 95 - }; 96 - 97 - static u64 spi_dmamask = DMA_BIT_MASK(32); 98 - 99 - struct platform_device s5pc100_device_spi0 = { 100 - .name = "s3c64xx-spi", 101 - .id = 0, 102 - .num_resources = ARRAY_SIZE(s5pc100_spi0_resource), 103 - .resource = s5pc100_spi0_resource, 104 - .dev = { 105 - .dma_mask = &spi_dmamask, 106 - .coherent_dma_mask = DMA_BIT_MASK(32), 107 - .platform_data = &s5pc100_spi0_pdata, 108 - }, 109 - }; 110 - 111 - static struct resource s5pc100_spi1_resource[] = { 112 - [0] = { 113 - .start = S5PC100_PA_SPI1, 114 - .end = S5PC100_PA_SPI1 + 0x100 - 1, 115 - .flags = IORESOURCE_MEM, 116 - }, 117 - [1] = { 118 - .start = DMACH_SPI1_TX, 119 - .end = DMACH_SPI1_TX, 120 - .flags = IORESOURCE_DMA, 121 - }, 122 - [2] = { 123 - .start = DMACH_SPI1_RX, 124 - .end = DMACH_SPI1_RX, 125 - .flags = IORESOURCE_DMA, 126 - }, 127 - [3] = { 128 - .start = IRQ_SPI1, 129 - .end = IRQ_SPI1, 130 - .flags = IORESOURCE_IRQ, 131 - }, 132 - }; 133 - 134 - static struct s3c64xx_spi_info s5pc100_spi1_pdata = { 135 - .cfg_gpio = s5pc100_spi_cfg_gpio, 136 - .fifo_lvl_mask = 0x7f, 137 - .rx_lvl_offset = 13, 138 - .high_speed = 1, 139 - .tx_st_done = 21, 140 - }; 141 - 142 - struct platform_device s5pc100_device_spi1 = { 143 - .name = "s3c64xx-spi", 144 - .id = 1, 145 - .num_resources = ARRAY_SIZE(s5pc100_spi1_resource), 146 - .resource = s5pc100_spi1_resource, 147 - .dev = { 148 - .dma_mask = &spi_dmamask, 149 - .coherent_dma_mask = DMA_BIT_MASK(32), 150 - .platform_data = &s5pc100_spi1_pdata, 151 - }, 152 - }; 153 - 154 - static struct resource s5pc100_spi2_resource[] = { 155 - [0] = { 156 - .start = S5PC100_PA_SPI2, 157 - .end = S5PC100_PA_SPI2 + 0x100 - 1, 158 - .flags = IORESOURCE_MEM, 159 - }, 160 - [1] = { 161 - .start = DMACH_SPI2_TX, 162 - .end = DMACH_SPI2_TX, 163 - .flags = IORESOURCE_DMA, 164 - }, 165 - [2] = { 166 - .start = DMACH_SPI2_RX, 167 - .end = DMACH_SPI2_RX, 168 - .flags = IORESOURCE_DMA, 169 - }, 170 - [3] = { 171 - .start = IRQ_SPI2, 172 - .end = IRQ_SPI2, 173 - .flags = IORESOURCE_IRQ, 174 - }, 175 - }; 176 - 177 - static struct s3c64xx_spi_info s5pc100_spi2_pdata = { 178 - .cfg_gpio = s5pc100_spi_cfg_gpio, 179 - .fifo_lvl_mask = 0x7f, 180 - .rx_lvl_offset = 13, 181 - .high_speed = 1, 182 - .tx_st_done = 21, 183 - }; 184 - 185 - struct platform_device s5pc100_device_spi2 = { 186 - .name = "s3c64xx-spi", 187 - .id = 2, 188 - .num_resources = ARRAY_SIZE(s5pc100_spi2_resource), 189 - .resource = s5pc100_spi2_resource, 190 - .dev = { 191 - .dma_mask = &spi_dmamask, 192 - .coherent_dma_mask = DMA_BIT_MASK(32), 193 - .platform_data = &s5pc100_spi2_pdata, 194 - }, 195 - }; 196 - 197 - void __init s5pc100_spi_set_info(int cntrlr, int src_clk_nr, int num_cs) 198 - { 199 - struct s3c64xx_spi_info *pd; 200 - 201 - /* Reject invalid configuration */ 202 - if (!num_cs || src_clk_nr < 0 203 - || src_clk_nr > S5PC100_SPI_SRCCLK_SPIBUS) { 204 - printk(KERN_ERR "%s: Invalid SPI configuration\n", __func__); 205 - return; 206 - } 207 - 208 - switch (cntrlr) { 209 - case 0: 210 - pd = &s5pc100_spi0_pdata; 211 - break; 212 - case 1: 213 - pd = &s5pc100_spi1_pdata; 214 - break; 215 - case 2: 216 - pd = &s5pc100_spi2_pdata; 217 - break; 218 - default: 219 - printk(KERN_ERR "%s: Invalid SPI controller(%d)\n", 220 - __func__, cntrlr); 221 - return; 222 - } 223 - 224 - pd->num_cs = num_cs; 225 - pd->src_clk_nr = src_clk_nr; 226 - pd->src_clk_name = spi_src_clks[src_clk_nr]; 227 - }
+69 -178
arch/arm/mach-s5pc100/dma.c
··· 35 35 36 36 static u64 dma_dmamask = DMA_BIT_MASK(32); 37 37 38 - struct dma_pl330_peri pdma0_peri[30] = { 39 - { 40 - .peri_id = (u8)DMACH_UART0_RX, 41 - .rqtype = DEVTOMEM, 42 - }, { 43 - .peri_id = (u8)DMACH_UART0_TX, 44 - .rqtype = MEMTODEV, 45 - }, { 46 - .peri_id = (u8)DMACH_UART1_RX, 47 - .rqtype = DEVTOMEM, 48 - }, { 49 - .peri_id = (u8)DMACH_UART1_TX, 50 - .rqtype = MEMTODEV, 51 - }, { 52 - .peri_id = (u8)DMACH_UART2_RX, 53 - .rqtype = DEVTOMEM, 54 - }, { 55 - .peri_id = (u8)DMACH_UART2_TX, 56 - .rqtype = MEMTODEV, 57 - }, { 58 - .peri_id = (u8)DMACH_UART3_RX, 59 - .rqtype = DEVTOMEM, 60 - }, { 61 - .peri_id = (u8)DMACH_UART3_TX, 62 - .rqtype = MEMTODEV, 63 - }, { 64 - .peri_id = DMACH_IRDA, 65 - }, { 66 - .peri_id = (u8)DMACH_I2S0_RX, 67 - .rqtype = DEVTOMEM, 68 - }, { 69 - .peri_id = (u8)DMACH_I2S0_TX, 70 - .rqtype = MEMTODEV, 71 - }, { 72 - .peri_id = (u8)DMACH_I2S0S_TX, 73 - .rqtype = MEMTODEV, 74 - }, { 75 - .peri_id = (u8)DMACH_I2S1_RX, 76 - .rqtype = DEVTOMEM, 77 - }, { 78 - .peri_id = (u8)DMACH_I2S1_TX, 79 - .rqtype = MEMTODEV, 80 - }, { 81 - .peri_id = (u8)DMACH_I2S2_RX, 82 - .rqtype = DEVTOMEM, 83 - }, { 84 - .peri_id = (u8)DMACH_I2S2_TX, 85 - .rqtype = MEMTODEV, 86 - }, { 87 - .peri_id = (u8)DMACH_SPI0_RX, 88 - .rqtype = DEVTOMEM, 89 - }, { 90 - .peri_id = (u8)DMACH_SPI0_TX, 91 - .rqtype = MEMTODEV, 92 - }, { 93 - .peri_id = (u8)DMACH_SPI1_RX, 94 - .rqtype = DEVTOMEM, 95 - }, { 96 - .peri_id = (u8)DMACH_SPI1_TX, 97 - .rqtype = MEMTODEV, 98 - }, { 99 - .peri_id = (u8)DMACH_SPI2_RX, 100 - .rqtype = DEVTOMEM, 101 - }, { 102 - .peri_id = (u8)DMACH_SPI2_TX, 103 - .rqtype = MEMTODEV, 104 - }, { 105 - .peri_id = (u8)DMACH_AC97_MICIN, 106 - .rqtype = DEVTOMEM, 107 - }, { 108 - .peri_id = (u8)DMACH_AC97_PCMIN, 109 - .rqtype = DEVTOMEM, 110 - }, { 111 - .peri_id = (u8)DMACH_AC97_PCMOUT, 112 - .rqtype = MEMTODEV, 113 - }, { 114 - .peri_id = (u8)DMACH_EXTERNAL, 115 - }, { 116 - .peri_id = (u8)DMACH_PWM, 117 - }, { 118 - .peri_id = (u8)DMACH_SPDIF, 119 - .rqtype = MEMTODEV, 120 - }, { 121 - .peri_id = (u8)DMACH_HSI_RX, 122 - .rqtype = DEVTOMEM, 123 - }, { 124 - .peri_id = (u8)DMACH_HSI_TX, 125 - .rqtype = MEMTODEV, 126 - }, 38 + u8 pdma0_peri[] = { 39 + DMACH_UART0_RX, 40 + DMACH_UART0_TX, 41 + DMACH_UART1_RX, 42 + DMACH_UART1_TX, 43 + DMACH_UART2_RX, 44 + DMACH_UART2_TX, 45 + DMACH_UART3_RX, 46 + DMACH_UART3_TX, 47 + DMACH_IRDA, 48 + DMACH_I2S0_RX, 49 + DMACH_I2S0_TX, 50 + DMACH_I2S0S_TX, 51 + DMACH_I2S1_RX, 52 + DMACH_I2S1_TX, 53 + DMACH_I2S2_RX, 54 + DMACH_I2S2_TX, 55 + DMACH_SPI0_RX, 56 + DMACH_SPI0_TX, 57 + DMACH_SPI1_RX, 58 + DMACH_SPI1_TX, 59 + DMACH_SPI2_RX, 60 + DMACH_SPI2_TX, 61 + DMACH_AC97_MICIN, 62 + DMACH_AC97_PCMIN, 63 + DMACH_AC97_PCMOUT, 64 + DMACH_EXTERNAL, 65 + DMACH_PWM, 66 + DMACH_SPDIF, 67 + DMACH_HSI_RX, 68 + DMACH_HSI_TX, 127 69 }; 128 70 129 71 struct dma_pl330_platdata s5pc100_pdma0_pdata = { 130 72 .nr_valid_peri = ARRAY_SIZE(pdma0_peri), 131 - .peri = pdma0_peri, 73 + .peri_id = pdma0_peri, 132 74 }; 133 75 134 76 struct amba_device s5pc100_device_pdma0 = { ··· 89 147 .periphid = 0x00041330, 90 148 }; 91 149 92 - struct dma_pl330_peri pdma1_peri[30] = { 93 - { 94 - .peri_id = (u8)DMACH_UART0_RX, 95 - .rqtype = DEVTOMEM, 96 - }, { 97 - .peri_id = (u8)DMACH_UART0_TX, 98 - .rqtype = MEMTODEV, 99 - }, { 100 - .peri_id = (u8)DMACH_UART1_RX, 101 - .rqtype = DEVTOMEM, 102 - }, { 103 - .peri_id = (u8)DMACH_UART1_TX, 104 - .rqtype = MEMTODEV, 105 - }, { 106 - .peri_id = (u8)DMACH_UART2_RX, 107 - .rqtype = DEVTOMEM, 108 - }, { 109 - .peri_id = (u8)DMACH_UART2_TX, 110 - .rqtype = MEMTODEV, 111 - }, { 112 - .peri_id = (u8)DMACH_UART3_RX, 113 - .rqtype = DEVTOMEM, 114 - }, { 115 - .peri_id = (u8)DMACH_UART3_TX, 116 - .rqtype = MEMTODEV, 117 - }, { 118 - .peri_id = DMACH_IRDA, 119 - }, { 120 - .peri_id = (u8)DMACH_I2S0_RX, 121 - .rqtype = DEVTOMEM, 122 - }, { 123 - .peri_id = (u8)DMACH_I2S0_TX, 124 - .rqtype = MEMTODEV, 125 - }, { 126 - .peri_id = (u8)DMACH_I2S0S_TX, 127 - .rqtype = MEMTODEV, 128 - }, { 129 - .peri_id = (u8)DMACH_I2S1_RX, 130 - .rqtype = DEVTOMEM, 131 - }, { 132 - .peri_id = (u8)DMACH_I2S1_TX, 133 - .rqtype = MEMTODEV, 134 - }, { 135 - .peri_id = (u8)DMACH_I2S2_RX, 136 - .rqtype = DEVTOMEM, 137 - }, { 138 - .peri_id = (u8)DMACH_I2S2_TX, 139 - .rqtype = MEMTODEV, 140 - }, { 141 - .peri_id = (u8)DMACH_SPI0_RX, 142 - .rqtype = DEVTOMEM, 143 - }, { 144 - .peri_id = (u8)DMACH_SPI0_TX, 145 - .rqtype = MEMTODEV, 146 - }, { 147 - .peri_id = (u8)DMACH_SPI1_RX, 148 - .rqtype = DEVTOMEM, 149 - }, { 150 - .peri_id = (u8)DMACH_SPI1_TX, 151 - .rqtype = MEMTODEV, 152 - }, { 153 - .peri_id = (u8)DMACH_SPI2_RX, 154 - .rqtype = DEVTOMEM, 155 - }, { 156 - .peri_id = (u8)DMACH_SPI2_TX, 157 - .rqtype = MEMTODEV, 158 - }, { 159 - .peri_id = (u8)DMACH_PCM0_RX, 160 - .rqtype = DEVTOMEM, 161 - }, { 162 - .peri_id = (u8)DMACH_PCM1_TX, 163 - .rqtype = MEMTODEV, 164 - }, { 165 - .peri_id = (u8)DMACH_PCM1_RX, 166 - .rqtype = DEVTOMEM, 167 - }, { 168 - .peri_id = (u8)DMACH_PCM1_TX, 169 - .rqtype = MEMTODEV, 170 - }, { 171 - .peri_id = (u8)DMACH_MSM_REQ0, 172 - }, { 173 - .peri_id = (u8)DMACH_MSM_REQ1, 174 - }, { 175 - .peri_id = (u8)DMACH_MSM_REQ2, 176 - }, { 177 - .peri_id = (u8)DMACH_MSM_REQ3, 178 - }, 150 + u8 pdma1_peri[] = { 151 + DMACH_UART0_RX, 152 + DMACH_UART0_TX, 153 + DMACH_UART1_RX, 154 + DMACH_UART1_TX, 155 + DMACH_UART2_RX, 156 + DMACH_UART2_TX, 157 + DMACH_UART3_RX, 158 + DMACH_UART3_TX, 159 + DMACH_IRDA, 160 + DMACH_I2S0_RX, 161 + DMACH_I2S0_TX, 162 + DMACH_I2S0S_TX, 163 + DMACH_I2S1_RX, 164 + DMACH_I2S1_TX, 165 + DMACH_I2S2_RX, 166 + DMACH_I2S2_TX, 167 + DMACH_SPI0_RX, 168 + DMACH_SPI0_TX, 169 + DMACH_SPI1_RX, 170 + DMACH_SPI1_TX, 171 + DMACH_SPI2_RX, 172 + DMACH_SPI2_TX, 173 + DMACH_PCM0_RX, 174 + DMACH_PCM0_TX, 175 + DMACH_PCM1_RX, 176 + DMACH_PCM1_TX, 177 + DMACH_MSM_REQ0, 178 + DMACH_MSM_REQ1, 179 + DMACH_MSM_REQ2, 180 + DMACH_MSM_REQ3, 179 181 }; 180 182 181 183 struct dma_pl330_platdata s5pc100_pdma1_pdata = { 182 184 .nr_valid_peri = ARRAY_SIZE(pdma1_peri), 183 - .peri = pdma1_peri, 185 + .peri_id = pdma1_peri, 184 186 }; 185 187 186 188 struct amba_device s5pc100_device_pdma1 = { ··· 145 259 146 260 static int __init s5pc100_dma_init(void) 147 261 { 262 + dma_cap_set(DMA_SLAVE, s5pc100_pdma0_pdata.cap_mask); 263 + dma_cap_set(DMA_CYCLIC, s5pc100_pdma0_pdata.cap_mask); 148 264 amba_device_register(&s5pc100_device_pdma0, &iomem_resource); 265 + 266 + dma_cap_set(DMA_SLAVE, s5pc100_pdma1_pdata.cap_mask); 267 + dma_cap_set(DMA_CYCLIC, s5pc100_pdma1_pdata.cap_mask); 149 268 amba_device_register(&s5pc100_device_pdma1, &iomem_resource); 150 269 151 270 return 0;
+2
arch/arm/mach-s5pc100/include/mach/irqs.h
··· 97 97 #define IRQ_SDMFIQ S5P_IRQ_VIC2(31) 98 98 #define IRQ_VIC_END S5P_IRQ_VIC2(31) 99 99 100 + #define IRQ_TIMER_BASE (11) 101 + 100 102 #define S5P_EINT_BASE1 (S5P_IRQ_VIC0(0)) 101 103 #define S5P_EINT_BASE2 (IRQ_VIC_END + 1) 102 104
+3
arch/arm/mach-s5pc100/include/mach/map.h
··· 100 100 #define S3C_PA_USB_HSOTG S5PC100_PA_USB_HSOTG 101 101 #define S3C_PA_USB_HSPHY S5PC100_PA_USB_HSPHY 102 102 #define S3C_PA_WDT S5PC100_PA_WATCHDOG 103 + #define S3C_PA_SPI0 S5PC100_PA_SPI0 104 + #define S3C_PA_SPI1 S5PC100_PA_SPI1 105 + #define S3C_PA_SPI2 S5PC100_PA_SPI2 103 106 104 107 #define S5P_PA_CHIPID S5PC100_PA_CHIPID 105 108 #define S5P_PA_FIMC0 S5PC100_PA_FIMC0
-23
arch/arm/mach-s5pc100/setup-sdhci.c
··· 1 - /* linux/arch/arm/mach-s5pc100/setup-sdhci.c 2 - * 3 - * Copyright 2008 Samsung Electronics 4 - * 5 - * S5PC100 - Helper functions for settign up SDHCI device(s) (HSMMC) 6 - * 7 - * Based on mach-s3c6410/setup-sdhci.c 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 version 2 as 11 - * published by the Free Software Foundation. 12 - */ 13 - 14 - #include <linux/types.h> 15 - 16 - /* clock sources for the mmc bus clock, order as for the ctrl2[5..4] */ 17 - 18 - char *s5pc100_hsmmc_clksrcs[4] = { 19 - [0] = "hsmmc", /* HCLK */ 20 - /* [1] = "hsmmc", - duplicate HCLK entry */ 21 - [2] = "sclk_mmc", /* mmc_bus */ 22 - /* [3] = "48m", - note not successfully used yet */ 23 - };
+65
arch/arm/mach-s5pc100/setup-spi.c
··· 1 + /* linux/arch/arm/mach-s5pc100/setup-spi.c 2 + * 3 + * Copyright (C) 2011 Samsung Electronics Ltd. 4 + * http://www.samsung.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 version 2 as 8 + * published by the Free Software Foundation. 9 + */ 10 + 11 + #include <linux/gpio.h> 12 + #include <linux/platform_device.h> 13 + 14 + #include <plat/gpio-cfg.h> 15 + #include <plat/s3c64xx-spi.h> 16 + 17 + #ifdef CONFIG_S3C64XX_DEV_SPI0 18 + struct s3c64xx_spi_info s3c64xx_spi0_pdata __initdata = { 19 + .fifo_lvl_mask = 0x7f, 20 + .rx_lvl_offset = 13, 21 + .high_speed = 1, 22 + .tx_st_done = 21, 23 + }; 24 + 25 + int s3c64xx_spi0_cfg_gpio(struct platform_device *dev) 26 + { 27 + s3c_gpio_cfgall_range(S5PC100_GPB(0), 3, 28 + S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 29 + return 0; 30 + } 31 + #endif 32 + 33 + #ifdef CONFIG_S3C64XX_DEV_SPI1 34 + struct s3c64xx_spi_info s3c64xx_spi1_pdata __initdata = { 35 + .fifo_lvl_mask = 0x7f, 36 + .rx_lvl_offset = 13, 37 + .high_speed = 1, 38 + .tx_st_done = 21, 39 + }; 40 + 41 + int s3c64xx_spi1_cfg_gpio(struct platform_device *dev) 42 + { 43 + s3c_gpio_cfgall_range(S5PC100_GPB(4), 3, 44 + S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 45 + return 0; 46 + } 47 + #endif 48 + 49 + #ifdef CONFIG_S3C64XX_DEV_SPI2 50 + struct s3c64xx_spi_info s3c64xx_spi2_pdata __initdata = { 51 + .fifo_lvl_mask = 0x7f, 52 + .rx_lvl_offset = 13, 53 + .high_speed = 1, 54 + .tx_st_done = 21, 55 + }; 56 + 57 + int s3c64xx_spi2_cfg_gpio(struct platform_device *dev) 58 + { 59 + s3c_gpio_cfgpin(S5PC100_GPG3(0), S3C_GPIO_SFN(3)); 60 + s3c_gpio_setpull(S5PC100_GPG3(0), S3C_GPIO_PULL_UP); 61 + s3c_gpio_cfgall_range(S5PC100_GPB(2), 2, 62 + S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP); 63 + return 0; 64 + } 65 + #endif
+5
arch/arm/mach-s5pv210/Kconfig
··· 60 60 help 61 61 Common setup code for the camera interfaces. 62 62 63 + config S5PV210_SETUP_SPI 64 + bool 65 + help 66 + Common setup code for SPI GPIO configurations. 67 + 63 68 menu "S5PC110 Machines" 64 69 65 70 config MACH_AQUILA
+1 -2
arch/arm/mach-s5pv210/Makefile
··· 27 27 # device support 28 28 29 29 obj-y += dev-audio.o 30 - obj-$(CONFIG_S3C64XX_DEV_SPI) += dev-spi.o 31 30 32 31 obj-$(CONFIG_S5PV210_SETUP_FB_24BPP) += setup-fb-24bpp.o 33 32 obj-$(CONFIG_S5PV210_SETUP_FIMC) += setup-fimc.o ··· 34 35 obj-$(CONFIG_S5PV210_SETUP_I2C2) += setup-i2c2.o 35 36 obj-$(CONFIG_S5PV210_SETUP_IDE) += setup-ide.o 36 37 obj-$(CONFIG_S5PV210_SETUP_KEYPAD) += setup-keypad.o 37 - obj-$(CONFIG_S5PV210_SETUP_SDHCI) += setup-sdhci.o 38 38 obj-$(CONFIG_S5PV210_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o 39 + obj-$(CONFIG_S5PV210_SETUP_SPI) += setup-spi.o
+200 -124
arch/arm/mach-s5pv210/clock.c
··· 399 399 .enable = s5pv210_clk_ip1_ctrl, 400 400 .ctrlbit = (1<<25), 401 401 }, { 402 - .name = "hsmmc", 403 - .devname = "s3c-sdhci.0", 404 - .parent = &clk_hclk_psys.clk, 405 - .enable = s5pv210_clk_ip2_ctrl, 406 - .ctrlbit = (1<<16), 407 - }, { 408 - .name = "hsmmc", 409 - .devname = "s3c-sdhci.1", 410 - .parent = &clk_hclk_psys.clk, 411 - .enable = s5pv210_clk_ip2_ctrl, 412 - .ctrlbit = (1<<17), 413 - }, { 414 - .name = "hsmmc", 415 - .devname = "s3c-sdhci.2", 416 - .parent = &clk_hclk_psys.clk, 417 - .enable = s5pv210_clk_ip2_ctrl, 418 - .ctrlbit = (1<<18), 419 - }, { 420 - .name = "hsmmc", 421 - .devname = "s3c-sdhci.3", 422 - .parent = &clk_hclk_psys.clk, 423 - .enable = s5pv210_clk_ip2_ctrl, 424 - .ctrlbit = (1<<19), 425 - }, { 426 402 .name = "systimer", 427 403 .parent = &clk_pclk_psys.clk, 428 404 .enable = s5pv210_clk_ip3_ctrl, ··· 533 557 .enable = s5pv210_clk_ip1_ctrl, 534 558 .ctrlbit = (1 << 26), 535 559 }, 560 + }; 561 + 562 + static struct clk clk_hsmmc0 = { 563 + .name = "hsmmc", 564 + .devname = "s3c-sdhci.0", 565 + .parent = &clk_hclk_psys.clk, 566 + .enable = s5pv210_clk_ip2_ctrl, 567 + .ctrlbit = (1<<16), 568 + }; 569 + 570 + static struct clk clk_hsmmc1 = { 571 + .name = "hsmmc", 572 + .devname = "s3c-sdhci.1", 573 + .parent = &clk_hclk_psys.clk, 574 + .enable = s5pv210_clk_ip2_ctrl, 575 + .ctrlbit = (1<<17), 576 + }; 577 + 578 + static struct clk clk_hsmmc2 = { 579 + .name = "hsmmc", 580 + .devname = "s3c-sdhci.2", 581 + .parent = &clk_hclk_psys.clk, 582 + .enable = s5pv210_clk_ip2_ctrl, 583 + .ctrlbit = (1<<18), 584 + }; 585 + 586 + static struct clk clk_hsmmc3 = { 587 + .name = "hsmmc", 588 + .devname = "s3c-sdhci.3", 589 + .parent = &clk_hclk_psys.clk, 590 + .enable = s5pv210_clk_ip2_ctrl, 591 + .ctrlbit = (1<<19), 536 592 }; 537 593 538 594 static struct clk *clkset_uart_list[] = { ··· 817 809 .reg_div = { .reg = S5P_CLK_DIV6, .shift = 12, .size = 3 }, 818 810 }, { 819 811 .clk = { 820 - .name = "uclk1", 821 - .devname = "s5pv210-uart.0", 822 - .enable = s5pv210_clk_mask0_ctrl, 823 - .ctrlbit = (1 << 12), 824 - }, 825 - .sources = &clkset_uart, 826 - .reg_src = { .reg = S5P_CLK_SRC4, .shift = 16, .size = 4 }, 827 - .reg_div = { .reg = S5P_CLK_DIV4, .shift = 16, .size = 4 }, 828 - }, { 829 - .clk = { 830 - .name = "uclk1", 831 - .devname = "s5pv210-uart.1", 832 - .enable = s5pv210_clk_mask0_ctrl, 833 - .ctrlbit = (1 << 13), 834 - }, 835 - .sources = &clkset_uart, 836 - .reg_src = { .reg = S5P_CLK_SRC4, .shift = 20, .size = 4 }, 837 - .reg_div = { .reg = S5P_CLK_DIV4, .shift = 20, .size = 4 }, 838 - }, { 839 - .clk = { 840 - .name = "uclk1", 841 - .devname = "s5pv210-uart.2", 842 - .enable = s5pv210_clk_mask0_ctrl, 843 - .ctrlbit = (1 << 14), 844 - }, 845 - .sources = &clkset_uart, 846 - .reg_src = { .reg = S5P_CLK_SRC4, .shift = 24, .size = 4 }, 847 - .reg_div = { .reg = S5P_CLK_DIV4, .shift = 24, .size = 4 }, 848 - }, { 849 - .clk = { 850 - .name = "uclk1", 851 - .devname = "s5pv210-uart.3", 852 - .enable = s5pv210_clk_mask0_ctrl, 853 - .ctrlbit = (1 << 15), 854 - }, 855 - .sources = &clkset_uart, 856 - .reg_src = { .reg = S5P_CLK_SRC4, .shift = 28, .size = 4 }, 857 - .reg_div = { .reg = S5P_CLK_DIV4, .shift = 28, .size = 4 }, 858 - }, { 859 - .clk = { 860 812 .name = "sclk_fimc", 861 813 .devname = "s5pv210-fimc.0", 862 814 .enable = s5pv210_clk_mask1_ctrl, ··· 874 906 .reg_div = { .reg = S5P_CLK_DIV1, .shift = 20, .size = 4 }, 875 907 }, { 876 908 .clk = { 877 - .name = "sclk_mmc", 878 - .devname = "s3c-sdhci.0", 879 - .enable = s5pv210_clk_mask0_ctrl, 880 - .ctrlbit = (1 << 8), 881 - }, 882 - .sources = &clkset_group2, 883 - .reg_src = { .reg = S5P_CLK_SRC4, .shift = 0, .size = 4 }, 884 - .reg_div = { .reg = S5P_CLK_DIV4, .shift = 0, .size = 4 }, 885 - }, { 886 - .clk = { 887 - .name = "sclk_mmc", 888 - .devname = "s3c-sdhci.1", 889 - .enable = s5pv210_clk_mask0_ctrl, 890 - .ctrlbit = (1 << 9), 891 - }, 892 - .sources = &clkset_group2, 893 - .reg_src = { .reg = S5P_CLK_SRC4, .shift = 4, .size = 4 }, 894 - .reg_div = { .reg = S5P_CLK_DIV4, .shift = 4, .size = 4 }, 895 - }, { 896 - .clk = { 897 - .name = "sclk_mmc", 898 - .devname = "s3c-sdhci.2", 899 - .enable = s5pv210_clk_mask0_ctrl, 900 - .ctrlbit = (1 << 10), 901 - }, 902 - .sources = &clkset_group2, 903 - .reg_src = { .reg = S5P_CLK_SRC4, .shift = 8, .size = 4 }, 904 - .reg_div = { .reg = S5P_CLK_DIV4, .shift = 8, .size = 4 }, 905 - }, { 906 - .clk = { 907 - .name = "sclk_mmc", 908 - .devname = "s3c-sdhci.3", 909 - .enable = s5pv210_clk_mask0_ctrl, 910 - .ctrlbit = (1 << 11), 911 - }, 912 - .sources = &clkset_group2, 913 - .reg_src = { .reg = S5P_CLK_SRC4, .shift = 12, .size = 4 }, 914 - .reg_div = { .reg = S5P_CLK_DIV4, .shift = 12, .size = 4 }, 915 - }, { 916 - .clk = { 917 909 .name = "sclk_mfc", 918 910 .devname = "s5p-mfc", 919 911 .enable = s5pv210_clk_ip0_ctrl, ··· 911 983 .reg_div = { .reg = S5P_CLK_DIV1, .shift = 28, .size = 4 }, 912 984 }, { 913 985 .clk = { 914 - .name = "sclk_spi", 915 - .devname = "s3c64xx-spi.0", 916 - .enable = s5pv210_clk_mask0_ctrl, 917 - .ctrlbit = (1 << 16), 918 - }, 919 - .sources = &clkset_group2, 920 - .reg_src = { .reg = S5P_CLK_SRC5, .shift = 0, .size = 4 }, 921 - .reg_div = { .reg = S5P_CLK_DIV5, .shift = 0, .size = 4 }, 922 - }, { 923 - .clk = { 924 - .name = "sclk_spi", 925 - .devname = "s3c64xx-spi.1", 926 - .enable = s5pv210_clk_mask0_ctrl, 927 - .ctrlbit = (1 << 17), 928 - }, 929 - .sources = &clkset_group2, 930 - .reg_src = { .reg = S5P_CLK_SRC5, .shift = 4, .size = 4 }, 931 - .reg_div = { .reg = S5P_CLK_DIV5, .shift = 4, .size = 4 }, 932 - }, { 933 - .clk = { 934 986 .name = "sclk_pwi", 935 987 .enable = s5pv210_clk_mask0_ctrl, 936 988 .ctrlbit = (1 << 29), ··· 928 1020 .reg_src = { .reg = S5P_CLK_SRC5, .shift = 12, .size = 4 }, 929 1021 .reg_div = { .reg = S5P_CLK_DIV5, .shift = 12, .size = 4 }, 930 1022 }, 1023 + }; 1024 + 1025 + static struct clksrc_clk clk_sclk_uart0 = { 1026 + .clk = { 1027 + .name = "uclk1", 1028 + .devname = "s5pv210-uart.0", 1029 + .enable = s5pv210_clk_mask0_ctrl, 1030 + .ctrlbit = (1 << 12), 1031 + }, 1032 + .sources = &clkset_uart, 1033 + .reg_src = { .reg = S5P_CLK_SRC4, .shift = 16, .size = 4 }, 1034 + .reg_div = { .reg = S5P_CLK_DIV4, .shift = 16, .size = 4 }, 1035 + }; 1036 + 1037 + static struct clksrc_clk clk_sclk_uart1 = { 1038 + .clk = { 1039 + .name = "uclk1", 1040 + .devname = "s5pv210-uart.1", 1041 + .enable = s5pv210_clk_mask0_ctrl, 1042 + .ctrlbit = (1 << 13), 1043 + }, 1044 + .sources = &clkset_uart, 1045 + .reg_src = { .reg = S5P_CLK_SRC4, .shift = 20, .size = 4 }, 1046 + .reg_div = { .reg = S5P_CLK_DIV4, .shift = 20, .size = 4 }, 1047 + }; 1048 + 1049 + static struct clksrc_clk clk_sclk_uart2 = { 1050 + .clk = { 1051 + .name = "uclk1", 1052 + .devname = "s5pv210-uart.2", 1053 + .enable = s5pv210_clk_mask0_ctrl, 1054 + .ctrlbit = (1 << 14), 1055 + }, 1056 + .sources = &clkset_uart, 1057 + .reg_src = { .reg = S5P_CLK_SRC4, .shift = 24, .size = 4 }, 1058 + .reg_div = { .reg = S5P_CLK_DIV4, .shift = 24, .size = 4 }, 1059 + }; 1060 + 1061 + static struct clksrc_clk clk_sclk_uart3 = { 1062 + .clk = { 1063 + .name = "uclk1", 1064 + .devname = "s5pv210-uart.3", 1065 + .enable = s5pv210_clk_mask0_ctrl, 1066 + .ctrlbit = (1 << 15), 1067 + }, 1068 + .sources = &clkset_uart, 1069 + .reg_src = { .reg = S5P_CLK_SRC4, .shift = 28, .size = 4 }, 1070 + .reg_div = { .reg = S5P_CLK_DIV4, .shift = 28, .size = 4 }, 1071 + }; 1072 + 1073 + static struct clksrc_clk clk_sclk_mmc0 = { 1074 + .clk = { 1075 + .name = "sclk_mmc", 1076 + .devname = "s3c-sdhci.0", 1077 + .enable = s5pv210_clk_mask0_ctrl, 1078 + .ctrlbit = (1 << 8), 1079 + }, 1080 + .sources = &clkset_group2, 1081 + .reg_src = { .reg = S5P_CLK_SRC4, .shift = 0, .size = 4 }, 1082 + .reg_div = { .reg = S5P_CLK_DIV4, .shift = 0, .size = 4 }, 1083 + }; 1084 + 1085 + static struct clksrc_clk clk_sclk_mmc1 = { 1086 + .clk = { 1087 + .name = "sclk_mmc", 1088 + .devname = "s3c-sdhci.1", 1089 + .enable = s5pv210_clk_mask0_ctrl, 1090 + .ctrlbit = (1 << 9), 1091 + }, 1092 + .sources = &clkset_group2, 1093 + .reg_src = { .reg = S5P_CLK_SRC4, .shift = 4, .size = 4 }, 1094 + .reg_div = { .reg = S5P_CLK_DIV4, .shift = 4, .size = 4 }, 1095 + }; 1096 + 1097 + static struct clksrc_clk clk_sclk_mmc2 = { 1098 + .clk = { 1099 + .name = "sclk_mmc", 1100 + .devname = "s3c-sdhci.2", 1101 + .enable = s5pv210_clk_mask0_ctrl, 1102 + .ctrlbit = (1 << 10), 1103 + }, 1104 + .sources = &clkset_group2, 1105 + .reg_src = { .reg = S5P_CLK_SRC4, .shift = 8, .size = 4 }, 1106 + .reg_div = { .reg = S5P_CLK_DIV4, .shift = 8, .size = 4 }, 1107 + }; 1108 + 1109 + static struct clksrc_clk clk_sclk_mmc3 = { 1110 + .clk = { 1111 + .name = "sclk_mmc", 1112 + .devname = "s3c-sdhci.3", 1113 + .enable = s5pv210_clk_mask0_ctrl, 1114 + .ctrlbit = (1 << 11), 1115 + }, 1116 + .sources = &clkset_group2, 1117 + .reg_src = { .reg = S5P_CLK_SRC4, .shift = 12, .size = 4 }, 1118 + .reg_div = { .reg = S5P_CLK_DIV4, .shift = 12, .size = 4 }, 1119 + }; 1120 + 1121 + static struct clksrc_clk clk_sclk_spi0 = { 1122 + .clk = { 1123 + .name = "sclk_spi", 1124 + .devname = "s3c64xx-spi.0", 1125 + .enable = s5pv210_clk_mask0_ctrl, 1126 + .ctrlbit = (1 << 16), 1127 + }, 1128 + .sources = &clkset_group2, 1129 + .reg_src = { .reg = S5P_CLK_SRC5, .shift = 0, .size = 4 }, 1130 + .reg_div = { .reg = S5P_CLK_DIV5, .shift = 0, .size = 4 }, 1131 + }; 1132 + 1133 + static struct clksrc_clk clk_sclk_spi1 = { 1134 + .clk = { 1135 + .name = "sclk_spi", 1136 + .devname = "s3c64xx-spi.1", 1137 + .enable = s5pv210_clk_mask0_ctrl, 1138 + .ctrlbit = (1 << 17), 1139 + }, 1140 + .sources = &clkset_group2, 1141 + .reg_src = { .reg = S5P_CLK_SRC5, .shift = 4, .size = 4 }, 1142 + .reg_div = { .reg = S5P_CLK_DIV5, .shift = 4, .size = 4 }, 1143 + }; 1144 + 1145 + 1146 + static struct clksrc_clk *clksrc_cdev[] = { 1147 + &clk_sclk_uart0, 1148 + &clk_sclk_uart1, 1149 + &clk_sclk_uart2, 1150 + &clk_sclk_uart3, 1151 + &clk_sclk_mmc0, 1152 + &clk_sclk_mmc1, 1153 + &clk_sclk_mmc2, 1154 + &clk_sclk_mmc3, 1155 + &clk_sclk_spi0, 1156 + &clk_sclk_spi1, 1157 + }; 1158 + 1159 + static struct clk *clk_cdev[] = { 1160 + &clk_hsmmc0, 1161 + &clk_hsmmc1, 1162 + &clk_hsmmc2, 1163 + &clk_hsmmc3, 931 1164 }; 932 1165 933 1166 /* Clock initialisation code */ ··· 1310 1261 &clk_pcmcdclk2, 1311 1262 }; 1312 1263 1264 + static struct clk_lookup s5pv210_clk_lookup[] = { 1265 + CLKDEV_INIT(NULL, "clk_uart_baud0", &clk_p), 1266 + CLKDEV_INIT("s5pv210-uart.0", "clk_uart_baud1", &clk_sclk_uart0.clk), 1267 + CLKDEV_INIT("s5pv210-uart.1", "clk_uart_baud1", &clk_sclk_uart1.clk), 1268 + CLKDEV_INIT("s5pv210-uart.2", "clk_uart_baud1", &clk_sclk_uart2.clk), 1269 + CLKDEV_INIT("s5pv210-uart.3", "clk_uart_baud1", &clk_sclk_uart3.clk), 1270 + CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.0", &clk_hsmmc0), 1271 + CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.0", &clk_hsmmc1), 1272 + CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.0", &clk_hsmmc2), 1273 + CLKDEV_INIT("s3c-sdhci.3", "mmc_busclk.0", &clk_hsmmc3), 1274 + CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk), 1275 + CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk), 1276 + CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk), 1277 + CLKDEV_INIT("s3c-sdhci.3", "mmc_busclk.2", &clk_sclk_mmc3.clk), 1278 + CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), 1279 + CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), 1280 + CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), 1281 + }; 1282 + 1313 1283 void __init s5pv210_register_clocks(void) 1314 1284 { 1315 1285 int ptr; ··· 1341 1273 for (ptr = 0; ptr < ARRAY_SIZE(sclk_tv); ptr++) 1342 1274 s3c_register_clksrc(sclk_tv[ptr], 1); 1343 1275 1276 + for (ptr = 0; ptr < ARRAY_SIZE(clksrc_cdev); ptr++) 1277 + s3c_register_clksrc(clksrc_cdev[ptr], 1); 1278 + 1344 1279 s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs)); 1345 1280 s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks)); 1346 1281 1347 1282 s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 1348 1283 s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 1284 + clkdev_add_table(s5pv210_clk_lookup, ARRAY_SIZE(s5pv210_clk_lookup)); 1285 + 1286 + s3c24xx_register_clocks(clk_cdev, ARRAY_SIZE(clk_cdev)); 1287 + for (ptr = 0; ptr < ARRAY_SIZE(clk_cdev); ptr++) 1288 + s3c_disable_clocks(clk_cdev[ptr], 1); 1349 1289 1350 1290 s3c24xx_register_clock(&dummy_apb_pclk); 1351 1291 s3c_pwmclk_init();
-175
arch/arm/mach-s5pv210/dev-spi.c
··· 1 - /* linux/arch/arm/mach-s5pv210/dev-spi.c 2 - * 3 - * Copyright (C) 2010 Samsung Electronics Co. Ltd. 4 - * Jaswinder Singh <jassi.brar@samsung.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 version 2 as 8 - * published by the Free Software Foundation. 9 - */ 10 - 11 - #include <linux/platform_device.h> 12 - #include <linux/dma-mapping.h> 13 - #include <linux/gpio.h> 14 - 15 - #include <mach/dma.h> 16 - #include <mach/map.h> 17 - #include <mach/irqs.h> 18 - #include <mach/spi-clocks.h> 19 - 20 - #include <plat/s3c64xx-spi.h> 21 - #include <plat/gpio-cfg.h> 22 - 23 - static char *spi_src_clks[] = { 24 - [S5PV210_SPI_SRCCLK_PCLK] = "pclk", 25 - [S5PV210_SPI_SRCCLK_SCLK] = "sclk_spi", 26 - }; 27 - 28 - /* SPI Controller platform_devices */ 29 - 30 - /* Since we emulate multi-cs capability, we do not touch the CS. 31 - * The emulated CS is toggled by board specific mechanism, as it can 32 - * be either some immediate GPIO or some signal out of some other 33 - * chip in between ... or some yet another way. 34 - * We simply do not assume anything about CS. 35 - */ 36 - static int s5pv210_spi_cfg_gpio(struct platform_device *pdev) 37 - { 38 - unsigned int base; 39 - 40 - switch (pdev->id) { 41 - case 0: 42 - base = S5PV210_GPB(0); 43 - break; 44 - 45 - case 1: 46 - base = S5PV210_GPB(4); 47 - break; 48 - 49 - default: 50 - dev_err(&pdev->dev, "Invalid SPI Controller number!"); 51 - return -EINVAL; 52 - } 53 - 54 - s3c_gpio_cfgall_range(base, 3, 55 - S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 56 - 57 - return 0; 58 - } 59 - 60 - static struct resource s5pv210_spi0_resource[] = { 61 - [0] = { 62 - .start = S5PV210_PA_SPI0, 63 - .end = S5PV210_PA_SPI0 + 0x100 - 1, 64 - .flags = IORESOURCE_MEM, 65 - }, 66 - [1] = { 67 - .start = DMACH_SPI0_TX, 68 - .end = DMACH_SPI0_TX, 69 - .flags = IORESOURCE_DMA, 70 - }, 71 - [2] = { 72 - .start = DMACH_SPI0_RX, 73 - .end = DMACH_SPI0_RX, 74 - .flags = IORESOURCE_DMA, 75 - }, 76 - [3] = { 77 - .start = IRQ_SPI0, 78 - .end = IRQ_SPI0, 79 - .flags = IORESOURCE_IRQ, 80 - }, 81 - }; 82 - 83 - static struct s3c64xx_spi_info s5pv210_spi0_pdata = { 84 - .cfg_gpio = s5pv210_spi_cfg_gpio, 85 - .fifo_lvl_mask = 0x1ff, 86 - .rx_lvl_offset = 15, 87 - .high_speed = 1, 88 - .tx_st_done = 25, 89 - }; 90 - 91 - static u64 spi_dmamask = DMA_BIT_MASK(32); 92 - 93 - struct platform_device s5pv210_device_spi0 = { 94 - .name = "s3c64xx-spi", 95 - .id = 0, 96 - .num_resources = ARRAY_SIZE(s5pv210_spi0_resource), 97 - .resource = s5pv210_spi0_resource, 98 - .dev = { 99 - .dma_mask = &spi_dmamask, 100 - .coherent_dma_mask = DMA_BIT_MASK(32), 101 - .platform_data = &s5pv210_spi0_pdata, 102 - }, 103 - }; 104 - 105 - static struct resource s5pv210_spi1_resource[] = { 106 - [0] = { 107 - .start = S5PV210_PA_SPI1, 108 - .end = S5PV210_PA_SPI1 + 0x100 - 1, 109 - .flags = IORESOURCE_MEM, 110 - }, 111 - [1] = { 112 - .start = DMACH_SPI1_TX, 113 - .end = DMACH_SPI1_TX, 114 - .flags = IORESOURCE_DMA, 115 - }, 116 - [2] = { 117 - .start = DMACH_SPI1_RX, 118 - .end = DMACH_SPI1_RX, 119 - .flags = IORESOURCE_DMA, 120 - }, 121 - [3] = { 122 - .start = IRQ_SPI1, 123 - .end = IRQ_SPI1, 124 - .flags = IORESOURCE_IRQ, 125 - }, 126 - }; 127 - 128 - static struct s3c64xx_spi_info s5pv210_spi1_pdata = { 129 - .cfg_gpio = s5pv210_spi_cfg_gpio, 130 - .fifo_lvl_mask = 0x7f, 131 - .rx_lvl_offset = 15, 132 - .high_speed = 1, 133 - .tx_st_done = 25, 134 - }; 135 - 136 - struct platform_device s5pv210_device_spi1 = { 137 - .name = "s3c64xx-spi", 138 - .id = 1, 139 - .num_resources = ARRAY_SIZE(s5pv210_spi1_resource), 140 - .resource = s5pv210_spi1_resource, 141 - .dev = { 142 - .dma_mask = &spi_dmamask, 143 - .coherent_dma_mask = DMA_BIT_MASK(32), 144 - .platform_data = &s5pv210_spi1_pdata, 145 - }, 146 - }; 147 - 148 - void __init s5pv210_spi_set_info(int cntrlr, int src_clk_nr, int num_cs) 149 - { 150 - struct s3c64xx_spi_info *pd; 151 - 152 - /* Reject invalid configuration */ 153 - if (!num_cs || src_clk_nr < 0 154 - || src_clk_nr > S5PV210_SPI_SRCCLK_SCLK) { 155 - printk(KERN_ERR "%s: Invalid SPI configuration\n", __func__); 156 - return; 157 - } 158 - 159 - switch (cntrlr) { 160 - case 0: 161 - pd = &s5pv210_spi0_pdata; 162 - break; 163 - case 1: 164 - pd = &s5pv210_spi1_pdata; 165 - break; 166 - default: 167 - printk(KERN_ERR "%s: Invalid SPI controller(%d)\n", 168 - __func__, cntrlr); 169 - return; 170 - } 171 - 172 - pd->num_cs = num_cs; 173 - pd->src_clk_nr = src_clk_nr; 174 - pd->src_clk_name = spi_src_clks[src_clk_nr]; 175 - }
+69 -172
arch/arm/mach-s5pv210/dma.c
··· 35 35 36 36 static u64 dma_dmamask = DMA_BIT_MASK(32); 37 37 38 - struct dma_pl330_peri pdma0_peri[28] = { 39 - { 40 - .peri_id = (u8)DMACH_UART0_RX, 41 - .rqtype = DEVTOMEM, 42 - }, { 43 - .peri_id = (u8)DMACH_UART0_TX, 44 - .rqtype = MEMTODEV, 45 - }, { 46 - .peri_id = (u8)DMACH_UART1_RX, 47 - .rqtype = DEVTOMEM, 48 - }, { 49 - .peri_id = (u8)DMACH_UART1_TX, 50 - .rqtype = MEMTODEV, 51 - }, { 52 - .peri_id = (u8)DMACH_UART2_RX, 53 - .rqtype = DEVTOMEM, 54 - }, { 55 - .peri_id = (u8)DMACH_UART2_TX, 56 - .rqtype = MEMTODEV, 57 - }, { 58 - .peri_id = (u8)DMACH_UART3_RX, 59 - .rqtype = DEVTOMEM, 60 - }, { 61 - .peri_id = (u8)DMACH_UART3_TX, 62 - .rqtype = MEMTODEV, 63 - }, { 64 - .peri_id = DMACH_MAX, 65 - }, { 66 - .peri_id = (u8)DMACH_I2S0_RX, 67 - .rqtype = DEVTOMEM, 68 - }, { 69 - .peri_id = (u8)DMACH_I2S0_TX, 70 - .rqtype = MEMTODEV, 71 - }, { 72 - .peri_id = (u8)DMACH_I2S0S_TX, 73 - .rqtype = MEMTODEV, 74 - }, { 75 - .peri_id = (u8)DMACH_I2S1_RX, 76 - .rqtype = DEVTOMEM, 77 - }, { 78 - .peri_id = (u8)DMACH_I2S1_TX, 79 - .rqtype = MEMTODEV, 80 - }, { 81 - .peri_id = (u8)DMACH_MAX, 82 - }, { 83 - .peri_id = (u8)DMACH_MAX, 84 - }, { 85 - .peri_id = (u8)DMACH_SPI0_RX, 86 - .rqtype = DEVTOMEM, 87 - }, { 88 - .peri_id = (u8)DMACH_SPI0_TX, 89 - .rqtype = MEMTODEV, 90 - }, { 91 - .peri_id = (u8)DMACH_SPI1_RX, 92 - .rqtype = DEVTOMEM, 93 - }, { 94 - .peri_id = (u8)DMACH_SPI1_TX, 95 - .rqtype = MEMTODEV, 96 - }, { 97 - .peri_id = (u8)DMACH_MAX, 98 - }, { 99 - .peri_id = (u8)DMACH_MAX, 100 - }, { 101 - .peri_id = (u8)DMACH_AC97_MICIN, 102 - .rqtype = DEVTOMEM, 103 - }, { 104 - .peri_id = (u8)DMACH_AC97_PCMIN, 105 - .rqtype = DEVTOMEM, 106 - }, { 107 - .peri_id = (u8)DMACH_AC97_PCMOUT, 108 - .rqtype = MEMTODEV, 109 - }, { 110 - .peri_id = (u8)DMACH_MAX, 111 - }, { 112 - .peri_id = (u8)DMACH_PWM, 113 - }, { 114 - .peri_id = (u8)DMACH_SPDIF, 115 - .rqtype = MEMTODEV, 116 - }, 38 + u8 pdma0_peri[] = { 39 + DMACH_UART0_RX, 40 + DMACH_UART0_TX, 41 + DMACH_UART1_RX, 42 + DMACH_UART1_TX, 43 + DMACH_UART2_RX, 44 + DMACH_UART2_TX, 45 + DMACH_UART3_RX, 46 + DMACH_UART3_TX, 47 + DMACH_MAX, 48 + DMACH_I2S0_RX, 49 + DMACH_I2S0_TX, 50 + DMACH_I2S0S_TX, 51 + DMACH_I2S1_RX, 52 + DMACH_I2S1_TX, 53 + DMACH_MAX, 54 + DMACH_MAX, 55 + DMACH_SPI0_RX, 56 + DMACH_SPI0_TX, 57 + DMACH_SPI1_RX, 58 + DMACH_SPI1_TX, 59 + DMACH_MAX, 60 + DMACH_MAX, 61 + DMACH_AC97_MICIN, 62 + DMACH_AC97_PCMIN, 63 + DMACH_AC97_PCMOUT, 64 + DMACH_MAX, 65 + DMACH_PWM, 66 + DMACH_SPDIF, 117 67 }; 118 68 119 69 struct dma_pl330_platdata s5pv210_pdma0_pdata = { 120 70 .nr_valid_peri = ARRAY_SIZE(pdma0_peri), 121 - .peri = pdma0_peri, 71 + .peri_id = pdma0_peri, 122 72 }; 123 73 124 74 struct amba_device s5pv210_device_pdma0 = { ··· 87 137 .periphid = 0x00041330, 88 138 }; 89 139 90 - struct dma_pl330_peri pdma1_peri[32] = { 91 - { 92 - .peri_id = (u8)DMACH_UART0_RX, 93 - .rqtype = DEVTOMEM, 94 - }, { 95 - .peri_id = (u8)DMACH_UART0_TX, 96 - .rqtype = MEMTODEV, 97 - }, { 98 - .peri_id = (u8)DMACH_UART1_RX, 99 - .rqtype = DEVTOMEM, 100 - }, { 101 - .peri_id = (u8)DMACH_UART1_TX, 102 - .rqtype = MEMTODEV, 103 - }, { 104 - .peri_id = (u8)DMACH_UART2_RX, 105 - .rqtype = DEVTOMEM, 106 - }, { 107 - .peri_id = (u8)DMACH_UART2_TX, 108 - .rqtype = MEMTODEV, 109 - }, { 110 - .peri_id = (u8)DMACH_UART3_RX, 111 - .rqtype = DEVTOMEM, 112 - }, { 113 - .peri_id = (u8)DMACH_UART3_TX, 114 - .rqtype = MEMTODEV, 115 - }, { 116 - .peri_id = DMACH_MAX, 117 - }, { 118 - .peri_id = (u8)DMACH_I2S0_RX, 119 - .rqtype = DEVTOMEM, 120 - }, { 121 - .peri_id = (u8)DMACH_I2S0_TX, 122 - .rqtype = MEMTODEV, 123 - }, { 124 - .peri_id = (u8)DMACH_I2S0S_TX, 125 - .rqtype = MEMTODEV, 126 - }, { 127 - .peri_id = (u8)DMACH_I2S1_RX, 128 - .rqtype = DEVTOMEM, 129 - }, { 130 - .peri_id = (u8)DMACH_I2S1_TX, 131 - .rqtype = MEMTODEV, 132 - }, { 133 - .peri_id = (u8)DMACH_I2S2_RX, 134 - .rqtype = DEVTOMEM, 135 - }, { 136 - .peri_id = (u8)DMACH_I2S2_TX, 137 - .rqtype = MEMTODEV, 138 - }, { 139 - .peri_id = (u8)DMACH_SPI0_RX, 140 - .rqtype = DEVTOMEM, 141 - }, { 142 - .peri_id = (u8)DMACH_SPI0_TX, 143 - .rqtype = MEMTODEV, 144 - }, { 145 - .peri_id = (u8)DMACH_SPI1_RX, 146 - .rqtype = DEVTOMEM, 147 - }, { 148 - .peri_id = (u8)DMACH_SPI1_TX, 149 - .rqtype = MEMTODEV, 150 - }, { 151 - .peri_id = (u8)DMACH_MAX, 152 - }, { 153 - .peri_id = (u8)DMACH_MAX, 154 - }, { 155 - .peri_id = (u8)DMACH_PCM0_RX, 156 - .rqtype = DEVTOMEM, 157 - }, { 158 - .peri_id = (u8)DMACH_PCM0_TX, 159 - .rqtype = MEMTODEV, 160 - }, { 161 - .peri_id = (u8)DMACH_PCM1_RX, 162 - .rqtype = DEVTOMEM, 163 - }, { 164 - .peri_id = (u8)DMACH_PCM1_TX, 165 - .rqtype = MEMTODEV, 166 - }, { 167 - .peri_id = (u8)DMACH_MSM_REQ0, 168 - }, { 169 - .peri_id = (u8)DMACH_MSM_REQ1, 170 - }, { 171 - .peri_id = (u8)DMACH_MSM_REQ2, 172 - }, { 173 - .peri_id = (u8)DMACH_MSM_REQ3, 174 - }, { 175 - .peri_id = (u8)DMACH_PCM2_RX, 176 - .rqtype = DEVTOMEM, 177 - }, { 178 - .peri_id = (u8)DMACH_PCM2_TX, 179 - .rqtype = MEMTODEV, 180 - }, 140 + u8 pdma1_peri[] = { 141 + DMACH_UART0_RX, 142 + DMACH_UART0_TX, 143 + DMACH_UART1_RX, 144 + DMACH_UART1_TX, 145 + DMACH_UART2_RX, 146 + DMACH_UART2_TX, 147 + DMACH_UART3_RX, 148 + DMACH_UART3_TX, 149 + DMACH_MAX, 150 + DMACH_I2S0_RX, 151 + DMACH_I2S0_TX, 152 + DMACH_I2S0S_TX, 153 + DMACH_I2S1_RX, 154 + DMACH_I2S1_TX, 155 + DMACH_I2S2_RX, 156 + DMACH_I2S2_TX, 157 + DMACH_SPI0_RX, 158 + DMACH_SPI0_TX, 159 + DMACH_SPI1_RX, 160 + DMACH_SPI1_TX, 161 + DMACH_MAX, 162 + DMACH_MAX, 163 + DMACH_PCM0_RX, 164 + DMACH_PCM0_TX, 165 + DMACH_PCM1_RX, 166 + DMACH_PCM1_TX, 167 + DMACH_MSM_REQ0, 168 + DMACH_MSM_REQ1, 169 + DMACH_MSM_REQ2, 170 + DMACH_MSM_REQ3, 171 + DMACH_PCM2_RX, 172 + DMACH_PCM2_TX, 181 173 }; 182 174 183 175 struct dma_pl330_platdata s5pv210_pdma1_pdata = { 184 176 .nr_valid_peri = ARRAY_SIZE(pdma1_peri), 185 - .peri = pdma1_peri, 177 + .peri_id = pdma1_peri, 186 178 }; 187 179 188 180 struct amba_device s5pv210_device_pdma1 = { ··· 145 253 146 254 static int __init s5pv210_dma_init(void) 147 255 { 256 + dma_cap_set(DMA_SLAVE, s5pv210_pdma0_pdata.cap_mask); 257 + dma_cap_set(DMA_CYCLIC, s5pv210_pdma0_pdata.cap_mask); 148 258 amba_device_register(&s5pv210_device_pdma0, &iomem_resource); 259 + 260 + dma_cap_set(DMA_SLAVE, s5pv210_pdma1_pdata.cap_mask); 261 + dma_cap_set(DMA_CYCLIC, s5pv210_pdma1_pdata.cap_mask); 149 262 amba_device_register(&s5pv210_device_pdma1, &iomem_resource); 150 263 151 264 return 0;
+2
arch/arm/mach-s5pv210/include/mach/irqs.h
··· 118 118 #define IRQ_MDNIE3 S5P_IRQ_VIC3(8) 119 119 #define IRQ_VIC_END S5P_IRQ_VIC3(31) 120 120 121 + #define IRQ_TIMER_BASE (11) 122 + 121 123 #define S5P_EINT_BASE1 (S5P_IRQ_VIC0(0)) 122 124 #define S5P_EINT_BASE2 (IRQ_VIC_END + 1) 123 125
+2
arch/arm/mach-s5pv210/include/mach/map.h
··· 109 109 #define S3C_PA_RTC S5PV210_PA_RTC 110 110 #define S3C_PA_USB_HSOTG S5PV210_PA_HSOTG 111 111 #define S3C_PA_WDT S5PV210_PA_WATCHDOG 112 + #define S3C_PA_SPI0 S5PV210_PA_SPI0 113 + #define S3C_PA_SPI1 S5PV210_PA_SPI1 112 114 113 115 #define S5P_PA_CHIPID S5PV210_PA_CHIPID 114 116 #define S5P_PA_FIMC0 S5PV210_PA_FIMC0
-19
arch/arm/mach-s5pv210/init.c
··· 18 18 #include <plat/s5pv210.h> 19 19 #include <plat/regs-serial.h> 20 20 21 - static struct s3c24xx_uart_clksrc s5pv210_serial_clocks[] = { 22 - [0] = { 23 - .name = "pclk", 24 - .divisor = 1, 25 - .min_baud = 0, 26 - .max_baud = 0, 27 - }, 28 - }; 29 - 30 21 /* uart registration process */ 31 22 void __init s5pv210_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) 32 23 { 33 - struct s3c2410_uartcfg *tcfg = cfg; 34 - u32 ucnt; 35 - 36 - for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { 37 - if (!tcfg->clocks) { 38 - tcfg->clocks = s5pv210_serial_clocks; 39 - tcfg->clocks_size = ARRAY_SIZE(s5pv210_serial_clocks); 40 - } 41 - } 42 - 43 24 s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); 44 25 }
-22
arch/arm/mach-s5pv210/setup-sdhci.c
··· 1 - /* linux/arch/arm/mach-s5pv210/setup-sdhci.c 2 - * 3 - * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd. 4 - * http://www.samsung.com/ 5 - * 6 - * S5PV210 - Helper functions for settign up SDHCI device(s) (HSMMC) 7 - * 8 - * This program is free software; you can redistribute it and/or modify 9 - * it under the terms of the GNU General Public License version 2 as 10 - * published by the Free Software Foundation. 11 - */ 12 - 13 - #include <linux/types.h> 14 - 15 - /* clock sources for the mmc bus clock, order as for the ctrl2[5..4] */ 16 - 17 - char *s5pv210_hsmmc_clksrcs[4] = { 18 - [0] = "hsmmc", /* HCLK */ 19 - /* [1] = "hsmmc", - duplicate HCLK entry */ 20 - [2] = "sclk_mmc", /* mmc_bus */ 21 - /* [3] = NULL, - reserved */ 22 - };
+51
arch/arm/mach-s5pv210/setup-spi.c
··· 1 + /* linux/arch/arm/mach-s5pv210/setup-spi.c 2 + * 3 + * Copyright (C) 2011 Samsung Electronics Ltd. 4 + * http://www.samsung.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 version 2 as 8 + * published by the Free Software Foundation. 9 + */ 10 + 11 + #include <linux/gpio.h> 12 + #include <linux/platform_device.h> 13 + 14 + #include <plat/gpio-cfg.h> 15 + #include <plat/s3c64xx-spi.h> 16 + 17 + #ifdef CONFIG_S3C64XX_DEV_SPI0 18 + struct s3c64xx_spi_info s3c64xx_spi0_pdata = { 19 + .fifo_lvl_mask = 0x1ff, 20 + .rx_lvl_offset = 15, 21 + .high_speed = 1, 22 + .tx_st_done = 25, 23 + }; 24 + 25 + int s3c64xx_spi0_cfg_gpio(struct platform_device *dev) 26 + { 27 + s3c_gpio_cfgpin(S5PV210_GPB(0), S3C_GPIO_SFN(2)); 28 + s3c_gpio_setpull(S5PV210_GPB(0), S3C_GPIO_PULL_UP); 29 + s3c_gpio_cfgall_range(S5PV210_GPB(2), 2, 30 + S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 31 + return 0; 32 + } 33 + #endif 34 + 35 + #ifdef CONFIG_S3C64XX_DEV_SPI1 36 + struct s3c64xx_spi_info s3c64xx_spi1_pdata = { 37 + .fifo_lvl_mask = 0x7f, 38 + .rx_lvl_offset = 15, 39 + .high_speed = 1, 40 + .tx_st_done = 25, 41 + }; 42 + 43 + int s3c64xx_spi1_cfg_gpio(struct platform_device *dev) 44 + { 45 + s3c_gpio_cfgpin(S5PV210_GPB(4), S3C_GPIO_SFN(2)); 46 + s3c_gpio_setpull(S5PV210_GPB(4), S3C_GPIO_PULL_UP); 47 + s3c_gpio_cfgall_range(S5PV210_GPB(6), 2, 48 + S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); 49 + return 0; 50 + } 51 + #endif
+26 -13
arch/arm/plat-s3c24xx/s3c2443-clock.c
··· 297 297 298 298 static struct clksrc_clk clksrc_clks[] = { 299 299 { 300 - /* ART baud-rate clock sourced from esysclk via a divisor */ 301 - .clk = { 302 - .name = "uartclk", 303 - .parent = &clk_esysclk.clk, 304 - }, 305 - .reg_div = { .reg = S3C2443_CLKDIV1, .size = 4, .shift = 8 }, 306 - }, { 307 300 /* camera interface bus-clock, divided down from esysclk */ 308 301 .clk = { 309 302 .name = "camif-upll", /* same as 2440 name */ ··· 314 321 }, 315 322 .reg_div = { .reg = S3C2443_CLKDIV1, .size = 8, .shift = 16 }, 316 323 }, 324 + }; 325 + 326 + static struct clksrc_clk clk_esys_uart = { 327 + /* ART baud-rate clock sourced from esysclk via a divisor */ 328 + .clk = { 329 + .name = "uartclk", 330 + .parent = &clk_esysclk.clk, 331 + }, 332 + .reg_div = { .reg = S3C2443_CLKDIV1, .size = 4, .shift = 8 }, 317 333 }; 318 334 319 335 static struct clk clk_i2s_ext = { ··· 427 425 .enable = s3c2443_clkcon_enable_h, 428 426 .ctrlbit = S3C2443_HCLKCON_DMA5, 429 427 }, { 430 - .name = "hsmmc", 431 - .devname = "s3c-sdhci.1", 432 - .parent = &clk_h, 433 - .enable = s3c2443_clkcon_enable_h, 434 - .ctrlbit = S3C2443_HCLKCON_HSMMC, 435 - }, { 436 428 .name = "gpio", 437 429 .parent = &clk_p, 438 430 .enable = s3c2443_clkcon_enable_p, ··· 508 512 } 509 513 }; 510 514 515 + static struct clk hsmmc1_clk = { 516 + .name = "hsmmc", 517 + .devname = "s3c-sdhci.1", 518 + .parent = &clk_h, 519 + .enable = s3c2443_clkcon_enable_h, 520 + .ctrlbit = S3C2443_HCLKCON_HSMMC, 521 + }; 522 + 511 523 static inline unsigned long s3c2443_get_hdiv(unsigned long clkcon0) 512 524 { 513 525 clkcon0 &= S3C2443_CLKDIV0_HCLKDIV_MASK; ··· 581 577 &clk_epll, 582 578 &clk_usb_bus, 583 579 &clk_armdiv, 580 + &hsmmc1_clk, 584 581 }; 585 582 586 583 static struct clksrc_clk *clksrcs[] __initdata = { ··· 592 587 &clk_esysclk, 593 588 &clk_msysclk, 594 589 &clk_arm, 590 + }; 591 + 592 + static struct clk_lookup s3c2443_clk_lookup[] = { 593 + CLKDEV_INIT(NULL, "clk_uart_baud1", &s3c24xx_uclk), 594 + CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p), 595 + CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_esys_uart.clk), 596 + CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.0", &hsmmc1_clk), 595 597 }; 596 598 597 599 void __init s3c2443_common_init_clocks(int xtal, pll_fn get_mpll, ··· 630 618 /* See s3c2443/etc notes on disabling clocks at init time */ 631 619 s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 632 620 s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 621 + clkdev_add_table(s3c2443_clk_lookup, ARRAY_SIZE(s3c2443_clk_lookup)); 633 622 634 623 s3c2443_common_setup_clocks(get_mpll); 635 624 }
+14 -2
arch/arm/plat-samsung/Kconfig
··· 226 226 help 227 227 Compile in platform device definitions for IDE 228 228 229 - config S3C64XX_DEV_SPI 229 + config S3C64XX_DEV_SPI0 230 230 bool 231 231 help 232 232 Compile in platform device definitions for S3C64XX's type 233 - SPI controllers. 233 + SPI controller 0 234 + 235 + config S3C64XX_DEV_SPI1 236 + bool 237 + help 238 + Compile in platform device definitions for S3C64XX's type 239 + SPI controller 1 240 + 241 + config S3C64XX_DEV_SPI2 242 + bool 243 + help 244 + Compile in platform device definitions for S3C64XX's type 245 + SPI controller 2 234 246 235 247 config SAMSUNG_DEV_TS 236 248 bool
+127
arch/arm/plat-samsung/devs.c
··· 61 61 #include <plat/regs-iic.h> 62 62 #include <plat/regs-serial.h> 63 63 #include <plat/regs-spi.h> 64 + #include <plat/s3c64xx-spi.h> 64 65 65 66 static u64 samsung_device_dma_mask = DMA_BIT_MASK(32); 66 67 ··· 1462 1461 .resource = s3c_wdt_resource, 1463 1462 }; 1464 1463 #endif /* CONFIG_S3C_DEV_WDT */ 1464 + 1465 + #ifdef CONFIG_S3C64XX_DEV_SPI0 1466 + static struct resource s3c64xx_spi0_resource[] = { 1467 + [0] = DEFINE_RES_MEM(S3C_PA_SPI0, SZ_256), 1468 + [1] = DEFINE_RES_DMA(DMACH_SPI0_TX), 1469 + [2] = DEFINE_RES_DMA(DMACH_SPI0_RX), 1470 + [3] = DEFINE_RES_IRQ(IRQ_SPI0), 1471 + }; 1472 + 1473 + struct platform_device s3c64xx_device_spi0 = { 1474 + .name = "s3c64xx-spi", 1475 + .id = 0, 1476 + .num_resources = ARRAY_SIZE(s3c64xx_spi0_resource), 1477 + .resource = s3c64xx_spi0_resource, 1478 + .dev = { 1479 + .dma_mask = &samsung_device_dma_mask, 1480 + .coherent_dma_mask = DMA_BIT_MASK(32), 1481 + }, 1482 + }; 1483 + 1484 + void __init s3c64xx_spi0_set_platdata(struct s3c64xx_spi_info *pd, 1485 + int src_clk_nr, int num_cs) 1486 + { 1487 + if (!pd) { 1488 + pr_err("%s:Need to pass platform data\n", __func__); 1489 + return; 1490 + } 1491 + 1492 + /* Reject invalid configuration */ 1493 + if (!num_cs || src_clk_nr < 0) { 1494 + pr_err("%s: Invalid SPI configuration\n", __func__); 1495 + return; 1496 + } 1497 + 1498 + pd->num_cs = num_cs; 1499 + pd->src_clk_nr = src_clk_nr; 1500 + if (!pd->cfg_gpio) 1501 + pd->cfg_gpio = s3c64xx_spi0_cfg_gpio; 1502 + 1503 + s3c_set_platdata(pd, sizeof(*pd), &s3c64xx_device_spi0); 1504 + } 1505 + #endif /* CONFIG_S3C64XX_DEV_SPI0 */ 1506 + 1507 + #ifdef CONFIG_S3C64XX_DEV_SPI1 1508 + static struct resource s3c64xx_spi1_resource[] = { 1509 + [0] = DEFINE_RES_MEM(S3C_PA_SPI1, SZ_256), 1510 + [1] = DEFINE_RES_DMA(DMACH_SPI1_TX), 1511 + [2] = DEFINE_RES_DMA(DMACH_SPI1_RX), 1512 + [3] = DEFINE_RES_IRQ(IRQ_SPI1), 1513 + }; 1514 + 1515 + struct platform_device s3c64xx_device_spi1 = { 1516 + .name = "s3c64xx-spi", 1517 + .id = 1, 1518 + .num_resources = ARRAY_SIZE(s3c64xx_spi1_resource), 1519 + .resource = s3c64xx_spi1_resource, 1520 + .dev = { 1521 + .dma_mask = &samsung_device_dma_mask, 1522 + .coherent_dma_mask = DMA_BIT_MASK(32), 1523 + }, 1524 + }; 1525 + 1526 + void __init s3c64xx_spi1_set_platdata(struct s3c64xx_spi_info *pd, 1527 + int src_clk_nr, int num_cs) 1528 + { 1529 + if (!pd) { 1530 + pr_err("%s:Need to pass platform data\n", __func__); 1531 + return; 1532 + } 1533 + 1534 + /* Reject invalid configuration */ 1535 + if (!num_cs || src_clk_nr < 0) { 1536 + pr_err("%s: Invalid SPI configuration\n", __func__); 1537 + return; 1538 + } 1539 + 1540 + pd->num_cs = num_cs; 1541 + pd->src_clk_nr = src_clk_nr; 1542 + if (!pd->cfg_gpio) 1543 + pd->cfg_gpio = s3c64xx_spi1_cfg_gpio; 1544 + 1545 + s3c_set_platdata(pd, sizeof(*pd), &s3c64xx_device_spi1); 1546 + } 1547 + #endif /* CONFIG_S3C64XX_DEV_SPI1 */ 1548 + 1549 + #ifdef CONFIG_S3C64XX_DEV_SPI2 1550 + static struct resource s3c64xx_spi2_resource[] = { 1551 + [0] = DEFINE_RES_MEM(S3C_PA_SPI2, SZ_256), 1552 + [1] = DEFINE_RES_DMA(DMACH_SPI2_TX), 1553 + [2] = DEFINE_RES_DMA(DMACH_SPI2_RX), 1554 + [3] = DEFINE_RES_IRQ(IRQ_SPI2), 1555 + }; 1556 + 1557 + struct platform_device s3c64xx_device_spi2 = { 1558 + .name = "s3c64xx-spi", 1559 + .id = 2, 1560 + .num_resources = ARRAY_SIZE(s3c64xx_spi2_resource), 1561 + .resource = s3c64xx_spi2_resource, 1562 + .dev = { 1563 + .dma_mask = &samsung_device_dma_mask, 1564 + .coherent_dma_mask = DMA_BIT_MASK(32), 1565 + }, 1566 + }; 1567 + 1568 + void __init s3c64xx_spi2_set_platdata(struct s3c64xx_spi_info *pd, 1569 + int src_clk_nr, int num_cs) 1570 + { 1571 + if (!pd) { 1572 + pr_err("%s:Need to pass platform data\n", __func__); 1573 + return; 1574 + } 1575 + 1576 + /* Reject invalid configuration */ 1577 + if (!num_cs || src_clk_nr < 0) { 1578 + pr_err("%s: Invalid SPI configuration\n", __func__); 1579 + return; 1580 + } 1581 + 1582 + pd->num_cs = num_cs; 1583 + pd->src_clk_nr = src_clk_nr; 1584 + if (!pd->cfg_gpio) 1585 + pd->cfg_gpio = s3c64xx_spi2_cfg_gpio; 1586 + 1587 + s3c_set_platdata(pd, sizeof(*pd), &s3c64xx_device_spi2); 1588 + } 1589 + #endif /* CONFIG_S3C64XX_DEV_SPI2 */
+8 -7
arch/arm/plat-samsung/dma-ops.c
··· 18 18 19 19 #include <mach/dma.h> 20 20 21 - static inline bool pl330_filter(struct dma_chan *chan, void *param) 22 - { 23 - struct dma_pl330_peri *peri = chan->private; 24 - return peri->peri_id == (unsigned)param; 25 - } 26 - 27 21 static unsigned samsung_dmadev_request(enum dma_ch dma_ch, 28 22 struct samsung_dma_info *info) 29 23 { 30 24 struct dma_chan *chan; 31 25 dma_cap_mask_t mask; 32 26 struct dma_slave_config slave_config; 27 + void *filter_param; 33 28 34 29 dma_cap_zero(mask); 35 30 dma_cap_set(info->cap, mask); 36 31 37 - chan = dma_request_channel(mask, pl330_filter, (void *)dma_ch); 32 + /* 33 + * If a dma channel property of a device node from device tree is 34 + * specified, use that as the fliter parameter. 35 + */ 36 + filter_param = (dma_ch == DMACH_DT_PROP) ? (void *)info->dt_dmach_prop : 37 + (void *)dma_ch; 38 + chan = dma_request_channel(mask, pl330_filter, filter_param); 38 39 39 40 if (info->direction == DMA_FROM_DEVICE) { 40 41 memset(&slave_config, 0, sizeof(struct dma_slave_config));
+1 -7
arch/arm/plat-samsung/include/plat/devs.h
··· 39 39 extern struct platform_device s3c64xx_device_pcm1; 40 40 extern struct platform_device s3c64xx_device_spi0; 41 41 extern struct platform_device s3c64xx_device_spi1; 42 + extern struct platform_device s3c64xx_device_spi2; 42 43 43 44 extern struct platform_device s3c_device_adc; 44 45 extern struct platform_device s3c_device_cfcon; ··· 99 98 extern struct platform_device s5p6450_device_iis2; 100 99 extern struct platform_device s5p6450_device_pcm0; 101 100 102 - extern struct platform_device s5p64x0_device_spi0; 103 - extern struct platform_device s5p64x0_device_spi1; 104 101 105 102 extern struct platform_device s5pc100_device_ac97; 106 103 extern struct platform_device s5pc100_device_iis0; ··· 107 108 extern struct platform_device s5pc100_device_pcm0; 108 109 extern struct platform_device s5pc100_device_pcm1; 109 110 extern struct platform_device s5pc100_device_spdif; 110 - extern struct platform_device s5pc100_device_spi0; 111 - extern struct platform_device s5pc100_device_spi1; 112 - extern struct platform_device s5pc100_device_spi2; 113 111 114 112 extern struct platform_device s5pv210_device_ac97; 115 113 extern struct platform_device s5pv210_device_iis0; ··· 116 120 extern struct platform_device s5pv210_device_pcm1; 117 121 extern struct platform_device s5pv210_device_pcm2; 118 122 extern struct platform_device s5pv210_device_spdif; 119 - extern struct platform_device s5pv210_device_spi0; 120 - extern struct platform_device s5pv210_device_spi1; 121 123 122 124 extern struct platform_device exynos4_device_ac97; 123 125 extern struct platform_device exynos4_device_ahci;
+1
arch/arm/plat-samsung/include/plat/dma-ops.h
··· 31 31 enum dma_slave_buswidth width; 32 32 dma_addr_t fifo; 33 33 struct s3c2410_dma_client *client; 34 + struct property *dt_dmach_prop; 34 35 }; 35 36 36 37 struct samsung_dma_ops {
+2 -1
arch/arm/plat-samsung/include/plat/dma-pl330.h
··· 21 21 * use these just as IDs. 22 22 */ 23 23 enum dma_ch { 24 - DMACH_UART0_RX, 24 + DMACH_DT_PROP = -1, 25 + DMACH_UART0_RX = 0, 25 26 DMACH_UART0_TX, 26 27 DMACH_UART1_RX, 27 28 DMACH_UART1_TX,
+2 -1
arch/arm/plat-samsung/include/plat/irqs.h
··· 44 44 #define S5P_IRQ_VIC2(x) (S5P_VIC2_BASE + (x)) 45 45 #define S5P_IRQ_VIC3(x) (S5P_VIC3_BASE + (x)) 46 46 47 - #define S5P_TIMER_IRQ(x) (11 + (x)) 47 + #define S5P_TIMER_IRQ(x) (IRQ_TIMER_BASE + (x)) 48 48 49 49 #define IRQ_TIMER0 S5P_TIMER_IRQ(0) 50 50 #define IRQ_TIMER1 S5P_TIMER_IRQ(1) 51 51 #define IRQ_TIMER2 S5P_TIMER_IRQ(2) 52 52 #define IRQ_TIMER3 S5P_TIMER_IRQ(3) 53 53 #define IRQ_TIMER4 S5P_TIMER_IRQ(4) 54 + #define IRQ_TIMER_COUNT (5) 54 55 55 56 #define IRQ_EINT(x) ((x) < 16 ? ((x) + S5P_EINT_BASE1) \ 56 57 : ((x) - 16 + S5P_EINT_BASE2))
+23 -24
arch/arm/plat-samsung/include/plat/regs-serial.h
··· 71 71 #define S3C2410_LCON_IRM (1<<6) 72 72 73 73 #define S3C2440_UCON_CLKMASK (3<<10) 74 + #define S3C2440_UCON_CLKSHIFT (10) 74 75 #define S3C2440_UCON_PCLK (0<<10) 75 76 #define S3C2440_UCON_UCLK (1<<10) 76 77 #define S3C2440_UCON_PCLK2 (2<<10) ··· 79 78 #define S3C2443_UCON_EPLL (3<<10) 80 79 81 80 #define S3C6400_UCON_CLKMASK (3<<10) 81 + #define S3C6400_UCON_CLKSHIFT (10) 82 82 #define S3C6400_UCON_PCLK (0<<10) 83 83 #define S3C6400_UCON_PCLK2 (2<<10) 84 84 #define S3C6400_UCON_UCLK0 (1<<10) ··· 92 90 #define S3C2440_UCON_DIVSHIFT (12) 93 91 94 92 #define S3C2412_UCON_CLKMASK (3<<10) 93 + #define S3C2412_UCON_CLKSHIFT (10) 95 94 #define S3C2412_UCON_UCLK (1<<10) 96 95 #define S3C2412_UCON_USYSCLK (3<<10) 97 96 #define S3C2412_UCON_PCLK (0<<10) 98 97 #define S3C2412_UCON_PCLK2 (2<<10) 99 98 99 + #define S3C2410_UCON_CLKMASK (1 << 10) 100 + #define S3C2410_UCON_CLKSHIFT (10) 100 101 #define S3C2410_UCON_UCLK (1<<10) 101 102 #define S3C2410_UCON_SBREAK (1<<4) 102 103 ··· 198 193 199 194 /* Following are specific to S5PV210 */ 200 195 #define S5PV210_UCON_CLKMASK (1<<10) 196 + #define S5PV210_UCON_CLKSHIFT (10) 201 197 #define S5PV210_UCON_PCLK (0<<10) 202 198 #define S5PV210_UCON_UCLK (1<<10) 203 199 ··· 227 221 #define S5PV210_UFSTAT_RXMASK (255<<0) 228 222 #define S5PV210_UFSTAT_RXSHIFT (0) 229 223 230 - #define NO_NEED_CHECK_CLKSRC 1 224 + #define S3C2410_UCON_CLKSEL0 (1 << 0) 225 + #define S3C2410_UCON_CLKSEL1 (1 << 1) 226 + #define S3C2410_UCON_CLKSEL2 (1 << 2) 227 + #define S3C2410_UCON_CLKSEL3 (1 << 3) 228 + 229 + /* Default values for s5pv210 UCON and UFCON uart registers */ 230 + #define S5PV210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ 231 + S3C2410_UCON_RXILEVEL | \ 232 + S3C2410_UCON_TXIRQMODE | \ 233 + S3C2410_UCON_RXIRQMODE | \ 234 + S3C2410_UCON_RXFIFO_TOI | \ 235 + S3C2443_UCON_RXERR_IRQEN) 236 + 237 + #define S5PV210_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \ 238 + S5PV210_UFCON_TXTRIG4 | \ 239 + S5PV210_UFCON_RXTRIG4) 231 240 232 241 #ifndef __ASSEMBLY__ 233 - 234 - /* struct s3c24xx_uart_clksrc 235 - * 236 - * this structure defines a named clock source that can be used for the 237 - * uart, so that the best clock can be selected for the requested baud 238 - * rate. 239 - * 240 - * min_baud and max_baud define the range of baud-rates this clock is 241 - * acceptable for, if they are both zero, it is assumed any baud rate that 242 - * can be generated from this clock will be used. 243 - * 244 - * divisor gives the divisor from the clock to the one seen by the uart 245 - */ 246 - 247 - struct s3c24xx_uart_clksrc { 248 - const char *name; 249 - unsigned int divisor; 250 - unsigned int min_baud; 251 - unsigned int max_baud; 252 - }; 253 242 254 243 /* configuration structure for per-machine configurations for the 255 244 * serial port ··· 258 257 unsigned char unused; 259 258 unsigned short flags; 260 259 upf_t uart_flags; /* default uart flags */ 260 + unsigned int clk_sel; 261 261 262 262 unsigned int has_fracval; 263 263 264 264 unsigned long ucon; /* value of ucon for port */ 265 265 unsigned long ulcon; /* value of ulcon for port */ 266 266 unsigned long ufcon; /* value of ufcon for port */ 267 - 268 - struct s3c24xx_uart_clksrc *clocks; 269 - unsigned int clocks_size; 270 267 }; 271 268 272 269 /* s3c24xx_uart_devs
+16 -8
arch/arm/plat-samsung/include/plat/s3c64xx-spi.h
··· 31 31 /** 32 32 * struct s3c64xx_spi_info - SPI Controller defining structure 33 33 * @src_clk_nr: Clock source index for the CLK_CFG[SPI_CLKSEL] field. 34 - * @src_clk_name: Platform name of the corresponding clock. 35 34 * @clk_from_cmu: If the SPI clock/prescalar control block is present 36 35 * by the platform's clock-management-unit and not in SPI controller. 37 36 * @num_cs: Number of CS this controller emulates. ··· 42 43 */ 43 44 struct s3c64xx_spi_info { 44 45 int src_clk_nr; 45 - char *src_clk_name; 46 46 bool clk_from_cmu; 47 47 48 48 int num_cs; ··· 56 58 }; 57 59 58 60 /** 59 - * s3c64xx_spi_set_info - SPI Controller configure callback by the board 61 + * s3c64xx_spi_set_platdata - SPI Controller configure callback by the board 60 62 * initialization code. 61 - * @cntrlr: SPI controller number the configuration is for. 63 + * @pd: SPI platform data to set. 62 64 * @src_clk_nr: Clock the SPI controller is to use to generate SPI clocks. 63 65 * @num_cs: Number of elements in the 'cs' array. 64 66 * 65 67 * Call this from machine init code for each SPI Controller that 66 68 * has some chips attached to it. 67 69 */ 68 - extern void s3c64xx_spi_set_info(int cntrlr, int src_clk_nr, int num_cs); 69 - extern void s5pc100_spi_set_info(int cntrlr, int src_clk_nr, int num_cs); 70 - extern void s5pv210_spi_set_info(int cntrlr, int src_clk_nr, int num_cs); 71 - extern void s5p64x0_spi_set_info(int cntrlr, int src_clk_nr, int num_cs); 70 + extern void s3c64xx_spi0_set_platdata(struct s3c64xx_spi_info *pd, 71 + int src_clk_nr, int num_cs); 72 + extern void s3c64xx_spi1_set_platdata(struct s3c64xx_spi_info *pd, 73 + int src_clk_nr, int num_cs); 74 + extern void s3c64xx_spi2_set_platdata(struct s3c64xx_spi_info *pd, 75 + int src_clk_nr, int num_cs); 72 76 77 + /* defined by architecture to configure gpio */ 78 + extern int s3c64xx_spi0_cfg_gpio(struct platform_device *dev); 79 + extern int s3c64xx_spi1_cfg_gpio(struct platform_device *dev); 80 + extern int s3c64xx_spi2_cfg_gpio(struct platform_device *dev); 81 + 82 + extern struct s3c64xx_spi_info s3c64xx_spi0_pdata; 83 + extern struct s3c64xx_spi_info s3c64xx_spi1_pdata; 84 + extern struct s3c64xx_spi_info s3c64xx_spi2_pdata; 73 85 #endif /* __S3C64XX_PLAT_SPI_H */
-31
arch/arm/plat-samsung/include/plat/sdhci.h
··· 66 66 enum cd_types cd_type; 67 67 enum clk_types clk_type; 68 68 69 - char **clocks; /* set of clock sources */ 70 - 71 69 int ext_cd_gpio; 72 70 bool ext_cd_gpio_invert; 73 71 int (*ext_cd_init)(void (*notify_func)(struct platform_device *, ··· 127 129 /* S3C2416 SDHCI setup */ 128 130 129 131 #ifdef CONFIG_S3C2416_SETUP_SDHCI 130 - extern char *s3c2416_hsmmc_clksrcs[4]; 131 - 132 132 static inline void s3c2416_default_sdhci0(void) 133 133 { 134 134 #ifdef CONFIG_S3C_DEV_HSMMC 135 - s3c_hsmmc0_def_platdata.clocks = s3c2416_hsmmc_clksrcs; 136 135 s3c_hsmmc0_def_platdata.cfg_gpio = s3c2416_setup_sdhci0_cfg_gpio; 137 136 #endif /* CONFIG_S3C_DEV_HSMMC */ 138 137 } ··· 137 142 static inline void s3c2416_default_sdhci1(void) 138 143 { 139 144 #ifdef CONFIG_S3C_DEV_HSMMC1 140 - s3c_hsmmc1_def_platdata.clocks = s3c2416_hsmmc_clksrcs; 141 145 s3c_hsmmc1_def_platdata.cfg_gpio = s3c2416_setup_sdhci1_cfg_gpio; 142 146 #endif /* CONFIG_S3C_DEV_HSMMC1 */ 143 147 } ··· 149 155 /* S3C64XX SDHCI setup */ 150 156 151 157 #ifdef CONFIG_S3C64XX_SETUP_SDHCI 152 - extern char *s3c64xx_hsmmc_clksrcs[4]; 153 - 154 158 static inline void s3c6400_default_sdhci0(void) 155 159 { 156 160 #ifdef CONFIG_S3C_DEV_HSMMC 157 - s3c_hsmmc0_def_platdata.clocks = s3c64xx_hsmmc_clksrcs; 158 161 s3c_hsmmc0_def_platdata.cfg_gpio = s3c64xx_setup_sdhci0_cfg_gpio; 159 162 #endif 160 163 } ··· 159 168 static inline void s3c6400_default_sdhci1(void) 160 169 { 161 170 #ifdef CONFIG_S3C_DEV_HSMMC1 162 - s3c_hsmmc1_def_platdata.clocks = s3c64xx_hsmmc_clksrcs; 163 171 s3c_hsmmc1_def_platdata.cfg_gpio = s3c64xx_setup_sdhci1_cfg_gpio; 164 172 #endif 165 173 } ··· 166 176 static inline void s3c6400_default_sdhci2(void) 167 177 { 168 178 #ifdef CONFIG_S3C_DEV_HSMMC2 169 - s3c_hsmmc2_def_platdata.clocks = s3c64xx_hsmmc_clksrcs; 170 179 s3c_hsmmc2_def_platdata.cfg_gpio = s3c64xx_setup_sdhci2_cfg_gpio; 171 180 #endif 172 181 } ··· 173 184 static inline void s3c6410_default_sdhci0(void) 174 185 { 175 186 #ifdef CONFIG_S3C_DEV_HSMMC 176 - s3c_hsmmc0_def_platdata.clocks = s3c64xx_hsmmc_clksrcs; 177 187 s3c_hsmmc0_def_platdata.cfg_gpio = s3c64xx_setup_sdhci0_cfg_gpio; 178 188 #endif 179 189 } ··· 180 192 static inline void s3c6410_default_sdhci1(void) 181 193 { 182 194 #ifdef CONFIG_S3C_DEV_HSMMC1 183 - s3c_hsmmc1_def_platdata.clocks = s3c64xx_hsmmc_clksrcs; 184 195 s3c_hsmmc1_def_platdata.cfg_gpio = s3c64xx_setup_sdhci1_cfg_gpio; 185 196 #endif 186 197 } ··· 187 200 static inline void s3c6410_default_sdhci2(void) 188 201 { 189 202 #ifdef CONFIG_S3C_DEV_HSMMC2 190 - s3c_hsmmc2_def_platdata.clocks = s3c64xx_hsmmc_clksrcs; 191 203 s3c_hsmmc2_def_platdata.cfg_gpio = s3c64xx_setup_sdhci2_cfg_gpio; 192 204 #endif 193 205 } ··· 204 218 /* S5PC100 SDHCI setup */ 205 219 206 220 #ifdef CONFIG_S5PC100_SETUP_SDHCI 207 - extern char *s5pc100_hsmmc_clksrcs[4]; 208 - 209 221 static inline void s5pc100_default_sdhci0(void) 210 222 { 211 223 #ifdef CONFIG_S3C_DEV_HSMMC 212 - s3c_hsmmc0_def_platdata.clocks = s5pc100_hsmmc_clksrcs; 213 224 s3c_hsmmc0_def_platdata.cfg_gpio = s5pc100_setup_sdhci0_cfg_gpio; 214 225 #endif 215 226 } ··· 214 231 static inline void s5pc100_default_sdhci1(void) 215 232 { 216 233 #ifdef CONFIG_S3C_DEV_HSMMC1 217 - s3c_hsmmc1_def_platdata.clocks = s5pc100_hsmmc_clksrcs; 218 234 s3c_hsmmc1_def_platdata.cfg_gpio = s5pc100_setup_sdhci1_cfg_gpio; 219 235 #endif 220 236 } ··· 221 239 static inline void s5pc100_default_sdhci2(void) 222 240 { 223 241 #ifdef CONFIG_S3C_DEV_HSMMC2 224 - s3c_hsmmc2_def_platdata.clocks = s5pc100_hsmmc_clksrcs; 225 242 s3c_hsmmc2_def_platdata.cfg_gpio = s5pc100_setup_sdhci2_cfg_gpio; 226 243 #endif 227 244 } ··· 235 254 /* S5PV210 SDHCI setup */ 236 255 237 256 #ifdef CONFIG_S5PV210_SETUP_SDHCI 238 - extern char *s5pv210_hsmmc_clksrcs[4]; 239 - 240 257 static inline void s5pv210_default_sdhci0(void) 241 258 { 242 259 #ifdef CONFIG_S3C_DEV_HSMMC 243 - s3c_hsmmc0_def_platdata.clocks = s5pv210_hsmmc_clksrcs; 244 260 s3c_hsmmc0_def_platdata.cfg_gpio = s5pv210_setup_sdhci0_cfg_gpio; 245 261 #endif 246 262 } ··· 245 267 static inline void s5pv210_default_sdhci1(void) 246 268 { 247 269 #ifdef CONFIG_S3C_DEV_HSMMC1 248 - s3c_hsmmc1_def_platdata.clocks = s5pv210_hsmmc_clksrcs; 249 270 s3c_hsmmc1_def_platdata.cfg_gpio = s5pv210_setup_sdhci1_cfg_gpio; 250 271 #endif 251 272 } ··· 252 275 static inline void s5pv210_default_sdhci2(void) 253 276 { 254 277 #ifdef CONFIG_S3C_DEV_HSMMC2 255 - s3c_hsmmc2_def_platdata.clocks = s5pv210_hsmmc_clksrcs; 256 278 s3c_hsmmc2_def_platdata.cfg_gpio = s5pv210_setup_sdhci2_cfg_gpio; 257 279 #endif 258 280 } ··· 259 283 static inline void s5pv210_default_sdhci3(void) 260 284 { 261 285 #ifdef CONFIG_S3C_DEV_HSMMC3 262 - s3c_hsmmc3_def_platdata.clocks = s5pv210_hsmmc_clksrcs; 263 286 s3c_hsmmc3_def_platdata.cfg_gpio = s5pv210_setup_sdhci3_cfg_gpio; 264 287 #endif 265 288 } ··· 273 298 274 299 /* EXYNOS4 SDHCI setup */ 275 300 #ifdef CONFIG_EXYNOS4_SETUP_SDHCI 276 - extern char *exynos4_hsmmc_clksrcs[4]; 277 - 278 301 static inline void exynos4_default_sdhci0(void) 279 302 { 280 303 #ifdef CONFIG_S3C_DEV_HSMMC 281 - s3c_hsmmc0_def_platdata.clocks = exynos4_hsmmc_clksrcs; 282 304 s3c_hsmmc0_def_platdata.cfg_gpio = exynos4_setup_sdhci0_cfg_gpio; 283 305 #endif 284 306 } ··· 283 311 static inline void exynos4_default_sdhci1(void) 284 312 { 285 313 #ifdef CONFIG_S3C_DEV_HSMMC1 286 - s3c_hsmmc1_def_platdata.clocks = exynos4_hsmmc_clksrcs; 287 314 s3c_hsmmc1_def_platdata.cfg_gpio = exynos4_setup_sdhci1_cfg_gpio; 288 315 #endif 289 316 } ··· 290 319 static inline void exynos4_default_sdhci2(void) 291 320 { 292 321 #ifdef CONFIG_S3C_DEV_HSMMC2 293 - s3c_hsmmc2_def_platdata.clocks = exynos4_hsmmc_clksrcs; 294 322 s3c_hsmmc2_def_platdata.cfg_gpio = exynos4_setup_sdhci2_cfg_gpio; 295 323 #endif 296 324 } ··· 297 327 static inline void exynos4_default_sdhci3(void) 298 328 { 299 329 #ifdef CONFIG_S3C_DEV_HSMMC3 300 - s3c_hsmmc3_def_platdata.clocks = exynos4_hsmmc_clksrcs; 301 330 s3c_hsmmc3_def_platdata.cfg_gpio = exynos4_setup_sdhci3_cfg_gpio; 302 331 #endif 303 332 }
+53 -46
drivers/dma/pl330.c
··· 19 19 #include <linux/amba/pl330.h> 20 20 #include <linux/pm_runtime.h> 21 21 #include <linux/scatterlist.h> 22 + #include <linux/of.h> 22 23 23 24 #define NR_DEFAULT_DESC 16 24 25 ··· 116 115 /* The channel which currently holds this desc */ 117 116 struct dma_pl330_chan *pchan; 118 117 }; 118 + 119 + /* forward declaration */ 120 + static struct amba_driver pl330_driver; 119 121 120 122 static inline struct dma_pl330_chan * 121 123 to_pchan(struct dma_chan *ch) ··· 270 266 271 267 tasklet_schedule(&pch->task); 272 268 } 269 + 270 + bool pl330_filter(struct dma_chan *chan, void *param) 271 + { 272 + u8 *peri_id; 273 + 274 + if (chan->device->dev->driver != &pl330_driver.drv) 275 + return false; 276 + 277 + #ifdef CONFIG_OF 278 + if (chan->device->dev->of_node) { 279 + const __be32 *prop_value; 280 + phandle phandle; 281 + struct device_node *node; 282 + 283 + prop_value = ((struct property *)param)->value; 284 + phandle = be32_to_cpup(prop_value++); 285 + node = of_find_node_by_phandle(phandle); 286 + return ((chan->private == node) && 287 + (chan->chan_id == be32_to_cpup(prop_value))); 288 + } 289 + #endif 290 + 291 + peri_id = chan->private; 292 + return *peri_id == (unsigned)param; 293 + } 294 + EXPORT_SYMBOL(pl330_filter); 273 295 274 296 static int pl330_alloc_chan_resources(struct dma_chan *chan) 275 297 { ··· 527 497 static struct dma_pl330_desc *pl330_get_desc(struct dma_pl330_chan *pch) 528 498 { 529 499 struct dma_pl330_dmac *pdmac = pch->dmac; 530 - struct dma_pl330_peri *peri = pch->chan.private; 500 + u8 *peri_id = pch->chan.private; 531 501 struct dma_pl330_desc *desc; 532 502 533 503 /* Pluck one desc from the pool of DMAC */ ··· 552 522 desc->txd.cookie = 0; 553 523 async_tx_ack(&desc->txd); 554 524 555 - if (peri) { 556 - desc->req.rqtype = peri->rqtype; 557 - desc->req.peri = pch->chan.chan_id; 558 - } else { 559 - desc->req.rqtype = MEMTOMEM; 560 - desc->req.peri = 0; 561 - } 525 + desc->req.peri = peri_id ? pch->chan.chan_id : 0; 562 526 563 527 dma_async_tx_descriptor_init(&desc->txd, &pch->chan); 564 528 ··· 639 615 case DMA_TO_DEVICE: 640 616 desc->rqcfg.src_inc = 1; 641 617 desc->rqcfg.dst_inc = 0; 618 + desc->req.rqtype = MEMTODEV; 642 619 src = dma_addr; 643 620 dst = pch->fifo_addr; 644 621 break; 645 622 case DMA_FROM_DEVICE: 646 623 desc->rqcfg.src_inc = 0; 647 624 desc->rqcfg.dst_inc = 1; 625 + desc->req.rqtype = DEVTOMEM; 648 626 src = pch->fifo_addr; 649 627 dst = dma_addr; 650 628 break; ··· 672 646 { 673 647 struct dma_pl330_desc *desc; 674 648 struct dma_pl330_chan *pch = to_pchan(chan); 675 - struct dma_pl330_peri *peri = chan->private; 676 649 struct pl330_info *pi; 677 650 int burst; 678 651 679 652 if (unlikely(!pch || !len)) 680 - return NULL; 681 - 682 - if (peri && peri->rqtype != MEMTOMEM) 683 653 return NULL; 684 654 685 655 pi = &pch->dmac->pif; ··· 686 664 687 665 desc->rqcfg.src_inc = 1; 688 666 desc->rqcfg.dst_inc = 1; 667 + desc->req.rqtype = MEMTOMEM; 689 668 690 669 /* Select max possible burst size */ 691 670 burst = pi->pcfg.data_bus_width / 8; ··· 715 692 { 716 693 struct dma_pl330_desc *first, *desc = NULL; 717 694 struct dma_pl330_chan *pch = to_pchan(chan); 718 - struct dma_pl330_peri *peri = chan->private; 719 695 struct scatterlist *sg; 720 696 unsigned long flags; 721 697 int i; 722 698 dma_addr_t addr; 723 699 724 - if (unlikely(!pch || !sgl || !sg_len || !peri)) 700 + if (unlikely(!pch || !sgl || !sg_len)) 725 701 return NULL; 726 - 727 - /* Make sure the direction is consistent */ 728 - if ((direction == DMA_TO_DEVICE && 729 - peri->rqtype != MEMTODEV) || 730 - (direction == DMA_FROM_DEVICE && 731 - peri->rqtype != DEVTOMEM)) { 732 - dev_err(pch->dmac->pif.dev, "%s:%d Invalid Direction\n", 733 - __func__, __LINE__); 734 - return NULL; 735 - } 736 702 737 703 addr = pch->fifo_addr; 738 704 ··· 762 750 if (direction == DMA_TO_DEVICE) { 763 751 desc->rqcfg.src_inc = 1; 764 752 desc->rqcfg.dst_inc = 0; 753 + desc->req.rqtype = MEMTODEV; 765 754 fill_px(&desc->px, 766 755 addr, sg_dma_address(sg), sg_dma_len(sg)); 767 756 } else { 768 757 desc->rqcfg.src_inc = 0; 769 758 desc->rqcfg.dst_inc = 1; 759 + desc->req.rqtype = DEVTOMEM; 770 760 fill_px(&desc->px, 771 761 sg_dma_address(sg), addr, sg_dma_len(sg)); 772 762 } ··· 870 856 INIT_LIST_HEAD(&pd->channels); 871 857 872 858 /* Initialize channel parameters */ 873 - num_chan = max(pdat ? pdat->nr_valid_peri : 0, (u8)pi->pcfg.num_chan); 859 + num_chan = max(pdat ? pdat->nr_valid_peri : (u8)pi->pcfg.num_peri, 860 + (u8)pi->pcfg.num_chan); 874 861 pdmac->peripherals = kzalloc(num_chan * sizeof(*pch), GFP_KERNEL); 875 862 876 863 for (i = 0; i < num_chan; i++) { 877 864 pch = &pdmac->peripherals[i]; 878 - if (pdat) { 879 - struct dma_pl330_peri *peri = &pdat->peri[i]; 880 - 881 - switch (peri->rqtype) { 882 - case MEMTOMEM: 883 - dma_cap_set(DMA_MEMCPY, pd->cap_mask); 884 - break; 885 - case MEMTODEV: 886 - case DEVTOMEM: 887 - dma_cap_set(DMA_SLAVE, pd->cap_mask); 888 - dma_cap_set(DMA_CYCLIC, pd->cap_mask); 889 - break; 890 - default: 891 - dev_err(&adev->dev, "DEVTODEV Not Supported\n"); 892 - continue; 893 - } 894 - pch->chan.private = peri; 895 - } else { 896 - dma_cap_set(DMA_MEMCPY, pd->cap_mask); 897 - pch->chan.private = NULL; 898 - } 865 + if (!adev->dev.of_node) 866 + pch->chan.private = pdat ? &pdat->peri_id[i] : NULL; 867 + else 868 + pch->chan.private = adev->dev.of_node; 899 869 900 870 INIT_LIST_HEAD(&pch->work_list); 901 871 spin_lock_init(&pch->lock); ··· 892 894 } 893 895 894 896 pd->dev = &adev->dev; 897 + if (pdat) { 898 + pd->cap_mask = pdat->cap_mask; 899 + } else { 900 + dma_cap_set(DMA_MEMCPY, pd->cap_mask); 901 + if (pi->pcfg.num_peri) { 902 + dma_cap_set(DMA_SLAVE, pd->cap_mask); 903 + dma_cap_set(DMA_CYCLIC, pd->cap_mask); 904 + } 905 + } 895 906 896 907 pd->device_alloc_chan_resources = pl330_alloc_chan_resources; 897 908 pd->device_free_chan_resources = pl330_free_chan_resources;
+72
drivers/gpio/gpio-samsung.c
··· 24 24 #include <linux/interrupt.h> 25 25 #include <linux/sysdev.h> 26 26 #include <linux/ioport.h> 27 + #include <linux/of.h> 28 + #include <linux/slab.h> 29 + #include <linux/of_address.h> 27 30 28 31 #include <asm/irq.h> 29 32 ··· 2377 2374 #endif 2378 2375 }; 2379 2376 2377 + #if defined(CONFIG_ARCH_EXYNOS4) && defined(CONFIG_OF) 2378 + static int exynos4_gpio_xlate(struct gpio_chip *gc, struct device_node *np, 2379 + const void *gpio_spec, u32 *flags) 2380 + { 2381 + const __be32 *gpio = gpio_spec; 2382 + const u32 n = be32_to_cpup(gpio); 2383 + unsigned int pin = gc->base + be32_to_cpu(gpio[0]); 2384 + 2385 + if (WARN_ON(gc->of_gpio_n_cells < 4)) 2386 + return -EINVAL; 2387 + 2388 + if (n > gc->ngpio) 2389 + return -EINVAL; 2390 + 2391 + if (s3c_gpio_cfgpin(pin, S3C_GPIO_SFN(be32_to_cpu(gpio[1])))) 2392 + pr_warn("gpio_xlate: failed to set pin function\n"); 2393 + if (s3c_gpio_setpull(pin, be32_to_cpu(gpio[2]))) 2394 + pr_warn("gpio_xlate: failed to set pin pull up/down\n"); 2395 + if (s5p_gpio_set_drvstr(pin, be32_to_cpu(gpio[3]))) 2396 + pr_warn("gpio_xlate: failed to set pin drive strength\n"); 2397 + 2398 + return n; 2399 + } 2400 + 2401 + static const struct of_device_id exynos4_gpio_dt_match[] __initdata = { 2402 + { .compatible = "samsung,exynos4-gpio", }, 2403 + {} 2404 + }; 2405 + 2406 + static __init void exynos4_gpiolib_attach_ofnode(struct samsung_gpio_chip *chip, 2407 + u64 base, u64 offset) 2408 + { 2409 + struct gpio_chip *gc = &chip->chip; 2410 + u64 address; 2411 + 2412 + if (!of_have_populated_dt()) 2413 + return; 2414 + 2415 + address = chip->base ? base + ((u32)chip->base & 0xfff) : base + offset; 2416 + gc->of_node = of_find_matching_node_by_address(NULL, 2417 + exynos4_gpio_dt_match, address); 2418 + if (!gc->of_node) { 2419 + pr_info("gpio: device tree node not found for gpio controller" 2420 + " with base address %08llx\n", address); 2421 + return; 2422 + } 2423 + gc->of_gpio_n_cells = 4; 2424 + gc->of_xlate = exynos4_gpio_xlate; 2425 + } 2426 + #elif defined(CONFIG_ARCH_EXYNOS4) 2427 + static __init void exynos4_gpiolib_attach_ofnode(struct samsung_gpio_chip *chip, 2428 + u64 base, u64 offset) 2429 + { 2430 + return; 2431 + } 2432 + #endif /* defined(CONFIG_ARCH_EXYNOS4) && defined(CONFIG_OF) */ 2433 + 2380 2434 /* TODO: cleanup soc_is_* */ 2381 2435 static __init int samsung_gpiolib_init(void) 2382 2436 { ··· 2515 2455 chip->config = &exynos4_gpio_cfg; 2516 2456 chip->group = group++; 2517 2457 } 2458 + #ifdef CONFIG_CPU_EXYNOS4210 2459 + exynos4_gpiolib_attach_ofnode(chip, 2460 + EXYNOS4_PA_GPIO1, i * 0x20); 2461 + #endif 2518 2462 } 2519 2463 samsung_gpiolib_add_4bit_chips(exynos4_gpios_1, nr_chips, S5P_VA_GPIO1); 2520 2464 ··· 2531 2467 chip->config = &exynos4_gpio_cfg; 2532 2468 chip->group = group++; 2533 2469 } 2470 + #ifdef CONFIG_CPU_EXYNOS4210 2471 + exynos4_gpiolib_attach_ofnode(chip, 2472 + EXYNOS4_PA_GPIO2, i * 0x20); 2473 + #endif 2534 2474 } 2535 2475 samsung_gpiolib_add_4bit_chips(exynos4_gpios_2, nr_chips, S5P_VA_GPIO2); 2536 2476 ··· 2547 2479 chip->config = &exynos4_gpio_cfg; 2548 2480 chip->group = group++; 2549 2481 } 2482 + #ifdef CONFIG_CPU_EXYNOS4210 2483 + exynos4_gpiolib_attach_ofnode(chip, 2484 + EXYNOS4_PA_GPIO3, i * 0x20); 2485 + #endif 2550 2486 } 2551 2487 samsung_gpiolib_add_4bit_chips(exynos4_gpios_3, nr_chips, S5P_VA_GPIO3); 2552 2488
+162 -12
drivers/input/keyboard/samsung-keypad.c
··· 21 21 #include <linux/module.h> 22 22 #include <linux/platform_device.h> 23 23 #include <linux/slab.h> 24 + #include <linux/of.h> 25 + #include <linux/of_gpio.h> 24 26 #include <linux/sched.h> 25 27 #include <plat/keypad.h> 26 28 ··· 70 68 wait_queue_head_t wait; 71 69 bool stopped; 72 70 int irq; 71 + enum samsung_keypad_type type; 73 72 unsigned int row_shift; 74 73 unsigned int rows; 75 74 unsigned int cols; 76 75 unsigned int row_state[SAMSUNG_MAX_COLS]; 76 + #ifdef CONFIG_OF 77 + int row_gpios[SAMSUNG_MAX_ROWS]; 78 + int col_gpios[SAMSUNG_MAX_COLS]; 79 + #endif 77 80 unsigned short keycodes[]; 78 81 }; 79 - 80 - static int samsung_keypad_is_s5pv210(struct device *dev) 81 - { 82 - struct platform_device *pdev = to_platform_device(dev); 83 - enum samsung_keypad_type type = 84 - platform_get_device_id(pdev)->driver_data; 85 - 86 - return type == KEYPAD_TYPE_S5PV210; 87 - } 88 82 89 83 static void samsung_keypad_scan(struct samsung_keypad *keypad, 90 84 unsigned int *row_state) 91 85 { 92 - struct device *dev = keypad->input_dev->dev.parent; 93 86 unsigned int col; 94 87 unsigned int val; 95 88 96 89 for (col = 0; col < keypad->cols; col++) { 97 - if (samsung_keypad_is_s5pv210(dev)) { 90 + if (keypad->type == KEYPAD_TYPE_S5PV210) { 98 91 val = S5PV210_KEYIFCOLEN_MASK; 99 92 val &= ~(1 << col) << 8; 100 93 } else { ··· 232 235 samsung_keypad_stop(keypad); 233 236 } 234 237 238 + #ifdef CONFIG_OF 239 + static struct samsung_keypad_platdata *samsung_keypad_parse_dt( 240 + struct device *dev) 241 + { 242 + struct samsung_keypad_platdata *pdata; 243 + struct matrix_keymap_data *keymap_data; 244 + uint32_t *keymap, num_rows = 0, num_cols = 0; 245 + struct device_node *np = dev->of_node, *key_np; 246 + unsigned int key_count = 0; 247 + 248 + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); 249 + if (!pdata) { 250 + dev_err(dev, "could not allocate memory for platform data\n"); 251 + return NULL; 252 + } 253 + 254 + of_property_read_u32(np, "samsung,keypad-num-rows", &num_rows); 255 + of_property_read_u32(np, "samsung,keypad-num-columns", &num_cols); 256 + if (!num_rows || !num_cols) { 257 + dev_err(dev, "number of keypad rows/columns not specified\n"); 258 + return NULL; 259 + } 260 + pdata->rows = num_rows; 261 + pdata->cols = num_cols; 262 + 263 + keymap_data = devm_kzalloc(dev, sizeof(*keymap_data), GFP_KERNEL); 264 + if (!keymap_data) { 265 + dev_err(dev, "could not allocate memory for keymap data\n"); 266 + return NULL; 267 + } 268 + pdata->keymap_data = keymap_data; 269 + 270 + for_each_child_of_node(np, key_np) 271 + key_count++; 272 + 273 + keymap_data->keymap_size = key_count; 274 + keymap = devm_kzalloc(dev, sizeof(uint32_t) * key_count, GFP_KERNEL); 275 + if (!keymap) { 276 + dev_err(dev, "could not allocate memory for keymap\n"); 277 + return NULL; 278 + } 279 + keymap_data->keymap = keymap; 280 + 281 + for_each_child_of_node(np, key_np) { 282 + u32 row, col, key_code; 283 + of_property_read_u32(key_np, "keypad,row", &row); 284 + of_property_read_u32(key_np, "keypad,column", &col); 285 + of_property_read_u32(key_np, "linux,code", &key_code); 286 + *keymap++ = KEY(row, col, key_code); 287 + } 288 + 289 + if (of_get_property(np, "linux,input-no-autorepeat", NULL)) 290 + pdata->no_autorepeat = true; 291 + if (of_get_property(np, "linux,input-wakeup", NULL)) 292 + pdata->wakeup = true; 293 + 294 + return pdata; 295 + } 296 + 297 + static void samsung_keypad_parse_dt_gpio(struct device *dev, 298 + struct samsung_keypad *keypad) 299 + { 300 + struct device_node *np = dev->of_node; 301 + int gpio, ret, row, col; 302 + 303 + for (row = 0; row < keypad->rows; row++) { 304 + gpio = of_get_named_gpio(np, "row-gpios", row); 305 + keypad->row_gpios[row] = gpio; 306 + if (!gpio_is_valid(gpio)) { 307 + dev_err(dev, "keypad row[%d]: invalid gpio %d\n", 308 + row, gpio); 309 + continue; 310 + } 311 + 312 + ret = gpio_request(gpio, "keypad-row"); 313 + if (ret) 314 + dev_err(dev, "keypad row[%d] gpio request failed\n", 315 + row); 316 + } 317 + 318 + for (col = 0; col < keypad->cols; col++) { 319 + gpio = of_get_named_gpio(np, "col-gpios", col); 320 + keypad->col_gpios[col] = gpio; 321 + if (!gpio_is_valid(gpio)) { 322 + dev_err(dev, "keypad column[%d]: invalid gpio %d\n", 323 + col, gpio); 324 + continue; 325 + } 326 + 327 + ret = gpio_request(gpio, "keypad-col"); 328 + if (ret) 329 + dev_err(dev, "keypad column[%d] gpio request failed\n", 330 + col); 331 + } 332 + } 333 + 334 + static void samsung_keypad_dt_gpio_free(struct samsung_keypad *keypad) 335 + { 336 + int cnt; 337 + 338 + for (cnt = 0; cnt < keypad->rows; cnt++) 339 + if (gpio_is_valid(keypad->row_gpios[cnt])) 340 + gpio_free(keypad->row_gpios[cnt]); 341 + 342 + for (cnt = 0; cnt < keypad->cols; cnt++) 343 + if (gpio_is_valid(keypad->col_gpios[cnt])) 344 + gpio_free(keypad->col_gpios[cnt]); 345 + } 346 + #else 347 + static 348 + struct samsung_keypad_platdata *samsung_keypad_parse_dt(struct device *dev) 349 + { 350 + return NULL; 351 + } 352 + 353 + static void samsung_keypad_dt_gpio_free(struct samsung_keypad *keypad) 354 + { 355 + } 356 + #endif 357 + 235 358 static int __devinit samsung_keypad_probe(struct platform_device *pdev) 236 359 { 237 360 const struct samsung_keypad_platdata *pdata; ··· 363 246 unsigned int keymap_size; 364 247 int error; 365 248 366 - pdata = pdev->dev.platform_data; 249 + if (pdev->dev.of_node) 250 + pdata = samsung_keypad_parse_dt(&pdev->dev); 251 + else 252 + pdata = pdev->dev.platform_data; 367 253 if (!pdata) { 368 254 dev_err(&pdev->dev, "no platform data defined\n"); 369 255 return -EINVAL; ··· 423 303 keypad->cols = pdata->cols; 424 304 init_waitqueue_head(&keypad->wait); 425 305 306 + if (pdev->dev.of_node) { 307 + #ifdef CONFIG_OF 308 + samsung_keypad_parse_dt_gpio(&pdev->dev, keypad); 309 + keypad->type = of_device_is_compatible(pdev->dev.of_node, 310 + "samsung,s5pv210-keypad"); 311 + #endif 312 + } else { 313 + keypad->type = platform_get_device_id(pdev)->driver_data; 314 + } 315 + 426 316 input_dev->name = pdev->name; 427 317 input_dev->id.bustype = BUS_HOST; 428 318 input_dev->dev.parent = &pdev->dev; ··· 473 343 474 344 device_init_wakeup(&pdev->dev, pdata->wakeup); 475 345 platform_set_drvdata(pdev, keypad); 346 + 347 + if (pdev->dev.of_node) { 348 + devm_kfree(&pdev->dev, (void *)pdata->keymap_data->keymap); 349 + devm_kfree(&pdev->dev, (void *)pdata->keymap_data); 350 + devm_kfree(&pdev->dev, (void *)pdata); 351 + } 476 352 return 0; 477 353 478 354 err_free_irq: 479 355 free_irq(keypad->irq, keypad); 480 356 err_put_clk: 481 357 clk_put(keypad->clk); 358 + samsung_keypad_dt_gpio_free(keypad); 482 359 err_unmap_base: 483 360 iounmap(keypad->base); 484 361 err_free_mem: ··· 511 374 free_irq(keypad->irq, keypad); 512 375 513 376 clk_put(keypad->clk); 377 + samsung_keypad_dt_gpio_free(keypad); 514 378 515 379 iounmap(keypad->base); 516 380 kfree(keypad); ··· 585 447 }; 586 448 #endif 587 449 450 + #ifdef CONFIG_OF 451 + static const struct of_device_id samsung_keypad_dt_match[] = { 452 + { .compatible = "samsung,s3c6410-keypad" }, 453 + { .compatible = "samsung,s5pv210-keypad" }, 454 + {}, 455 + }; 456 + MODULE_DEVICE_TABLE(of, samsung_keypad_dt_match); 457 + #else 458 + #define samsung_keypad_dt_match NULL 459 + #endif 460 + 588 461 static struct platform_device_id samsung_keypad_driver_ids[] = { 589 462 { 590 463 .name = "samsung-keypad", ··· 614 465 .driver = { 615 466 .name = "samsung-keypad", 616 467 .owner = THIS_MODULE, 468 + .of_match_table = samsung_keypad_dt_match, 617 469 #ifdef CONFIG_PM 618 470 .pm = &samsung_keypad_pm_ops, 619 471 #endif
+2 -5
drivers/mmc/host/sdhci-s3c.c
··· 435 435 436 436 for (clks = 0, ptr = 0; ptr < MAX_BUS_CLK; ptr++) { 437 437 struct clk *clk; 438 - char *name = pdata->clocks[ptr]; 438 + char name[14]; 439 439 440 - if (name == NULL) 441 - continue; 442 - 440 + snprintf(name, 14, "mmc_busclk.%d", ptr); 443 441 clk = clk_get(dev, name); 444 442 if (IS_ERR(clk)) { 445 - dev_err(dev, "failed to get clock %s\n", name); 446 443 continue; 447 444 } 448 445
+20 -1
drivers/rtc/rtc-s3c.c
··· 25 25 #include <linux/clk.h> 26 26 #include <linux/log2.h> 27 27 #include <linux/slab.h> 28 + #include <linux/of.h> 28 29 29 30 #include <mach/hardware.h> 30 31 #include <asm/uaccess.h> ··· 508 507 goto err_nortc; 509 508 } 510 509 511 - s3c_rtc_cpu_type = platform_get_device_id(pdev)->driver_data; 510 + #ifdef CONFIG_OF 511 + if (pdev->dev.of_node) 512 + s3c_rtc_cpu_type = of_device_is_compatible(pdev->dev.of_node, 513 + "samsung,s3c6410-rtc") ? TYPE_S3C64XX : TYPE_S3C2410; 514 + else 515 + #endif 516 + s3c_rtc_cpu_type = platform_get_device_id(pdev)->driver_data; 512 517 513 518 /* Check RTC Time */ 514 519 ··· 636 629 #define s3c_rtc_resume NULL 637 630 #endif 638 631 632 + #ifdef CONFIG_OF 633 + static const struct of_device_id s3c_rtc_dt_match[] = { 634 + { .compatible = "samsung,s3c2410-rtc" }, 635 + { .compatible = "samsung,s3c6410-rtc" }, 636 + {}, 637 + }; 638 + MODULE_DEVICE_TABLE(of, s3c_rtc_dt_match); 639 + #else 640 + #define s3c_rtc_dt_match NULL 641 + #endif 642 + 639 643 static struct platform_device_id s3c_rtc_driver_ids[] = { 640 644 { 641 645 .name = "s3c2410-rtc", ··· 669 651 .driver = { 670 652 .name = "s3c-rtc", 671 653 .owner = THIS_MODULE, 654 + .of_match_table = s3c_rtc_dt_match, 672 655 }, 673 656 }; 674 657
+5 -9
drivers/spi/spi-s3c64xx.c
··· 971 971 struct s3c64xx_spi_info *sci; 972 972 struct spi_master *master; 973 973 int ret; 974 + char clk_name[16]; 974 975 975 976 if (pdev->id < 0) { 976 977 dev_err(&pdev->dev, ··· 985 984 } 986 985 987 986 sci = pdev->dev.platform_data; 988 - if (!sci->src_clk_name) { 989 - dev_err(&pdev->dev, 990 - "Board init must call s3c64xx_spi_set_info()\n"); 991 - return -EINVAL; 992 - } 993 987 994 988 /* Check for availability of necessary resource */ 995 989 ··· 1069 1073 goto err4; 1070 1074 } 1071 1075 1072 - sdd->src_clk = clk_get(&pdev->dev, sci->src_clk_name); 1076 + sprintf(clk_name, "spi_busclk%d", sci->src_clk_nr); 1077 + sdd->src_clk = clk_get(&pdev->dev, clk_name); 1073 1078 if (IS_ERR(sdd->src_clk)) { 1074 1079 dev_err(&pdev->dev, 1075 - "Unable to acquire clock '%s'\n", sci->src_clk_name); 1080 + "Unable to acquire clock '%s'\n", clk_name); 1076 1081 ret = PTR_ERR(sdd->src_clk); 1077 1082 goto err5; 1078 1083 } 1079 1084 1080 1085 if (clk_enable(sdd->src_clk)) { 1081 - dev_err(&pdev->dev, "Couldn't enable clock '%s'\n", 1082 - sci->src_clk_name); 1086 + dev_err(&pdev->dev, "Couldn't enable clock '%s'\n", clk_name); 1083 1087 ret = -EBUSY; 1084 1088 goto err6; 1085 1089 }
+2 -43
drivers/tty/serial/Kconfig
··· 457 457 config SERIAL_SAMSUNG_UARTS_4 458 458 bool 459 459 depends on ARM && PLAT_SAMSUNG 460 - default y if CPU_S3C2443 460 + default y if !(CPU_S3C2410 || SERIAL_S3C2412 || CPU_S3C2440 || CPU_S3C2442) 461 461 help 462 462 Internal node for the common case of 4 Samsung compatible UARTs 463 463 ··· 465 465 int 466 466 depends on ARM && PLAT_SAMSUNG 467 467 default 6 if ARCH_S5P6450 468 - default 4 if SERIAL_SAMSUNG_UARTS_4 468 + default 4 if SERIAL_SAMSUNG_UARTS_4 || CPU_S3C2416 469 469 default 3 470 470 help 471 471 Select the number of available UART ports for the Samsung S3C ··· 494 494 "console=ttySACx". (Try "man bootparam" or see the documentation of 495 495 your boot loader about how to pass options to the kernel at 496 496 boot time.) 497 - 498 - config SERIAL_S3C2410 499 - tristate "Samsung S3C2410 Serial port support" 500 - depends on SERIAL_SAMSUNG && CPU_S3C2410 501 - default y if CPU_S3C2410 502 - help 503 - Serial port support for the Samsung S3C2410 SoC 504 - 505 - config SERIAL_S3C2412 506 - tristate "Samsung S3C2412/S3C2413 Serial port support" 507 - depends on SERIAL_SAMSUNG && CPU_S3C2412 508 - default y if CPU_S3C2412 509 - help 510 - Serial port support for the Samsung S3C2412 and S3C2413 SoC 511 - 512 - config SERIAL_S3C2440 513 - tristate "Samsung S3C2440/S3C2442/S3C2416 Serial port support" 514 - depends on SERIAL_SAMSUNG && (CPU_S3C2440 || CPU_S3C2442 || CPU_S3C2416) 515 - default y if CPU_S3C2440 516 - default y if CPU_S3C2442 517 - select SERIAL_SAMSUNG_UARTS_4 if CPU_S3C2416 518 - help 519 - Serial port support for the Samsung S3C2440, S3C2416 and S3C2442 SoC 520 - 521 - config SERIAL_S3C6400 522 - tristate "Samsung S3C6400/S3C6410/S5P6440/S5P6450/S5PC100 Serial port support" 523 - depends on SERIAL_SAMSUNG && (CPU_S3C6400 || CPU_S3C6410 || CPU_S5P6440 || CPU_S5P6450 || CPU_S5PC100) 524 - select SERIAL_SAMSUNG_UARTS_4 525 - default y 526 - help 527 - Serial port support for the Samsung S3C6400, S3C6410, S5P6440, S5P6450 528 - and S5PC100 SoCs 529 - 530 - config SERIAL_S5PV210 531 - tristate "Samsung S5PV210 Serial port support" 532 - depends on SERIAL_SAMSUNG && (CPU_S5PV210 || CPU_EXYNOS4210 || SOC_EXYNOS4212) 533 - select SERIAL_SAMSUNG_UARTS_4 if (CPU_S5PV210 || CPU_EXYNOS4210 || SOC_EXYNOS4212) 534 - default y 535 - help 536 - Serial port support for Samsung's S5P Family of SoC's 537 - 538 497 539 498 config SERIAL_MAX3100 540 499 tristate "MAX3100 support"
-5
drivers/tty/serial/Makefile
··· 39 39 obj-$(CONFIG_SERIAL_BFIN) += bfin_uart.o 40 40 obj-$(CONFIG_SERIAL_BFIN_SPORT) += bfin_sport_uart.o 41 41 obj-$(CONFIG_SERIAL_SAMSUNG) += samsung.o 42 - obj-$(CONFIG_SERIAL_S3C2410) += s3c2410.o 43 - obj-$(CONFIG_SERIAL_S3C2412) += s3c2412.o 44 - obj-$(CONFIG_SERIAL_S3C2440) += s3c2440.o 45 - obj-$(CONFIG_SERIAL_S3C6400) += s3c6400.o 46 - obj-$(CONFIG_SERIAL_S5PV210) += s5pv210.o 47 42 obj-$(CONFIG_SERIAL_MAX3100) += max3100.o 48 43 obj-$(CONFIG_SERIAL_MAX3107) += max3107.o 49 44 obj-$(CONFIG_SERIAL_MAX3107_AAVA) += max3107-aava.o
-115
drivers/tty/serial/s3c2410.c
··· 1 - /* 2 - * Driver for Samsung S3C2410 SoC onboard UARTs. 3 - * 4 - * Ben Dooks, Copyright (c) 2003-2008 Simtec Electronics 5 - * http://armlinux.simtec.co.uk/ 6 - * 7 - * This program is free software; you can redistribute it and/or modify 8 - * it under the terms of the GNU General Public License version 2 as 9 - * published by the Free Software Foundation. 10 - */ 11 - 12 - #include <linux/module.h> 13 - #include <linux/ioport.h> 14 - #include <linux/io.h> 15 - #include <linux/platform_device.h> 16 - #include <linux/init.h> 17 - #include <linux/serial_core.h> 18 - #include <linux/serial.h> 19 - 20 - #include <asm/irq.h> 21 - #include <mach/hardware.h> 22 - 23 - #include <plat/regs-serial.h> 24 - #include <mach/regs-gpio.h> 25 - 26 - #include "samsung.h" 27 - 28 - static int s3c2410_serial_setsource(struct uart_port *port, 29 - struct s3c24xx_uart_clksrc *clk) 30 - { 31 - unsigned long ucon = rd_regl(port, S3C2410_UCON); 32 - 33 - if (strcmp(clk->name, "uclk") == 0) 34 - ucon |= S3C2410_UCON_UCLK; 35 - else 36 - ucon &= ~S3C2410_UCON_UCLK; 37 - 38 - wr_regl(port, S3C2410_UCON, ucon); 39 - return 0; 40 - } 41 - 42 - static int s3c2410_serial_getsource(struct uart_port *port, 43 - struct s3c24xx_uart_clksrc *clk) 44 - { 45 - unsigned long ucon = rd_regl(port, S3C2410_UCON); 46 - 47 - clk->divisor = 1; 48 - clk->name = (ucon & S3C2410_UCON_UCLK) ? "uclk" : "pclk"; 49 - 50 - return 0; 51 - } 52 - 53 - static int s3c2410_serial_resetport(struct uart_port *port, 54 - struct s3c2410_uartcfg *cfg) 55 - { 56 - dbg("s3c2410_serial_resetport: port=%p (%08lx), cfg=%p\n", 57 - port, port->mapbase, cfg); 58 - 59 - wr_regl(port, S3C2410_UCON, cfg->ucon); 60 - wr_regl(port, S3C2410_ULCON, cfg->ulcon); 61 - 62 - /* reset both fifos */ 63 - 64 - wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH); 65 - wr_regl(port, S3C2410_UFCON, cfg->ufcon); 66 - 67 - return 0; 68 - } 69 - 70 - static struct s3c24xx_uart_info s3c2410_uart_inf = { 71 - .name = "Samsung S3C2410 UART", 72 - .type = PORT_S3C2410, 73 - .fifosize = 16, 74 - .rx_fifomask = S3C2410_UFSTAT_RXMASK, 75 - .rx_fifoshift = S3C2410_UFSTAT_RXSHIFT, 76 - .rx_fifofull = S3C2410_UFSTAT_RXFULL, 77 - .tx_fifofull = S3C2410_UFSTAT_TXFULL, 78 - .tx_fifomask = S3C2410_UFSTAT_TXMASK, 79 - .tx_fifoshift = S3C2410_UFSTAT_TXSHIFT, 80 - .get_clksrc = s3c2410_serial_getsource, 81 - .set_clksrc = s3c2410_serial_setsource, 82 - .reset_port = s3c2410_serial_resetport, 83 - }; 84 - 85 - static int s3c2410_serial_probe(struct platform_device *dev) 86 - { 87 - return s3c24xx_serial_probe(dev, &s3c2410_uart_inf); 88 - } 89 - 90 - static struct platform_driver s3c2410_serial_driver = { 91 - .probe = s3c2410_serial_probe, 92 - .remove = __devexit_p(s3c24xx_serial_remove), 93 - .driver = { 94 - .name = "s3c2410-uart", 95 - .owner = THIS_MODULE, 96 - }, 97 - }; 98 - 99 - static int __init s3c2410_serial_init(void) 100 - { 101 - return s3c24xx_serial_init(&s3c2410_serial_driver, &s3c2410_uart_inf); 102 - } 103 - 104 - static void __exit s3c2410_serial_exit(void) 105 - { 106 - platform_driver_unregister(&s3c2410_serial_driver); 107 - } 108 - 109 - module_init(s3c2410_serial_init); 110 - module_exit(s3c2410_serial_exit); 111 - 112 - MODULE_LICENSE("GPL v2"); 113 - MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>"); 114 - MODULE_DESCRIPTION("Samsung S3C2410 SoC Serial port driver"); 115 - MODULE_ALIAS("platform:s3c2410-uart");
-149
drivers/tty/serial/s3c2412.c
··· 1 - /* 2 - * Driver for Samsung S3C2412 and S3C2413 SoC onboard UARTs. 3 - * 4 - * Ben Dooks, Copyright (c) 2003-2008 Simtec Electronics 5 - * http://armlinux.simtec.co.uk/ 6 - * 7 - * This program is free software; you can redistribute it and/or modify 8 - * it under the terms of the GNU General Public License version 2 as 9 - * published by the Free Software Foundation. 10 - */ 11 - 12 - #include <linux/module.h> 13 - #include <linux/ioport.h> 14 - #include <linux/io.h> 15 - #include <linux/platform_device.h> 16 - #include <linux/init.h> 17 - #include <linux/serial_core.h> 18 - #include <linux/serial.h> 19 - 20 - #include <asm/irq.h> 21 - #include <mach/hardware.h> 22 - 23 - #include <plat/regs-serial.h> 24 - #include <mach/regs-gpio.h> 25 - 26 - #include "samsung.h" 27 - 28 - static int s3c2412_serial_setsource(struct uart_port *port, 29 - struct s3c24xx_uart_clksrc *clk) 30 - { 31 - unsigned long ucon = rd_regl(port, S3C2410_UCON); 32 - 33 - ucon &= ~S3C2412_UCON_CLKMASK; 34 - 35 - if (strcmp(clk->name, "uclk") == 0) 36 - ucon |= S3C2440_UCON_UCLK; 37 - else if (strcmp(clk->name, "pclk") == 0) 38 - ucon |= S3C2440_UCON_PCLK; 39 - else if (strcmp(clk->name, "usysclk") == 0) 40 - ucon |= S3C2412_UCON_USYSCLK; 41 - else { 42 - printk(KERN_ERR "unknown clock source %s\n", clk->name); 43 - return -EINVAL; 44 - } 45 - 46 - wr_regl(port, S3C2410_UCON, ucon); 47 - return 0; 48 - } 49 - 50 - 51 - static int s3c2412_serial_getsource(struct uart_port *port, 52 - struct s3c24xx_uart_clksrc *clk) 53 - { 54 - unsigned long ucon = rd_regl(port, S3C2410_UCON); 55 - 56 - switch (ucon & S3C2412_UCON_CLKMASK) { 57 - case S3C2412_UCON_UCLK: 58 - clk->divisor = 1; 59 - clk->name = "uclk"; 60 - break; 61 - 62 - case S3C2412_UCON_PCLK: 63 - case S3C2412_UCON_PCLK2: 64 - clk->divisor = 1; 65 - clk->name = "pclk"; 66 - break; 67 - 68 - case S3C2412_UCON_USYSCLK: 69 - clk->divisor = 1; 70 - clk->name = "usysclk"; 71 - break; 72 - } 73 - 74 - return 0; 75 - } 76 - 77 - static int s3c2412_serial_resetport(struct uart_port *port, 78 - struct s3c2410_uartcfg *cfg) 79 - { 80 - unsigned long ucon = rd_regl(port, S3C2410_UCON); 81 - 82 - dbg("%s: port=%p (%08lx), cfg=%p\n", 83 - __func__, port, port->mapbase, cfg); 84 - 85 - /* ensure we don't change the clock settings... */ 86 - 87 - ucon &= S3C2412_UCON_CLKMASK; 88 - 89 - wr_regl(port, S3C2410_UCON, ucon | cfg->ucon); 90 - wr_regl(port, S3C2410_ULCON, cfg->ulcon); 91 - 92 - /* reset both fifos */ 93 - 94 - wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH); 95 - wr_regl(port, S3C2410_UFCON, cfg->ufcon); 96 - 97 - return 0; 98 - } 99 - 100 - static struct s3c24xx_uart_info s3c2412_uart_inf = { 101 - .name = "Samsung S3C2412 UART", 102 - .type = PORT_S3C2412, 103 - .fifosize = 64, 104 - .has_divslot = 1, 105 - .rx_fifomask = S3C2440_UFSTAT_RXMASK, 106 - .rx_fifoshift = S3C2440_UFSTAT_RXSHIFT, 107 - .rx_fifofull = S3C2440_UFSTAT_RXFULL, 108 - .tx_fifofull = S3C2440_UFSTAT_TXFULL, 109 - .tx_fifomask = S3C2440_UFSTAT_TXMASK, 110 - .tx_fifoshift = S3C2440_UFSTAT_TXSHIFT, 111 - .get_clksrc = s3c2412_serial_getsource, 112 - .set_clksrc = s3c2412_serial_setsource, 113 - .reset_port = s3c2412_serial_resetport, 114 - }; 115 - 116 - /* device management */ 117 - 118 - static int s3c2412_serial_probe(struct platform_device *dev) 119 - { 120 - dbg("s3c2440_serial_probe: dev=%p\n", dev); 121 - return s3c24xx_serial_probe(dev, &s3c2412_uart_inf); 122 - } 123 - 124 - static struct platform_driver s3c2412_serial_driver = { 125 - .probe = s3c2412_serial_probe, 126 - .remove = __devexit_p(s3c24xx_serial_remove), 127 - .driver = { 128 - .name = "s3c2412-uart", 129 - .owner = THIS_MODULE, 130 - }, 131 - }; 132 - 133 - static inline int s3c2412_serial_init(void) 134 - { 135 - return s3c24xx_serial_init(&s3c2412_serial_driver, &s3c2412_uart_inf); 136 - } 137 - 138 - static inline void s3c2412_serial_exit(void) 139 - { 140 - platform_driver_unregister(&s3c2412_serial_driver); 141 - } 142 - 143 - module_init(s3c2412_serial_init); 144 - module_exit(s3c2412_serial_exit); 145 - 146 - MODULE_DESCRIPTION("Samsung S3C2412,S3C2413 SoC Serial port driver"); 147 - MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>"); 148 - MODULE_LICENSE("GPL v2"); 149 - MODULE_ALIAS("platform:s3c2412-uart");
-178
drivers/tty/serial/s3c2440.c
··· 1 - /* 2 - * Driver for Samsung S3C2440 and S3C2442 SoC onboard UARTs. 3 - * 4 - * Ben Dooks, Copyright (c) 2003-2008 Simtec Electronics 5 - * http://armlinux.simtec.co.uk/ 6 - * 7 - * This program is free software; you can redistribute it and/or modify 8 - * it under the terms of the GNU General Public License version 2 as 9 - * published by the Free Software Foundation. 10 - */ 11 - 12 - #include <linux/module.h> 13 - #include <linux/ioport.h> 14 - #include <linux/io.h> 15 - #include <linux/platform_device.h> 16 - #include <linux/init.h> 17 - #include <linux/serial_core.h> 18 - #include <linux/serial.h> 19 - 20 - #include <asm/irq.h> 21 - #include <mach/hardware.h> 22 - 23 - #include <plat/regs-serial.h> 24 - #include <mach/regs-gpio.h> 25 - 26 - #include "samsung.h" 27 - 28 - 29 - static int s3c2440_serial_setsource(struct uart_port *port, 30 - struct s3c24xx_uart_clksrc *clk) 31 - { 32 - unsigned long ucon = rd_regl(port, S3C2410_UCON); 33 - 34 - /* todo - proper fclk<>nonfclk switch. */ 35 - 36 - ucon &= ~S3C2440_UCON_CLKMASK; 37 - 38 - if (strcmp(clk->name, "uclk") == 0) 39 - ucon |= S3C2440_UCON_UCLK; 40 - else if (strcmp(clk->name, "pclk") == 0) 41 - ucon |= S3C2440_UCON_PCLK; 42 - else if (strcmp(clk->name, "fclk") == 0) 43 - ucon |= S3C2440_UCON_FCLK; 44 - else { 45 - printk(KERN_ERR "unknown clock source %s\n", clk->name); 46 - return -EINVAL; 47 - } 48 - 49 - wr_regl(port, S3C2410_UCON, ucon); 50 - return 0; 51 - } 52 - 53 - 54 - static int s3c2440_serial_getsource(struct uart_port *port, 55 - struct s3c24xx_uart_clksrc *clk) 56 - { 57 - unsigned long ucon = rd_regl(port, S3C2410_UCON); 58 - unsigned long ucon0, ucon1, ucon2; 59 - 60 - switch (ucon & S3C2440_UCON_CLKMASK) { 61 - case S3C2440_UCON_UCLK: 62 - clk->divisor = 1; 63 - clk->name = "uclk"; 64 - break; 65 - 66 - case S3C2440_UCON_PCLK: 67 - case S3C2440_UCON_PCLK2: 68 - clk->divisor = 1; 69 - clk->name = "pclk"; 70 - break; 71 - 72 - case S3C2440_UCON_FCLK: 73 - /* the fun of calculating the uart divisors on 74 - * the s3c2440 */ 75 - 76 - ucon0 = __raw_readl(S3C24XX_VA_UART0 + S3C2410_UCON); 77 - ucon1 = __raw_readl(S3C24XX_VA_UART1 + S3C2410_UCON); 78 - ucon2 = __raw_readl(S3C24XX_VA_UART2 + S3C2410_UCON); 79 - 80 - printk("ucons: %08lx, %08lx, %08lx\n", ucon0, ucon1, ucon2); 81 - 82 - ucon0 &= S3C2440_UCON0_DIVMASK; 83 - ucon1 &= S3C2440_UCON1_DIVMASK; 84 - ucon2 &= S3C2440_UCON2_DIVMASK; 85 - 86 - if (ucon0 != 0) { 87 - clk->divisor = ucon0 >> S3C2440_UCON_DIVSHIFT; 88 - clk->divisor += 6; 89 - } else if (ucon1 != 0) { 90 - clk->divisor = ucon1 >> S3C2440_UCON_DIVSHIFT; 91 - clk->divisor += 21; 92 - } else if (ucon2 != 0) { 93 - clk->divisor = ucon2 >> S3C2440_UCON_DIVSHIFT; 94 - clk->divisor += 36; 95 - } else { 96 - /* manual calims 44, seems to be 9 */ 97 - clk->divisor = 9; 98 - } 99 - 100 - clk->name = "fclk"; 101 - break; 102 - } 103 - 104 - return 0; 105 - } 106 - 107 - static int s3c2440_serial_resetport(struct uart_port *port, 108 - struct s3c2410_uartcfg *cfg) 109 - { 110 - unsigned long ucon = rd_regl(port, S3C2410_UCON); 111 - 112 - dbg("s3c2440_serial_resetport: port=%p (%08lx), cfg=%p\n", 113 - port, port->mapbase, cfg); 114 - 115 - /* ensure we don't change the clock settings... */ 116 - 117 - ucon &= (S3C2440_UCON0_DIVMASK | (3<<10)); 118 - 119 - wr_regl(port, S3C2410_UCON, ucon | cfg->ucon); 120 - wr_regl(port, S3C2410_ULCON, cfg->ulcon); 121 - 122 - /* reset both fifos */ 123 - 124 - wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH); 125 - wr_regl(port, S3C2410_UFCON, cfg->ufcon); 126 - 127 - return 0; 128 - } 129 - 130 - static struct s3c24xx_uart_info s3c2440_uart_inf = { 131 - .name = "Samsung S3C2440 UART", 132 - .type = PORT_S3C2440, 133 - .fifosize = 64, 134 - .rx_fifomask = S3C2440_UFSTAT_RXMASK, 135 - .rx_fifoshift = S3C2440_UFSTAT_RXSHIFT, 136 - .rx_fifofull = S3C2440_UFSTAT_RXFULL, 137 - .tx_fifofull = S3C2440_UFSTAT_TXFULL, 138 - .tx_fifomask = S3C2440_UFSTAT_TXMASK, 139 - .tx_fifoshift = S3C2440_UFSTAT_TXSHIFT, 140 - .get_clksrc = s3c2440_serial_getsource, 141 - .set_clksrc = s3c2440_serial_setsource, 142 - .reset_port = s3c2440_serial_resetport, 143 - }; 144 - 145 - /* device management */ 146 - 147 - static int s3c2440_serial_probe(struct platform_device *dev) 148 - { 149 - dbg("s3c2440_serial_probe: dev=%p\n", dev); 150 - return s3c24xx_serial_probe(dev, &s3c2440_uart_inf); 151 - } 152 - 153 - static struct platform_driver s3c2440_serial_driver = { 154 - .probe = s3c2440_serial_probe, 155 - .remove = __devexit_p(s3c24xx_serial_remove), 156 - .driver = { 157 - .name = "s3c2440-uart", 158 - .owner = THIS_MODULE, 159 - }, 160 - }; 161 - 162 - static int __init s3c2440_serial_init(void) 163 - { 164 - return s3c24xx_serial_init(&s3c2440_serial_driver, &s3c2440_uart_inf); 165 - } 166 - 167 - static void __exit s3c2440_serial_exit(void) 168 - { 169 - platform_driver_unregister(&s3c2440_serial_driver); 170 - } 171 - 172 - module_init(s3c2440_serial_init); 173 - module_exit(s3c2440_serial_exit); 174 - 175 - MODULE_DESCRIPTION("Samsung S3C2440,S3C2442 SoC Serial port driver"); 176 - MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>"); 177 - MODULE_LICENSE("GPL v2"); 178 - MODULE_ALIAS("platform:s3c2440-uart");
-149
drivers/tty/serial/s3c6400.c
··· 1 - /* 2 - * Driver for Samsung S3C6400 and S3C6410 SoC onboard UARTs. 3 - * 4 - * Copyright 2008 Openmoko, Inc. 5 - * Copyright 2008 Simtec Electronics 6 - * Ben Dooks <ben@simtec.co.uk> 7 - * http://armlinux.simtec.co.uk/ 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 version 2 as 11 - * published by the Free Software Foundation. 12 - */ 13 - 14 - #include <linux/module.h> 15 - #include <linux/ioport.h> 16 - #include <linux/io.h> 17 - #include <linux/platform_device.h> 18 - #include <linux/init.h> 19 - #include <linux/serial_core.h> 20 - #include <linux/serial.h> 21 - 22 - #include <asm/irq.h> 23 - #include <mach/hardware.h> 24 - 25 - #include <plat/regs-serial.h> 26 - 27 - #include "samsung.h" 28 - 29 - static int s3c6400_serial_setsource(struct uart_port *port, 30 - struct s3c24xx_uart_clksrc *clk) 31 - { 32 - unsigned long ucon = rd_regl(port, S3C2410_UCON); 33 - 34 - if (strcmp(clk->name, "uclk0") == 0) { 35 - ucon &= ~S3C6400_UCON_CLKMASK; 36 - ucon |= S3C6400_UCON_UCLK0; 37 - } else if (strcmp(clk->name, "uclk1") == 0) 38 - ucon |= S3C6400_UCON_UCLK1; 39 - else if (strcmp(clk->name, "pclk") == 0) { 40 - /* See notes about transitioning from UCLK to PCLK */ 41 - ucon &= ~S3C6400_UCON_UCLK0; 42 - } else { 43 - printk(KERN_ERR "unknown clock source %s\n", clk->name); 44 - return -EINVAL; 45 - } 46 - 47 - wr_regl(port, S3C2410_UCON, ucon); 48 - return 0; 49 - } 50 - 51 - 52 - static int s3c6400_serial_getsource(struct uart_port *port, 53 - struct s3c24xx_uart_clksrc *clk) 54 - { 55 - u32 ucon = rd_regl(port, S3C2410_UCON); 56 - 57 - clk->divisor = 1; 58 - 59 - switch (ucon & S3C6400_UCON_CLKMASK) { 60 - case S3C6400_UCON_UCLK0: 61 - clk->name = "uclk0"; 62 - break; 63 - 64 - case S3C6400_UCON_UCLK1: 65 - clk->name = "uclk1"; 66 - break; 67 - 68 - case S3C6400_UCON_PCLK: 69 - case S3C6400_UCON_PCLK2: 70 - clk->name = "pclk"; 71 - break; 72 - } 73 - 74 - return 0; 75 - } 76 - 77 - static int s3c6400_serial_resetport(struct uart_port *port, 78 - struct s3c2410_uartcfg *cfg) 79 - { 80 - unsigned long ucon = rd_regl(port, S3C2410_UCON); 81 - 82 - dbg("s3c6400_serial_resetport: port=%p (%08lx), cfg=%p\n", 83 - port, port->mapbase, cfg); 84 - 85 - /* ensure we don't change the clock settings... */ 86 - 87 - ucon &= S3C6400_UCON_CLKMASK; 88 - 89 - wr_regl(port, S3C2410_UCON, ucon | cfg->ucon); 90 - wr_regl(port, S3C2410_ULCON, cfg->ulcon); 91 - 92 - /* reset both fifos */ 93 - 94 - wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH); 95 - wr_regl(port, S3C2410_UFCON, cfg->ufcon); 96 - 97 - return 0; 98 - } 99 - 100 - static struct s3c24xx_uart_info s3c6400_uart_inf = { 101 - .name = "Samsung S3C6400 UART", 102 - .type = PORT_S3C6400, 103 - .fifosize = 64, 104 - .has_divslot = 1, 105 - .rx_fifomask = S3C2440_UFSTAT_RXMASK, 106 - .rx_fifoshift = S3C2440_UFSTAT_RXSHIFT, 107 - .rx_fifofull = S3C2440_UFSTAT_RXFULL, 108 - .tx_fifofull = S3C2440_UFSTAT_TXFULL, 109 - .tx_fifomask = S3C2440_UFSTAT_TXMASK, 110 - .tx_fifoshift = S3C2440_UFSTAT_TXSHIFT, 111 - .get_clksrc = s3c6400_serial_getsource, 112 - .set_clksrc = s3c6400_serial_setsource, 113 - .reset_port = s3c6400_serial_resetport, 114 - }; 115 - 116 - /* device management */ 117 - 118 - static int s3c6400_serial_probe(struct platform_device *dev) 119 - { 120 - dbg("s3c6400_serial_probe: dev=%p\n", dev); 121 - return s3c24xx_serial_probe(dev, &s3c6400_uart_inf); 122 - } 123 - 124 - static struct platform_driver s3c6400_serial_driver = { 125 - .probe = s3c6400_serial_probe, 126 - .remove = __devexit_p(s3c24xx_serial_remove), 127 - .driver = { 128 - .name = "s3c6400-uart", 129 - .owner = THIS_MODULE, 130 - }, 131 - }; 132 - 133 - static int __init s3c6400_serial_init(void) 134 - { 135 - return s3c24xx_serial_init(&s3c6400_serial_driver, &s3c6400_uart_inf); 136 - } 137 - 138 - static void __exit s3c6400_serial_exit(void) 139 - { 140 - platform_driver_unregister(&s3c6400_serial_driver); 141 - } 142 - 143 - module_init(s3c6400_serial_init); 144 - module_exit(s3c6400_serial_exit); 145 - 146 - MODULE_DESCRIPTION("Samsung S3C6400,S3C6410 SoC Serial port driver"); 147 - MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>"); 148 - MODULE_LICENSE("GPL v2"); 149 - MODULE_ALIAS("platform:s3c6400-uart");
-158
drivers/tty/serial/s5pv210.c
··· 1 - /* 2 - * Copyright (c) 2010 Samsung Electronics Co., Ltd. 3 - * http://www.samsung.com/ 4 - * 5 - * Based on drivers/serial/s3c6400.c 6 - * 7 - * Driver for Samsung S5PV210 SoC UARTs. 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 version 2 as 11 - * published by the Free Software Foundation. 12 - */ 13 - 14 - #include <linux/module.h> 15 - #include <linux/ioport.h> 16 - #include <linux/io.h> 17 - #include <linux/platform_device.h> 18 - #include <linux/init.h> 19 - #include <linux/serial_core.h> 20 - #include <linux/serial.h> 21 - #include <linux/delay.h> 22 - 23 - #include <asm/irq.h> 24 - #include <mach/hardware.h> 25 - #include <plat/regs-serial.h> 26 - #include "samsung.h" 27 - 28 - static int s5pv210_serial_setsource(struct uart_port *port, 29 - struct s3c24xx_uart_clksrc *clk) 30 - { 31 - struct s3c2410_uartcfg *cfg = port->dev->platform_data; 32 - unsigned long ucon = rd_regl(port, S3C2410_UCON); 33 - 34 - if (cfg->flags & NO_NEED_CHECK_CLKSRC) 35 - return 0; 36 - 37 - if (strcmp(clk->name, "pclk") == 0) 38 - ucon &= ~S5PV210_UCON_CLKMASK; 39 - else if (strcmp(clk->name, "uclk1") == 0) 40 - ucon |= S5PV210_UCON_CLKMASK; 41 - else { 42 - printk(KERN_ERR "unknown clock source %s\n", clk->name); 43 - return -EINVAL; 44 - } 45 - 46 - wr_regl(port, S3C2410_UCON, ucon); 47 - return 0; 48 - } 49 - 50 - 51 - static int s5pv210_serial_getsource(struct uart_port *port, 52 - struct s3c24xx_uart_clksrc *clk) 53 - { 54 - struct s3c2410_uartcfg *cfg = port->dev->platform_data; 55 - u32 ucon = rd_regl(port, S3C2410_UCON); 56 - 57 - clk->divisor = 1; 58 - 59 - if (cfg->flags & NO_NEED_CHECK_CLKSRC) 60 - return 0; 61 - 62 - switch (ucon & S5PV210_UCON_CLKMASK) { 63 - case S5PV210_UCON_PCLK: 64 - clk->name = "pclk"; 65 - break; 66 - case S5PV210_UCON_UCLK: 67 - clk->name = "uclk1"; 68 - break; 69 - } 70 - 71 - return 0; 72 - } 73 - 74 - static int s5pv210_serial_resetport(struct uart_port *port, 75 - struct s3c2410_uartcfg *cfg) 76 - { 77 - unsigned long ucon = rd_regl(port, S3C2410_UCON); 78 - 79 - ucon &= S5PV210_UCON_CLKMASK; 80 - wr_regl(port, S3C2410_UCON, ucon | cfg->ucon); 81 - wr_regl(port, S3C2410_ULCON, cfg->ulcon); 82 - 83 - /* reset both fifos */ 84 - wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH); 85 - wr_regl(port, S3C2410_UFCON, cfg->ufcon); 86 - 87 - /* It is need to delay When reset FIFO register */ 88 - udelay(1); 89 - 90 - return 0; 91 - } 92 - 93 - #define S5PV210_UART_DEFAULT_INFO(fifo_size) \ 94 - .name = "Samsung S5PV210 UART0", \ 95 - .type = PORT_S3C6400, \ 96 - .fifosize = fifo_size, \ 97 - .has_divslot = 1, \ 98 - .rx_fifomask = S5PV210_UFSTAT_RXMASK, \ 99 - .rx_fifoshift = S5PV210_UFSTAT_RXSHIFT, \ 100 - .rx_fifofull = S5PV210_UFSTAT_RXFULL, \ 101 - .tx_fifofull = S5PV210_UFSTAT_TXFULL, \ 102 - .tx_fifomask = S5PV210_UFSTAT_TXMASK, \ 103 - .tx_fifoshift = S5PV210_UFSTAT_TXSHIFT, \ 104 - .get_clksrc = s5pv210_serial_getsource, \ 105 - .set_clksrc = s5pv210_serial_setsource, \ 106 - .reset_port = s5pv210_serial_resetport 107 - 108 - static struct s3c24xx_uart_info s5p_port_fifo256 = { 109 - S5PV210_UART_DEFAULT_INFO(256), 110 - }; 111 - 112 - static struct s3c24xx_uart_info s5p_port_fifo64 = { 113 - S5PV210_UART_DEFAULT_INFO(64), 114 - }; 115 - 116 - static struct s3c24xx_uart_info s5p_port_fifo16 = { 117 - S5PV210_UART_DEFAULT_INFO(16), 118 - }; 119 - 120 - static struct s3c24xx_uart_info *s5p_uart_inf[] = { 121 - [0] = &s5p_port_fifo256, 122 - [1] = &s5p_port_fifo64, 123 - [2] = &s5p_port_fifo16, 124 - [3] = &s5p_port_fifo16, 125 - }; 126 - 127 - /* device management */ 128 - static int s5p_serial_probe(struct platform_device *pdev) 129 - { 130 - return s3c24xx_serial_probe(pdev, s5p_uart_inf[pdev->id]); 131 - } 132 - 133 - static struct platform_driver s5p_serial_driver = { 134 - .probe = s5p_serial_probe, 135 - .remove = __devexit_p(s3c24xx_serial_remove), 136 - .driver = { 137 - .name = "s5pv210-uart", 138 - .owner = THIS_MODULE, 139 - }, 140 - }; 141 - 142 - static int __init s5p_serial_init(void) 143 - { 144 - return s3c24xx_serial_init(&s5p_serial_driver, *s5p_uart_inf); 145 - } 146 - 147 - static void __exit s5p_serial_exit(void) 148 - { 149 - platform_driver_unregister(&s5p_serial_driver); 150 - } 151 - 152 - module_init(s5p_serial_init); 153 - module_exit(s5p_serial_exit); 154 - 155 - MODULE_LICENSE("GPL"); 156 - MODULE_ALIAS("platform:s5pv210-uart"); 157 - MODULE_DESCRIPTION("Samsung S5PV210 UART Driver support"); 158 - MODULE_AUTHOR("Thomas Abraham <thomas.ab@samsung.com>");
+390 -265
drivers/tty/serial/samsung.c
··· 42 42 #include <linux/delay.h> 43 43 #include <linux/clk.h> 44 44 #include <linux/cpufreq.h> 45 + #include <linux/of.h> 45 46 46 47 #include <asm/irq.h> 47 48 ··· 50 49 #include <mach/map.h> 51 50 52 51 #include <plat/regs-serial.h> 52 + #include <plat/clock.h> 53 53 54 54 #include "samsung.h" 55 55 ··· 192 190 193 191 static inline struct s3c2410_uartcfg *s3c24xx_port_to_cfg(struct uart_port *port) 194 192 { 193 + struct s3c24xx_uart_port *ourport; 194 + 195 195 if (port->dev == NULL) 196 196 return NULL; 197 197 198 - return (struct s3c2410_uartcfg *)port->dev->platform_data; 198 + ourport = container_of(port, struct s3c24xx_uart_port, port); 199 + return ourport->cfg; 199 200 } 200 201 201 202 static int s3c24xx_serial_rx_fifocnt(struct s3c24xx_uart_port *ourport, ··· 207 202 struct s3c24xx_uart_info *info = ourport->info; 208 203 209 204 if (ufstat & info->rx_fifofull) 210 - return info->fifosize; 205 + return ourport->port.fifosize; 211 206 212 207 return (ufstat & info->rx_fifomask) >> info->rx_fifoshift; 213 208 } ··· 560 555 * 561 556 */ 562 557 558 + #define MAX_CLK_NAME_LENGTH 15 563 559 564 - #define MAX_CLKS (8) 565 - 566 - static struct s3c24xx_uart_clksrc tmp_clksrc = { 567 - .name = "pclk", 568 - .min_baud = 0, 569 - .max_baud = 0, 570 - .divisor = 1, 571 - }; 572 - 573 - static inline int 574 - s3c24xx_serial_getsource(struct uart_port *port, struct s3c24xx_uart_clksrc *c) 560 + static inline int s3c24xx_serial_getsource(struct uart_port *port) 575 561 { 576 562 struct s3c24xx_uart_info *info = s3c24xx_port_to_info(port); 563 + unsigned int ucon; 577 564 578 - return (info->get_clksrc)(port, c); 579 - } 580 - 581 - static inline int 582 - s3c24xx_serial_setsource(struct uart_port *port, struct s3c24xx_uart_clksrc *c) 583 - { 584 - struct s3c24xx_uart_info *info = s3c24xx_port_to_info(port); 585 - 586 - return (info->set_clksrc)(port, c); 587 - } 588 - 589 - struct baud_calc { 590 - struct s3c24xx_uart_clksrc *clksrc; 591 - unsigned int calc; 592 - unsigned int divslot; 593 - unsigned int quot; 594 - struct clk *src; 595 - }; 596 - 597 - static int s3c24xx_serial_calcbaud(struct baud_calc *calc, 598 - struct uart_port *port, 599 - struct s3c24xx_uart_clksrc *clksrc, 600 - unsigned int baud) 601 - { 602 - struct s3c24xx_uart_port *ourport = to_ourport(port); 603 - unsigned long rate; 604 - 605 - calc->src = clk_get(port->dev, clksrc->name); 606 - if (calc->src == NULL || IS_ERR(calc->src)) 565 + if (info->num_clks == 1) 607 566 return 0; 608 567 609 - rate = clk_get_rate(calc->src); 610 - rate /= clksrc->divisor; 611 - 612 - calc->clksrc = clksrc; 613 - 614 - if (ourport->info->has_divslot) { 615 - unsigned long div = rate / baud; 616 - 617 - /* The UDIVSLOT register on the newer UARTs allows us to 618 - * get a divisor adjustment of 1/16th on the baud clock. 619 - * 620 - * We don't keep the UDIVSLOT value (the 16ths we calculated 621 - * by not multiplying the baud by 16) as it is easy enough 622 - * to recalculate. 623 - */ 624 - 625 - calc->quot = div / 16; 626 - calc->calc = rate / div; 627 - } else { 628 - calc->quot = (rate + (8 * baud)) / (16 * baud); 629 - calc->calc = (rate / (calc->quot * 16)); 630 - } 631 - 632 - calc->quot--; 633 - return 1; 568 + ucon = rd_regl(port, S3C2410_UCON); 569 + ucon &= info->clksel_mask; 570 + return ucon >> info->clksel_shift; 634 571 } 635 572 636 - static unsigned int s3c24xx_serial_getclk(struct uart_port *port, 637 - struct s3c24xx_uart_clksrc **clksrc, 638 - struct clk **clk, 639 - unsigned int baud) 573 + static void s3c24xx_serial_setsource(struct uart_port *port, 574 + unsigned int clk_sel) 640 575 { 641 - struct s3c2410_uartcfg *cfg = s3c24xx_port_to_cfg(port); 642 - struct s3c24xx_uart_clksrc *clkp; 643 - struct baud_calc res[MAX_CLKS]; 644 - struct baud_calc *resptr, *best, *sptr; 645 - int i; 576 + struct s3c24xx_uart_info *info = s3c24xx_port_to_info(port); 577 + unsigned int ucon; 646 578 647 - clkp = cfg->clocks; 648 - best = NULL; 579 + if (info->num_clks == 1) 580 + return; 649 581 650 - if (cfg->clocks_size < 2) { 651 - if (cfg->clocks_size == 0) 652 - clkp = &tmp_clksrc; 582 + ucon = rd_regl(port, S3C2410_UCON); 583 + if ((ucon & info->clksel_mask) >> info->clksel_shift == clk_sel) 584 + return; 653 585 654 - /* check to see if we're sourcing fclk, and if so we're 655 - * going to have to update the clock source 656 - */ 586 + ucon &= ~info->clksel_mask; 587 + ucon |= clk_sel << info->clksel_shift; 588 + wr_regl(port, S3C2410_UCON, ucon); 589 + } 657 590 658 - if (strcmp(clkp->name, "fclk") == 0) { 659 - struct s3c24xx_uart_clksrc src; 591 + static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport, 592 + unsigned int req_baud, struct clk **best_clk, 593 + unsigned int *clk_num) 594 + { 595 + struct s3c24xx_uart_info *info = ourport->info; 596 + struct clk *clk; 597 + unsigned long rate; 598 + unsigned int cnt, baud, quot, clk_sel, best_quot = 0; 599 + char clkname[MAX_CLK_NAME_LENGTH]; 600 + int calc_deviation, deviation = (1 << 30) - 1; 660 601 661 - s3c24xx_serial_getsource(port, &src); 602 + *best_clk = NULL; 603 + clk_sel = (ourport->cfg->clk_sel) ? ourport->cfg->clk_sel : 604 + ourport->info->def_clk_sel; 605 + for (cnt = 0; cnt < info->num_clks; cnt++) { 606 + if (!(clk_sel & (1 << cnt))) 607 + continue; 662 608 663 - /* check that the port already using fclk, and if 664 - * not, then re-select fclk 609 + sprintf(clkname, "clk_uart_baud%d", cnt); 610 + clk = clk_get(ourport->port.dev, clkname); 611 + if (IS_ERR_OR_NULL(clk)) 612 + continue; 613 + 614 + rate = clk_get_rate(clk); 615 + if (!rate) 616 + continue; 617 + 618 + if (ourport->info->has_divslot) { 619 + unsigned long div = rate / req_baud; 620 + 621 + /* The UDIVSLOT register on the newer UARTs allows us to 622 + * get a divisor adjustment of 1/16th on the baud clock. 623 + * 624 + * We don't keep the UDIVSLOT value (the 16ths we 625 + * calculated by not multiplying the baud by 16) as it 626 + * is easy enough to recalculate. 665 627 */ 666 628 667 - if (strcmp(src.name, clkp->name) == 0) { 668 - s3c24xx_serial_setsource(port, clkp); 669 - s3c24xx_serial_getsource(port, &src); 670 - } 671 - 672 - clkp->divisor = src.divisor; 629 + quot = div / 16; 630 + baud = rate / div; 631 + } else { 632 + quot = (rate + (8 * req_baud)) / (16 * req_baud); 633 + baud = rate / (quot * 16); 673 634 } 635 + quot--; 674 636 675 - s3c24xx_serial_calcbaud(res, port, clkp, baud); 676 - best = res; 677 - resptr = best + 1; 678 - } else { 679 - resptr = res; 637 + calc_deviation = req_baud - baud; 638 + if (calc_deviation < 0) 639 + calc_deviation = -calc_deviation; 680 640 681 - for (i = 0; i < cfg->clocks_size; i++, clkp++) { 682 - if (s3c24xx_serial_calcbaud(resptr, port, clkp, baud)) 683 - resptr++; 684 - } 685 - } 686 - 687 - /* ok, we now need to select the best clock we found */ 688 - 689 - if (!best) { 690 - unsigned int deviation = (1<<30)|((1<<30)-1); 691 - int calc_deviation; 692 - 693 - for (sptr = res; sptr < resptr; sptr++) { 694 - calc_deviation = baud - sptr->calc; 695 - if (calc_deviation < 0) 696 - calc_deviation = -calc_deviation; 697 - 698 - if (calc_deviation < deviation) { 699 - best = sptr; 700 - deviation = calc_deviation; 701 - } 641 + if (calc_deviation < deviation) { 642 + *best_clk = clk; 643 + best_quot = quot; 644 + *clk_num = cnt; 645 + deviation = calc_deviation; 702 646 } 703 647 } 704 648 705 - /* store results to pass back */ 706 - 707 - *clksrc = best->clksrc; 708 - *clk = best->src; 709 - 710 - return best->quot; 649 + return best_quot; 711 650 } 712 651 713 652 /* udivslot_table[] ··· 684 735 { 685 736 struct s3c2410_uartcfg *cfg = s3c24xx_port_to_cfg(port); 686 737 struct s3c24xx_uart_port *ourport = to_ourport(port); 687 - struct s3c24xx_uart_clksrc *clksrc = NULL; 688 738 struct clk *clk = NULL; 689 739 unsigned long flags; 690 - unsigned int baud, quot; 740 + unsigned int baud, quot, clk_sel = 0; 691 741 unsigned int ulcon; 692 742 unsigned int umcon; 693 743 unsigned int udivslot = 0; ··· 702 754 */ 703 755 704 756 baud = uart_get_baud_rate(port, termios, old, 0, 115200*8); 705 - 757 + quot = s3c24xx_serial_getclk(ourport, baud, &clk, &clk_sel); 706 758 if (baud == 38400 && (port->flags & UPF_SPD_MASK) == UPF_SPD_CUST) 707 759 quot = port->custom_divisor; 708 - else 709 - quot = s3c24xx_serial_getclk(port, &clksrc, &clk, baud); 760 + if (!clk) 761 + return; 710 762 711 763 /* check to see if we need to change clock source */ 712 764 713 - if (ourport->clksrc != clksrc || ourport->baudclk != clk) { 714 - dbg("selecting clock %p\n", clk); 715 - s3c24xx_serial_setsource(port, clksrc); 765 + if (ourport->baudclk != clk) { 766 + s3c24xx_serial_setsource(port, clk_sel); 716 767 717 768 if (ourport->baudclk != NULL && !IS_ERR(ourport->baudclk)) { 718 769 clk_disable(ourport->baudclk); ··· 720 773 721 774 clk_enable(clk); 722 775 723 - ourport->clksrc = clksrc; 724 776 ourport->baudclk = clk; 725 777 ourport->baudclk_rate = clk ? clk_get_rate(clk) : 0; 726 778 } ··· 966 1020 967 1021 /* s3c24xx_serial_resetport 968 1022 * 969 - * wrapper to call the specific reset for this port (reset the fifos 970 - * and the settings) 1023 + * reset the fifos and other the settings. 971 1024 */ 972 1025 973 - static inline int s3c24xx_serial_resetport(struct uart_port *port, 974 - struct s3c2410_uartcfg *cfg) 1026 + static void s3c24xx_serial_resetport(struct uart_port *port, 1027 + struct s3c2410_uartcfg *cfg) 975 1028 { 976 1029 struct s3c24xx_uart_info *info = s3c24xx_port_to_info(port); 1030 + unsigned long ucon = rd_regl(port, S3C2410_UCON); 1031 + unsigned int ucon_mask; 977 1032 978 - return (info->reset_port)(port, cfg); 1033 + ucon_mask = info->clksel_mask; 1034 + if (info->type == PORT_S3C2440) 1035 + ucon_mask |= S3C2440_UCON0_DIVMASK; 1036 + 1037 + ucon &= ucon_mask; 1038 + wr_regl(port, S3C2410_UCON, ucon | cfg->ucon); 1039 + 1040 + /* reset both fifos */ 1041 + wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH); 1042 + wr_regl(port, S3C2410_UFCON, cfg->ufcon); 1043 + 1044 + /* some delay is required after fifo reset */ 1045 + udelay(1); 979 1046 } 980 1047 981 1048 ··· 1080 1121 */ 1081 1122 1082 1123 static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, 1083 - struct s3c24xx_uart_info *info, 1084 1124 struct platform_device *platdev) 1085 1125 { 1086 1126 struct uart_port *port = &ourport->port; 1087 - struct s3c2410_uartcfg *cfg; 1127 + struct s3c2410_uartcfg *cfg = ourport->cfg; 1088 1128 struct resource *res; 1089 1129 int ret; 1090 1130 ··· 1092 1134 if (platdev == NULL) 1093 1135 return -ENODEV; 1094 1136 1095 - cfg = s3c24xx_dev_to_cfg(&platdev->dev); 1096 - 1097 1137 if (port->mapbase != 0) 1098 1138 return 0; 1099 1139 1100 - if (cfg->hwport > CONFIG_SERIAL_SAMSUNG_UARTS) { 1101 - printk(KERN_ERR "%s: port %d bigger than %d\n", __func__, 1102 - cfg->hwport, CONFIG_SERIAL_SAMSUNG_UARTS); 1103 - return -ERANGE; 1104 - } 1105 - 1106 1140 /* setup info for port */ 1107 1141 port->dev = &platdev->dev; 1108 - ourport->info = info; 1109 1142 1110 1143 /* Startup sequence is different for s3c64xx and higher SoC's */ 1111 1144 if (s3c24xx_serial_has_interrupt_mask(port)) 1112 1145 s3c24xx_serial_ops.startup = s3c64xx_serial_startup; 1113 - 1114 - /* copy the info in from provided structure */ 1115 - ourport->port.fifosize = info->fifosize; 1116 - 1117 - dbg("s3c24xx_serial_init_port: %p (hw %d)...\n", port, cfg->hwport); 1118 1146 1119 1147 port->uartclk = 1; 1120 1148 ··· 1159 1215 struct uart_port *port = s3c24xx_dev_to_port(dev); 1160 1216 struct s3c24xx_uart_port *ourport = to_ourport(port); 1161 1217 1162 - return snprintf(buf, PAGE_SIZE, "* %s\n", ourport->clksrc->name); 1218 + return snprintf(buf, PAGE_SIZE, "* %s\n", ourport->baudclk->name); 1163 1219 } 1164 1220 1165 1221 static DEVICE_ATTR(clock_source, S_IRUGO, s3c24xx_serial_show_clksrc, NULL); 1166 1222 1223 + 1167 1224 /* Device driver serial port probe */ 1168 1225 1226 + static const struct of_device_id s3c24xx_uart_dt_match[]; 1169 1227 static int probe_index; 1170 1228 1171 - int s3c24xx_serial_probe(struct platform_device *dev, 1172 - struct s3c24xx_uart_info *info) 1229 + static inline struct s3c24xx_serial_drv_data *s3c24xx_get_driver_data( 1230 + struct platform_device *pdev) 1231 + { 1232 + #ifdef CONFIG_OF 1233 + if (pdev->dev.of_node) { 1234 + const struct of_device_id *match; 1235 + match = of_match_node(s3c24xx_uart_dt_match, pdev->dev.of_node); 1236 + return (struct s3c24xx_serial_drv_data *)match->data; 1237 + } 1238 + #endif 1239 + return (struct s3c24xx_serial_drv_data *) 1240 + platform_get_device_id(pdev)->driver_data; 1241 + } 1242 + 1243 + static int s3c24xx_serial_probe(struct platform_device *pdev) 1173 1244 { 1174 1245 struct s3c24xx_uart_port *ourport; 1175 1246 int ret; 1176 1247 1177 - dbg("s3c24xx_serial_probe(%p, %p) %d\n", dev, info, probe_index); 1248 + dbg("s3c24xx_serial_probe(%p) %d\n", pdev, probe_index); 1178 1249 1179 1250 ourport = &s3c24xx_serial_ports[probe_index]; 1251 + 1252 + ourport->drv_data = s3c24xx_get_driver_data(pdev); 1253 + if (!ourport->drv_data) { 1254 + dev_err(&pdev->dev, "could not find driver data\n"); 1255 + return -ENODEV; 1256 + } 1257 + 1258 + ourport->info = ourport->drv_data->info; 1259 + ourport->cfg = (pdev->dev.platform_data) ? 1260 + (struct s3c2410_uartcfg *)pdev->dev.platform_data : 1261 + ourport->drv_data->def_cfg; 1262 + 1263 + ourport->port.fifosize = (ourport->info->fifosize) ? 1264 + ourport->info->fifosize : 1265 + ourport->drv_data->fifosize[probe_index]; 1266 + 1180 1267 probe_index++; 1181 1268 1182 1269 dbg("%s: initialising port %p...\n", __func__, ourport); 1183 1270 1184 - ret = s3c24xx_serial_init_port(ourport, info, dev); 1271 + ret = s3c24xx_serial_init_port(ourport, pdev); 1185 1272 if (ret < 0) 1186 1273 goto probe_err; 1187 1274 1188 1275 dbg("%s: adding port\n", __func__); 1189 1276 uart_add_one_port(&s3c24xx_uart_drv, &ourport->port); 1190 - platform_set_drvdata(dev, &ourport->port); 1277 + platform_set_drvdata(pdev, &ourport->port); 1191 1278 1192 - ret = device_create_file(&dev->dev, &dev_attr_clock_source); 1279 + ret = device_create_file(&pdev->dev, &dev_attr_clock_source); 1193 1280 if (ret < 0) 1194 - printk(KERN_ERR "%s: failed to add clksrc attr.\n", __func__); 1281 + dev_err(&pdev->dev, "failed to add clock source attr.\n"); 1195 1282 1196 1283 ret = s3c24xx_serial_cpufreq_register(ourport); 1197 1284 if (ret < 0) 1198 - dev_err(&dev->dev, "failed to add cpufreq notifier\n"); 1285 + dev_err(&pdev->dev, "failed to add cpufreq notifier\n"); 1199 1286 1200 1287 return 0; 1201 1288 ··· 1234 1259 return ret; 1235 1260 } 1236 1261 1237 - EXPORT_SYMBOL_GPL(s3c24xx_serial_probe); 1238 - 1239 - int __devexit s3c24xx_serial_remove(struct platform_device *dev) 1262 + static int __devexit s3c24xx_serial_remove(struct platform_device *dev) 1240 1263 { 1241 1264 struct uart_port *port = s3c24xx_dev_to_port(&dev->dev); 1242 1265 ··· 1246 1273 1247 1274 return 0; 1248 1275 } 1249 - 1250 - EXPORT_SYMBOL_GPL(s3c24xx_serial_remove); 1251 1276 1252 1277 /* UART power management code */ 1253 1278 #ifdef CONFIG_PM_SLEEP ··· 1285 1314 1286 1315 #define SERIAL_SAMSUNG_PM_OPS NULL 1287 1316 #endif /* CONFIG_PM_SLEEP */ 1288 - 1289 - int s3c24xx_serial_init(struct platform_driver *drv, 1290 - struct s3c24xx_uart_info *info) 1291 - { 1292 - dbg("s3c24xx_serial_init(%p,%p)\n", drv, info); 1293 - 1294 - drv->driver.pm = SERIAL_SAMSUNG_PM_OPS; 1295 - 1296 - return platform_driver_register(drv); 1297 - } 1298 - 1299 - EXPORT_SYMBOL_GPL(s3c24xx_serial_init); 1300 - 1301 - /* module initialisation code */ 1302 - 1303 - static int __init s3c24xx_serial_modinit(void) 1304 - { 1305 - int ret; 1306 - 1307 - ret = uart_register_driver(&s3c24xx_uart_drv); 1308 - if (ret < 0) { 1309 - printk(KERN_ERR "failed to register UART driver\n"); 1310 - return -1; 1311 - } 1312 - 1313 - return 0; 1314 - } 1315 - 1316 - static void __exit s3c24xx_serial_modexit(void) 1317 - { 1318 - uart_unregister_driver(&s3c24xx_uart_drv); 1319 - } 1320 - 1321 - module_init(s3c24xx_serial_modinit); 1322 - module_exit(s3c24xx_serial_modexit); 1323 1317 1324 1318 /* Console code */ 1325 1319 ··· 1331 1395 s3c24xx_serial_get_options(struct uart_port *port, int *baud, 1332 1396 int *parity, int *bits) 1333 1397 { 1334 - struct s3c24xx_uart_clksrc clksrc; 1335 1398 struct clk *clk; 1336 1399 unsigned int ulcon; 1337 1400 unsigned int ucon; 1338 1401 unsigned int ubrdiv; 1339 1402 unsigned long rate; 1403 + unsigned int clk_sel; 1404 + char clk_name[MAX_CLK_NAME_LENGTH]; 1340 1405 1341 1406 ulcon = rd_regl(port, S3C2410_ULCON); 1342 1407 ucon = rd_regl(port, S3C2410_UCON); ··· 1382 1445 1383 1446 /* now calculate the baud rate */ 1384 1447 1385 - s3c24xx_serial_getsource(port, &clksrc); 1448 + clk_sel = s3c24xx_serial_getsource(port); 1449 + sprintf(clk_name, "clk_uart_baud%d", clk_sel); 1386 1450 1387 - clk = clk_get(port->dev, clksrc.name); 1451 + clk = clk_get(port->dev, clk_name); 1388 1452 if (!IS_ERR(clk) && clk != NULL) 1389 - rate = clk_get_rate(clk) / clksrc.divisor; 1453 + rate = clk_get_rate(clk); 1390 1454 else 1391 1455 rate = 1; 1392 - 1393 1456 1394 1457 *baud = rate / (16 * (ubrdiv + 1)); 1395 1458 dbg("calculated baud %d\n", *baud); 1396 1459 } 1397 1460 1398 - } 1399 - 1400 - /* s3c24xx_serial_init_ports 1401 - * 1402 - * initialise the serial ports from the machine provided initialisation 1403 - * data. 1404 - */ 1405 - 1406 - static int s3c24xx_serial_init_ports(struct s3c24xx_uart_info **info) 1407 - { 1408 - struct s3c24xx_uart_port *ptr = s3c24xx_serial_ports; 1409 - struct platform_device **platdev_ptr; 1410 - int i; 1411 - 1412 - dbg("s3c24xx_serial_init_ports: initialising ports...\n"); 1413 - 1414 - platdev_ptr = s3c24xx_uart_devs; 1415 - 1416 - for (i = 0; i < CONFIG_SERIAL_SAMSUNG_UARTS; i++, ptr++, platdev_ptr++) { 1417 - s3c24xx_serial_init_port(ptr, info[i], *platdev_ptr); 1418 - } 1419 - 1420 - return 0; 1421 1461 } 1422 1462 1423 1463 static int __init ··· 1440 1526 return uart_set_options(port, co, baud, parity, bits, flow); 1441 1527 } 1442 1528 1443 - /* s3c24xx_serial_initconsole 1444 - * 1445 - * initialise the console from one of the uart drivers 1446 - */ 1447 - 1448 1529 static struct console s3c24xx_serial_console = { 1449 1530 .name = S3C24XX_SERIAL_NAME, 1450 1531 .device = uart_console_device, ··· 1449 1540 .setup = s3c24xx_serial_console_setup, 1450 1541 .data = &s3c24xx_uart_drv, 1451 1542 }; 1452 - 1453 - int s3c24xx_serial_initconsole(struct platform_driver *drv, 1454 - struct s3c24xx_uart_info **info) 1455 - 1456 - { 1457 - struct platform_device *dev = s3c24xx_uart_devs[0]; 1458 - 1459 - dbg("s3c24xx_serial_initconsole\n"); 1460 - 1461 - /* select driver based on the cpu */ 1462 - 1463 - if (dev == NULL) { 1464 - printk(KERN_ERR "s3c24xx: no devices for console init\n"); 1465 - return 0; 1466 - } 1467 - 1468 - if (strcmp(dev->name, drv->driver.name) != 0) 1469 - return 0; 1470 - 1471 - s3c24xx_serial_console.data = &s3c24xx_uart_drv; 1472 - s3c24xx_serial_init_ports(info); 1473 - 1474 - register_console(&s3c24xx_serial_console); 1475 - return 0; 1476 - } 1477 - 1478 1543 #endif /* CONFIG_SERIAL_SAMSUNG_CONSOLE */ 1479 1544 1545 + #ifdef CONFIG_CPU_S3C2410 1546 + static struct s3c24xx_serial_drv_data s3c2410_serial_drv_data = { 1547 + .info = &(struct s3c24xx_uart_info) { 1548 + .name = "Samsung S3C2410 UART", 1549 + .type = PORT_S3C2410, 1550 + .fifosize = 16, 1551 + .rx_fifomask = S3C2410_UFSTAT_RXMASK, 1552 + .rx_fifoshift = S3C2410_UFSTAT_RXSHIFT, 1553 + .rx_fifofull = S3C2410_UFSTAT_RXFULL, 1554 + .tx_fifofull = S3C2410_UFSTAT_TXFULL, 1555 + .tx_fifomask = S3C2410_UFSTAT_TXMASK, 1556 + .tx_fifoshift = S3C2410_UFSTAT_TXSHIFT, 1557 + .def_clk_sel = S3C2410_UCON_CLKSEL0, 1558 + .num_clks = 2, 1559 + .clksel_mask = S3C2410_UCON_CLKMASK, 1560 + .clksel_shift = S3C2410_UCON_CLKSHIFT, 1561 + }, 1562 + .def_cfg = &(struct s3c2410_uartcfg) { 1563 + .ucon = S3C2410_UCON_DEFAULT, 1564 + .ufcon = S3C2410_UFCON_DEFAULT, 1565 + }, 1566 + }; 1567 + #define S3C2410_SERIAL_DRV_DATA ((kernel_ulong_t)&s3c2410_serial_drv_data) 1568 + #else 1569 + #define S3C2410_SERIAL_DRV_DATA (kernel_ulong_t)NULL 1570 + #endif 1571 + 1572 + #ifdef CONFIG_CPU_S3C2412 1573 + static struct s3c24xx_serial_drv_data s3c2412_serial_drv_data = { 1574 + .info = &(struct s3c24xx_uart_info) { 1575 + .name = "Samsung S3C2412 UART", 1576 + .type = PORT_S3C2412, 1577 + .fifosize = 64, 1578 + .has_divslot = 1, 1579 + .rx_fifomask = S3C2440_UFSTAT_RXMASK, 1580 + .rx_fifoshift = S3C2440_UFSTAT_RXSHIFT, 1581 + .rx_fifofull = S3C2440_UFSTAT_RXFULL, 1582 + .tx_fifofull = S3C2440_UFSTAT_TXFULL, 1583 + .tx_fifomask = S3C2440_UFSTAT_TXMASK, 1584 + .tx_fifoshift = S3C2440_UFSTAT_TXSHIFT, 1585 + .def_clk_sel = S3C2410_UCON_CLKSEL2, 1586 + .num_clks = 4, 1587 + .clksel_mask = S3C2412_UCON_CLKMASK, 1588 + .clksel_shift = S3C2412_UCON_CLKSHIFT, 1589 + }, 1590 + .def_cfg = &(struct s3c2410_uartcfg) { 1591 + .ucon = S3C2410_UCON_DEFAULT, 1592 + .ufcon = S3C2410_UFCON_DEFAULT, 1593 + }, 1594 + }; 1595 + #define S3C2412_SERIAL_DRV_DATA ((kernel_ulong_t)&s3c2412_serial_drv_data) 1596 + #else 1597 + #define S3C2412_SERIAL_DRV_DATA (kernel_ulong_t)NULL 1598 + #endif 1599 + 1600 + #if defined(CONFIG_CPU_S3C2440) || defined(CONFIG_CPU_S3C2416) || \ 1601 + defined(CONFIG_CPU_S3C2443) 1602 + static struct s3c24xx_serial_drv_data s3c2440_serial_drv_data = { 1603 + .info = &(struct s3c24xx_uart_info) { 1604 + .name = "Samsung S3C2440 UART", 1605 + .type = PORT_S3C2440, 1606 + .fifosize = 64, 1607 + .has_divslot = 1, 1608 + .rx_fifomask = S3C2440_UFSTAT_RXMASK, 1609 + .rx_fifoshift = S3C2440_UFSTAT_RXSHIFT, 1610 + .rx_fifofull = S3C2440_UFSTAT_RXFULL, 1611 + .tx_fifofull = S3C2440_UFSTAT_TXFULL, 1612 + .tx_fifomask = S3C2440_UFSTAT_TXMASK, 1613 + .tx_fifoshift = S3C2440_UFSTAT_TXSHIFT, 1614 + .def_clk_sel = S3C2410_UCON_CLKSEL2, 1615 + .num_clks = 4, 1616 + .clksel_mask = S3C2412_UCON_CLKMASK, 1617 + .clksel_shift = S3C2412_UCON_CLKSHIFT, 1618 + }, 1619 + .def_cfg = &(struct s3c2410_uartcfg) { 1620 + .ucon = S3C2410_UCON_DEFAULT, 1621 + .ufcon = S3C2410_UFCON_DEFAULT, 1622 + }, 1623 + }; 1624 + #define S3C2440_SERIAL_DRV_DATA ((kernel_ulong_t)&s3c2440_serial_drv_data) 1625 + #else 1626 + #define S3C2440_SERIAL_DRV_DATA (kernel_ulong_t)NULL 1627 + #endif 1628 + 1629 + #if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410) || \ 1630 + defined(CONFIG_CPU_S5P6440) || defined(CONFIG_CPU_S5P6450) || \ 1631 + defined(CONFIG_CPU_S5PC100) 1632 + static struct s3c24xx_serial_drv_data s3c6400_serial_drv_data = { 1633 + .info = &(struct s3c24xx_uart_info) { 1634 + .name = "Samsung S3C6400 UART", 1635 + .type = PORT_S3C6400, 1636 + .fifosize = 64, 1637 + .has_divslot = 1, 1638 + .rx_fifomask = S3C2440_UFSTAT_RXMASK, 1639 + .rx_fifoshift = S3C2440_UFSTAT_RXSHIFT, 1640 + .rx_fifofull = S3C2440_UFSTAT_RXFULL, 1641 + .tx_fifofull = S3C2440_UFSTAT_TXFULL, 1642 + .tx_fifomask = S3C2440_UFSTAT_TXMASK, 1643 + .tx_fifoshift = S3C2440_UFSTAT_TXSHIFT, 1644 + .def_clk_sel = S3C2410_UCON_CLKSEL2, 1645 + .num_clks = 4, 1646 + .clksel_mask = S3C6400_UCON_CLKMASK, 1647 + .clksel_shift = S3C6400_UCON_CLKSHIFT, 1648 + }, 1649 + .def_cfg = &(struct s3c2410_uartcfg) { 1650 + .ucon = S3C2410_UCON_DEFAULT, 1651 + .ufcon = S3C2410_UFCON_DEFAULT, 1652 + }, 1653 + }; 1654 + #define S3C6400_SERIAL_DRV_DATA ((kernel_ulong_t)&s3c6400_serial_drv_data) 1655 + #else 1656 + #define S3C6400_SERIAL_DRV_DATA (kernel_ulong_t)NULL 1657 + #endif 1658 + 1659 + #ifdef CONFIG_CPU_S5PV210 1660 + static struct s3c24xx_serial_drv_data s5pv210_serial_drv_data = { 1661 + .info = &(struct s3c24xx_uart_info) { 1662 + .name = "Samsung S5PV210 UART", 1663 + .type = PORT_S3C6400, 1664 + .has_divslot = 1, 1665 + .rx_fifomask = S5PV210_UFSTAT_RXMASK, 1666 + .rx_fifoshift = S5PV210_UFSTAT_RXSHIFT, 1667 + .rx_fifofull = S5PV210_UFSTAT_RXFULL, 1668 + .tx_fifofull = S5PV210_UFSTAT_TXFULL, 1669 + .tx_fifomask = S5PV210_UFSTAT_TXMASK, 1670 + .tx_fifoshift = S5PV210_UFSTAT_TXSHIFT, 1671 + .def_clk_sel = S3C2410_UCON_CLKSEL0, 1672 + .num_clks = 2, 1673 + .clksel_mask = S5PV210_UCON_CLKMASK, 1674 + .clksel_shift = S5PV210_UCON_CLKSHIFT, 1675 + }, 1676 + .def_cfg = &(struct s3c2410_uartcfg) { 1677 + .ucon = S5PV210_UCON_DEFAULT, 1678 + .ufcon = S5PV210_UFCON_DEFAULT, 1679 + }, 1680 + .fifosize = { 256, 64, 16, 16 }, 1681 + }; 1682 + #define S5PV210_SERIAL_DRV_DATA ((kernel_ulong_t)&s5pv210_serial_drv_data) 1683 + #else 1684 + #define S5PV210_SERIAL_DRV_DATA (kernel_ulong_t)NULL 1685 + #endif 1686 + 1687 + #ifdef CONFIG_CPU_EXYNOS4210 1688 + static struct s3c24xx_serial_drv_data exynos4210_serial_drv_data = { 1689 + .info = &(struct s3c24xx_uart_info) { 1690 + .name = "Samsung Exynos4 UART", 1691 + .type = PORT_S3C6400, 1692 + .has_divslot = 1, 1693 + .rx_fifomask = S5PV210_UFSTAT_RXMASK, 1694 + .rx_fifoshift = S5PV210_UFSTAT_RXSHIFT, 1695 + .rx_fifofull = S5PV210_UFSTAT_RXFULL, 1696 + .tx_fifofull = S5PV210_UFSTAT_TXFULL, 1697 + .tx_fifomask = S5PV210_UFSTAT_TXMASK, 1698 + .tx_fifoshift = S5PV210_UFSTAT_TXSHIFT, 1699 + .def_clk_sel = S3C2410_UCON_CLKSEL0, 1700 + .num_clks = 1, 1701 + .clksel_mask = 0, 1702 + .clksel_shift = 0, 1703 + }, 1704 + .def_cfg = &(struct s3c2410_uartcfg) { 1705 + .ucon = S5PV210_UCON_DEFAULT, 1706 + .ufcon = S5PV210_UFCON_DEFAULT, 1707 + .has_fracval = 1, 1708 + }, 1709 + .fifosize = { 256, 64, 16, 16 }, 1710 + }; 1711 + #define EXYNOS4210_SERIAL_DRV_DATA ((kernel_ulong_t)&exynos4210_serial_drv_data) 1712 + #else 1713 + #define EXYNOS4210_SERIAL_DRV_DATA (kernel_ulong_t)NULL 1714 + #endif 1715 + 1716 + static struct platform_device_id s3c24xx_serial_driver_ids[] = { 1717 + { 1718 + .name = "s3c2410-uart", 1719 + .driver_data = S3C2410_SERIAL_DRV_DATA, 1720 + }, { 1721 + .name = "s3c2412-uart", 1722 + .driver_data = S3C2412_SERIAL_DRV_DATA, 1723 + }, { 1724 + .name = "s3c2440-uart", 1725 + .driver_data = S3C2440_SERIAL_DRV_DATA, 1726 + }, { 1727 + .name = "s3c6400-uart", 1728 + .driver_data = S3C6400_SERIAL_DRV_DATA, 1729 + }, { 1730 + .name = "s5pv210-uart", 1731 + .driver_data = S5PV210_SERIAL_DRV_DATA, 1732 + }, { 1733 + .name = "exynos4210-uart", 1734 + .driver_data = EXYNOS4210_SERIAL_DRV_DATA, 1735 + }, 1736 + { }, 1737 + }; 1738 + MODULE_DEVICE_TABLE(platform, s3c24xx_serial_driver_ids); 1739 + 1740 + #ifdef CONFIG_OF 1741 + static const struct of_device_id s3c24xx_uart_dt_match[] = { 1742 + { .compatible = "samsung,exynos4210-uart", 1743 + .data = (void *)EXYNOS4210_SERIAL_DRV_DATA }, 1744 + {}, 1745 + }; 1746 + MODULE_DEVICE_TABLE(of, s3c24xx_uart_dt_match); 1747 + #else 1748 + #define s3c24xx_uart_dt_match NULL 1749 + #endif 1750 + 1751 + static struct platform_driver samsung_serial_driver = { 1752 + .probe = s3c24xx_serial_probe, 1753 + .remove = __devexit_p(s3c24xx_serial_remove), 1754 + .id_table = s3c24xx_serial_driver_ids, 1755 + .driver = { 1756 + .name = "samsung-uart", 1757 + .owner = THIS_MODULE, 1758 + .pm = SERIAL_SAMSUNG_PM_OPS, 1759 + .of_match_table = s3c24xx_uart_dt_match, 1760 + }, 1761 + }; 1762 + 1763 + /* module initialisation code */ 1764 + 1765 + static int __init s3c24xx_serial_modinit(void) 1766 + { 1767 + int ret; 1768 + 1769 + ret = uart_register_driver(&s3c24xx_uart_drv); 1770 + if (ret < 0) { 1771 + printk(KERN_ERR "failed to register UART driver\n"); 1772 + return -1; 1773 + } 1774 + 1775 + return platform_driver_register(&samsung_serial_driver); 1776 + } 1777 + 1778 + static void __exit s3c24xx_serial_modexit(void) 1779 + { 1780 + uart_unregister_driver(&s3c24xx_uart_drv); 1781 + } 1782 + 1783 + module_init(s3c24xx_serial_modinit); 1784 + module_exit(s3c24xx_serial_modexit); 1785 + 1786 + MODULE_ALIAS("platform:samsung-uart"); 1480 1787 MODULE_DESCRIPTION("Samsung SoC Serial port driver"); 1481 1788 MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>"); 1482 1789 MODULE_LICENSE("GPL v2");
+14 -18
drivers/tty/serial/samsung.h
··· 19 19 unsigned long tx_fifomask; 20 20 unsigned long tx_fifoshift; 21 21 unsigned long tx_fifofull; 22 + unsigned int def_clk_sel; 23 + unsigned long num_clks; 24 + unsigned long clksel_mask; 25 + unsigned long clksel_shift; 22 26 23 27 /* uart port features */ 24 28 25 29 unsigned int has_divslot:1; 26 30 27 - /* clock source control */ 28 - 29 - int (*get_clksrc)(struct uart_port *, struct s3c24xx_uart_clksrc *clk); 30 - int (*set_clksrc)(struct uart_port *, struct s3c24xx_uart_clksrc *clk); 31 - 32 31 /* uart controls */ 33 32 int (*reset_port)(struct uart_port *, struct s3c2410_uartcfg *); 33 + }; 34 + 35 + struct s3c24xx_serial_drv_data { 36 + struct s3c24xx_uart_info *info; 37 + struct s3c2410_uartcfg *def_cfg; 38 + unsigned int fifosize[CONFIG_SERIAL_SAMSUNG_UARTS]; 34 39 }; 35 40 36 41 struct s3c24xx_uart_port { ··· 48 43 unsigned int tx_irq; 49 44 50 45 struct s3c24xx_uart_info *info; 51 - struct s3c24xx_uart_clksrc *clksrc; 52 46 struct clk *clk; 53 47 struct clk *baudclk; 54 48 struct uart_port port; 49 + struct s3c24xx_serial_drv_data *drv_data; 50 + 51 + /* reference to platform data */ 52 + struct s3c2410_uartcfg *cfg; 55 53 56 54 #ifdef CONFIG_CPU_FREQ 57 55 struct notifier_block freq_transition; ··· 64 56 /* conversion functions */ 65 57 66 58 #define s3c24xx_dev_to_port(__dev) (struct uart_port *)dev_get_drvdata(__dev) 67 - #define s3c24xx_dev_to_cfg(__dev) (struct s3c2410_uartcfg *)((__dev)->platform_data) 68 59 69 60 /* register access controls */ 70 61 ··· 75 68 76 69 #define wr_regb(port, reg, val) __raw_writeb(val, portaddr(port, reg)) 77 70 #define wr_regl(port, reg, val) __raw_writel(val, portaddr(port, reg)) 78 - 79 - extern int s3c24xx_serial_probe(struct platform_device *dev, 80 - struct s3c24xx_uart_info *uart); 81 - 82 - extern int __devexit s3c24xx_serial_remove(struct platform_device *dev); 83 - 84 - extern int s3c24xx_serial_initconsole(struct platform_driver *drv, 85 - struct s3c24xx_uart_info **uart); 86 - 87 - extern int s3c24xx_serial_init(struct platform_driver *drv, 88 - struct s3c24xx_uart_info *info); 89 71 90 72 #ifdef CONFIG_SERIAL_SAMSUNG_DEBUG 91 73
+5 -10
include/linux/amba/pl330.h
··· 12 12 #ifndef __AMBA_PL330_H_ 13 13 #define __AMBA_PL330_H_ 14 14 15 + #include <linux/dmaengine.h> 15 16 #include <asm/hardware/pl330.h> 16 - 17 - struct dma_pl330_peri { 18 - /* 19 - * Peri_Req i/f of the DMAC that is 20 - * peripheral could be reached from. 21 - */ 22 - u8 peri_id; /* specific dma id */ 23 - enum pl330_reqtype rqtype; 24 - }; 25 17 26 18 struct dma_pl330_platdata { 27 19 /* ··· 25 33 */ 26 34 u8 nr_valid_peri; 27 35 /* Array of valid peripherals */ 28 - struct dma_pl330_peri *peri; 36 + u8 *peri_id; 37 + /* Operational capabilities */ 38 + dma_cap_mask_t cap_mask; 29 39 /* Bytes to allocate for MC buffer */ 30 40 unsigned mcbuf_sz; 31 41 }; 32 42 43 + extern bool pl330_filter(struct dma_chan *chan, void *param); 33 44 #endif /* __AMBA_PL330_H_ */