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

Merge branch 'next/dt-samsung' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung into next/dt

From Kukjin Kim <kgene.kim@samsung.com>:

It is for supporting spi dt for exynos4210 and exynos5250, and got the
ack from Grant Likely for spi driver.

Note: Since this is including spi driver changes, so it was made based
on next/devel-dma-ops which touches same file, Samsung spi driver for
avoiding bad conflicts.

* 'next/dt-samsung' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung:
ARM: dts: Add nodes for spi controllers for SAMSUNG EXYNOS5 platforms
ARM: EXYNOS: Enable platform support for SPI controllers for EXYNOS5
ARM: EXYNOS: Add spi clock support for EXYNOS5
ARM: dts: Add nodes for spi controllers for SAMSUNG EXYNOS4 platforms
ARM: EXYNOS: Enable platform support for SPI controllers for EXYNOX4
ARM: EXYNOS: Fix the incorrect hierarchy of spi controller bus clock
ARM: EXYNOS: Add device tree node for EXYNOS4 interrupt combiner controller
spi: s3c64xx: add device tree support
spi: s3c64xx: Remove the 'set_level' callback from controller data
ARM: SAMSUNG: Modify s3c64xx_spi{0|1|2}_set_platdata function
ARM: SAMSUNG: Remove pdev pointer parameter from spi gpio setup functions
spi: s3c64xx: move controller information into driver data
spi: s3c64xx: remove unused S3C64XX_SPI_ST_TRLCNTZ macro
ARM: S3C64XX: Add a new dma request id for device tree based dma channel lookup

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

+956 -329
+113
Documentation/devicetree/bindings/spi/spi-samsung.txt
··· 1 + * Samsung SPI Controller 2 + 3 + The Samsung SPI controller is used to interface with various devices such as flash 4 + and display controllers using the SPI communication interface. 5 + 6 + Required SoC Specific Properties: 7 + 8 + - compatible: should be one of the following. 9 + - samsung,s3c2443-spi: for s3c2443, s3c2416 and s3c2450 platforms 10 + - samsung,s3c6410-spi: for s3c6410 platforms 11 + - samsung,s5p6440-spi: for s5p6440 and s5p6450 platforms 12 + - samsung,s5pv210-spi: for s5pv210 and s5pc110 platforms 13 + - samsung,exynos4210-spi: for exynos4 and exynos5 platforms 14 + 15 + - reg: physical base address of the controller and length of memory mapped 16 + region. 17 + 18 + - interrupts: The interrupt number to the cpu. The interrupt specifier format 19 + depends on the interrupt controller. 20 + 21 + - tx-dma-channel: The dma channel specifier for tx operations. The format of 22 + the dma specifier depends on the dma controller. 23 + 24 + - rx-dma-channel: The dma channel specifier for rx operations. The format of 25 + the dma specifier depends on the dma controller. 26 + 27 + Required Board Specific Properties: 28 + 29 + - #address-cells: should be 1. 30 + - #size-cells: should be 0. 31 + - gpios: The gpio specifier for clock, mosi and miso interface lines (in the 32 + order specified). The format of the gpio specifier depends on the gpio 33 + controller. 34 + 35 + Optional Board Specific Properties: 36 + 37 + - samsung,spi-src-clk: If the spi controller includes a internal clock mux to 38 + select the clock source for the spi bus clock, this property can be used to 39 + indicate the clock to be used for driving the spi bus clock. If not specified, 40 + the clock number 0 is used as default. 41 + 42 + - num-cs: Specifies the number of chip select lines supported. If 43 + not specified, the default number of chip select lines is set to 1. 44 + 45 + SPI Controller specific data in SPI slave nodes: 46 + 47 + - The spi slave nodes should provide the following information which is required 48 + by the spi controller. 49 + 50 + - cs-gpio: A gpio specifier that specifies the gpio line used as 51 + the slave select line by the spi controller. The format of the gpio 52 + specifier depends on the gpio controller. 53 + 54 + - samsung,spi-feedback-delay: The sampling phase shift to be applied on the 55 + miso line (to account for any lag in the miso line). The following are the 56 + valid values. 57 + 58 + - 0: No phase shift. 59 + - 1: 90 degree phase shift sampling. 60 + - 2: 180 degree phase shift sampling. 61 + - 3: 270 degree phase shift sampling. 62 + 63 + Aliases: 64 + 65 + - All the SPI controller nodes should be represented in the aliases node using 66 + the following format 'spi{n}' where n is a unique number for the alias. 67 + 68 + 69 + Example: 70 + 71 + - SoC Specific Portion: 72 + 73 + spi_0: spi@12d20000 { 74 + compatible = "samsung,exynos4210-spi"; 75 + reg = <0x12d20000 0x100>; 76 + interrupts = <0 66 0>; 77 + tx-dma-channel = <&pdma0 5>; 78 + rx-dma-channel = <&pdma0 4>; 79 + }; 80 + 81 + - Board Specific Portion: 82 + 83 + spi_0: spi@12d20000 { 84 + #address-cells = <1>; 85 + #size-cells = <0>; 86 + gpios = <&gpa2 4 2 3 0>, 87 + <&gpa2 6 2 3 0>, 88 + <&gpa2 7 2 3 0>; 89 + 90 + w25q80bw@0 { 91 + #address-cells = <1>; 92 + #size-cells = <1>; 93 + compatible = "w25x80"; 94 + reg = <0>; 95 + spi-max-frequency = <10000>; 96 + 97 + controller-data { 98 + cs-gpio = <&gpa2 5 1 0 3>; 99 + samsung,spi-feedback-delay = <0>; 100 + }; 101 + 102 + partition@0 { 103 + label = "U-Boot"; 104 + reg = <0x0 0x40000>; 105 + read-only; 106 + }; 107 + 108 + partition@40000 { 109 + label = "Kernel"; 110 + reg = <0x40000 0xc0000>; 111 + }; 112 + }; 113 + };
+12
arch/arm/boot/dts/exynos4210-origen.dts
··· 134 134 i2c@138D0000 { 135 135 status = "disabled"; 136 136 }; 137 + 138 + spi_0: spi@13920000 { 139 + status = "disabled"; 140 + }; 141 + 142 + spi_1: spi@13930000 { 143 + status = "disabled"; 144 + }; 145 + 146 + spi_2: spi@13940000 { 147 + status = "disabled"; 148 + }; 137 149 };
+38
arch/arm/boot/dts/exynos4210-smdkv310.dts
··· 179 179 i2c@138D0000 { 180 180 status = "disabled"; 181 181 }; 182 + 183 + spi_0: spi@13920000 { 184 + status = "disabled"; 185 + }; 186 + 187 + spi_1: spi@13930000 { 188 + status = "disabled"; 189 + }; 190 + 191 + spi_2: spi@13940000 { 192 + gpios = <&gpc1 1 5 3 0>, 193 + <&gpc1 3 5 3 0>, 194 + <&gpc1 4 5 3 0>; 195 + 196 + w25x80@0 { 197 + #address-cells = <1>; 198 + #size-cells = <1>; 199 + compatible = "w25x80"; 200 + reg = <0>; 201 + spi-max-frequency = <1000000>; 202 + 203 + controller-data { 204 + cs-gpio = <&gpc1 2 1 0 3>; 205 + samsung,spi-feedback-delay = <0>; 206 + }; 207 + 208 + partition@0 { 209 + label = "U-Boot"; 210 + reg = <0x0 0x40000>; 211 + read-only; 212 + }; 213 + 214 + partition@40000 { 215 + label = "Kernel"; 216 + reg = <0x40000 0xc0000>; 217 + }; 218 + }; 219 + }; 182 220 };
+47
arch/arm/boot/dts/exynos4210.dtsi
··· 25 25 compatible = "samsung,exynos4210"; 26 26 interrupt-parent = <&gic>; 27 27 28 + aliases { 29 + spi0 = &spi_0; 30 + spi1 = &spi_1; 31 + spi2 = &spi_2; 32 + }; 33 + 28 34 gic:interrupt-controller@10490000 { 29 35 compatible = "arm,cortex-a9-gic"; 30 36 #interrupt-cells = <3>; 31 37 interrupt-controller; 32 38 cpu-offset = <0x8000>; 33 39 reg = <0x10490000 0x1000>, <0x10480000 0x100>; 40 + }; 41 + 42 + combiner:interrupt-controller@10440000 { 43 + compatible = "samsung,exynos4210-combiner"; 44 + #interrupt-cells = <2>; 45 + interrupt-controller; 46 + reg = <0x10440000 0x1000>; 47 + interrupts = <0 0 0>, <0 1 0>, <0 2 0>, <0 3 0>, 48 + <0 4 0>, <0 5 0>, <0 6 0>, <0 7 0>, 49 + <0 8 0>, <0 9 0>, <0 10 0>, <0 11 0>, 50 + <0 12 0>, <0 13 0>, <0 14 0>, <0 15 0>; 34 51 }; 35 52 36 53 watchdog@10060000 { ··· 162 145 compatible = "samsung,s3c2440-i2c"; 163 146 reg = <0x138D0000 0x100>; 164 147 interrupts = <0 65 0>; 148 + }; 149 + 150 + spi_0: spi@13920000 { 151 + compatible = "samsung,exynos4210-spi"; 152 + reg = <0x13920000 0x100>; 153 + interrupts = <0 66 0>; 154 + tx-dma-channel = <&pdma0 7>; 155 + rx-dma-channel = <&pdma0 6>; 156 + #address-cells = <1>; 157 + #size-cells = <0>; 158 + }; 159 + 160 + spi_1: spi@13930000 { 161 + compatible = "samsung,exynos4210-spi"; 162 + reg = <0x13930000 0x100>; 163 + interrupts = <0 67 0>; 164 + tx-dma-channel = <&pdma1 7>; 165 + rx-dma-channel = <&pdma1 6>; 166 + #address-cells = <1>; 167 + #size-cells = <0>; 168 + }; 169 + 170 + spi_2: spi@13940000 { 171 + compatible = "samsung,exynos4210-spi"; 172 + reg = <0x13940000 0x100>; 173 + interrupts = <0 68 0>; 174 + tx-dma-channel = <&pdma0 9>; 175 + rx-dma-channel = <&pdma0 8>; 176 + #address-cells = <1>; 177 + #size-cells = <0>; 165 178 }; 166 179 167 180 amba {
+38
arch/arm/boot/dts/exynos5250-smdk5250.dts
··· 71 71 i2c@12CD0000 { 72 72 status = "disabled"; 73 73 }; 74 + 75 + spi_0: spi@12d20000 { 76 + status = "disabled"; 77 + }; 78 + 79 + spi_1: spi@12d30000 { 80 + gpios = <&gpa2 4 2 3 0>, 81 + <&gpa2 6 2 3 0>, 82 + <&gpa2 7 2 3 0>; 83 + 84 + w25q80bw@0 { 85 + #address-cells = <1>; 86 + #size-cells = <1>; 87 + compatible = "w25x80"; 88 + reg = <0>; 89 + spi-max-frequency = <1000000>; 90 + 91 + controller-data { 92 + cs-gpio = <&gpa2 5 1 0 3>; 93 + samsung,spi-feedback-delay = <0>; 94 + }; 95 + 96 + partition@0 { 97 + label = "U-Boot"; 98 + reg = <0x0 0x40000>; 99 + read-only; 100 + }; 101 + 102 + partition@40000 { 103 + label = "Kernel"; 104 + reg = <0x40000 0xc0000>; 105 + }; 106 + }; 107 + }; 108 + 109 + spi_2: spi@12d40000 { 110 + status = "disabled"; 111 + }; 74 112 };
+36
arch/arm/boot/dts/exynos5250.dtsi
··· 23 23 compatible = "samsung,exynos5250"; 24 24 interrupt-parent = <&gic>; 25 25 26 + aliases { 27 + spi0 = &spi_0; 28 + spi1 = &spi_1; 29 + spi2 = &spi_2; 30 + }; 31 + 26 32 gic:interrupt-controller@10481000 { 27 33 compatible = "arm,cortex-a9-gic"; 28 34 #interrupt-cells = <3>; ··· 148 142 compatible = "samsung,s3c2440-i2c"; 149 143 reg = <0x12CD0000 0x100>; 150 144 interrupts = <0 63 0>; 145 + #address-cells = <1>; 146 + #size-cells = <0>; 147 + }; 148 + 149 + spi_0: spi@12d20000 { 150 + compatible = "samsung,exynos4210-spi"; 151 + reg = <0x12d20000 0x100>; 152 + interrupts = <0 66 0>; 153 + tx-dma-channel = <&pdma0 5>; 154 + rx-dma-channel = <&pdma0 4>; 155 + #address-cells = <1>; 156 + #size-cells = <0>; 157 + }; 158 + 159 + spi_1: spi@12d30000 { 160 + compatible = "samsung,exynos4210-spi"; 161 + reg = <0x12d30000 0x100>; 162 + interrupts = <0 67 0>; 163 + tx-dma-channel = <&pdma1 5>; 164 + rx-dma-channel = <&pdma1 4>; 165 + #address-cells = <1>; 166 + #size-cells = <0>; 167 + }; 168 + 169 + spi_2: spi@12d40000 { 170 + compatible = "samsung,exynos4210-spi"; 171 + reg = <0x12d40000 0x100>; 172 + interrupts = <0 68 0>; 173 + tx-dma-channel = <&pdma0 7>; 174 + rx-dma-channel = <&pdma0 6>; 151 175 #address-cells = <1>; 152 176 #size-cells = <0>; 153 177 };
+51 -22
arch/arm/mach-exynos/clock-exynos4.c
··· 586 586 .ctrlbit = (1 << 13), 587 587 }, { 588 588 .name = "spi", 589 - .devname = "s3c64xx-spi.0", 589 + .devname = "exynos4210-spi.0", 590 590 .enable = exynos4_clk_ip_peril_ctrl, 591 591 .ctrlbit = (1 << 16), 592 592 }, { 593 593 .name = "spi", 594 - .devname = "s3c64xx-spi.1", 594 + .devname = "exynos4210-spi.1", 595 595 .enable = exynos4_clk_ip_peril_ctrl, 596 596 .ctrlbit = (1 << 17), 597 597 }, { 598 598 .name = "spi", 599 - .devname = "s3c64xx-spi.2", 599 + .devname = "exynos4210-spi.2", 600 600 .enable = exynos4_clk_ip_peril_ctrl, 601 601 .ctrlbit = (1 << 18), 602 602 }, { ··· 1242 1242 .reg_div = { .reg = EXYNOS4_CLKDIV_FSYS2, .shift = 24, .size = 8 }, 1243 1243 }; 1244 1244 1245 - static struct clksrc_clk exynos4_clk_sclk_spi0 = { 1245 + static struct clksrc_clk exynos4_clk_mdout_spi0 = { 1246 1246 .clk = { 1247 - .name = "sclk_spi", 1248 - .devname = "s3c64xx-spi.0", 1249 - .enable = exynos4_clksrc_mask_peril1_ctrl, 1250 - .ctrlbit = (1 << 16), 1247 + .name = "mdout_spi", 1248 + .devname = "exynos4210-spi.0", 1251 1249 }, 1252 1250 .sources = &exynos4_clkset_group, 1253 1251 .reg_src = { .reg = EXYNOS4_CLKSRC_PERIL1, .shift = 16, .size = 4 }, 1254 1252 .reg_div = { .reg = EXYNOS4_CLKDIV_PERIL1, .shift = 0, .size = 4 }, 1255 1253 }; 1256 1254 1257 - static struct clksrc_clk exynos4_clk_sclk_spi1 = { 1255 + static struct clksrc_clk exynos4_clk_mdout_spi1 = { 1258 1256 .clk = { 1259 - .name = "sclk_spi", 1260 - .devname = "s3c64xx-spi.1", 1261 - .enable = exynos4_clksrc_mask_peril1_ctrl, 1262 - .ctrlbit = (1 << 20), 1257 + .name = "mdout_spi", 1258 + .devname = "exynos4210-spi.1", 1263 1259 }, 1264 1260 .sources = &exynos4_clkset_group, 1265 1261 .reg_src = { .reg = EXYNOS4_CLKSRC_PERIL1, .shift = 20, .size = 4 }, 1266 1262 .reg_div = { .reg = EXYNOS4_CLKDIV_PERIL1, .shift = 16, .size = 4 }, 1267 1263 }; 1268 1264 1269 - static struct clksrc_clk exynos4_clk_sclk_spi2 = { 1265 + static struct clksrc_clk exynos4_clk_mdout_spi2 = { 1270 1266 .clk = { 1271 - .name = "sclk_spi", 1272 - .devname = "s3c64xx-spi.2", 1273 - .enable = exynos4_clksrc_mask_peril1_ctrl, 1274 - .ctrlbit = (1 << 24), 1267 + .name = "mdout_spi", 1268 + .devname = "exynos4210-spi.2", 1275 1269 }, 1276 1270 .sources = &exynos4_clkset_group, 1277 1271 .reg_src = { .reg = EXYNOS4_CLKSRC_PERIL1, .shift = 24, .size = 4 }, 1278 1272 .reg_div = { .reg = EXYNOS4_CLKDIV_PERIL2, .shift = 0, .size = 4 }, 1273 + }; 1274 + 1275 + static struct clksrc_clk exynos4_clk_sclk_spi0 = { 1276 + .clk = { 1277 + .name = "sclk_spi", 1278 + .devname = "exynos4210-spi.0", 1279 + .parent = &exynos4_clk_mdout_spi0.clk, 1280 + .enable = exynos4_clksrc_mask_peril1_ctrl, 1281 + .ctrlbit = (1 << 16), 1282 + }, 1283 + .reg_div = { .reg = EXYNOS4_CLKDIV_PERIL1, .shift = 8, .size = 8 }, 1284 + }; 1285 + 1286 + static struct clksrc_clk exynos4_clk_sclk_spi1 = { 1287 + .clk = { 1288 + .name = "sclk_spi", 1289 + .devname = "exynos4210-spi.1", 1290 + .parent = &exynos4_clk_mdout_spi1.clk, 1291 + .enable = exynos4_clksrc_mask_peril1_ctrl, 1292 + .ctrlbit = (1 << 20), 1293 + }, 1294 + .reg_div = { .reg = EXYNOS4_CLKDIV_PERIL1, .shift = 24, .size = 8 }, 1295 + }; 1296 + 1297 + static struct clksrc_clk exynos4_clk_sclk_spi2 = { 1298 + .clk = { 1299 + .name = "sclk_spi", 1300 + .devname = "exynos4210-spi.2", 1301 + .parent = &exynos4_clk_mdout_spi2.clk, 1302 + .enable = exynos4_clksrc_mask_peril1_ctrl, 1303 + .ctrlbit = (1 << 24), 1304 + }, 1305 + .reg_div = { .reg = EXYNOS4_CLKDIV_PERIL2, .shift = 8, .size = 8 }, 1279 1306 }; 1280 1307 1281 1308 /* Clock initialization code */ ··· 1358 1331 &exynos4_clk_sclk_spi0, 1359 1332 &exynos4_clk_sclk_spi1, 1360 1333 &exynos4_clk_sclk_spi2, 1361 - 1334 + &exynos4_clk_mdout_spi0, 1335 + &exynos4_clk_mdout_spi1, 1336 + &exynos4_clk_mdout_spi2, 1362 1337 }; 1363 1338 1364 1339 static struct clk_lookup exynos4_clk_lookup[] = { ··· 1376 1347 CLKDEV_INIT("dma-pl330.0", "apb_pclk", &exynos4_clk_pdma0), 1377 1348 CLKDEV_INIT("dma-pl330.1", "apb_pclk", &exynos4_clk_pdma1), 1378 1349 CLKDEV_INIT("dma-pl330.2", "apb_pclk", &exynos4_clk_mdma1), 1379 - CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk0", &exynos4_clk_sclk_spi0.clk), 1380 - CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk0", &exynos4_clk_sclk_spi1.clk), 1381 - CLKDEV_INIT("s3c64xx-spi.2", "spi_busclk0", &exynos4_clk_sclk_spi2.clk), 1350 + CLKDEV_INIT("exynos4210-spi.0", "spi_busclk0", &exynos4_clk_sclk_spi0.clk), 1351 + CLKDEV_INIT("exynos4210-spi.1", "spi_busclk0", &exynos4_clk_sclk_spi1.clk), 1352 + CLKDEV_INIT("exynos4210-spi.2", "spi_busclk0", &exynos4_clk_sclk_spi2.clk), 1382 1353 }; 1383 1354 1384 1355 static int xtal_rate;
+95
arch/arm/mach-exynos/clock-exynos5.c
··· 131 131 return s5p_gatectrl(EXYNOS5_CLKSRC_MASK_PERIC0, clk, enable); 132 132 } 133 133 134 + static int exynos5_clksrc_mask_peric1_ctrl(struct clk *clk, int enable) 135 + { 136 + return s5p_gatectrl(EXYNOS5_CLKSRC_MASK_PERIC1, clk, enable); 137 + } 138 + 134 139 static int exynos5_clk_ip_acp_ctrl(struct clk *clk, int enable) 135 140 { 136 141 return s5p_gatectrl(EXYNOS5_CLKGATE_IP_ACP, clk, enable); ··· 746 741 .enable = exynos5_clk_ip_peric_ctrl, 747 742 .ctrlbit = (1 << 14), 748 743 }, { 744 + .name = "spi", 745 + .devname = "exynos4210-spi.0", 746 + .parent = &exynos5_clk_aclk_66.clk, 747 + .enable = exynos5_clk_ip_peric_ctrl, 748 + .ctrlbit = (1 << 16), 749 + }, { 750 + .name = "spi", 751 + .devname = "exynos4210-spi.1", 752 + .parent = &exynos5_clk_aclk_66.clk, 753 + .enable = exynos5_clk_ip_peric_ctrl, 754 + .ctrlbit = (1 << 17), 755 + }, { 756 + .name = "spi", 757 + .devname = "exynos4210-spi.2", 758 + .parent = &exynos5_clk_aclk_66.clk, 759 + .enable = exynos5_clk_ip_peric_ctrl, 760 + .ctrlbit = (1 << 18), 761 + }, { 749 762 .name = SYSMMU_CLOCK_NAME, 750 763 .devname = SYSMMU_CLOCK_DEVNAME(mfc_l, 0), 751 764 .enable = &exynos5_clk_ip_mfc_ctrl, ··· 1057 1034 .reg_div = { .reg = EXYNOS5_CLKDIV_FSYS2, .shift = 24, .size = 8 }, 1058 1035 }; 1059 1036 1037 + static struct clksrc_clk exynos5_clk_mdout_spi0 = { 1038 + .clk = { 1039 + .name = "mdout_spi", 1040 + .devname = "exynos4210-spi.0", 1041 + }, 1042 + .sources = &exynos5_clkset_group, 1043 + .reg_src = { .reg = EXYNOS5_CLKSRC_PERIC1, .shift = 16, .size = 4 }, 1044 + .reg_div = { .reg = EXYNOS5_CLKDIV_PERIC1, .shift = 0, .size = 4 }, 1045 + }; 1046 + 1047 + static struct clksrc_clk exynos5_clk_mdout_spi1 = { 1048 + .clk = { 1049 + .name = "mdout_spi", 1050 + .devname = "exynos4210-spi.1", 1051 + }, 1052 + .sources = &exynos5_clkset_group, 1053 + .reg_src = { .reg = EXYNOS5_CLKSRC_PERIC1, .shift = 20, .size = 4 }, 1054 + .reg_div = { .reg = EXYNOS5_CLKDIV_PERIC1, .shift = 16, .size = 4 }, 1055 + }; 1056 + 1057 + static struct clksrc_clk exynos5_clk_mdout_spi2 = { 1058 + .clk = { 1059 + .name = "mdout_spi", 1060 + .devname = "exynos4210-spi.2", 1061 + }, 1062 + .sources = &exynos5_clkset_group, 1063 + .reg_src = { .reg = EXYNOS5_CLKSRC_PERIC1, .shift = 24, .size = 4 }, 1064 + .reg_div = { .reg = EXYNOS5_CLKDIV_PERIC2, .shift = 0, .size = 4 }, 1065 + }; 1066 + 1067 + static struct clksrc_clk exynos5_clk_sclk_spi0 = { 1068 + .clk = { 1069 + .name = "sclk_spi", 1070 + .devname = "exynos4210-spi.0", 1071 + .parent = &exynos5_clk_mdout_spi0.clk, 1072 + .enable = exynos5_clksrc_mask_peric1_ctrl, 1073 + .ctrlbit = (1 << 16), 1074 + }, 1075 + .reg_div = { .reg = EXYNOS5_CLKDIV_PERIC1, .shift = 8, .size = 8 }, 1076 + }; 1077 + 1078 + static struct clksrc_clk exynos5_clk_sclk_spi1 = { 1079 + .clk = { 1080 + .name = "sclk_spi", 1081 + .devname = "exynos4210-spi.1", 1082 + .parent = &exynos5_clk_mdout_spi1.clk, 1083 + .enable = exynos5_clksrc_mask_peric1_ctrl, 1084 + .ctrlbit = (1 << 20), 1085 + }, 1086 + .reg_div = { .reg = EXYNOS5_CLKDIV_PERIC1, .shift = 24, .size = 8 }, 1087 + }; 1088 + 1089 + static struct clksrc_clk exynos5_clk_sclk_spi2 = { 1090 + .clk = { 1091 + .name = "sclk_spi", 1092 + .devname = "exynos4210-spi.2", 1093 + .parent = &exynos5_clk_mdout_spi2.clk, 1094 + .enable = exynos5_clksrc_mask_peric1_ctrl, 1095 + .ctrlbit = (1 << 24), 1096 + }, 1097 + .reg_div = { .reg = EXYNOS5_CLKDIV_PERIC2, .shift = 8, .size = 8 }, 1098 + }; 1099 + 1060 1100 static struct clksrc_clk exynos5_clksrcs[] = { 1061 1101 { 1062 1102 .clk = { ··· 1234 1148 &exynos5_clk_dout_mmc4, 1235 1149 &exynos5_clk_aclk_acp, 1236 1150 &exynos5_clk_pclk_acp, 1151 + &exynos5_clk_sclk_spi0, 1152 + &exynos5_clk_sclk_spi1, 1153 + &exynos5_clk_sclk_spi2, 1154 + &exynos5_clk_mdout_spi0, 1155 + &exynos5_clk_mdout_spi1, 1156 + &exynos5_clk_mdout_spi2, 1237 1157 }; 1238 1158 1239 1159 static struct clk *exynos5_clk_cdev[] = { ··· 1268 1176 CLKDEV_INIT("exynos4-sdhci.1", "mmc_busclk.2", &exynos5_clk_sclk_mmc1.clk), 1269 1177 CLKDEV_INIT("exynos4-sdhci.2", "mmc_busclk.2", &exynos5_clk_sclk_mmc2.clk), 1270 1178 CLKDEV_INIT("exynos4-sdhci.3", "mmc_busclk.2", &exynos5_clk_sclk_mmc3.clk), 1179 + CLKDEV_INIT("exynos4210-spi.0", "spi_busclk0", &exynos5_clk_sclk_spi0.clk), 1180 + CLKDEV_INIT("exynos4210-spi.1", "spi_busclk0", &exynos5_clk_sclk_spi1.clk), 1181 + CLKDEV_INIT("exynos4210-spi.2", "spi_busclk0", &exynos5_clk_sclk_spi2.clk), 1271 1182 CLKDEV_INIT("dma-pl330.0", "apb_pclk", &exynos5_clk_pdma0), 1272 1183 CLKDEV_INIT("dma-pl330.1", "apb_pclk", &exynos5_clk_pdma1), 1273 1184 CLKDEV_INIT("dma-pl330.2", "apb_pclk", &exynos5_clk_mdma1),
+4
arch/arm/mach-exynos/include/mach/irqs.h
··· 195 195 #define IRQ_IIC6 EXYNOS4_IRQ_IIC6 196 196 #define IRQ_IIC7 EXYNOS4_IRQ_IIC7 197 197 198 + #define IRQ_SPI0 EXYNOS4_IRQ_SPI0 199 + #define IRQ_SPI1 EXYNOS4_IRQ_SPI1 200 + #define IRQ_SPI2 EXYNOS4_IRQ_SPI2 201 + 198 202 #define IRQ_USB_HOST EXYNOS4_IRQ_USB_HOST 199 203 #define IRQ_OTG EXYNOS4_IRQ_USB_HSOTG 200 204
+3
arch/arm/mach-exynos/include/mach/map.h
··· 154 154 #define EXYNOS4_PA_SPI0 0x13920000 155 155 #define EXYNOS4_PA_SPI1 0x13930000 156 156 #define EXYNOS4_PA_SPI2 0x13940000 157 + #define EXYNOS5_PA_SPI0 0x12D20000 158 + #define EXYNOS5_PA_SPI1 0x12D30000 159 + #define EXYNOS5_PA_SPI2 0x12D40000 157 160 158 161 #define EXYNOS4_PA_GPIO1 0x11400000 159 162 #define EXYNOS4_PA_GPIO2 0x11000000
+6
arch/arm/mach-exynos/mach-exynos4-dt.c
··· 55 55 "exynos4-sdhci.3", NULL), 56 56 OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS4_PA_IIC(0), 57 57 "s3c2440-i2c.0", NULL), 58 + OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS4_PA_SPI0, 59 + "exynos4210-spi.0", NULL), 60 + OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS4_PA_SPI1, 61 + "exynos4210-spi.1", NULL), 62 + OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS4_PA_SPI2, 63 + "exynos4210-spi.2", NULL), 58 64 OF_DEV_AUXDATA("arm,pl330", EXYNOS4_PA_PDMA0, "dma-pl330.0", NULL), 59 65 OF_DEV_AUXDATA("arm,pl330", EXYNOS4_PA_PDMA1, "dma-pl330.1", NULL), 60 66 {},
+6
arch/arm/mach-exynos/mach-exynos5-dt.c
··· 47 47 "s3c2440-i2c.0", NULL), 48 48 OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS5_PA_IIC(1), 49 49 "s3c2440-i2c.1", NULL), 50 + OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS5_PA_SPI0, 51 + "exynos4210-spi.0", NULL), 52 + OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS5_PA_SPI1, 53 + "exynos4210-spi.1", NULL), 54 + OF_DEV_AUXDATA("samsung,exynos4210-spi", EXYNOS5_PA_SPI2, 55 + "exynos4210-spi.2", NULL), 50 56 OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA0, "dma-pl330.0", NULL), 51 57 OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA1, "dma-pl330.1", NULL), 52 58 OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_MDMA1, "dma-pl330.2", NULL),
+3 -30
arch/arm/mach-exynos/setup-spi.c
··· 9 9 */ 10 10 11 11 #include <linux/gpio.h> 12 - #include <linux/platform_device.h> 13 - 14 12 #include <plat/gpio-cfg.h> 15 - #include <plat/s3c64xx-spi.h> 16 13 17 14 #ifdef CONFIG_S3C64XX_DEV_SPI0 18 - struct s3c64xx_spi_info s3c64xx_spi0_pdata __initdata = { 19 - .fifo_lvl_mask = 0x1ff, 20 - .rx_lvl_offset = 15, 21 - .high_speed = 1, 22 - .clk_from_cmu = true, 23 - .tx_st_done = 25, 24 - }; 25 - 26 - int s3c64xx_spi0_cfg_gpio(struct platform_device *dev) 15 + int s3c64xx_spi0_cfg_gpio(void) 27 16 { 28 17 s3c_gpio_cfgpin(EXYNOS4_GPB(0), S3C_GPIO_SFN(2)); 29 18 s3c_gpio_setpull(EXYNOS4_GPB(0), S3C_GPIO_PULL_UP); ··· 23 34 #endif 24 35 25 36 #ifdef CONFIG_S3C64XX_DEV_SPI1 26 - struct s3c64xx_spi_info s3c64xx_spi1_pdata __initdata = { 27 - .fifo_lvl_mask = 0x7f, 28 - .rx_lvl_offset = 15, 29 - .high_speed = 1, 30 - .clk_from_cmu = true, 31 - .tx_st_done = 25, 32 - }; 33 - 34 - int s3c64xx_spi1_cfg_gpio(struct platform_device *dev) 37 + int s3c64xx_spi1_cfg_gpio(void) 35 38 { 36 39 s3c_gpio_cfgpin(EXYNOS4_GPB(4), S3C_GPIO_SFN(2)); 37 40 s3c_gpio_setpull(EXYNOS4_GPB(4), S3C_GPIO_PULL_UP); ··· 34 53 #endif 35 54 36 55 #ifdef CONFIG_S3C64XX_DEV_SPI2 37 - struct s3c64xx_spi_info s3c64xx_spi2_pdata __initdata = { 38 - .fifo_lvl_mask = 0x7f, 39 - .rx_lvl_offset = 15, 40 - .high_speed = 1, 41 - .clk_from_cmu = true, 42 - .tx_st_done = 25, 43 - }; 44 - 45 - int s3c64xx_spi2_cfg_gpio(struct platform_device *dev) 56 + int s3c64xx_spi2_cfg_gpio(void) 46 57 { 47 58 s3c_gpio_cfgpin(EXYNOS4_GPC1(1), S3C_GPIO_SFN(5)); 48 59 s3c_gpio_setpull(EXYNOS4_GPC1(1), S3C_GPIO_PULL_UP);
+2 -1
arch/arm/mach-s3c24xx/clock-s3c2416.c
··· 144 144 CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.0", &hsmmc0_clk), 145 145 CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &hsmmc_mux0.clk), 146 146 CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &hsmmc_mux1.clk), 147 - CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk2", &hsspi_mux.clk), 147 + /* s3c2443-spi.0 is used on s3c2416 and s3c2450 as well */ 148 + CLKDEV_INIT("s3c2443-spi.0", "spi_busclk2", &hsspi_mux.clk), 148 149 }; 149 150 150 151 void __init s3c2416_init_clocks(int xtal)
+1 -1
arch/arm/mach-s3c24xx/clock-s3c2443.c
··· 181 181 182 182 static struct clk_lookup s3c2443_clk_lookup[] = { 183 183 CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_hsmmc), 184 - CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk2", &clk_hsspi.clk), 184 + CLKDEV_INIT("s3c2443-spi.0", "spi_busclk2", &clk_hsspi.clk), 185 185 }; 186 186 187 187 void __init s3c2443_init_clocks(int xtal)
+2 -2
arch/arm/mach-s3c24xx/common-s3c2443.c
··· 559 559 560 560 static struct clk hsspi_clk = { 561 561 .name = "spi", 562 - .devname = "s3c64xx-spi.0", 562 + .devname = "s3c2443-spi.0", 563 563 .parent = &clk_p, 564 564 .enable = s3c2443_clkcon_enable_p, 565 565 .ctrlbit = S3C2443_PCLKCON_HSSPI, ··· 633 633 CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p), 634 634 CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_esys_uart.clk), 635 635 CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.0", &hsmmc1_clk), 636 - CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk0", &hsspi_clk), 636 + CLKDEV_INIT("s3c2443-spi.0", "spi_busclk0", &hsspi_clk), 637 637 }; 638 638 639 639 void __init s3c2443_common_init_clocks(int xtal, pll_fn get_mpll,
+1 -9
arch/arm/mach-s3c24xx/setup-spi.c
··· 13 13 #include <linux/platform_device.h> 14 14 15 15 #include <plat/gpio-cfg.h> 16 - #include <plat/s3c64xx-spi.h> 17 16 18 17 #include <mach/hardware.h> 19 18 #include <mach/regs-gpio.h> 20 19 21 20 #ifdef CONFIG_S3C64XX_DEV_SPI0 22 - struct s3c64xx_spi_info s3c64xx_spi0_pdata __initdata = { 23 - .fifo_lvl_mask = 0x7f, 24 - .rx_lvl_offset = 13, 25 - .tx_st_done = 21, 26 - .high_speed = 1, 27 - }; 28 - 29 - int s3c64xx_spi0_cfg_gpio(struct platform_device *pdev) 21 + int s3c64xx_spi0_cfg_gpio(void) 30 22 { 31 23 /* enable hsspi bit in misccr */ 32 24 s3c2410_modify_misccr(S3C2416_MISCCR_HSSPI_EN2, 1);
+10 -10
arch/arm/mach-s3c64xx/clock.c
··· 178 178 .ctrlbit = S3C_CLKCON_PCLK_KEYPAD, 179 179 }, { 180 180 .name = "spi", 181 - .devname = "s3c64xx-spi.0", 181 + .devname = "s3c6410-spi.0", 182 182 .parent = &clk_p, 183 183 .enable = s3c64xx_pclk_ctrl, 184 184 .ctrlbit = S3C_CLKCON_PCLK_SPI0, 185 185 }, { 186 186 .name = "spi", 187 - .devname = "s3c64xx-spi.1", 187 + .devname = "s3c6410-spi.1", 188 188 .parent = &clk_p, 189 189 .enable = s3c64xx_pclk_ctrl, 190 190 .ctrlbit = S3C_CLKCON_PCLK_SPI1, ··· 331 331 332 332 static struct clk clk_48m_spi0 = { 333 333 .name = "spi_48m", 334 - .devname = "s3c64xx-spi.0", 334 + .devname = "s3c6410-spi.0", 335 335 .parent = &clk_48m, 336 336 .enable = s3c64xx_sclk_ctrl, 337 337 .ctrlbit = S3C_CLKCON_SCLK_SPI0_48, ··· 339 339 340 340 static struct clk clk_48m_spi1 = { 341 341 .name = "spi_48m", 342 - .devname = "s3c64xx-spi.1", 342 + .devname = "s3c6410-spi.1", 343 343 .parent = &clk_48m, 344 344 .enable = s3c64xx_sclk_ctrl, 345 345 .ctrlbit = S3C_CLKCON_SCLK_SPI1_48, ··· 802 802 static struct clksrc_clk clk_sclk_spi0 = { 803 803 .clk = { 804 804 .name = "spi-bus", 805 - .devname = "s3c64xx-spi.0", 805 + .devname = "s3c6410-spi.0", 806 806 .ctrlbit = S3C_CLKCON_SCLK_SPI0, 807 807 .enable = s3c64xx_sclk_ctrl, 808 808 }, ··· 814 814 static struct clksrc_clk clk_sclk_spi1 = { 815 815 .clk = { 816 816 .name = "spi-bus", 817 - .devname = "s3c64xx-spi.1", 817 + .devname = "s3c6410-spi.1", 818 818 .ctrlbit = S3C_CLKCON_SCLK_SPI1, 819 819 .enable = s3c64xx_sclk_ctrl, 820 820 }, ··· 858 858 CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk), 859 859 CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk), 860 860 CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), 861 - CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), 862 - CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk2", &clk_48m_spi0), 863 - CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), 864 - CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk2", &clk_48m_spi1), 861 + CLKDEV_INIT("s3c6410-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), 862 + CLKDEV_INIT("s3c6410-spi.0", "spi_busclk2", &clk_48m_spi0), 863 + CLKDEV_INIT("s3c6410-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), 864 + CLKDEV_INIT("s3c6410-spi.1", "spi_busclk2", &clk_48m_spi1), 865 865 }; 866 866 867 867 #define GET_DIV(clk, field) ((((clk) & field##_MASK) >> field##_SHIFT) + 1)
+1
arch/arm/mach-s3c64xx/include/mach/dma.h
··· 21 21 */ 22 22 enum dma_ch { 23 23 /* DMA0/SDMA0 */ 24 + DMACH_DT_PROP = -1, /* not yet supported, do not use */ 24 25 DMACH_UART0 = 0, 25 26 DMACH_UART0_SRC2, 26 27 DMACH_UART1,
+1 -1
arch/arm/mach-s3c64xx/mach-crag6410.c
··· 799 799 i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1)); 800 800 801 801 samsung_keypad_set_platdata(&crag6410_keypad_data); 802 - s3c64xx_spi0_set_platdata(&s3c64xx_spi0_pdata, 0, 1); 802 + s3c64xx_spi0_set_platdata(NULL, 0, 1); 803 803 804 804 platform_add_devices(crag6410_devices, ARRAY_SIZE(crag6410_devices)); 805 805
+2 -17
arch/arm/mach-s3c64xx/setup-spi.c
··· 9 9 */ 10 10 11 11 #include <linux/gpio.h> 12 - #include <linux/platform_device.h> 13 - 14 12 #include <plat/gpio-cfg.h> 15 - #include <plat/s3c64xx-spi.h> 16 13 17 14 #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) 15 + int s3c64xx_spi0_cfg_gpio(void) 25 16 { 26 17 s3c_gpio_cfgall_range(S3C64XX_GPC(0), 3, 27 18 S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); ··· 21 30 #endif 22 31 23 32 #ifdef CONFIG_S3C64XX_DEV_SPI1 24 - struct s3c64xx_spi_info s3c64xx_spi1_pdata __initdata = { 25 - .fifo_lvl_mask = 0x7f, 26 - .rx_lvl_offset = 13, 27 - .tx_st_done = 21, 28 - }; 29 - 30 - int s3c64xx_spi1_cfg_gpio(struct platform_device *dev) 33 + int s3c64xx_spi1_cfg_gpio(void) 31 34 { 32 35 s3c_gpio_cfgall_range(S3C64XX_GPC(4), 3, 33 36 S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
+6 -6
arch/arm/mach-s5p64x0/clock-s5p6440.c
··· 227 227 .ctrlbit = (1 << 17), 228 228 }, { 229 229 .name = "spi", 230 - .devname = "s3c64xx-spi.0", 230 + .devname = "s5p64x0-spi.0", 231 231 .parent = &clk_pclk_low.clk, 232 232 .enable = s5p64x0_pclk_ctrl, 233 233 .ctrlbit = (1 << 21), 234 234 }, { 235 235 .name = "spi", 236 - .devname = "s3c64xx-spi.1", 236 + .devname = "s5p64x0-spi.1", 237 237 .parent = &clk_pclk_low.clk, 238 238 .enable = s5p64x0_pclk_ctrl, 239 239 .ctrlbit = (1 << 22), ··· 467 467 static struct clksrc_clk clk_sclk_spi0 = { 468 468 .clk = { 469 469 .name = "sclk_spi", 470 - .devname = "s3c64xx-spi.0", 470 + .devname = "s5p64x0-spi.0", 471 471 .ctrlbit = (1 << 20), 472 472 .enable = s5p64x0_sclk_ctrl, 473 473 }, ··· 479 479 static struct clksrc_clk clk_sclk_spi1 = { 480 480 .clk = { 481 481 .name = "sclk_spi", 482 - .devname = "s3c64xx-spi.1", 482 + .devname = "s5p64x0-spi.1", 483 483 .ctrlbit = (1 << 21), 484 484 .enable = s5p64x0_sclk_ctrl, 485 485 }, ··· 519 519 CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_pclk_low.clk), 520 520 CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_sclk_uclk.clk), 521 521 CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), 522 - CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), 523 - CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), 522 + CLKDEV_INIT("s5p64x0-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), 523 + CLKDEV_INIT("s5p64x0-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), 524 524 CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk), 525 525 CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk), 526 526 CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk),
+6 -6
arch/arm/mach-s5p64x0/clock-s5p6450.c
··· 236 236 .ctrlbit = (1 << 17), 237 237 }, { 238 238 .name = "spi", 239 - .devname = "s3c64xx-spi.0", 239 + .devname = "s5p64x0-spi.0", 240 240 .parent = &clk_pclk_low.clk, 241 241 .enable = s5p64x0_pclk_ctrl, 242 242 .ctrlbit = (1 << 21), 243 243 }, { 244 244 .name = "spi", 245 - .devname = "s3c64xx-spi.1", 245 + .devname = "s5p64x0-spi.1", 246 246 .parent = &clk_pclk_low.clk, 247 247 .enable = s5p64x0_pclk_ctrl, 248 248 .ctrlbit = (1 << 22), ··· 528 528 static struct clksrc_clk clk_sclk_spi0 = { 529 529 .clk = { 530 530 .name = "sclk_spi", 531 - .devname = "s3c64xx-spi.0", 531 + .devname = "s5p64x0-spi.0", 532 532 .ctrlbit = (1 << 20), 533 533 .enable = s5p64x0_sclk_ctrl, 534 534 }, ··· 540 540 static struct clksrc_clk clk_sclk_spi1 = { 541 541 .clk = { 542 542 .name = "sclk_spi", 543 - .devname = "s3c64xx-spi.1", 543 + .devname = "s5p64x0-spi.1", 544 544 .ctrlbit = (1 << 21), 545 545 .enable = s5p64x0_sclk_ctrl, 546 546 }, ··· 562 562 CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_pclk_low.clk), 563 563 CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_sclk_uclk.clk), 564 564 CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), 565 - CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), 566 - CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), 565 + CLKDEV_INIT("s5p64x0-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), 566 + CLKDEV_INIT("s5p64x0-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), 567 567 CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk), 568 568 CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk), 569 569 CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk),
+2 -19
arch/arm/mach-s5p64x0/setup-spi.c
··· 9 9 */ 10 10 11 11 #include <linux/gpio.h> 12 - #include <linux/platform_device.h> 13 - #include <linux/io.h> 14 - 15 12 #include <plat/gpio-cfg.h> 16 - #include <plat/cpu.h> 17 - #include <plat/s3c64xx-spi.h> 18 13 19 14 #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) 15 + int s3c64xx_spi0_cfg_gpio(void) 27 16 { 28 17 if (soc_is_s5p6450()) 29 18 s3c_gpio_cfgall_range(S5P6450_GPC(0), 3, ··· 25 36 #endif 26 37 27 38 #ifdef CONFIG_S3C64XX_DEV_SPI1 28 - struct s3c64xx_spi_info s3c64xx_spi1_pdata __initdata = { 29 - .fifo_lvl_mask = 0x7f, 30 - .rx_lvl_offset = 15, 31 - .tx_st_done = 25, 32 - }; 33 - 34 - int s3c64xx_spi1_cfg_gpio(struct platform_device *dev) 39 + int s3c64xx_spi1_cfg_gpio(void) 35 40 { 36 41 if (soc_is_s5p6450()) 37 42 s3c_gpio_cfgall_range(S5P6450_GPC(4), 3,
+15 -15
arch/arm/mach-s5pc100/clock.c
··· 564 564 .ctrlbit = (1 << 5), 565 565 }, { 566 566 .name = "spi", 567 - .devname = "s3c64xx-spi.0", 567 + .devname = "s5pc100-spi.0", 568 568 .parent = &clk_div_d1_bus.clk, 569 569 .enable = s5pc100_d1_4_ctrl, 570 570 .ctrlbit = (1 << 6), 571 571 }, { 572 572 .name = "spi", 573 - .devname = "s3c64xx-spi.1", 573 + .devname = "s5pc100-spi.1", 574 574 .parent = &clk_div_d1_bus.clk, 575 575 .enable = s5pc100_d1_4_ctrl, 576 576 .ctrlbit = (1 << 7), 577 577 }, { 578 578 .name = "spi", 579 - .devname = "s3c64xx-spi.2", 579 + .devname = "s5pc100-spi.2", 580 580 .parent = &clk_div_d1_bus.clk, 581 581 .enable = s5pc100_d1_4_ctrl, 582 582 .ctrlbit = (1 << 8), ··· 702 702 703 703 static struct clk clk_48m_spi0 = { 704 704 .name = "spi_48m", 705 - .devname = "s3c64xx-spi.0", 705 + .devname = "s5pc100-spi.0", 706 706 .parent = &clk_mout_48m.clk, 707 707 .enable = s5pc100_sclk0_ctrl, 708 708 .ctrlbit = (1 << 7), ··· 710 710 711 711 static struct clk clk_48m_spi1 = { 712 712 .name = "spi_48m", 713 - .devname = "s3c64xx-spi.1", 713 + .devname = "s5pc100-spi.1", 714 714 .parent = &clk_mout_48m.clk, 715 715 .enable = s5pc100_sclk0_ctrl, 716 716 .ctrlbit = (1 << 8), ··· 718 718 719 719 static struct clk clk_48m_spi2 = { 720 720 .name = "spi_48m", 721 - .devname = "s3c64xx-spi.2", 721 + .devname = "s5pc100-spi.2", 722 722 .parent = &clk_mout_48m.clk, 723 723 .enable = s5pc100_sclk0_ctrl, 724 724 .ctrlbit = (1 << 9), ··· 1085 1085 static struct clksrc_clk clk_sclk_spi0 = { 1086 1086 .clk = { 1087 1087 .name = "sclk_spi", 1088 - .devname = "s3c64xx-spi.0", 1088 + .devname = "s5pc100-spi.0", 1089 1089 .ctrlbit = (1 << 4), 1090 1090 .enable = s5pc100_sclk0_ctrl, 1091 1091 }, ··· 1097 1097 static struct clksrc_clk clk_sclk_spi1 = { 1098 1098 .clk = { 1099 1099 .name = "sclk_spi", 1100 - .devname = "s3c64xx-spi.1", 1100 + .devname = "s5pc100-spi.1", 1101 1101 .ctrlbit = (1 << 5), 1102 1102 .enable = s5pc100_sclk0_ctrl, 1103 1103 }, ··· 1109 1109 static struct clksrc_clk clk_sclk_spi2 = { 1110 1110 .clk = { 1111 1111 .name = "sclk_spi", 1112 - .devname = "s3c64xx-spi.2", 1112 + .devname = "s5pc100-spi.2", 1113 1113 .ctrlbit = (1 << 6), 1114 1114 .enable = s5pc100_sclk0_ctrl, 1115 1115 }, ··· 1315 1315 CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk), 1316 1316 CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk), 1317 1317 CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), 1318 - CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_48m_spi0), 1319 - CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk2", &clk_sclk_spi0.clk), 1320 - CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_48m_spi1), 1321 - CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk2", &clk_sclk_spi1.clk), 1322 - CLKDEV_INIT("s3c64xx-spi.2", "spi_busclk1", &clk_48m_spi2), 1323 - CLKDEV_INIT("s3c64xx-spi.2", "spi_busclk2", &clk_sclk_spi2.clk), 1318 + CLKDEV_INIT("s5pc100-spi.0", "spi_busclk1", &clk_48m_spi0), 1319 + CLKDEV_INIT("s5pc100-spi.0", "spi_busclk2", &clk_sclk_spi0.clk), 1320 + CLKDEV_INIT("s5pc100-spi.1", "spi_busclk1", &clk_48m_spi1), 1321 + CLKDEV_INIT("s5pc100-spi.1", "spi_busclk2", &clk_sclk_spi1.clk), 1322 + CLKDEV_INIT("s5pc100-spi.2", "spi_busclk1", &clk_48m_spi2), 1323 + CLKDEV_INIT("s5pc100-spi.2", "spi_busclk2", &clk_sclk_spi2.clk), 1324 1324 }; 1325 1325 1326 1326 void __init s5pc100_register_clocks(void)
+3 -27
arch/arm/mach-s5pc100/setup-spi.c
··· 9 9 */ 10 10 11 11 #include <linux/gpio.h> 12 - #include <linux/platform_device.h> 13 - 14 12 #include <plat/gpio-cfg.h> 15 - #include <plat/s3c64xx-spi.h> 16 13 17 14 #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) 15 + int s3c64xx_spi0_cfg_gpio(void) 26 16 { 27 17 s3c_gpio_cfgall_range(S5PC100_GPB(0), 3, 28 18 S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); ··· 21 31 #endif 22 32 23 33 #ifdef CONFIG_S3C64XX_DEV_SPI1 24 - struct s3c64xx_spi_info s3c64xx_spi1_pdata __initdata = { 25 - .fifo_lvl_mask = 0x7f, 26 - .rx_lvl_offset = 13, 27 - .high_speed = 1, 28 - .tx_st_done = 21, 29 - }; 30 - 31 - int s3c64xx_spi1_cfg_gpio(struct platform_device *dev) 34 + int s3c64xx_spi1_cfg_gpio(void) 32 35 { 33 36 s3c_gpio_cfgall_range(S5PC100_GPB(4), 3, 34 37 S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); ··· 30 47 #endif 31 48 32 49 #ifdef CONFIG_S3C64XX_DEV_SPI2 33 - struct s3c64xx_spi_info s3c64xx_spi2_pdata __initdata = { 34 - .fifo_lvl_mask = 0x7f, 35 - .rx_lvl_offset = 13, 36 - .high_speed = 1, 37 - .tx_st_done = 21, 38 - }; 39 - 40 - int s3c64xx_spi2_cfg_gpio(struct platform_device *dev) 50 + int s3c64xx_spi2_cfg_gpio(void) 41 51 { 42 52 s3c_gpio_cfgpin(S5PC100_GPG3(0), S3C_GPIO_SFN(3)); 43 53 s3c_gpio_setpull(S5PC100_GPG3(0), S3C_GPIO_PULL_UP);
+7 -7
arch/arm/mach-s5pv210/clock.c
··· 445 445 .ctrlbit = (1 << 11), 446 446 }, { 447 447 .name = "spi", 448 - .devname = "s3c64xx-spi.0", 448 + .devname = "s5pv210-spi.0", 449 449 .parent = &clk_pclk_psys.clk, 450 450 .enable = s5pv210_clk_ip3_ctrl, 451 451 .ctrlbit = (1<<12), 452 452 }, { 453 453 .name = "spi", 454 - .devname = "s3c64xx-spi.1", 454 + .devname = "s5pv210-spi.1", 455 455 .parent = &clk_pclk_psys.clk, 456 456 .enable = s5pv210_clk_ip3_ctrl, 457 457 .ctrlbit = (1<<13), 458 458 }, { 459 459 .name = "spi", 460 - .devname = "s3c64xx-spi.2", 460 + .devname = "s5pv210-spi.2", 461 461 .parent = &clk_pclk_psys.clk, 462 462 .enable = s5pv210_clk_ip3_ctrl, 463 463 .ctrlbit = (1<<14), ··· 1035 1035 static struct clksrc_clk clk_sclk_spi0 = { 1036 1036 .clk = { 1037 1037 .name = "sclk_spi", 1038 - .devname = "s3c64xx-spi.0", 1038 + .devname = "s5pv210-spi.0", 1039 1039 .enable = s5pv210_clk_mask0_ctrl, 1040 1040 .ctrlbit = (1 << 16), 1041 1041 }, ··· 1047 1047 static struct clksrc_clk clk_sclk_spi1 = { 1048 1048 .clk = { 1049 1049 .name = "sclk_spi", 1050 - .devname = "s3c64xx-spi.1", 1050 + .devname = "s5pv210-spi.1", 1051 1051 .enable = s5pv210_clk_mask0_ctrl, 1052 1052 .ctrlbit = (1 << 17), 1053 1053 }, ··· 1331 1331 CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk), 1332 1332 CLKDEV_INIT("s3c-sdhci.3", "mmc_busclk.2", &clk_sclk_mmc3.clk), 1333 1333 CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), 1334 - CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), 1335 - CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), 1334 + CLKDEV_INIT("s5pv210-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), 1335 + CLKDEV_INIT("s5pv210-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), 1336 1336 }; 1337 1337 1338 1338 void __init s5pv210_register_clocks(void)
+2 -19
arch/arm/mach-s5pv210/setup-spi.c
··· 9 9 */ 10 10 11 11 #include <linux/gpio.h> 12 - #include <linux/platform_device.h> 13 - 14 12 #include <plat/gpio-cfg.h> 15 - #include <plat/s3c64xx-spi.h> 16 13 17 14 #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) 15 + int s3c64xx_spi0_cfg_gpio(void) 26 16 { 27 17 s3c_gpio_cfgpin(S5PV210_GPB(0), S3C_GPIO_SFN(2)); 28 18 s3c_gpio_setpull(S5PV210_GPB(0), S3C_GPIO_PULL_UP); ··· 23 33 #endif 24 34 25 35 #ifdef CONFIG_S3C64XX_DEV_SPI1 26 - struct s3c64xx_spi_info s3c64xx_spi1_pdata = { 27 - .fifo_lvl_mask = 0x7f, 28 - .rx_lvl_offset = 15, 29 - .high_speed = 1, 30 - .tx_st_done = 25, 31 - }; 32 - 33 - int s3c64xx_spi1_cfg_gpio(struct platform_device *dev) 36 + int s3c64xx_spi1_cfg_gpio(void) 34 37 { 35 38 s3c_gpio_cfgpin(S5PV210_GPB(4), S3C_GPIO_SFN(2)); 36 39 s3c_gpio_setpull(S5PV210_GPB(4), S3C_GPIO_PULL_UP);
+23 -37
arch/arm/plat-samsung/devs.c
··· 1512 1512 }; 1513 1513 1514 1514 struct platform_device s3c64xx_device_spi0 = { 1515 - .name = "s3c64xx-spi", 1515 + .name = "s3c6410-spi", 1516 1516 .id = 0, 1517 1517 .num_resources = ARRAY_SIZE(s3c64xx_spi0_resource), 1518 1518 .resource = s3c64xx_spi0_resource, ··· 1522 1522 }, 1523 1523 }; 1524 1524 1525 - void __init s3c64xx_spi0_set_platdata(struct s3c64xx_spi_info *pd, 1526 - int src_clk_nr, int num_cs) 1525 + void __init s3c64xx_spi0_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, 1526 + int num_cs) 1527 1527 { 1528 - if (!pd) { 1529 - pr_err("%s:Need to pass platform data\n", __func__); 1530 - return; 1531 - } 1528 + struct s3c64xx_spi_info pd; 1532 1529 1533 1530 /* Reject invalid configuration */ 1534 1531 if (!num_cs || src_clk_nr < 0) { ··· 1533 1536 return; 1534 1537 } 1535 1538 1536 - pd->num_cs = num_cs; 1537 - pd->src_clk_nr = src_clk_nr; 1538 - if (!pd->cfg_gpio) 1539 - pd->cfg_gpio = s3c64xx_spi0_cfg_gpio; 1539 + pd.num_cs = num_cs; 1540 + pd.src_clk_nr = src_clk_nr; 1541 + pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi0_cfg_gpio; 1540 1542 1541 - s3c_set_platdata(pd, sizeof(*pd), &s3c64xx_device_spi0); 1543 + s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi0); 1542 1544 } 1543 1545 #endif /* CONFIG_S3C64XX_DEV_SPI0 */ 1544 1546 ··· 1550 1554 }; 1551 1555 1552 1556 struct platform_device s3c64xx_device_spi1 = { 1553 - .name = "s3c64xx-spi", 1557 + .name = "s3c6410-spi", 1554 1558 .id = 1, 1555 1559 .num_resources = ARRAY_SIZE(s3c64xx_spi1_resource), 1556 1560 .resource = s3c64xx_spi1_resource, ··· 1560 1564 }, 1561 1565 }; 1562 1566 1563 - void __init s3c64xx_spi1_set_platdata(struct s3c64xx_spi_info *pd, 1564 - int src_clk_nr, int num_cs) 1567 + void __init s3c64xx_spi1_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, 1568 + int num_cs) 1565 1569 { 1566 - if (!pd) { 1567 - pr_err("%s:Need to pass platform data\n", __func__); 1568 - return; 1569 - } 1570 - 1571 1570 /* Reject invalid configuration */ 1572 1571 if (!num_cs || src_clk_nr < 0) { 1573 1572 pr_err("%s: Invalid SPI configuration\n", __func__); 1574 1573 return; 1575 1574 } 1576 1575 1577 - pd->num_cs = num_cs; 1578 - pd->src_clk_nr = src_clk_nr; 1579 - if (!pd->cfg_gpio) 1580 - pd->cfg_gpio = s3c64xx_spi1_cfg_gpio; 1576 + pd.num_cs = num_cs; 1577 + pd.src_clk_nr = src_clk_nr; 1578 + pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi1_cfg_gpio; 1581 1579 1582 - s3c_set_platdata(pd, sizeof(*pd), &s3c64xx_device_spi1); 1580 + s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi1); 1583 1581 } 1584 1582 #endif /* CONFIG_S3C64XX_DEV_SPI1 */ 1585 1583 ··· 1586 1596 }; 1587 1597 1588 1598 struct platform_device s3c64xx_device_spi2 = { 1589 - .name = "s3c64xx-spi", 1599 + .name = "s3c6410-spi", 1590 1600 .id = 2, 1591 1601 .num_resources = ARRAY_SIZE(s3c64xx_spi2_resource), 1592 1602 .resource = s3c64xx_spi2_resource, ··· 1596 1606 }, 1597 1607 }; 1598 1608 1599 - void __init s3c64xx_spi2_set_platdata(struct s3c64xx_spi_info *pd, 1600 - int src_clk_nr, int num_cs) 1609 + void __init s3c64xx_spi2_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, 1610 + int num_cs) 1601 1611 { 1602 - if (!pd) { 1603 - pr_err("%s:Need to pass platform data\n", __func__); 1604 - return; 1605 - } 1612 + struct s3c64xx_spi_info pd; 1606 1613 1607 1614 /* Reject invalid configuration */ 1608 1615 if (!num_cs || src_clk_nr < 0) { ··· 1607 1620 return; 1608 1621 } 1609 1622 1610 - pd->num_cs = num_cs; 1611 - pd->src_clk_nr = src_clk_nr; 1612 - if (!pd->cfg_gpio) 1613 - pd->cfg_gpio = s3c64xx_spi2_cfg_gpio; 1623 + pd.num_cs = num_cs; 1624 + pd.src_clk_nr = src_clk_nr; 1625 + pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi2_cfg_gpio; 1614 1626 1615 - s3c_set_platdata(pd, sizeof(*pd), &s3c64xx_device_spi2); 1627 + s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi2); 1616 1628 } 1617 1629 #endif /* CONFIG_S3C64XX_DEV_SPI2 */
+11 -28
arch/arm/plat-samsung/include/plat/s3c64xx-spi.h
··· 18 18 * @fb_delay: Slave specific feedback delay. 19 19 * Refer to FB_CLK_SEL register definition in SPI chapter. 20 20 * @line: Custom 'identity' of the CS line. 21 - * @set_level: CS line control. 22 21 * 23 22 * This is per SPI-Slave Chipselect information. 24 23 * Allocate and initialize one in machine init code and make the ··· 26 27 struct s3c64xx_spi_csinfo { 27 28 u8 fb_delay; 28 29 unsigned line; 29 - void (*set_level)(unsigned line_id, int lvl); 30 30 }; 31 31 32 32 /** 33 33 * struct s3c64xx_spi_info - SPI Controller defining structure 34 34 * @src_clk_nr: Clock source index for the CLK_CFG[SPI_CLKSEL] field. 35 - * @clk_from_cmu: If the SPI clock/prescalar control block is present 36 - * by the platform's clock-management-unit and not in SPI controller. 37 35 * @num_cs: Number of CS this controller emulates. 38 36 * @cfg_gpio: Configure pins for this SPI controller. 39 - * @fifo_lvl_mask: All tx fifo_lvl fields start at offset-6 40 - * @rx_lvl_offset: Depends on tx fifo_lvl field and bus number 41 - * @high_speed: If the controller supports HIGH_SPEED_EN bit 42 - * @tx_st_done: Depends on tx fifo_lvl field 43 37 */ 44 38 struct s3c64xx_spi_info { 45 39 int src_clk_nr; 46 - bool clk_from_cmu; 47 - 48 40 int num_cs; 49 - 50 - int (*cfg_gpio)(struct platform_device *pdev); 51 - 52 - /* Following two fields are for future compatibility */ 53 - int fifo_lvl_mask; 54 - int rx_lvl_offset; 55 - int high_speed; 56 - int tx_st_done; 41 + int (*cfg_gpio)(void); 57 42 }; 58 43 59 44 /** 60 45 * s3c64xx_spi_set_platdata - SPI Controller configure callback by the board 61 46 * initialization code. 62 - * @pd: SPI platform data to set. 47 + * @cfg_gpio: Pointer to gpio setup function. 63 48 * @src_clk_nr: Clock the SPI controller is to use to generate SPI clocks. 64 49 * @num_cs: Number of elements in the 'cs' array. 65 50 * 66 51 * Call this from machine init code for each SPI Controller that 67 52 * has some chips attached to it. 68 53 */ 69 - extern void s3c64xx_spi0_set_platdata(struct s3c64xx_spi_info *pd, 70 - int src_clk_nr, int num_cs); 71 - extern void s3c64xx_spi1_set_platdata(struct s3c64xx_spi_info *pd, 72 - int src_clk_nr, int num_cs); 73 - extern void s3c64xx_spi2_set_platdata(struct s3c64xx_spi_info *pd, 74 - int src_clk_nr, int num_cs); 54 + extern void s3c64xx_spi0_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, 55 + int num_cs); 56 + extern void s3c64xx_spi1_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, 57 + int num_cs); 58 + extern void s3c64xx_spi2_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, 59 + int num_cs); 75 60 76 61 /* defined by architecture to configure gpio */ 77 - extern int s3c64xx_spi0_cfg_gpio(struct platform_device *dev); 78 - extern int s3c64xx_spi1_cfg_gpio(struct platform_device *dev); 79 - extern int s3c64xx_spi2_cfg_gpio(struct platform_device *dev); 62 + extern int s3c64xx_spi0_cfg_gpio(void); 63 + extern int s3c64xx_spi1_cfg_gpio(void); 64 + extern int s3c64xx_spi2_cfg_gpio(void); 80 65 81 66 extern struct s3c64xx_spi_info s3c64xx_spi0_pdata; 82 67 extern struct s3c64xx_spi_info s3c64xx_spi1_pdata;
+409 -72
drivers/spi/spi-s3c64xx.c
··· 27 27 #include <linux/platform_device.h> 28 28 #include <linux/pm_runtime.h> 29 29 #include <linux/spi/spi.h> 30 + #include <linux/gpio.h> 31 + #include <linux/of.h> 32 + #include <linux/of_gpio.h> 30 33 31 34 #include <mach/dma.h> 32 35 #include <plat/s3c64xx-spi.h> 36 + 37 + #define MAX_SPI_PORTS 3 33 38 34 39 /* Registers and bit-fields */ 35 40 ··· 118 113 119 114 #define S3C64XX_SPI_FBCLK_MSK (3<<0) 120 115 121 - #define S3C64XX_SPI_ST_TRLCNTZ(v, i) ((((v) >> (i)->rx_lvl_offset) & \ 122 - (((i)->fifo_lvl_mask + 1))) \ 123 - ? 1 : 0) 124 - 125 - #define S3C64XX_SPI_ST_TX_DONE(v, i) (((v) & (1 << (i)->tx_st_done)) ? 1 : 0) 126 - #define TX_FIFO_LVL(v, i) (((v) >> 6) & (i)->fifo_lvl_mask) 127 - #define RX_FIFO_LVL(v, i) (((v) >> (i)->rx_lvl_offset) & (i)->fifo_lvl_mask) 116 + #define FIFO_LVL_MASK(i) ((i)->port_conf->fifo_lvl_mask[i->port_id]) 117 + #define S3C64XX_SPI_ST_TX_DONE(v, i) (((v) & \ 118 + (1 << (i)->port_conf->tx_st_done)) ? 1 : 0) 119 + #define TX_FIFO_LVL(v, i) (((v) >> 6) & FIFO_LVL_MASK(i)) 120 + #define RX_FIFO_LVL(v, i) (((v) >> (i)->port_conf->rx_lvl_offset) & \ 121 + FIFO_LVL_MASK(i)) 128 122 129 123 #define S3C64XX_SPI_MAX_TRAILCNT 0x3ff 130 124 #define S3C64XX_SPI_TRAILCNT_OFF 19 ··· 139 135 unsigned ch; 140 136 enum dma_data_direction direction; 141 137 enum dma_ch dmach; 138 + struct property *dma_prop; 139 + }; 140 + 141 + /** 142 + * struct s3c64xx_spi_info - SPI Controller hardware info 143 + * @fifo_lvl_mask: Bit-mask for {TX|RX}_FIFO_LVL bits in SPI_STATUS register. 144 + * @rx_lvl_offset: Bit offset of RX_FIFO_LVL bits in SPI_STATUS regiter. 145 + * @tx_st_done: Bit offset of TX_DONE bit in SPI_STATUS regiter. 146 + * @high_speed: True, if the controller supports HIGH_SPEED_EN bit. 147 + * @clk_from_cmu: True, if the controller does not include a clock mux and 148 + * prescaler unit. 149 + * 150 + * The Samsung s3c64xx SPI controller are used on various Samsung SoC's but 151 + * differ in some aspects such as the size of the fifo and spi bus clock 152 + * setup. Such differences are specified to the driver using this structure 153 + * which is provided as driver data to the driver. 154 + */ 155 + struct s3c64xx_spi_port_config { 156 + int fifo_lvl_mask[MAX_SPI_PORTS]; 157 + int rx_lvl_offset; 158 + int tx_st_done; 159 + bool high_speed; 160 + bool clk_from_cmu; 142 161 }; 143 162 144 163 /** ··· 202 175 struct s3c64xx_spi_dma_data rx_dma; 203 176 struct s3c64xx_spi_dma_data tx_dma; 204 177 struct samsung_dma_ops *ops; 178 + struct s3c64xx_spi_port_config *port_conf; 179 + unsigned int port_id; 180 + unsigned long gpios[4]; 205 181 }; 206 182 207 183 static struct s3c2410_dma_client s3c64xx_spi_dma_client = { ··· 213 183 214 184 static void flush_fifo(struct s3c64xx_spi_driver_data *sdd) 215 185 { 216 - struct s3c64xx_spi_info *sci = sdd->cntrlr_info; 217 186 void __iomem *regs = sdd->regs; 218 187 unsigned long loops; 219 188 u32 val; ··· 228 199 loops = msecs_to_loops(1); 229 200 do { 230 201 val = readl(regs + S3C64XX_SPI_STATUS); 231 - } while (TX_FIFO_LVL(val, sci) && loops--); 202 + } while (TX_FIFO_LVL(val, sdd) && loops--); 232 203 233 204 if (loops == 0) 234 205 dev_warn(&sdd->pdev->dev, "Timed out flushing TX FIFO\n"); ··· 237 208 loops = msecs_to_loops(1); 238 209 do { 239 210 val = readl(regs + S3C64XX_SPI_STATUS); 240 - if (RX_FIFO_LVL(val, sci)) 211 + if (RX_FIFO_LVL(val, sdd)) 241 212 readl(regs + S3C64XX_SPI_RX_DATA); 242 213 else 243 214 break; ··· 330 301 req.cap = DMA_SLAVE; 331 302 req.client = &s3c64xx_spi_dma_client; 332 303 304 + req.dt_dmach_prop = sdd->rx_dma.dma_prop; 333 305 sdd->rx_dma.ch = sdd->ops->request(sdd->rx_dma.dmach, &req); 306 + req.dt_dmach_prop = sdd->tx_dma.dma_prop; 334 307 sdd->tx_dma.ch = sdd->ops->request(sdd->tx_dma.dmach, &req); 335 308 336 309 return 1; ··· 342 311 struct spi_device *spi, 343 312 struct spi_transfer *xfer, int dma_mode) 344 313 { 345 - struct s3c64xx_spi_info *sci = sdd->cntrlr_info; 346 314 void __iomem *regs = sdd->regs; 347 315 u32 modecfg, chcfg; 348 316 ··· 391 361 if (xfer->rx_buf != NULL) { 392 362 sdd->state |= RXBUSY; 393 363 394 - if (sci->high_speed && sdd->cur_speed >= 30000000UL 364 + if (sdd->port_conf->high_speed && sdd->cur_speed >= 30000000UL 395 365 && !(sdd->cur_mode & SPI_CPHA)) 396 366 chcfg |= S3C64XX_SPI_CH_HS_EN; 397 367 ··· 418 388 if (sdd->tgl_spi != spi) { /* if last mssg on diff device */ 419 389 /* Deselect the last toggled device */ 420 390 cs = sdd->tgl_spi->controller_data; 421 - cs->set_level(cs->line, 422 - spi->mode & SPI_CS_HIGH ? 0 : 1); 391 + gpio_set_value(cs->line, 392 + spi->mode & SPI_CS_HIGH ? 0 : 1); 423 393 } 424 394 sdd->tgl_spi = NULL; 425 395 } 426 396 427 397 cs = spi->controller_data; 428 - cs->set_level(cs->line, spi->mode & SPI_CS_HIGH ? 1 : 0); 398 + gpio_set_value(cs->line, spi->mode & SPI_CS_HIGH ? 1 : 0); 429 399 } 430 400 431 401 static int wait_for_xfer(struct s3c64xx_spi_driver_data *sdd, 432 402 struct spi_transfer *xfer, int dma_mode) 433 403 { 434 - struct s3c64xx_spi_info *sci = sdd->cntrlr_info; 435 404 void __iomem *regs = sdd->regs; 436 405 unsigned long val; 437 406 int ms; ··· 447 418 val = msecs_to_loops(ms); 448 419 do { 449 420 status = readl(regs + S3C64XX_SPI_STATUS); 450 - } while (RX_FIFO_LVL(status, sci) < xfer->len && --val); 421 + } while (RX_FIFO_LVL(status, sdd) < xfer->len && --val); 451 422 } 452 423 453 424 if (!val) ··· 466 437 if (xfer->rx_buf == NULL) { 467 438 val = msecs_to_loops(10); 468 439 status = readl(regs + S3C64XX_SPI_STATUS); 469 - while ((TX_FIFO_LVL(status, sci) 470 - || !S3C64XX_SPI_ST_TX_DONE(status, sci)) 440 + while ((TX_FIFO_LVL(status, sdd) 441 + || !S3C64XX_SPI_ST_TX_DONE(status, sdd)) 471 442 && --val) { 472 443 cpu_relax(); 473 444 status = readl(regs + S3C64XX_SPI_STATUS); ··· 511 482 if (sdd->tgl_spi == spi) 512 483 sdd->tgl_spi = NULL; 513 484 514 - cs->set_level(cs->line, spi->mode & SPI_CS_HIGH ? 0 : 1); 485 + gpio_set_value(cs->line, spi->mode & SPI_CS_HIGH ? 0 : 1); 515 486 } 516 487 517 488 static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd) 518 489 { 519 - struct s3c64xx_spi_info *sci = sdd->cntrlr_info; 520 490 void __iomem *regs = sdd->regs; 521 491 u32 val; 522 492 523 493 /* Disable Clock */ 524 - if (sci->clk_from_cmu) { 494 + if (sdd->port_conf->clk_from_cmu) { 525 495 clk_disable(sdd->src_clk); 526 496 } else { 527 497 val = readl(regs + S3C64XX_SPI_CLK_CFG); ··· 564 536 565 537 writel(val, regs + S3C64XX_SPI_MODE_CFG); 566 538 567 - if (sci->clk_from_cmu) { 539 + if (sdd->port_conf->clk_from_cmu) { 568 540 /* Configure Clock */ 569 541 /* There is half-multiplier before the SPI */ 570 542 clk_set_rate(sdd->src_clk, sdd->cur_speed * 2); ··· 590 562 static int s3c64xx_spi_map_mssg(struct s3c64xx_spi_driver_data *sdd, 591 563 struct spi_message *msg) 592 564 { 593 - struct s3c64xx_spi_info *sci = sdd->cntrlr_info; 594 565 struct device *dev = &sdd->pdev->dev; 595 566 struct spi_transfer *xfer; 596 567 ··· 605 578 /* Map until end or first fail */ 606 579 list_for_each_entry(xfer, &msg->transfers, transfer_list) { 607 580 608 - if (xfer->len <= ((sci->fifo_lvl_mask >> 1) + 1)) 581 + if (xfer->len <= ((FIFO_LVL_MASK(sdd) >> 1) + 1)) 609 582 continue; 610 583 611 584 if (xfer->tx_buf != NULL) { ··· 639 612 static void s3c64xx_spi_unmap_mssg(struct s3c64xx_spi_driver_data *sdd, 640 613 struct spi_message *msg) 641 614 { 642 - struct s3c64xx_spi_info *sci = sdd->cntrlr_info; 643 615 struct device *dev = &sdd->pdev->dev; 644 616 struct spi_transfer *xfer; 645 617 ··· 647 621 648 622 list_for_each_entry(xfer, &msg->transfers, transfer_list) { 649 623 650 - if (xfer->len <= ((sci->fifo_lvl_mask >> 1) + 1)) 624 + if (xfer->len <= ((FIFO_LVL_MASK(sdd) >> 1) + 1)) 651 625 continue; 652 626 653 627 if (xfer->rx_buf != NULL ··· 666 640 struct spi_message *msg) 667 641 { 668 642 struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master); 669 - struct s3c64xx_spi_info *sci = sdd->cntrlr_info; 670 643 struct spi_device *spi = msg->spi; 671 644 struct s3c64xx_spi_csinfo *cs = spi->controller_data; 672 645 struct spi_transfer *xfer; ··· 720 695 } 721 696 722 697 /* Polling method for xfers not bigger than FIFO capacity */ 723 - if (xfer->len <= ((sci->fifo_lvl_mask >> 1) + 1)) 698 + if (xfer->len <= ((FIFO_LVL_MASK(sdd) >> 1) + 1)) 724 699 use_dma = 0; 725 700 else 726 701 use_dma = 1; ··· 825 800 return 0; 826 801 } 827 802 803 + static struct s3c64xx_spi_csinfo *s3c64xx_get_slave_ctrldata( 804 + struct s3c64xx_spi_driver_data *sdd, 805 + struct spi_device *spi) 806 + { 807 + struct s3c64xx_spi_csinfo *cs; 808 + struct device_node *slave_np, *data_np; 809 + u32 fb_delay = 0; 810 + 811 + slave_np = spi->dev.of_node; 812 + if (!slave_np) { 813 + dev_err(&spi->dev, "device node not found\n"); 814 + return ERR_PTR(-EINVAL); 815 + } 816 + 817 + for_each_child_of_node(slave_np, data_np) 818 + if (!strcmp(data_np->name, "controller-data")) 819 + break; 820 + if (!data_np) { 821 + dev_err(&spi->dev, "child node 'controller-data' not found\n"); 822 + return ERR_PTR(-EINVAL); 823 + } 824 + 825 + cs = kzalloc(sizeof(*cs), GFP_KERNEL); 826 + if (!cs) { 827 + dev_err(&spi->dev, "could not allocate memory for controller" 828 + " data\n"); 829 + return ERR_PTR(-ENOMEM); 830 + } 831 + 832 + cs->line = of_get_named_gpio(data_np, "cs-gpio", 0); 833 + if (!gpio_is_valid(cs->line)) { 834 + dev_err(&spi->dev, "chip select gpio is not specified or " 835 + "invalid\n"); 836 + kfree(cs); 837 + return ERR_PTR(-EINVAL); 838 + } 839 + 840 + of_property_read_u32(data_np, "samsung,spi-feedback-delay", &fb_delay); 841 + cs->fb_delay = fb_delay; 842 + return cs; 843 + } 844 + 828 845 /* 829 846 * Here we only check the validity of requested configuration 830 847 * and save the configuration in a local data-structure. ··· 880 813 struct s3c64xx_spi_info *sci; 881 814 struct spi_message *msg; 882 815 unsigned long flags; 883 - int err = 0; 816 + int err; 884 817 885 - if (cs == NULL || cs->set_level == NULL) { 818 + sdd = spi_master_get_devdata(spi->master); 819 + if (!cs && spi->dev.of_node) { 820 + cs = s3c64xx_get_slave_ctrldata(sdd, spi); 821 + spi->controller_data = cs; 822 + } 823 + 824 + if (IS_ERR_OR_NULL(cs)) { 886 825 dev_err(&spi->dev, "No CS for SPI(%d)\n", spi->chip_select); 887 826 return -ENODEV; 888 827 } 889 828 890 - sdd = spi_master_get_devdata(spi->master); 829 + if (!spi_get_ctldata(spi)) { 830 + err = gpio_request(cs->line, dev_name(&spi->dev)); 831 + if (err) { 832 + dev_err(&spi->dev, "request for slave select gpio " 833 + "line [%d] failed\n", cs->line); 834 + err = -EBUSY; 835 + goto err_gpio_req; 836 + } 837 + spi_set_ctldata(spi, cs); 838 + } 839 + 891 840 sci = sdd->cntrlr_info; 892 841 893 842 spin_lock_irqsave(&sdd->lock, flags); ··· 914 831 dev_err(&spi->dev, 915 832 "setup: attempt while mssg in queue!\n"); 916 833 spin_unlock_irqrestore(&sdd->lock, flags); 917 - return -EBUSY; 834 + err = -EBUSY; 835 + goto err_msgq; 918 836 } 919 837 } 920 838 ··· 933 849 pm_runtime_get_sync(&sdd->pdev->dev); 934 850 935 851 /* Check if we can provide the requested rate */ 936 - if (!sci->clk_from_cmu) { 852 + if (!sdd->port_conf->clk_from_cmu) { 937 853 u32 psr, speed; 938 854 939 855 /* Max possible */ ··· 958 874 } 959 875 960 876 speed = clk_get_rate(sdd->src_clk) / 2 / (psr + 1); 961 - if (spi->max_speed_hz >= speed) 877 + if (spi->max_speed_hz >= speed) { 962 878 spi->max_speed_hz = speed; 963 - else 879 + } else { 964 880 err = -EINVAL; 881 + goto setup_exit; 882 + } 965 883 } 966 884 967 885 pm_runtime_put(&sdd->pdev->dev); 886 + disable_cs(sdd, spi); 887 + return 0; 968 888 969 889 setup_exit: 970 - 971 890 /* setup() returns with device de-selected */ 972 891 disable_cs(sdd, spi); 973 892 893 + err_msgq: 894 + gpio_free(cs->line); 895 + spi_set_ctldata(spi, NULL); 896 + 897 + err_gpio_req: 898 + kfree(cs); 899 + 974 900 return err; 901 + } 902 + 903 + static void s3c64xx_spi_cleanup(struct spi_device *spi) 904 + { 905 + struct s3c64xx_spi_csinfo *cs = spi_get_ctldata(spi); 906 + 907 + if (cs) { 908 + gpio_free(cs->line); 909 + if (spi->dev.of_node) 910 + kfree(cs); 911 + } 912 + spi_set_ctldata(spi, NULL); 975 913 } 976 914 977 915 static irqreturn_t s3c64xx_spi_irq(int irq, void *data) ··· 1036 930 /* Disable Interrupts - we use Polling if not DMA mode */ 1037 931 writel(0, regs + S3C64XX_SPI_INT_EN); 1038 932 1039 - if (!sci->clk_from_cmu) 933 + if (!sdd->port_conf->clk_from_cmu) 1040 934 writel(sci->src_clk_nr << S3C64XX_SPI_CLKSEL_SRCSHFT, 1041 935 regs + S3C64XX_SPI_CLK_CFG); 1042 936 writel(0, regs + S3C64XX_SPI_MODE_CFG); ··· 1057 951 flush_fifo(sdd); 1058 952 } 1059 953 954 + static int __devinit s3c64xx_spi_get_dmares( 955 + struct s3c64xx_spi_driver_data *sdd, bool tx) 956 + { 957 + struct platform_device *pdev = sdd->pdev; 958 + struct s3c64xx_spi_dma_data *dma_data; 959 + struct property *prop; 960 + struct resource *res; 961 + char prop_name[15], *chan_str; 962 + 963 + if (tx) { 964 + dma_data = &sdd->tx_dma; 965 + dma_data->direction = DMA_TO_DEVICE; 966 + chan_str = "tx"; 967 + } else { 968 + dma_data = &sdd->rx_dma; 969 + dma_data->direction = DMA_FROM_DEVICE; 970 + chan_str = "rx"; 971 + } 972 + 973 + if (!sdd->pdev->dev.of_node) { 974 + res = platform_get_resource(pdev, IORESOURCE_DMA, tx ? 0 : 1); 975 + if (!res) { 976 + dev_err(&pdev->dev, "Unable to get SPI-%s dma " 977 + "resource\n", chan_str); 978 + return -ENXIO; 979 + } 980 + dma_data->dmach = res->start; 981 + return 0; 982 + } 983 + 984 + sprintf(prop_name, "%s-dma-channel", chan_str); 985 + prop = of_find_property(pdev->dev.of_node, prop_name, NULL); 986 + if (!prop) { 987 + dev_err(&pdev->dev, "%s dma channel property not specified\n", 988 + chan_str); 989 + return -ENXIO; 990 + } 991 + 992 + dma_data->dmach = DMACH_DT_PROP; 993 + dma_data->dma_prop = prop; 994 + return 0; 995 + } 996 + 997 + #ifdef CONFIG_OF 998 + static int s3c64xx_spi_parse_dt_gpio(struct s3c64xx_spi_driver_data *sdd) 999 + { 1000 + struct device *dev = &sdd->pdev->dev; 1001 + int idx, gpio, ret; 1002 + 1003 + /* find gpios for mosi, miso and clock lines */ 1004 + for (idx = 0; idx < 3; idx++) { 1005 + gpio = of_get_gpio(dev->of_node, idx); 1006 + if (!gpio_is_valid(gpio)) { 1007 + dev_err(dev, "invalid gpio[%d]: %d\n", idx, gpio); 1008 + goto free_gpio; 1009 + } 1010 + 1011 + ret = gpio_request(gpio, "spi-bus"); 1012 + if (ret) { 1013 + dev_err(dev, "gpio [%d] request failed\n", gpio); 1014 + goto free_gpio; 1015 + } 1016 + } 1017 + return 0; 1018 + 1019 + free_gpio: 1020 + while (--idx >= 0) 1021 + gpio_free(sdd->gpios[idx]); 1022 + return -EINVAL; 1023 + } 1024 + 1025 + static void s3c64xx_spi_dt_gpio_free(struct s3c64xx_spi_driver_data *sdd) 1026 + { 1027 + unsigned int idx; 1028 + for (idx = 0; idx < 3; idx++) 1029 + gpio_free(sdd->gpios[idx]); 1030 + } 1031 + 1032 + static struct __devinit s3c64xx_spi_info * s3c64xx_spi_parse_dt( 1033 + struct device *dev) 1034 + { 1035 + struct s3c64xx_spi_info *sci; 1036 + u32 temp; 1037 + 1038 + sci = devm_kzalloc(dev, sizeof(*sci), GFP_KERNEL); 1039 + if (!sci) { 1040 + dev_err(dev, "memory allocation for spi_info failed\n"); 1041 + return ERR_PTR(-ENOMEM); 1042 + } 1043 + 1044 + if (of_property_read_u32(dev->of_node, "samsung,spi-src-clk", &temp)) { 1045 + dev_warn(dev, "spi bus clock parent not specified, using " 1046 + "clock at index 0 as parent\n"); 1047 + sci->src_clk_nr = 0; 1048 + } else { 1049 + sci->src_clk_nr = temp; 1050 + } 1051 + 1052 + if (of_property_read_u32(dev->of_node, "num-cs", &temp)) { 1053 + dev_warn(dev, "number of chip select lines not specified, " 1054 + "assuming 1 chip select line\n"); 1055 + sci->num_cs = 1; 1056 + } else { 1057 + sci->num_cs = temp; 1058 + } 1059 + 1060 + return sci; 1061 + } 1062 + #else 1063 + static struct s3c64xx_spi_info *s3c64xx_spi_parse_dt(struct device *dev) 1064 + { 1065 + return dev->platform_data; 1066 + } 1067 + 1068 + static int s3c64xx_spi_parse_dt_gpio(struct s3c64xx_spi_driver_data *sdd) 1069 + { 1070 + return -EINVAL; 1071 + } 1072 + 1073 + static void s3c64xx_spi_dt_gpio_free(struct s3c64xx_spi_driver_data *sdd) 1074 + { 1075 + } 1076 + #endif 1077 + 1078 + static const struct of_device_id s3c64xx_spi_dt_match[]; 1079 + 1080 + static inline struct s3c64xx_spi_port_config *s3c64xx_spi_get_port_config( 1081 + struct platform_device *pdev) 1082 + { 1083 + #ifdef CONFIG_OF 1084 + if (pdev->dev.of_node) { 1085 + const struct of_device_id *match; 1086 + match = of_match_node(s3c64xx_spi_dt_match, pdev->dev.of_node); 1087 + return (struct s3c64xx_spi_port_config *)match->data; 1088 + } 1089 + #endif 1090 + return (struct s3c64xx_spi_port_config *) 1091 + platform_get_device_id(pdev)->driver_data; 1092 + } 1093 + 1060 1094 static int __init s3c64xx_spi_probe(struct platform_device *pdev) 1061 1095 { 1062 - struct resource *mem_res, *dmatx_res, *dmarx_res; 1096 + struct resource *mem_res; 1063 1097 struct s3c64xx_spi_driver_data *sdd; 1064 - struct s3c64xx_spi_info *sci; 1098 + struct s3c64xx_spi_info *sci = pdev->dev.platform_data; 1065 1099 struct spi_master *master; 1066 1100 int ret, irq; 1067 1101 char clk_name[16]; 1068 1102 1069 - if (pdev->id < 0) { 1070 - dev_err(&pdev->dev, 1071 - "Invalid platform device id-%d\n", pdev->id); 1072 - return -ENODEV; 1103 + if (!sci && pdev->dev.of_node) { 1104 + sci = s3c64xx_spi_parse_dt(&pdev->dev); 1105 + if (IS_ERR(sci)) 1106 + return PTR_ERR(sci); 1073 1107 } 1074 1108 1075 - if (pdev->dev.platform_data == NULL) { 1109 + if (!sci) { 1076 1110 dev_err(&pdev->dev, "platform_data missing!\n"); 1077 1111 return -ENODEV; 1078 - } 1079 - 1080 - sci = pdev->dev.platform_data; 1081 - 1082 - /* Check for availability of necessary resource */ 1083 - 1084 - dmatx_res = platform_get_resource(pdev, IORESOURCE_DMA, 0); 1085 - if (dmatx_res == NULL) { 1086 - dev_err(&pdev->dev, "Unable to get SPI-Tx dma resource\n"); 1087 - return -ENXIO; 1088 - } 1089 - 1090 - dmarx_res = platform_get_resource(pdev, IORESOURCE_DMA, 1); 1091 - if (dmarx_res == NULL) { 1092 - dev_err(&pdev->dev, "Unable to get SPI-Rx dma resource\n"); 1093 - return -ENXIO; 1094 1112 } 1095 1113 1096 1114 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ··· 1239 1009 platform_set_drvdata(pdev, master); 1240 1010 1241 1011 sdd = spi_master_get_devdata(master); 1012 + sdd->port_conf = s3c64xx_spi_get_port_config(pdev); 1242 1013 sdd->master = master; 1243 1014 sdd->cntrlr_info = sci; 1244 1015 sdd->pdev = pdev; 1245 1016 sdd->sfr_start = mem_res->start; 1246 - sdd->tx_dma.dmach = dmatx_res->start; 1247 - sdd->tx_dma.direction = DMA_MEM_TO_DEV; 1248 - sdd->rx_dma.dmach = dmarx_res->start; 1249 - sdd->rx_dma.direction = DMA_DEV_TO_MEM; 1017 + if (pdev->dev.of_node) { 1018 + ret = of_alias_get_id(pdev->dev.of_node, "spi"); 1019 + if (ret < 0) { 1020 + dev_err(&pdev->dev, "failed to get alias id, " 1021 + "errno %d\n", ret); 1022 + goto err0; 1023 + } 1024 + sdd->port_id = ret; 1025 + } else { 1026 + sdd->port_id = pdev->id; 1027 + } 1250 1028 1251 1029 sdd->cur_bpw = 8; 1252 1030 1253 - master->bus_num = pdev->id; 1031 + ret = s3c64xx_spi_get_dmares(sdd, true); 1032 + if (ret) 1033 + goto err0; 1034 + 1035 + ret = s3c64xx_spi_get_dmares(sdd, false); 1036 + if (ret) 1037 + goto err0; 1038 + 1039 + master->dev.of_node = pdev->dev.of_node; 1040 + master->bus_num = sdd->port_id; 1254 1041 master->setup = s3c64xx_spi_setup; 1042 + master->cleanup = s3c64xx_spi_cleanup; 1255 1043 master->prepare_transfer_hardware = s3c64xx_spi_prepare_transfer; 1256 1044 master->transfer_one_message = s3c64xx_spi_transfer_one_message; 1257 1045 master->unprepare_transfer_hardware = s3c64xx_spi_unprepare_transfer; ··· 1292 1044 goto err1; 1293 1045 } 1294 1046 1295 - if (sci->cfg_gpio == NULL || sci->cfg_gpio(pdev)) { 1047 + if (!sci->cfg_gpio && pdev->dev.of_node) { 1048 + if (s3c64xx_spi_parse_dt_gpio(sdd)) 1049 + return -EBUSY; 1050 + } else if (sci->cfg_gpio == NULL || sci->cfg_gpio()) { 1296 1051 dev_err(&pdev->dev, "Unable to config gpio\n"); 1297 1052 ret = -EBUSY; 1298 1053 goto err2; ··· 1331 1080 } 1332 1081 1333 1082 /* Setup Deufult Mode */ 1334 - s3c64xx_spi_hwinit(sdd, pdev->id); 1083 + s3c64xx_spi_hwinit(sdd, sdd->port_id); 1335 1084 1336 1085 spin_lock_init(&sdd->lock); 1337 1086 init_completion(&sdd->xfer_completion); ··· 1356 1105 1357 1106 dev_dbg(&pdev->dev, "Samsung SoC SPI Driver loaded for Bus SPI-%d " 1358 1107 "with %d Slaves attached\n", 1359 - pdev->id, master->num_chipselect); 1108 + sdd->port_id, master->num_chipselect); 1360 1109 dev_dbg(&pdev->dev, "\tIOmem=[0x%x-0x%x]\tDMA=[Rx-%d, Tx-%d]\n", 1361 1110 mem_res->end, mem_res->start, 1362 1111 sdd->rx_dma.dmach, sdd->tx_dma.dmach); ··· 1376 1125 err4: 1377 1126 clk_put(sdd->clk); 1378 1127 err3: 1128 + if (!sdd->cntrlr_info->cfg_gpio && pdev->dev.of_node) 1129 + s3c64xx_spi_dt_gpio_free(sdd); 1379 1130 err2: 1380 1131 iounmap((void *) sdd->regs); 1381 1132 err1: ··· 1409 1156 clk_disable(sdd->clk); 1410 1157 clk_put(sdd->clk); 1411 1158 1159 + if (!sdd->cntrlr_info->cfg_gpio && pdev->dev.of_node) 1160 + s3c64xx_spi_dt_gpio_free(sdd); 1161 + 1412 1162 iounmap((void *) sdd->regs); 1413 1163 1414 1164 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ··· 1436 1180 clk_disable(sdd->src_clk); 1437 1181 clk_disable(sdd->clk); 1438 1182 1183 + if (!sdd->cntrlr_info->cfg_gpio && dev->of_node) 1184 + s3c64xx_spi_dt_gpio_free(sdd); 1185 + 1439 1186 sdd->cur_speed = 0; /* Output Clock is stopped */ 1440 1187 1441 1188 return 0; ··· 1446 1187 1447 1188 static int s3c64xx_spi_resume(struct device *dev) 1448 1189 { 1449 - struct platform_device *pdev = to_platform_device(dev); 1450 1190 struct spi_master *master = spi_master_get(dev_get_drvdata(dev)); 1451 1191 struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master); 1452 1192 struct s3c64xx_spi_info *sci = sdd->cntrlr_info; 1453 1193 1454 - sci->cfg_gpio(pdev); 1194 + if (!sci->cfg_gpio && dev->of_node) 1195 + s3c64xx_spi_parse_dt_gpio(sdd); 1196 + else 1197 + sci->cfg_gpio(); 1455 1198 1456 1199 /* Enable the clock */ 1457 1200 clk_enable(sdd->src_clk); 1458 1201 clk_enable(sdd->clk); 1459 1202 1460 - s3c64xx_spi_hwinit(sdd, pdev->id); 1203 + s3c64xx_spi_hwinit(sdd, sdd->port_id); 1461 1204 1462 1205 spi_master_resume(master); 1463 1206 ··· 1497 1236 s3c64xx_spi_runtime_resume, NULL) 1498 1237 }; 1499 1238 1239 + struct s3c64xx_spi_port_config s3c2443_spi_port_config = { 1240 + .fifo_lvl_mask = { 0x7f }, 1241 + .rx_lvl_offset = 13, 1242 + .tx_st_done = 21, 1243 + .high_speed = true, 1244 + }; 1245 + 1246 + struct s3c64xx_spi_port_config s3c6410_spi_port_config = { 1247 + .fifo_lvl_mask = { 0x7f, 0x7F }, 1248 + .rx_lvl_offset = 13, 1249 + .tx_st_done = 21, 1250 + }; 1251 + 1252 + struct s3c64xx_spi_port_config s5p64x0_spi_port_config = { 1253 + .fifo_lvl_mask = { 0x1ff, 0x7F }, 1254 + .rx_lvl_offset = 15, 1255 + .tx_st_done = 25, 1256 + }; 1257 + 1258 + struct s3c64xx_spi_port_config s5pc100_spi_port_config = { 1259 + .fifo_lvl_mask = { 0x7f, 0x7F }, 1260 + .rx_lvl_offset = 13, 1261 + .tx_st_done = 21, 1262 + .high_speed = true, 1263 + }; 1264 + 1265 + struct s3c64xx_spi_port_config s5pv210_spi_port_config = { 1266 + .fifo_lvl_mask = { 0x1ff, 0x7F }, 1267 + .rx_lvl_offset = 15, 1268 + .tx_st_done = 25, 1269 + .high_speed = true, 1270 + }; 1271 + 1272 + struct s3c64xx_spi_port_config exynos4_spi_port_config = { 1273 + .fifo_lvl_mask = { 0x1ff, 0x7F, 0x7F }, 1274 + .rx_lvl_offset = 15, 1275 + .tx_st_done = 25, 1276 + .high_speed = true, 1277 + .clk_from_cmu = true, 1278 + }; 1279 + 1280 + static struct platform_device_id s3c64xx_spi_driver_ids[] = { 1281 + { 1282 + .name = "s3c2443-spi", 1283 + .driver_data = (kernel_ulong_t)&s3c2443_spi_port_config, 1284 + }, { 1285 + .name = "s3c6410-spi", 1286 + .driver_data = (kernel_ulong_t)&s3c6410_spi_port_config, 1287 + }, { 1288 + .name = "s5p64x0-spi", 1289 + .driver_data = (kernel_ulong_t)&s5p64x0_spi_port_config, 1290 + }, { 1291 + .name = "s5pc100-spi", 1292 + .driver_data = (kernel_ulong_t)&s5pc100_spi_port_config, 1293 + }, { 1294 + .name = "s5pv210-spi", 1295 + .driver_data = (kernel_ulong_t)&s5pv210_spi_port_config, 1296 + }, { 1297 + .name = "exynos4210-spi", 1298 + .driver_data = (kernel_ulong_t)&exynos4_spi_port_config, 1299 + }, 1300 + { }, 1301 + }; 1302 + 1303 + #ifdef CONFIG_OF 1304 + static const struct of_device_id s3c64xx_spi_dt_match[] = { 1305 + { .compatible = "samsung,exynos4210-spi", 1306 + .data = (void *)&exynos4_spi_port_config, 1307 + }, 1308 + { }, 1309 + }; 1310 + MODULE_DEVICE_TABLE(of, s3c64xx_spi_dt_match); 1311 + #endif /* CONFIG_OF */ 1312 + 1500 1313 static struct platform_driver s3c64xx_spi_driver = { 1501 1314 .driver = { 1502 1315 .name = "s3c64xx-spi", 1503 1316 .owner = THIS_MODULE, 1504 1317 .pm = &s3c64xx_spi_pm, 1318 + .of_match_table = of_match_ptr(s3c64xx_spi_dt_match), 1505 1319 }, 1506 1320 .remove = s3c64xx_spi_remove, 1321 + .id_table = s3c64xx_spi_driver_ids, 1507 1322 }; 1508 1323 MODULE_ALIAS("platform:s3c64xx-spi"); 1509 1324