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

Merge branch 'prima2/multiplatform' into next/multiplatform

This series enables multiplatform support on the SIRF prima2/marco/atlas6
platform. The code was already quite tidy, so this is a relatively simple
change, and it follows similar changes we made to other ARMv7 based
platforms recently.

* prima2/multiplatform:
ARM: sirf: enable support in multi_v7_defconfig
ARM: sirf: enable multiplatform support
ARM: sirf: use clocksource_of infrastructure
ARM: sirf: move debug-macro.S to include/debug/sirf.S
ARM: sirf: enable sparse IRQ
ARM: sirf: move irq driver to drivers/irqchip
ARM: sirf: fix prima2 interrupt lookup
pinctrl: sirf: convert to linear irq domain
clocksource: make CLOCKSOURCE_OF_DECLARE type safe
ARM/dts: prima2: add .dtsi for atlas6 and .dts for atla6-evb board
arm: prima2: add new SiRFatlas6 machine in common board
ARM: smp_twd: convert to use CLKSRC_OF init
clocksource: tegra20: use the device_node pointer passed to init
clocksource: pass DT node pointer to init functions
clocksource: add empty version of clocksource_of_init

Conflicts:
arch/arm/configs/multi_v7_defconfig
arch/arm/mach-spear/spear13xx.c
Tested-by: Barry Song <Barry.Song@csr.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+1047 -511
+1 -16
arch/arm/Kconfig
··· 49 49 select HAVE_REGS_AND_STACK_ACCESS_API 50 50 select HAVE_SYSCALL_TRACEPOINTS 51 51 select HAVE_UID16 52 - select HAVE_VIRT_TO_BUS 53 52 select KTIME_SCALAR 54 53 select PERF_USE_VMALLOC 55 54 select RTC_LIB ··· 402 403 select CPU_FA526 403 404 help 404 405 Support for the Cortina Systems Gemini family SoCs 405 - 406 - config ARCH_SIRF 407 - bool "CSR SiRF" 408 - select ARCH_REQUIRE_GPIOLIB 409 - select AUTO_ZRELADDR 410 - select COMMON_CLK 411 - select GENERIC_CLOCKEVENTS 412 - select GENERIC_IRQ_CHIP 413 - select MIGHT_HAVE_CACHE_L2X0 414 - select NO_IOPORT 415 - select PINCTRL 416 - select PINCTRL_SIRF 417 - select USE_OF 418 - help 419 - Support for CSR SiRFprimaII/Marco/Polo platforms 420 406 421 407 config ARCH_EBSA110 422 408 bool "EBSA-110" ··· 1541 1557 config HAVE_ARM_TWD 1542 1558 bool 1543 1559 depends on SMP 1560 + select CLKSRC_OF if OF 1544 1561 help 1545 1562 This options enables support for the ARM timer and watchdog unit 1546 1563
+1
arch/arm/Kconfig.debug
··· 608 608 default "debug/nomadik.S" if DEBUG_NOMADIK_UART 609 609 default "debug/omap2plus.S" if DEBUG_OMAP2PLUS_UART 610 610 default "debug/picoxcell.S" if DEBUG_PICOXCELL_UART 611 + default "debug/sirf.S" if DEBUG_SIRFPRIMA2_UART1 || DEBUG_SIRFMARCO_UART1 611 612 default "debug/socfpga.S" if DEBUG_SOCFPGA_UART 612 613 default "debug/sunxi.S" if DEBUG_SUNXI_UART0 || DEBUG_SUNXI_UART1 613 614 default "debug/vexpress.S" if DEBUG_VEXPRESS_UART0_DETECT || \
+78
arch/arm/boot/dts/atlas6-evb.dts
··· 1 + /* 2 + * DTS file for CSR SiRFatlas6 Evaluation Board 3 + * 4 + * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company. 5 + * 6 + * Licensed under GPLv2 or later. 7 + */ 8 + 9 + /dts-v1/; 10 + 11 + /include/ "atlas6.dtsi" 12 + 13 + / { 14 + model = "CSR SiRFatlas6 Evaluation Board"; 15 + compatible = "sirf,atlas6-cb", "sirf,atlas6"; 16 + 17 + memory { 18 + reg = <0x00000000 0x20000000>; 19 + }; 20 + 21 + axi { 22 + peri-iobg { 23 + uart@b0060000 { 24 + pinctrl-names = "default"; 25 + pinctrl-0 = <&uart1_pins_a>; 26 + }; 27 + spi@b00d0000 { 28 + status = "okay"; 29 + pinctrl-names = "default"; 30 + pinctrl-0 = <&spi0_pins_a>; 31 + spi@0 { 32 + compatible = "spidev"; 33 + reg = <0>; 34 + spi-max-frequency = <1000000>; 35 + }; 36 + }; 37 + spi@b0170000 { 38 + pinctrl-names = "default"; 39 + pinctrl-0 = <&spi1_pins_a>; 40 + }; 41 + i2c0: i2c@b00e0000 { 42 + status = "okay"; 43 + pinctrl-names = "default"; 44 + pinctrl-0 = <&i2c0_pins_a>; 45 + lcd@40 { 46 + compatible = "sirf,lcd"; 47 + reg = <0x40>; 48 + }; 49 + }; 50 + 51 + }; 52 + disp-iobg { 53 + lcd@90010000 { 54 + status = "okay"; 55 + pinctrl-names = "default"; 56 + pinctrl-0 = <&lcd_24pins_a>; 57 + }; 58 + }; 59 + }; 60 + display: display@0 { 61 + panels { 62 + panel0: panel@0 { 63 + panel-name = "Innolux TFT"; 64 + hactive = <800>; 65 + vactive = <480>; 66 + left_margin = <20>; 67 + right_margin = <234>; 68 + upper_margin = <3>; 69 + lower_margin = <41>; 70 + hsync_len = <3>; 71 + vsync_len = <2>; 72 + pixclock = <33264000>; 73 + sync = <3>; 74 + timing = <0x88>; 75 + }; 76 + }; 77 + }; 78 + };
+668
arch/arm/boot/dts/atlas6.dtsi
··· 1 + /* 2 + * DTS file for CSR SiRFatlas6 SoC 3 + * 4 + * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company. 5 + * 6 + * Licensed under GPLv2 or later. 7 + */ 8 + 9 + /include/ "skeleton.dtsi" 10 + / { 11 + compatible = "sirf,atlas6"; 12 + #address-cells = <1>; 13 + #size-cells = <1>; 14 + interrupt-parent = <&intc>; 15 + 16 + cpus { 17 + #address-cells = <1>; 18 + #size-cells = <0>; 19 + 20 + cpu@0 { 21 + reg = <0x0>; 22 + d-cache-line-size = <32>; 23 + i-cache-line-size = <32>; 24 + d-cache-size = <32768>; 25 + i-cache-size = <32768>; 26 + /* from bootloader */ 27 + timebase-frequency = <0>; 28 + bus-frequency = <0>; 29 + clock-frequency = <0>; 30 + }; 31 + }; 32 + 33 + axi { 34 + compatible = "simple-bus"; 35 + #address-cells = <1>; 36 + #size-cells = <1>; 37 + ranges = <0x40000000 0x40000000 0x80000000>; 38 + 39 + intc: interrupt-controller@80020000 { 40 + #interrupt-cells = <1>; 41 + interrupt-controller; 42 + compatible = "sirf,prima2-intc"; 43 + reg = <0x80020000 0x1000>; 44 + }; 45 + 46 + sys-iobg { 47 + compatible = "simple-bus"; 48 + #address-cells = <1>; 49 + #size-cells = <1>; 50 + ranges = <0x88000000 0x88000000 0x40000>; 51 + 52 + clks: clock-controller@88000000 { 53 + compatible = "sirf,atlas6-clkc"; 54 + reg = <0x88000000 0x1000>; 55 + interrupts = <3>; 56 + #clock-cells = <1>; 57 + }; 58 + 59 + reset-controller@88010000 { 60 + compatible = "sirf,prima2-rstc"; 61 + reg = <0x88010000 0x1000>; 62 + }; 63 + 64 + rsc-controller@88020000 { 65 + compatible = "sirf,prima2-rsc"; 66 + reg = <0x88020000 0x1000>; 67 + }; 68 + }; 69 + 70 + mem-iobg { 71 + compatible = "simple-bus"; 72 + #address-cells = <1>; 73 + #size-cells = <1>; 74 + ranges = <0x90000000 0x90000000 0x10000>; 75 + 76 + memory-controller@90000000 { 77 + compatible = "sirf,prima2-memc"; 78 + reg = <0x90000000 0x10000>; 79 + interrupts = <27>; 80 + clocks = <&clks 5>; 81 + }; 82 + }; 83 + 84 + disp-iobg { 85 + compatible = "simple-bus"; 86 + #address-cells = <1>; 87 + #size-cells = <1>; 88 + ranges = <0x90010000 0x90010000 0x30000>; 89 + 90 + lcd@90010000 { 91 + compatible = "sirf,prima2-lcd"; 92 + reg = <0x90010000 0x20000>; 93 + interrupts = <30>; 94 + clocks = <&clks 34>; 95 + display=<&display>; 96 + /* later transfer to pwm */ 97 + bl-gpio = <&gpio 7 0>; 98 + default-panel = <&panel0>; 99 + }; 100 + 101 + vpp@90020000 { 102 + compatible = "sirf,prima2-vpp"; 103 + reg = <0x90020000 0x10000>; 104 + interrupts = <31>; 105 + clocks = <&clks 35>; 106 + }; 107 + }; 108 + 109 + graphics-iobg { 110 + compatible = "simple-bus"; 111 + #address-cells = <1>; 112 + #size-cells = <1>; 113 + ranges = <0x98000000 0x98000000 0x8000000>; 114 + 115 + graphics@98000000 { 116 + compatible = "powervr,sgx510"; 117 + reg = <0x98000000 0x8000000>; 118 + interrupts = <6>; 119 + clocks = <&clks 32>; 120 + }; 121 + }; 122 + 123 + dsp-iobg { 124 + compatible = "simple-bus"; 125 + #address-cells = <1>; 126 + #size-cells = <1>; 127 + ranges = <0xa8000000 0xa8000000 0x2000000>; 128 + 129 + dspif@a8000000 { 130 + compatible = "sirf,prima2-dspif"; 131 + reg = <0xa8000000 0x10000>; 132 + interrupts = <9>; 133 + }; 134 + 135 + gps@a8010000 { 136 + compatible = "sirf,prima2-gps"; 137 + reg = <0xa8010000 0x10000>; 138 + interrupts = <7>; 139 + clocks = <&clks 9>; 140 + }; 141 + 142 + dsp@a9000000 { 143 + compatible = "sirf,prima2-dsp"; 144 + reg = <0xa9000000 0x1000000>; 145 + interrupts = <8>; 146 + clocks = <&clks 8>; 147 + }; 148 + }; 149 + 150 + peri-iobg { 151 + compatible = "simple-bus"; 152 + #address-cells = <1>; 153 + #size-cells = <1>; 154 + ranges = <0xb0000000 0xb0000000 0x180000>, 155 + <0x56000000 0x56000000 0x1b00000>; 156 + 157 + timer@b0020000 { 158 + compatible = "sirf,prima2-tick"; 159 + reg = <0xb0020000 0x1000>; 160 + interrupts = <0>; 161 + }; 162 + 163 + nand@b0030000 { 164 + compatible = "sirf,prima2-nand"; 165 + reg = <0xb0030000 0x10000>; 166 + interrupts = <41>; 167 + clocks = <&clks 26>; 168 + }; 169 + 170 + audio@b0040000 { 171 + compatible = "sirf,prima2-audio"; 172 + reg = <0xb0040000 0x10000>; 173 + interrupts = <35>; 174 + clocks = <&clks 27>; 175 + }; 176 + 177 + uart0: uart@b0050000 { 178 + cell-index = <0>; 179 + compatible = "sirf,prima2-uart"; 180 + reg = <0xb0050000 0x1000>; 181 + interrupts = <17>; 182 + fifosize = <128>; 183 + clocks = <&clks 13>; 184 + }; 185 + 186 + uart1: uart@b0060000 { 187 + cell-index = <1>; 188 + compatible = "sirf,prima2-uart"; 189 + reg = <0xb0060000 0x1000>; 190 + interrupts = <18>; 191 + fifosize = <32>; 192 + clocks = <&clks 14>; 193 + }; 194 + 195 + uart2: uart@b0070000 { 196 + cell-index = <2>; 197 + compatible = "sirf,prima2-uart"; 198 + reg = <0xb0070000 0x1000>; 199 + interrupts = <19>; 200 + fifosize = <128>; 201 + clocks = <&clks 15>; 202 + }; 203 + 204 + usp0: usp@b0080000 { 205 + cell-index = <0>; 206 + compatible = "sirf,prima2-usp"; 207 + reg = <0xb0080000 0x10000>; 208 + interrupts = <20>; 209 + clocks = <&clks 28>; 210 + }; 211 + 212 + usp1: usp@b0090000 { 213 + cell-index = <1>; 214 + compatible = "sirf,prima2-usp"; 215 + reg = <0xb0090000 0x10000>; 216 + interrupts = <21>; 217 + clocks = <&clks 29>; 218 + }; 219 + 220 + dmac0: dma-controller@b00b0000 { 221 + cell-index = <0>; 222 + compatible = "sirf,prima2-dmac"; 223 + reg = <0xb00b0000 0x10000>; 224 + interrupts = <12>; 225 + clocks = <&clks 24>; 226 + }; 227 + 228 + dmac1: dma-controller@b0160000 { 229 + cell-index = <1>; 230 + compatible = "sirf,prima2-dmac"; 231 + reg = <0xb0160000 0x10000>; 232 + interrupts = <13>; 233 + clocks = <&clks 25>; 234 + }; 235 + 236 + vip@b00C0000 { 237 + compatible = "sirf,prima2-vip"; 238 + reg = <0xb00C0000 0x10000>; 239 + clocks = <&clks 31>; 240 + }; 241 + 242 + spi0: spi@b00d0000 { 243 + cell-index = <0>; 244 + compatible = "sirf,prima2-spi"; 245 + reg = <0xb00d0000 0x10000>; 246 + interrupts = <15>; 247 + sirf,spi-num-chipselects = <1>; 248 + cs-gpios = <&gpio 0 0>; 249 + sirf,spi-dma-rx-channel = <25>; 250 + sirf,spi-dma-tx-channel = <20>; 251 + #address-cells = <1>; 252 + #size-cells = <0>; 253 + clocks = <&clks 19>; 254 + status = "disabled"; 255 + }; 256 + 257 + spi1: spi@b0170000 { 258 + cell-index = <1>; 259 + compatible = "sirf,prima2-spi"; 260 + reg = <0xb0170000 0x10000>; 261 + interrupts = <16>; 262 + clocks = <&clks 20>; 263 + status = "disabled"; 264 + }; 265 + 266 + i2c0: i2c@b00e0000 { 267 + cell-index = <0>; 268 + compatible = "sirf,prima2-i2c"; 269 + reg = <0xb00e0000 0x10000>; 270 + interrupts = <24>; 271 + #address-cells = <1>; 272 + #size-cells = <0>; 273 + clocks = <&clks 17>; 274 + }; 275 + 276 + i2c1: i2c@b00f0000 { 277 + cell-index = <1>; 278 + compatible = "sirf,prima2-i2c"; 279 + reg = <0xb00f0000 0x10000>; 280 + interrupts = <25>; 281 + #address-cells = <1>; 282 + #size-cells = <0>; 283 + clocks = <&clks 18>; 284 + }; 285 + 286 + tsc@b0110000 { 287 + compatible = "sirf,prima2-tsc"; 288 + reg = <0xb0110000 0x10000>; 289 + interrupts = <33>; 290 + clocks = <&clks 16>; 291 + }; 292 + 293 + gpio: pinctrl@b0120000 { 294 + #gpio-cells = <2>; 295 + #interrupt-cells = <2>; 296 + compatible = "sirf,atlas6-pinctrl"; 297 + reg = <0xb0120000 0x10000>; 298 + interrupts = <43 44 45 46 47>; 299 + gpio-controller; 300 + interrupt-controller; 301 + 302 + lcd_16pins_a: lcd0@0 { 303 + lcd { 304 + sirf,pins = "lcd_16bitsgrp"; 305 + sirf,function = "lcd_16bits"; 306 + }; 307 + }; 308 + lcd_18pins_a: lcd0@1 { 309 + lcd { 310 + sirf,pins = "lcd_18bitsgrp"; 311 + sirf,function = "lcd_18bits"; 312 + }; 313 + }; 314 + lcd_24pins_a: lcd0@2 { 315 + lcd { 316 + sirf,pins = "lcd_24bitsgrp"; 317 + sirf,function = "lcd_24bits"; 318 + }; 319 + }; 320 + lcdrom_pins_a: lcdrom0@0 { 321 + lcd { 322 + sirf,pins = "lcdromgrp"; 323 + sirf,function = "lcdrom"; 324 + }; 325 + }; 326 + uart0_pins_a: uart0@0 { 327 + uart { 328 + sirf,pins = "uart0grp"; 329 + sirf,function = "uart0"; 330 + }; 331 + }; 332 + uart1_pins_a: uart1@0 { 333 + uart { 334 + sirf,pins = "uart1grp"; 335 + sirf,function = "uart1"; 336 + }; 337 + }; 338 + uart2_pins_a: uart2@0 { 339 + uart { 340 + sirf,pins = "uart2grp"; 341 + sirf,function = "uart2"; 342 + }; 343 + }; 344 + uart2_noflow_pins_a: uart2@1 { 345 + uart { 346 + sirf,pins = "uart2_nostreamctrlgrp"; 347 + sirf,function = "uart2_nostreamctrl"; 348 + }; 349 + }; 350 + spi0_pins_a: spi0@0 { 351 + spi { 352 + sirf,pins = "spi0grp"; 353 + sirf,function = "spi0"; 354 + }; 355 + }; 356 + spi1_pins_a: spi1@0 { 357 + spi { 358 + sirf,pins = "spi1grp"; 359 + sirf,function = "spi1"; 360 + }; 361 + }; 362 + i2c0_pins_a: i2c0@0 { 363 + i2c { 364 + sirf,pins = "i2c0grp"; 365 + sirf,function = "i2c0"; 366 + }; 367 + }; 368 + i2c1_pins_a: i2c1@0 { 369 + i2c { 370 + sirf,pins = "i2c1grp"; 371 + sirf,function = "i2c1"; 372 + }; 373 + }; 374 + pwm0_pins_a: pwm0@0 { 375 + pwm { 376 + sirf,pins = "pwm0grp"; 377 + sirf,function = "pwm0"; 378 + }; 379 + }; 380 + pwm1_pins_a: pwm1@0 { 381 + pwm { 382 + sirf,pins = "pwm1grp"; 383 + sirf,function = "pwm1"; 384 + }; 385 + }; 386 + pwm2_pins_a: pwm2@0 { 387 + pwm { 388 + sirf,pins = "pwm2grp"; 389 + sirf,function = "pwm2"; 390 + }; 391 + }; 392 + pwm3_pins_a: pwm3@0 { 393 + pwm { 394 + sirf,pins = "pwm3grp"; 395 + sirf,function = "pwm3"; 396 + }; 397 + }; 398 + pwm4_pins_a: pwm4@0 { 399 + pwm { 400 + sirf,pins = "pwm4grp"; 401 + sirf,function = "pwm4"; 402 + }; 403 + }; 404 + gps_pins_a: gps@0 { 405 + gps { 406 + sirf,pins = "gpsgrp"; 407 + sirf,function = "gps"; 408 + }; 409 + }; 410 + vip_pins_a: vip@0 { 411 + vip { 412 + sirf,pins = "vipgrp"; 413 + sirf,function = "vip"; 414 + }; 415 + }; 416 + sdmmc0_pins_a: sdmmc0@0 { 417 + sdmmc0 { 418 + sirf,pins = "sdmmc0grp"; 419 + sirf,function = "sdmmc0"; 420 + }; 421 + }; 422 + sdmmc1_pins_a: sdmmc1@0 { 423 + sdmmc1 { 424 + sirf,pins = "sdmmc1grp"; 425 + sirf,function = "sdmmc1"; 426 + }; 427 + }; 428 + sdmmc2_pins_a: sdmmc2@0 { 429 + sdmmc2 { 430 + sirf,pins = "sdmmc2grp"; 431 + sirf,function = "sdmmc2"; 432 + }; 433 + }; 434 + sdmmc2_nowp_pins_a: sdmmc2_nowp@0 { 435 + sdmmc2_nowp { 436 + sirf,pins = "sdmmc2_nowpgrp"; 437 + sirf,function = "sdmmc2_nowp"; 438 + }; 439 + }; 440 + sdmmc3_pins_a: sdmmc3@0 { 441 + sdmmc3 { 442 + sirf,pins = "sdmmc3grp"; 443 + sirf,function = "sdmmc3"; 444 + }; 445 + }; 446 + sdmmc5_pins_a: sdmmc5@0 { 447 + sdmmc5 { 448 + sirf,pins = "sdmmc5grp"; 449 + sirf,function = "sdmmc5"; 450 + }; 451 + }; 452 + i2s_pins_a: i2s@0 { 453 + i2s { 454 + sirf,pins = "i2sgrp"; 455 + sirf,function = "i2s"; 456 + }; 457 + }; 458 + i2s_no_din_pins_a: i2s_no_din@0 { 459 + i2s_no_din { 460 + sirf,pins = "i2s_no_dingrp"; 461 + sirf,function = "i2s_no_din"; 462 + }; 463 + }; 464 + i2s_6chn_pins_a: i2s_6chn@0 { 465 + i2s_6chn { 466 + sirf,pins = "i2s_6chngrp"; 467 + sirf,function = "i2s_6chn"; 468 + }; 469 + }; 470 + ac97_pins_a: ac97@0 { 471 + ac97 { 472 + sirf,pins = "ac97grp"; 473 + sirf,function = "ac97"; 474 + }; 475 + }; 476 + nand_pins_a: nand@0 { 477 + nand { 478 + sirf,pins = "nandgrp"; 479 + sirf,function = "nand"; 480 + }; 481 + }; 482 + usp0_pins_a: usp0@0 { 483 + usp0 { 484 + sirf,pins = "usp0grp"; 485 + sirf,function = "usp0"; 486 + }; 487 + }; 488 + usp1_pins_a: usp1@0 { 489 + usp1 { 490 + sirf,pins = "usp1grp"; 491 + sirf,function = "usp1"; 492 + }; 493 + }; 494 + usb0_upli_drvbus_pins_a: usb0_upli_drvbus@0 { 495 + usb0_upli_drvbus { 496 + sirf,pins = "usb0_upli_drvbusgrp"; 497 + sirf,function = "usb0_upli_drvbus"; 498 + }; 499 + }; 500 + usb1_utmi_drvbus_pins_a: usb1_utmi_drvbus@0 { 501 + usb1_utmi_drvbus { 502 + sirf,pins = "usb1_utmi_drvbusgrp"; 503 + sirf,function = "usb1_utmi_drvbus"; 504 + }; 505 + }; 506 + warm_rst_pins_a: warm_rst@0 { 507 + warm_rst { 508 + sirf,pins = "warm_rstgrp"; 509 + sirf,function = "warm_rst"; 510 + }; 511 + }; 512 + pulse_count_pins_a: pulse_count@0 { 513 + pulse_count { 514 + sirf,pins = "pulse_countgrp"; 515 + sirf,function = "pulse_count"; 516 + }; 517 + }; 518 + cko0_rst_pins_a: cko0_rst@0 { 519 + cko0_rst { 520 + sirf,pins = "cko0_rstgrp"; 521 + sirf,function = "cko0_rst"; 522 + }; 523 + }; 524 + cko1_rst_pins_a: cko1_rst@0 { 525 + cko1_rst { 526 + sirf,pins = "cko1_rstgrp"; 527 + sirf,function = "cko1_rst"; 528 + }; 529 + }; 530 + }; 531 + 532 + pwm@b0130000 { 533 + compatible = "sirf,prima2-pwm"; 534 + reg = <0xb0130000 0x10000>; 535 + clocks = <&clks 21>; 536 + }; 537 + 538 + efusesys@b0140000 { 539 + compatible = "sirf,prima2-efuse"; 540 + reg = <0xb0140000 0x10000>; 541 + clocks = <&clks 22>; 542 + }; 543 + 544 + pulsec@b0150000 { 545 + compatible = "sirf,prima2-pulsec"; 546 + reg = <0xb0150000 0x10000>; 547 + interrupts = <48>; 548 + clocks = <&clks 23>; 549 + }; 550 + 551 + pci-iobg { 552 + compatible = "sirf,prima2-pciiobg", "simple-bus"; 553 + #address-cells = <1>; 554 + #size-cells = <1>; 555 + ranges = <0x56000000 0x56000000 0x1b00000>; 556 + 557 + sd0: sdhci@56000000 { 558 + cell-index = <0>; 559 + compatible = "sirf,prima2-sdhc"; 560 + reg = <0x56000000 0x100000>; 561 + interrupts = <38>; 562 + bus-width = <8>; 563 + clocks = <&clks 36>; 564 + }; 565 + 566 + sd1: sdhci@56100000 { 567 + cell-index = <1>; 568 + compatible = "sirf,prima2-sdhc"; 569 + reg = <0x56100000 0x100000>; 570 + interrupts = <38>; 571 + status = "disabled"; 572 + clocks = <&clks 36>; 573 + }; 574 + 575 + sd2: sdhci@56200000 { 576 + cell-index = <2>; 577 + compatible = "sirf,prima2-sdhc"; 578 + reg = <0x56200000 0x100000>; 579 + interrupts = <23>; 580 + status = "disabled"; 581 + clocks = <&clks 37>; 582 + }; 583 + 584 + sd3: sdhci@56300000 { 585 + cell-index = <3>; 586 + compatible = "sirf,prima2-sdhc"; 587 + reg = <0x56300000 0x100000>; 588 + interrupts = <23>; 589 + status = "disabled"; 590 + clocks = <&clks 37>; 591 + }; 592 + 593 + sd5: sdhci@56500000 { 594 + cell-index = <5>; 595 + compatible = "sirf,prima2-sdhc"; 596 + reg = <0x56500000 0x100000>; 597 + interrupts = <39>; 598 + status = "disabled"; 599 + clocks = <&clks 38>; 600 + }; 601 + 602 + pci-copy@57900000 { 603 + compatible = "sirf,prima2-pcicp"; 604 + reg = <0x57900000 0x100000>; 605 + interrupts = <40>; 606 + }; 607 + 608 + rom-interface@57a00000 { 609 + compatible = "sirf,prima2-romif"; 610 + reg = <0x57a00000 0x100000>; 611 + }; 612 + }; 613 + }; 614 + 615 + rtc-iobg { 616 + compatible = "sirf,prima2-rtciobg", "sirf-prima2-rtciobg-bus"; 617 + #address-cells = <1>; 618 + #size-cells = <1>; 619 + reg = <0x80030000 0x10000>; 620 + 621 + gpsrtc@1000 { 622 + compatible = "sirf,prima2-gpsrtc"; 623 + reg = <0x1000 0x1000>; 624 + interrupts = <55 56 57>; 625 + }; 626 + 627 + sysrtc@2000 { 628 + compatible = "sirf,prima2-sysrtc"; 629 + reg = <0x2000 0x1000>; 630 + interrupts = <52 53 54>; 631 + }; 632 + 633 + pwrc@3000 { 634 + compatible = "sirf,prima2-pwrc"; 635 + reg = <0x3000 0x1000>; 636 + interrupts = <32>; 637 + }; 638 + }; 639 + 640 + uus-iobg { 641 + compatible = "simple-bus"; 642 + #address-cells = <1>; 643 + #size-cells = <1>; 644 + ranges = <0xb8000000 0xb8000000 0x40000>; 645 + 646 + usb0: usb@b00e0000 { 647 + compatible = "chipidea,ci13611a-prima2"; 648 + reg = <0xb8000000 0x10000>; 649 + interrupts = <10>; 650 + clocks = <&clks 40>; 651 + }; 652 + 653 + usb1: usb@b00f0000 { 654 + compatible = "chipidea,ci13611a-prima2"; 655 + reg = <0xb8010000 0x10000>; 656 + interrupts = <11>; 657 + clocks = <&clks 41>; 658 + }; 659 + 660 + security@b00f0000 { 661 + compatible = "sirf,prima2-security"; 662 + reg = <0xb8030000 0x10000>; 663 + interrupts = <42>; 664 + clocks = <&clks 7>; 665 + }; 666 + }; 667 + }; 668 + };
+6
arch/arm/configs/multi_v7_defconfig
··· 3 3 CONFIG_HIGH_RES_TIMERS=y 4 4 CONFIG_ARCH_MVEBU=y 5 5 CONFIG_MACH_ARMADA_370=y 6 + CONFIG_ARCH_SIRF=y 6 7 CONFIG_MACH_ARMADA_XP=y 7 8 CONFIG_ARCH_HIGHBANK=y 8 9 CONFIG_ARCH_SOCFPGA=y ··· 41 40 CONFIG_SERIAL_AMBA_PL011=y 42 41 CONFIG_SERIAL_AMBA_PL011_CONSOLE=y 43 42 CONFIG_SERIAL_OF_PLATFORM=y 43 + CONFIG_SERIAL_SIRFSOC=y 44 + CONFIG_SERIAL_SIRFSOC_CONSOLE=y 44 45 CONFIG_IPMI_HANDLER=y 45 46 CONFIG_IPMI_SI=y 46 47 CONFIG_I2C=y 47 48 CONFIG_I2C_DESIGNWARE_PLATFORM=y 49 + CONFIG_I2C_SIRF=y 48 50 CONFIG_SPI=y 49 51 CONFIG_SPI_PL022=y 52 + CONFIG_SPI_SIRF=y 50 53 CONFIG_GPIO_PL061=y 51 54 CONFIG_FB=y 52 55 CONFIG_FB_ARMCLCD=y ··· 71 66 CONFIG_RTC_DRV_PL031=y 72 67 CONFIG_DMADEVICES=y 73 68 CONFIG_PL330_DMA=y 69 + CONFIG_SIRF_DMA=y 74 70 CONFIG_DW_DMAC=y
-8
arch/arm/include/asm/smp_twd.h
··· 34 34 35 35 int twd_local_timer_register(struct twd_local_timer *); 36 36 37 - #ifdef CONFIG_HAVE_ARM_TWD 38 - void twd_local_timer_of_register(void); 39 - #else 40 - static inline void twd_local_timer_of_register(void) 41 - { 42 - } 43 - #endif 44 - 45 37 #endif
+4 -13
arch/arm/kernel/smp_twd.c
··· 362 362 } 363 363 364 364 #ifdef CONFIG_OF 365 - const static struct of_device_id twd_of_match[] __initconst = { 366 - { .compatible = "arm,cortex-a9-twd-timer", }, 367 - { .compatible = "arm,cortex-a5-twd-timer", }, 368 - { .compatible = "arm,arm11mp-twd-timer", }, 369 - { }, 370 - }; 371 - 372 - void __init twd_local_timer_of_register(void) 365 + static void __init twd_local_timer_of_register(struct device_node *np) 373 366 { 374 - struct device_node *np; 375 367 int err; 376 368 377 369 if (!is_smp() || !setup_max_cpus) 378 - return; 379 - 380 - np = of_find_matching_node(NULL, twd_of_match); 381 - if (!np) 382 370 return; 383 371 384 372 twd_ppi = irq_of_parse_and_map(np, 0); ··· 386 398 out: 387 399 WARN(err, "twd_local_timer_of_register failed (%d)\n", err); 388 400 } 401 + CLOCKSOURCE_OF_DECLARE(arm_twd_a9, "arm,cortex-a9-twd-timer", twd_local_timer_of_register); 402 + CLOCKSOURCE_OF_DECLARE(arm_twd_a5, "arm,cortex-a5-twd-timer", twd_local_timer_of_register); 403 + CLOCKSOURCE_OF_DECLARE(arm_twd_11mp, "arm,arm11mp-twd-timer", twd_local_timer_of_register); 389 404 #endif
+2 -3
arch/arm/mach-highbank/highbank.c
··· 32 32 #include <asm/cacheflush.h> 33 33 #include <asm/cputype.h> 34 34 #include <asm/smp_plat.h> 35 - #include <asm/smp_twd.h> 36 35 #include <asm/hardware/arm_timer.h> 37 36 #include <asm/hardware/timer-sp.h> 38 37 #include <asm/hardware/cache-l2x0.h> ··· 118 119 sp804_clocksource_and_sched_clock_init(timer_base + 0x20, "timer1"); 119 120 sp804_clockevents_init(timer_base, irq, "timer0"); 120 121 121 - twd_local_timer_of_register(); 122 - 123 122 arch_timer_of_register(); 124 123 arch_timer_sched_clock_init(); 124 + 125 + clocksource_of_init(); 125 126 } 126 127 127 128 static void highbank_power_off(void)
+2 -3
arch/arm/mach-imx/mach-imx6q.c
··· 12 12 13 13 #include <linux/clk.h> 14 14 #include <linux/clkdev.h> 15 + #include <linux/clocksource.h> 15 16 #include <linux/cpu.h> 16 17 #include <linux/delay.h> 17 18 #include <linux/export.h> ··· 29 28 #include <linux/regmap.h> 30 29 #include <linux/micrel_phy.h> 31 30 #include <linux/mfd/syscon.h> 32 - #include <asm/smp_twd.h> 33 31 #include <asm/hardware/cache-l2x0.h> 34 32 #include <asm/mach/arch.h> 35 33 #include <asm/mach/map.h> 36 - #include <asm/mach/time.h> 37 34 #include <asm/system_misc.h> 38 35 39 36 #include "common.h" ··· 291 292 static void __init imx6q_timer_init(void) 292 293 { 293 294 mx6q_clocks_init(); 294 - twd_local_timer_of_register(); 295 + clocksource_of_init(); 295 296 imx_print_silicon_rev("i.MX6Q", imx6q_revision()); 296 297 } 297 298
+1 -1
arch/arm/mach-omap2/timer.c
··· 597 597 int err; 598 598 599 599 if (of_have_populated_dt()) { 600 - twd_local_timer_of_register(); 600 + clocksource_of_init(); 601 601 return; 602 602 } 603 603
+21 -1
arch/arm/mach-prima2/Kconfig
··· 1 + config ARCH_SIRF 2 + bool "CSR SiRF" if ARCH_MULTI_V7 3 + select ARCH_REQUIRE_GPIOLIB 4 + select GENERIC_CLOCKEVENTS 5 + select GENERIC_IRQ_CHIP 6 + select MIGHT_HAVE_CACHE_L2X0 7 + select NO_IOPORT 8 + select PINCTRL 9 + select PINCTRL_SIRF 10 + help 11 + Support for CSR SiRFprimaII/Marco/Polo platforms 12 + 1 13 if ARCH_SIRF 2 14 3 - menu "CSR SiRF primaII/Marco/Polo Specific Features" 15 + menu "CSR SiRF atlas6/primaII/Marco/Polo Specific Features" 16 + 17 + config ARCH_ATLAS6 18 + bool "CSR SiRFSoC ATLAS6 ARM Cortex A9 Platform" 19 + default y 20 + select CPU_V7 21 + select SIRF_IRQ 22 + help 23 + Support for CSR SiRFSoC ARM Cortex A9 Platform 4 24 5 25 config ARCH_PRIMA2 6 26 bool "CSR SiRFSoC PRIMA2 ARM Cortex A9 Platform"
+2 -3
arch/arm/mach-prima2/Makefile
··· 4 4 obj-$(CONFIG_DEBUG_LL) += lluart.o 5 5 obj-$(CONFIG_CACHE_L2X0) += l2x0.o 6 6 obj-$(CONFIG_SUSPEND) += pm.o sleep.o 7 - obj-$(CONFIG_SIRF_IRQ) += irq.o 8 7 obj-$(CONFIG_SMP) += platsmp.o headsmp.o 9 8 obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o 10 - obj-$(CONFIG_ARCH_PRIMA2) += timer-prima2.o 11 - obj-$(CONFIG_ARCH_MARCO) += timer-marco.o 9 + 10 + CFLAGS_hotplug.o += -march=armv7-a
+31 -6
arch/arm/mach-prima2/common.c
··· 6 6 * Licensed under GPLv2 or later. 7 7 */ 8 8 9 + #include <linux/clocksource.h> 9 10 #include <linux/init.h> 10 11 #include <linux/kernel.h> 11 12 #include <linux/irqchip.h> ··· 32 31 sirfsoc_pm_init(); 33 32 } 34 33 34 + static __init void sirfsoc_init_time(void) 35 + { 36 + /* initialize clocking early, we want to set the OS timer */ 37 + sirfsoc_of_clk_init(); 38 + clocksource_of_init(); 39 + } 40 + 35 41 static __init void sirfsoc_map_io(void) 36 42 { 37 43 sirfsoc_map_lluart(); 38 44 sirfsoc_map_scu(); 39 45 } 46 + 47 + #ifdef CONFIG_ARCH_ATLAS6 48 + static const char *atlas6_dt_match[] __initdata = { 49 + "sirf,atlas6", 50 + NULL 51 + }; 52 + 53 + DT_MACHINE_START(ATLAS6_DT, "Generic ATLAS6 (Flattened Device Tree)") 54 + /* Maintainer: Barry Song <baohua.song@csr.com> */ 55 + .nr_irqs = 128, 56 + .map_io = sirfsoc_map_io, 57 + .init_irq = irqchip_init, 58 + .init_time = sirfsoc_init_time, 59 + .init_machine = sirfsoc_mach_init, 60 + .init_late = sirfsoc_init_late, 61 + .dt_compat = atlas6_dt_match, 62 + .restart = sirfsoc_restart, 63 + MACHINE_END 64 + #endif 40 65 41 66 #ifdef CONFIG_ARCH_PRIMA2 42 67 static const char *prima2_dt_match[] __initdata = { ··· 72 45 73 46 DT_MACHINE_START(PRIMA2_DT, "Generic PRIMA2 (Flattened Device Tree)") 74 47 /* Maintainer: Barry Song <baohua.song@csr.com> */ 48 + .nr_irqs = 128, 75 49 .map_io = sirfsoc_map_io, 76 - .init_irq = sirfsoc_of_irq_init, 77 - .init_time = sirfsoc_prima2_timer_init, 78 - #ifdef CONFIG_MULTI_IRQ_HANDLER 79 - .handle_irq = sirfsoc_handle_irq, 80 - #endif 50 + .init_irq = irqchip_init, 51 + .init_time = sirfsoc_init_time, 81 52 .dma_zone_size = SZ_256M, 82 53 .init_machine = sirfsoc_mach_init, 83 54 .init_late = sirfsoc_init_late, ··· 95 70 .smp = smp_ops(sirfsoc_smp_ops), 96 71 .map_io = sirfsoc_map_io, 97 72 .init_irq = irqchip_init, 98 - .init_time = sirfsoc_marco_timer_init, 73 + .init_time = sirfsoc_init_time, 99 74 .init_machine = sirfsoc_mach_init, 100 75 .init_late = sirfsoc_init_late, 101 76 .dt_compat = marco_dt_match,
+2 -2
arch/arm/mach-prima2/common.h
··· 13 13 #include <asm/mach/time.h> 14 14 #include <asm/exception.h> 15 15 16 - extern void sirfsoc_prima2_timer_init(void); 17 - extern void sirfsoc_marco_timer_init(void); 16 + #define SIRFSOC_VA_BASE _AC(0xFEC00000, UL) 17 + #define SIRFSOC_VA(x) (SIRFSOC_VA_BASE + ((x) & 0x00FFF000)) 18 18 19 19 extern struct smp_operations sirfsoc_smp_ops; 20 20 extern void sirfsoc_secondary_startup(void);
-15
arch/arm/mach-prima2/include/mach/clkdev.h
··· 1 - /* 2 - * arch/arm/mach-prima2/include/mach/clkdev.h 3 - * 4 - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. 5 - * 6 - * Licensed under GPLv2 or later. 7 - */ 8 - 9 - #ifndef __MACH_CLKDEV_H 10 - #define __MACH_CLKDEV_H 11 - 12 - #define __clk_get(clk) ({ 1; }) 13 - #define __clk_put(clk) do { } while (0) 14 - 15 - #endif
-29
arch/arm/mach-prima2/include/mach/debug-macro.S
··· 1 - /* 2 - * arch/arm/mach-prima2/include/mach/debug-macro.S 3 - * 4 - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. 5 - * 6 - * Licensed under GPLv2 or later. 7 - */ 8 - 9 - #include <mach/hardware.h> 10 - #include <mach/uart.h> 11 - 12 - .macro addruart, rp, rv, tmp 13 - ldr \rp, =SIRFSOC_UART1_PA_BASE @ physical 14 - ldr \rv, =SIRFSOC_UART1_VA_BASE @ virtual 15 - .endm 16 - 17 - .macro senduart,rd,rx 18 - str \rd, [\rx, #SIRFSOC_UART_TXFIFO_DATA] 19 - .endm 20 - 21 - .macro busyuart,rd,rx 22 - .endm 23 - 24 - .macro waituart,rd,rx 25 - 1001: ldr \rd, [\rx, #SIRFSOC_UART_TXFIFO_STATUS] 26 - tst \rd, #SIRFSOC_UART1_TXFIFO_EMPTY 27 - beq 1001b 28 - .endm 29 -
-22
arch/arm/mach-prima2/include/mach/entry-macro.S
··· 1 - /* 2 - * arch/arm/mach-prima2/include/mach/entry-macro.S 3 - * 4 - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. 5 - * 6 - * Licensed under GPLv2 or later. 7 - */ 8 - 9 - #include <mach/hardware.h> 10 - 11 - #define SIRFSOC_INT_ID 0x38 12 - 13 - .macro get_irqnr_preamble, base, tmp 14 - ldr \base, =sirfsoc_intc_base 15 - ldr \base, [\base] 16 - .endm 17 - 18 - .macro get_irqnr_and_base, irqnr, irqstat, base, tmp 19 - ldr \irqnr, [\base, #SIRFSOC_INT_ID] @ Get the highest priority irq 20 - cmp \irqnr, #0x40 @ the irq num can't be larger than 0x3f 21 - movges \irqnr, #0 22 - .endm
-15
arch/arm/mach-prima2/include/mach/hardware.h
··· 1 - /* 2 - * arch/arm/mach-prima2/include/mach/hardware.h 3 - * 4 - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. 5 - * 6 - * Licensed under GPLv2 or later. 7 - */ 8 - 9 - #ifndef __MACH_HARDWARE_H__ 10 - #define __MACH_HARDWARE_H__ 11 - 12 - #include <asm/sizes.h> 13 - #include <mach/map.h> 14 - 15 - #endif
-17
arch/arm/mach-prima2/include/mach/irqs.h
··· 1 - /* 2 - * arch/arm/mach-prima2/include/mach/irqs.h 3 - * 4 - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. 5 - * 6 - * Licensed under GPLv2 or later. 7 - */ 8 - 9 - #ifndef __ASM_ARCH_IRQS_H 10 - #define __ASM_ARCH_IRQS_H 11 - 12 - #define SIRFSOC_INTENAL_IRQ_START 0 13 - #define SIRFSOC_INTENAL_IRQ_END 127 14 - #define SIRFSOC_GPIO_IRQ_START (SIRFSOC_INTENAL_IRQ_END + 1) 15 - #define NR_IRQS 288 16 - 17 - #endif
-18
arch/arm/mach-prima2/include/mach/map.h
··· 1 - /* 2 - * memory & I/O static mapping definitions for CSR SiRFprimaII 3 - * 4 - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. 5 - * 6 - * Licensed under GPLv2 or later. 7 - */ 8 - 9 - #ifndef __MACH_PRIMA2_MAP_H__ 10 - #define __MACH_PRIMA2_MAP_H__ 11 - 12 - #include <linux/const.h> 13 - 14 - #define SIRFSOC_VA_BASE _AC(0xFEC00000, UL) 15 - 16 - #define SIRFSOC_VA(x) (SIRFSOC_VA_BASE + ((x) & 0x00FFF000)) 17 - 18 - #endif
-14
arch/arm/mach-prima2/include/mach/timex.h
··· 1 - /* 2 - * arch/arm/mach-prima2/include/mach/timex.h 3 - * 4 - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. 5 - * 6 - * Licensed under GPLv2 or later. 7 - */ 8 - 9 - #ifndef __MACH_TIMEX_H__ 10 - #define __MACH_TIMEX_H__ 11 - 12 - #define CLOCK_TICK_RATE 1000000 13 - 14 - #endif
+21 -8
arch/arm/mach-prima2/include/mach/uart.h arch/arm/include/debug/sirf.S
··· 1 1 /* 2 - * arch/arm/mach-prima2/include/mach/uart.h 2 + * arch/arm/mach-prima2/include/mach/debug-macro.S 3 3 * 4 4 * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. 5 5 * 6 6 * Licensed under GPLv2 or later. 7 7 */ 8 8 9 - #ifndef __MACH_PRIMA2_SIRFSOC_UART_H 10 - #define __MACH_PRIMA2_SIRFSOC_UART_H 11 - 12 - /* UART-1: used as serial debug port */ 13 9 #if defined(CONFIG_DEBUG_SIRFPRIMA2_UART1) 14 10 #define SIRFSOC_UART1_PA_BASE 0xb0060000 15 11 #elif defined(CONFIG_DEBUG_SIRFMARCO_UART1) ··· 13 17 #else 14 18 #define SIRFSOC_UART1_PA_BASE 0 15 19 #endif 16 - #define SIRFSOC_UART1_VA_BASE SIRFSOC_VA(0x060000) 17 - #define SIRFSOC_UART1_SIZE SZ_4K 20 + 21 + #define SIRFSOC_UART1_VA_BASE 0xFEC60000 18 22 19 23 #define SIRFSOC_UART_TXFIFO_STATUS 0x0114 20 24 #define SIRFSOC_UART_TXFIFO_DATA 0x0118 ··· 22 26 #define SIRFSOC_UART1_TXFIFO_FULL (1 << 5) 23 27 #define SIRFSOC_UART1_TXFIFO_EMPTY (1 << 6) 24 28 25 - #endif 29 + .macro addruart, rp, rv, tmp 30 + ldr \rp, =SIRFSOC_UART1_PA_BASE @ physical 31 + ldr \rv, =SIRFSOC_UART1_VA_BASE @ virtual 32 + .endm 33 + 34 + .macro senduart,rd,rx 35 + str \rd, [\rx, #SIRFSOC_UART_TXFIFO_DATA] 36 + .endm 37 + 38 + .macro busyuart,rd,rx 39 + .endm 40 + 41 + .macro waituart,rd,rx 42 + 1001: ldr \rd, [\rx, #SIRFSOC_UART_TXFIFO_STATUS] 43 + tst \rd, #SIRFSOC_UART1_TXFIFO_EMPTY 44 + beq 1001b 45 + .endm 46 +
-41
arch/arm/mach-prima2/include/mach/uncompress.h
··· 1 - /* 2 - * arch/arm/mach-prima2/include/mach/uncompress.h 3 - * 4 - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. 5 - * 6 - * Licensed under GPLv2 or later. 7 - */ 8 - 9 - #ifndef __ASM_ARCH_UNCOMPRESS_H 10 - #define __ASM_ARCH_UNCOMPRESS_H 11 - 12 - #include <linux/io.h> 13 - #include <mach/hardware.h> 14 - #include <mach/uart.h> 15 - 16 - void arch_decomp_setup(void) 17 - { 18 - } 19 - 20 - static __inline__ void putc(char c) 21 - { 22 - /* 23 - * during kernel decompression, all mappings are flat: 24 - * virt_addr == phys_addr 25 - */ 26 - if (!SIRFSOC_UART1_PA_BASE) 27 - return; 28 - 29 - while (__raw_readl((void __iomem *)SIRFSOC_UART1_PA_BASE + SIRFSOC_UART_TXFIFO_STATUS) 30 - & SIRFSOC_UART1_TXFIFO_FULL) 31 - barrier(); 32 - 33 - __raw_writel(c, (void __iomem *)SIRFSOC_UART1_PA_BASE + SIRFSOC_UART_TXFIFO_DATA); 34 - } 35 - 36 - static inline void flush(void) 37 - { 38 - } 39 - 40 - #endif 41 -
-129
arch/arm/mach-prima2/irq.c
··· 1 - /* 2 - * interrupt controller support for CSR SiRFprimaII 3 - * 4 - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. 5 - * 6 - * Licensed under GPLv2 or later. 7 - */ 8 - 9 - #include <linux/init.h> 10 - #include <linux/io.h> 11 - #include <linux/irq.h> 12 - #include <linux/of.h> 13 - #include <linux/of_address.h> 14 - #include <linux/irqdomain.h> 15 - #include <linux/syscore_ops.h> 16 - #include <asm/mach/irq.h> 17 - #include <asm/exception.h> 18 - #include <mach/hardware.h> 19 - 20 - #define SIRFSOC_INT_RISC_MASK0 0x0018 21 - #define SIRFSOC_INT_RISC_MASK1 0x001C 22 - #define SIRFSOC_INT_RISC_LEVEL0 0x0020 23 - #define SIRFSOC_INT_RISC_LEVEL1 0x0024 24 - #define SIRFSOC_INIT_IRQ_ID 0x0038 25 - 26 - void __iomem *sirfsoc_intc_base; 27 - 28 - static __init void 29 - sirfsoc_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num) 30 - { 31 - struct irq_chip_generic *gc; 32 - struct irq_chip_type *ct; 33 - 34 - gc = irq_alloc_generic_chip("SIRFINTC", 1, irq_start, base, handle_level_irq); 35 - ct = gc->chip_types; 36 - 37 - ct->chip.irq_mask = irq_gc_mask_clr_bit; 38 - ct->chip.irq_unmask = irq_gc_mask_set_bit; 39 - ct->regs.mask = SIRFSOC_INT_RISC_MASK0; 40 - 41 - irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE, IRQ_NOREQUEST, 0); 42 - } 43 - 44 - static __init void sirfsoc_irq_init(void) 45 - { 46 - sirfsoc_alloc_gc(sirfsoc_intc_base, 0, 32); 47 - sirfsoc_alloc_gc(sirfsoc_intc_base + 4, 32, 48 - SIRFSOC_INTENAL_IRQ_END + 1 - 32); 49 - 50 - writel_relaxed(0, sirfsoc_intc_base + SIRFSOC_INT_RISC_LEVEL0); 51 - writel_relaxed(0, sirfsoc_intc_base + SIRFSOC_INT_RISC_LEVEL1); 52 - 53 - writel_relaxed(0, sirfsoc_intc_base + SIRFSOC_INT_RISC_MASK0); 54 - writel_relaxed(0, sirfsoc_intc_base + SIRFSOC_INT_RISC_MASK1); 55 - } 56 - 57 - asmlinkage void __exception_irq_entry sirfsoc_handle_irq(struct pt_regs *regs) 58 - { 59 - u32 irqstat, irqnr; 60 - 61 - irqstat = readl_relaxed(sirfsoc_intc_base + SIRFSOC_INIT_IRQ_ID); 62 - irqnr = irqstat & 0xff; 63 - 64 - handle_IRQ(irqnr, regs); 65 - } 66 - 67 - static struct of_device_id intc_ids[] = { 68 - { .compatible = "sirf,prima2-intc" }, 69 - {}, 70 - }; 71 - 72 - void __init sirfsoc_of_irq_init(void) 73 - { 74 - struct device_node *np; 75 - 76 - np = of_find_matching_node(NULL, intc_ids); 77 - if (!np) 78 - return; 79 - 80 - sirfsoc_intc_base = of_iomap(np, 0); 81 - if (!sirfsoc_intc_base) 82 - panic("unable to map intc cpu registers\n"); 83 - 84 - irq_domain_add_legacy(np, SIRFSOC_INTENAL_IRQ_END + 1, 0, 0, 85 - &irq_domain_simple_ops, NULL); 86 - 87 - of_node_put(np); 88 - 89 - sirfsoc_irq_init(); 90 - } 91 - 92 - struct sirfsoc_irq_status { 93 - u32 mask0; 94 - u32 mask1; 95 - u32 level0; 96 - u32 level1; 97 - }; 98 - 99 - static struct sirfsoc_irq_status sirfsoc_irq_st; 100 - 101 - static int sirfsoc_irq_suspend(void) 102 - { 103 - sirfsoc_irq_st.mask0 = readl_relaxed(sirfsoc_intc_base + SIRFSOC_INT_RISC_MASK0); 104 - sirfsoc_irq_st.mask1 = readl_relaxed(sirfsoc_intc_base + SIRFSOC_INT_RISC_MASK1); 105 - sirfsoc_irq_st.level0 = readl_relaxed(sirfsoc_intc_base + SIRFSOC_INT_RISC_LEVEL0); 106 - sirfsoc_irq_st.level1 = readl_relaxed(sirfsoc_intc_base + SIRFSOC_INT_RISC_LEVEL1); 107 - 108 - return 0; 109 - } 110 - 111 - static void sirfsoc_irq_resume(void) 112 - { 113 - writel_relaxed(sirfsoc_irq_st.mask0, sirfsoc_intc_base + SIRFSOC_INT_RISC_MASK0); 114 - writel_relaxed(sirfsoc_irq_st.mask1, sirfsoc_intc_base + SIRFSOC_INT_RISC_MASK1); 115 - writel_relaxed(sirfsoc_irq_st.level0, sirfsoc_intc_base + SIRFSOC_INT_RISC_LEVEL0); 116 - writel_relaxed(sirfsoc_irq_st.level1, sirfsoc_intc_base + SIRFSOC_INT_RISC_LEVEL1); 117 - } 118 - 119 - static struct syscore_ops sirfsoc_irq_syscore_ops = { 120 - .suspend = sirfsoc_irq_suspend, 121 - .resume = sirfsoc_irq_resume, 122 - }; 123 - 124 - static int __init sirfsoc_irq_pm_init(void) 125 - { 126 - register_syscore_ops(&sirfsoc_irq_syscore_ops); 127 - return 0; 128 - } 129 - device_initcall(sirfsoc_irq_pm_init);
+12 -2
arch/arm/mach-prima2/lluart.c
··· 9 9 #include <linux/kernel.h> 10 10 #include <asm/page.h> 11 11 #include <asm/mach/map.h> 12 - #include <mach/map.h> 13 - #include <mach/uart.h> 12 + #include "common.h" 13 + 14 + #if defined(CONFIG_DEBUG_SIRFPRIMA2_UART1) 15 + #define SIRFSOC_UART1_PA_BASE 0xb0060000 16 + #elif defined(CONFIG_DEBUG_SIRFMARCO_UART1) 17 + #define SIRFSOC_UART1_PA_BASE 0xcc060000 18 + #else 19 + #define SIRFSOC_UART1_PA_BASE 0 20 + #endif 21 + 22 + #define SIRFSOC_UART1_VA_BASE SIRFSOC_VA(0x060000) 23 + #define SIRFSOC_UART1_SIZE SZ_4K 14 24 15 25 void __init sirfsoc_map_lluart(void) 16 26 {
-1
arch/arm/mach-prima2/platsmp.c
··· 18 18 #include <asm/smp_scu.h> 19 19 #include <asm/cacheflush.h> 20 20 #include <asm/cputype.h> 21 - #include <mach/map.h> 22 21 23 22 #include "common.h" 24 23
+4 -21
arch/arm/mach-prima2/timer-marco.c drivers/clocksource/timer-marco.c
··· 21 21 #include <asm/localtimer.h> 22 22 #include <asm/mach/time.h> 23 23 24 - #include "common.h" 25 - 26 24 #define SIRFSOC_TIMER_32COUNTER_0_CTRL 0x0000 27 25 #define SIRFSOC_TIMER_32COUNTER_1_CTRL 0x0004 28 26 #define SIRFSOC_TIMER_MATCH_0 0x0018 ··· 51 53 static u32 sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT]; 52 54 53 55 static void __iomem *sirfsoc_timer_base; 54 - static void __init sirfsoc_of_timer_map(void); 55 56 56 57 /* disable count and interrupt */ 57 58 static inline void sirfsoc_timer_count_disable(int idx) ··· 239 242 } 240 243 241 244 /* initialize the kernel jiffy timer source */ 242 - void __init sirfsoc_marco_timer_init(void) 245 + static void __init sirfsoc_marco_timer_init(void) 243 246 { 244 247 unsigned long rate; 245 248 u32 timer_div; 246 249 struct clk *clk; 247 - 248 - /* initialize clocking early, we want to set the OS timer */ 249 - sirfsoc_of_clk_init(); 250 250 251 251 /* timer's input clock is io clock */ 252 252 clk = clk_get_sys("io", NULL); ··· 253 259 254 260 BUG_ON(rate < CLOCK_TICK_RATE); 255 261 BUG_ON(rate % CLOCK_TICK_RATE); 256 - 257 - sirfsoc_of_timer_map(); 258 262 259 263 /* Initialize the timer dividers */ 260 264 timer_div = rate / CLOCK_TICK_RATE - 1; ··· 278 286 sirfsoc_clockevent_init(); 279 287 } 280 288 281 - static struct of_device_id timer_ids[] = { 282 - { .compatible = "sirf,marco-tick" }, 283 - {}, 284 - }; 285 - 286 - static void __init sirfsoc_of_timer_map(void) 289 + static void __init sirfsoc_of_timer_init(struct device_node *np) 287 290 { 288 - struct device_node *np; 289 - 290 - np = of_find_matching_node(NULL, timer_ids); 291 - if (!np) 292 - return; 293 291 sirfsoc_timer_base = of_iomap(np, 0); 294 292 if (!sirfsoc_timer_base) 295 293 panic("unable to map timer cpu registers\n"); ··· 294 312 panic("No irq passed for timer1 via DT\n"); 295 313 #endif 296 314 297 - of_node_put(np); 315 + sirfsoc_marco_timer_init(); 298 316 } 317 + CLOCKSOURCE_OF_DECLARE(sirfsoc_marco_timer, "sirf,marco-tick", sirfsoc_of_timer_init );
+8 -34
arch/arm/mach-prima2/timer-prima2.c drivers/clocksource/timer-prima2.c
··· 16 16 #include <linux/err.h> 17 17 #include <linux/slab.h> 18 18 #include <linux/of.h> 19 + #include <linux/of_irq.h> 19 20 #include <linux/of_address.h> 20 - #include <mach/map.h> 21 21 #include <asm/sched_clock.h> 22 22 #include <asm/mach/time.h> 23 - 24 - #include "common.h" 25 23 26 24 #define SIRFSOC_TIMER_COUNTER_LO 0x0000 27 25 #define SIRFSOC_TIMER_COUNTER_HI 0x0004 ··· 53 55 static u32 sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT]; 54 56 55 57 static void __iomem *sirfsoc_timer_base; 56 - static void __init sirfsoc_of_timer_map(void); 57 58 58 59 /* timer0 interrupt handler */ 59 60 static irqreturn_t sirfsoc_timer_interrupt(int irq, void *dev_id) ··· 178 181 } 179 182 180 183 /* initialize the kernel jiffy timer source */ 181 - void __init sirfsoc_prima2_timer_init(void) 184 + static void __init sirfsoc_prima2_timer_init(struct device_node *np) 182 185 { 183 186 unsigned long rate; 184 187 struct clk *clk; 185 - 186 - /* initialize clocking early, we want to set the OS timer */ 187 - sirfsoc_of_clk_init(); 188 188 189 189 /* timer's input clock is io clock */ 190 190 clk = clk_get_sys("io", NULL); ··· 193 199 BUG_ON(rate < CLOCK_TICK_RATE); 194 200 BUG_ON(rate % CLOCK_TICK_RATE); 195 201 196 - sirfsoc_of_timer_map(); 202 + sirfsoc_timer_base = of_iomap(np, 0); 203 + if (!sirfsoc_timer_base) 204 + panic("unable to map timer cpu registers\n"); 205 + 206 + sirfsoc_timer_irq.irq = irq_of_parse_and_map(np, 0); 197 207 198 208 writel_relaxed(rate / CLOCK_TICK_RATE / 2 - 1, sirfsoc_timer_base + SIRFSOC_TIMER_DIV); 199 209 writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_LO); ··· 212 214 213 215 sirfsoc_clockevent_init(); 214 216 } 215 - 216 - static struct of_device_id timer_ids[] = { 217 - { .compatible = "sirf,prima2-tick" }, 218 - {}, 219 - }; 220 - 221 - static void __init sirfsoc_of_timer_map(void) 222 - { 223 - struct device_node *np; 224 - const unsigned int *intspec; 225 - 226 - np = of_find_matching_node(NULL, timer_ids); 227 - if (!np) 228 - return; 229 - sirfsoc_timer_base = of_iomap(np, 0); 230 - if (!sirfsoc_timer_base) 231 - panic("unable to map timer cpu registers\n"); 232 - 233 - /* Get the interrupts property */ 234 - intspec = of_get_property(np, "interrupts", NULL); 235 - BUG_ON(!intspec); 236 - sirfsoc_timer_irq.irq = be32_to_cpup(intspec); 237 - 238 - of_node_put(np); 239 - } 217 + CLOCKSOURCE_OF_DECLARE(sirfsoc_prima2_timer, "sirf,prima2-tick", sirfsoc_prima2_timer_init);
+2 -2
arch/arm/mach-spear/spear13xx.c
··· 15 15 16 16 #include <linux/amba/pl022.h> 17 17 #include <linux/clk.h> 18 + #include <linux/clocksource.h> 18 19 #include <linux/dw_dmac.h> 19 20 #include <linux/err.h> 20 21 #include <linux/of.h> 21 22 #include <asm/hardware/cache-l2x0.h> 22 23 #include <asm/mach/map.h> 23 - #include <asm/smp_twd.h> 24 24 #include "generic.h" 25 25 #include <mach/spear.h> 26 26 ··· 180 180 clk_put(pclk); 181 181 182 182 spear_setup_of_timer(); 183 - twd_local_timer_of_register(); 183 + clocksource_of_init(); 184 184 }
+2 -1
arch/arm/mach-ux500/timer.c
··· 7 7 #include <linux/io.h> 8 8 #include <linux/errno.h> 9 9 #include <linux/clksrc-dbx500-prcmu.h> 10 + #include <linux/clocksource.h> 10 11 #include <linux/of.h> 11 12 #include <linux/of_address.h> 12 13 #include <linux/platform_data/clocksource-nomadik-mtu.h> ··· 33 32 twd_local_timer = &u8500_twd_local_timer; 34 33 35 34 if (of_have_populated_dt()) 36 - twd_local_timer_of_register(); 35 + clocksource_of_init(); 37 36 else { 38 37 err = twd_local_timer_register(twd_local_timer); 39 38 if (err)
+3 -3
arch/arm/mach-vexpress/v2m.c
··· 5 5 #include <linux/amba/bus.h> 6 6 #include <linux/amba/mmci.h> 7 7 #include <linux/io.h> 8 + #include <linux/clocksource.h> 8 9 #include <linux/smp.h> 9 10 #include <linux/init.h> 10 11 #include <linux/irqchip.h> ··· 26 25 #include <asm/arch_timer.h> 27 26 #include <asm/mach-types.h> 28 27 #include <asm/sizes.h> 29 - #include <asm/smp_twd.h> 30 28 #include <asm/mach/arch.h> 31 29 #include <asm/mach/map.h> 32 30 #include <asm/mach/time.h> ··· 435 435 436 436 vexpress_clk_of_init(); 437 437 438 + clocksource_of_init(); 438 439 do { 439 440 node = of_find_compatible_node(node, NULL, "arm,sp804"); 440 441 } while (node && vexpress_get_site_by_node(node) != VEXPRESS_SITE_MB); ··· 446 445 irq_of_parse_and_map(node, 0)); 447 446 } 448 447 449 - if (arch_timer_of_register() != 0) 450 - twd_local_timer_of_register(); 448 + arch_timer_of_register(); 451 449 452 450 if (arch_timer_sched_clock_init() != 0) 453 451 versatile_sched_clock_init(vexpress_get_24mhz_clock_base(),
+2
drivers/clocksource/Makefile
··· 16 16 obj-$(CONFIG_CLKSRC_DBX500_PRCMU) += clksrc-dbx500-prcmu.o 17 17 obj-$(CONFIG_ARMADA_370_XP_TIMER) += time-armada-370-xp.o 18 18 obj-$(CONFIG_ARCH_BCM2835) += bcm2835_timer.o 19 + obj-$(CONFIG_ARCH_MARCO) += timer-marco.o 20 + obj-$(CONFIG_ARCH_PRIMA2) += timer-prima2.o 19 21 obj-$(CONFIG_SUNXI_TIMER) += sunxi_timer.o 20 22 obj-$(CONFIG_ARCH_TEGRA) += tegra20_timer.o 21 23 obj-$(CONFIG_VT8500_TIMER) += vt8500_timer.o
+1 -11
drivers/clocksource/bcm2835_timer.c
··· 95 95 } 96 96 } 97 97 98 - static struct of_device_id bcm2835_time_match[] __initconst = { 99 - { .compatible = "brcm,bcm2835-system-timer" }, 100 - {} 101 - }; 102 - 103 - static void __init bcm2835_timer_init(void) 98 + static void __init bcm2835_timer_init(struct device_node *node) 104 99 { 105 - struct device_node *node; 106 100 void __iomem *base; 107 101 u32 freq; 108 102 int irq; 109 103 struct bcm2835_timer *timer; 110 - 111 - node = of_find_matching_node(NULL, bcm2835_time_match); 112 - if (!node) 113 - panic("No bcm2835 timer node"); 114 104 115 105 base = of_iomap(node, 0); 116 106 if (!base)
+3 -2
drivers/clocksource/clksrc-of.c
··· 16 16 17 17 #include <linux/init.h> 18 18 #include <linux/of.h> 19 + #include <linux/clocksource.h> 19 20 20 21 extern struct of_device_id __clksrc_of_table[]; 21 22 ··· 27 26 { 28 27 struct device_node *np; 29 28 const struct of_device_id *match; 30 - void (*init_func)(void); 29 + clocksource_of_init_fn init_func; 31 30 32 31 for_each_matching_node_and_match(np, __clksrc_of_table, &match) { 33 32 init_func = match->data; 34 - init_func(); 33 + init_func(np); 35 34 } 36 35 }
+27 -46
drivers/clocksource/tegra20_timer.c
··· 154 154 .dev_id = &tegra_clockevent, 155 155 }; 156 156 157 - static const struct of_device_id timer_match[] __initconst = { 158 - { .compatible = "nvidia,tegra20-timer" }, 159 - {} 160 - }; 161 - 162 - static const struct of_device_id rtc_match[] __initconst = { 163 - { .compatible = "nvidia,tegra20-rtc" }, 164 - {} 165 - }; 166 - 167 - static void __init tegra20_init_timer(void) 157 + static void __init tegra20_init_timer(struct device_node *np) 168 158 { 169 - struct device_node *np; 170 159 struct clk *clk; 171 160 unsigned long rate; 172 161 int ret; 173 - 174 - np = of_find_matching_node(NULL, timer_match); 175 - if (!np) { 176 - pr_err("Failed to find timer DT node\n"); 177 - BUG(); 178 - } 179 162 180 163 timer_reg_base = of_iomap(np, 0); 181 164 if (!timer_reg_base) { ··· 180 197 clk_prepare_enable(clk); 181 198 rate = clk_get_rate(clk); 182 199 } 183 - 184 - of_node_put(np); 185 - 186 - np = of_find_matching_node(NULL, rtc_match); 187 - if (!np) { 188 - pr_err("Failed to find RTC DT node\n"); 189 - BUG(); 190 - } 191 - 192 - rtc_base = of_iomap(np, 0); 193 - if (!rtc_base) { 194 - pr_err("Can't map RTC registers"); 195 - BUG(); 196 - } 197 - 198 - /* 199 - * rtc registers are used by read_persistent_clock, keep the rtc clock 200 - * enabled 201 - */ 202 - clk = clk_get_sys("rtc-tegra", NULL); 203 - if (IS_ERR(clk)) 204 - pr_warn("Unable to get rtc-tegra clock\n"); 205 - else 206 - clk_prepare_enable(clk); 207 200 208 201 of_node_put(np); 209 202 ··· 218 259 tegra_clockevent.irq = tegra_timer_irq.irq; 219 260 clockevents_config_and_register(&tegra_clockevent, 1000000, 220 261 0x1, 0x1fffffff); 221 - #ifdef CONFIG_HAVE_ARM_TWD 222 - twd_local_timer_of_register(); 223 - #endif 262 + } 263 + CLOCKSOURCE_OF_DECLARE(tegra20_timer, "nvidia,tegra20-timer", tegra20_init_timer); 264 + 265 + static void __init tegra20_init_rtc(struct device_node *np) 266 + { 267 + struct clk *clk; 268 + 269 + rtc_base = of_iomap(np, 0); 270 + if (!rtc_base) { 271 + pr_err("Can't map RTC registers"); 272 + BUG(); 273 + } 274 + 275 + /* 276 + * rtc registers are used by read_persistent_clock, keep the rtc clock 277 + * enabled 278 + */ 279 + clk = clk_get_sys("rtc-tegra", NULL); 280 + if (IS_ERR(clk)) 281 + pr_warn("Unable to get rtc-tegra clock\n"); 282 + else 283 + clk_prepare_enable(clk); 284 + 285 + of_node_put(np); 286 + 224 287 register_persistent_clock(NULL, tegra_read_persistent_clock); 225 288 } 226 - CLOCKSOURCE_OF_DECLARE(tegra20, "nvidia,tegra20-timer", tegra20_init_timer); 289 + CLOCKSOURCE_OF_DECLARE(tegra20_rtc, "nvidia,tegra20-rtc", tegra20_init_rtc); 227 290 228 291 #ifdef CONFIG_PM 229 292 static u32 usec_config;
+2 -14
drivers/clocksource/vt8500_timer.c
··· 129 129 .dev_id = &clockevent, 130 130 }; 131 131 132 - static struct of_device_id vt8500_timer_ids[] = { 133 - { .compatible = "via,vt8500-timer" }, 134 - { } 135 - }; 136 - 137 - static void __init vt8500_timer_init(void) 132 + static void __init vt8500_timer_init(struct device_node *np) 138 133 { 139 - struct device_node *np; 140 134 int timer_irq; 141 135 142 - np = of_find_matching_node(NULL, vt8500_timer_ids); 143 - if (!np) { 144 - pr_err("%s: Timer description missing from Device Tree\n", 145 - __func__); 146 - return; 147 - } 148 136 regbase = of_iomap(np, 0); 149 137 if (!regbase) { 150 138 pr_err("%s: Missing iobase description in Device Tree\n", ··· 165 177 4, 0xf0000000); 166 178 } 167 179 168 - CLOCKSOURCE_OF_DECLARE(vt8500, "via,vt8500-timer", vt8500_timer_init) 180 + CLOCKSOURCE_OF_DECLARE(vt8500, "via,vt8500-timer", vt8500_timer_init);
+1
drivers/irqchip/Makefile
··· 8 8 obj-$(CONFIG_ARCH_SPEAR3XX) += spear-shirq.o 9 9 obj-$(CONFIG_ARM_GIC) += irq-gic.o 10 10 obj-$(CONFIG_ARM_VIC) += irq-vic.o 11 + obj-$(CONFIG_SIRF_IRQ) += irq-sirfsoc.o 11 12 obj-$(CONFIG_VERSATILE_FPGA_IRQ) += irq-versatile-fpga.o
+126
drivers/irqchip/irq-sirfsoc.c
··· 1 + /* 2 + * interrupt controller support for CSR SiRFprimaII 3 + * 4 + * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. 5 + * 6 + * Licensed under GPLv2 or later. 7 + */ 8 + 9 + #include <linux/init.h> 10 + #include <linux/io.h> 11 + #include <linux/irq.h> 12 + #include <linux/of.h> 13 + #include <linux/of_address.h> 14 + #include <linux/irqdomain.h> 15 + #include <linux/syscore_ops.h> 16 + #include <asm/mach/irq.h> 17 + #include <asm/exception.h> 18 + #include "irqchip.h" 19 + 20 + #define SIRFSOC_INT_RISC_MASK0 0x0018 21 + #define SIRFSOC_INT_RISC_MASK1 0x001C 22 + #define SIRFSOC_INT_RISC_LEVEL0 0x0020 23 + #define SIRFSOC_INT_RISC_LEVEL1 0x0024 24 + #define SIRFSOC_INIT_IRQ_ID 0x0038 25 + 26 + #define SIRFSOC_NUM_IRQS 128 27 + 28 + static struct irq_domain *sirfsoc_irqdomain; 29 + 30 + static __init void 31 + sirfsoc_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num) 32 + { 33 + struct irq_chip_generic *gc; 34 + struct irq_chip_type *ct; 35 + 36 + gc = irq_alloc_generic_chip("SIRFINTC", 1, irq_start, base, handle_level_irq); 37 + ct = gc->chip_types; 38 + 39 + ct->chip.irq_mask = irq_gc_mask_clr_bit; 40 + ct->chip.irq_unmask = irq_gc_mask_set_bit; 41 + ct->regs.mask = SIRFSOC_INT_RISC_MASK0; 42 + 43 + irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE, IRQ_NOREQUEST, 0); 44 + } 45 + 46 + static asmlinkage void __exception_irq_entry sirfsoc_handle_irq(struct pt_regs *regs) 47 + { 48 + void __iomem *base = sirfsoc_irqdomain->host_data; 49 + u32 irqstat, irqnr; 50 + 51 + irqstat = readl_relaxed(base + SIRFSOC_INIT_IRQ_ID); 52 + irqnr = irq_find_mapping(sirfsoc_irqdomain, irqstat & 0xff); 53 + 54 + handle_IRQ(irqnr, regs); 55 + } 56 + 57 + static int __init sirfsoc_irq_init(struct device_node *np, struct device_node *parent) 58 + { 59 + void __iomem *base = of_iomap(np, 0); 60 + if (!base) 61 + panic("unable to map intc cpu registers\n"); 62 + 63 + /* using legacy because irqchip_generic does not work with linear */ 64 + sirfsoc_irqdomain = irq_domain_add_legacy(np, SIRFSOC_NUM_IRQS, 0, 0, 65 + &irq_domain_simple_ops, base); 66 + 67 + sirfsoc_alloc_gc(base, 0, 32); 68 + sirfsoc_alloc_gc(base + 4, 32, SIRFSOC_NUM_IRQS - 32); 69 + 70 + writel_relaxed(0, base + SIRFSOC_INT_RISC_LEVEL0); 71 + writel_relaxed(0, base + SIRFSOC_INT_RISC_LEVEL1); 72 + 73 + writel_relaxed(0, base + SIRFSOC_INT_RISC_MASK0); 74 + writel_relaxed(0, base + SIRFSOC_INT_RISC_MASK1); 75 + 76 + set_handle_irq(sirfsoc_handle_irq); 77 + 78 + return 0; 79 + } 80 + IRQCHIP_DECLARE(sirfsoc_intc, "sirf,prima2-intc", sirfsoc_irq_init); 81 + 82 + struct sirfsoc_irq_status { 83 + u32 mask0; 84 + u32 mask1; 85 + u32 level0; 86 + u32 level1; 87 + }; 88 + 89 + static struct sirfsoc_irq_status sirfsoc_irq_st; 90 + 91 + static int sirfsoc_irq_suspend(void) 92 + { 93 + void __iomem *base = sirfsoc_irqdomain->host_data; 94 + 95 + sirfsoc_irq_st.mask0 = readl_relaxed(base + SIRFSOC_INT_RISC_MASK0); 96 + sirfsoc_irq_st.mask1 = readl_relaxed(base + SIRFSOC_INT_RISC_MASK1); 97 + sirfsoc_irq_st.level0 = readl_relaxed(base + SIRFSOC_INT_RISC_LEVEL0); 98 + sirfsoc_irq_st.level1 = readl_relaxed(base + SIRFSOC_INT_RISC_LEVEL1); 99 + 100 + return 0; 101 + } 102 + 103 + static void sirfsoc_irq_resume(void) 104 + { 105 + void __iomem *base = sirfsoc_irqdomain->host_data; 106 + 107 + writel_relaxed(sirfsoc_irq_st.mask0, base + SIRFSOC_INT_RISC_MASK0); 108 + writel_relaxed(sirfsoc_irq_st.mask1, base + SIRFSOC_INT_RISC_MASK1); 109 + writel_relaxed(sirfsoc_irq_st.level0, base + SIRFSOC_INT_RISC_LEVEL0); 110 + writel_relaxed(sirfsoc_irq_st.level1, base + SIRFSOC_INT_RISC_LEVEL1); 111 + } 112 + 113 + static struct syscore_ops sirfsoc_irq_syscore_ops = { 114 + .suspend = sirfsoc_irq_suspend, 115 + .resume = sirfsoc_irq_resume, 116 + }; 117 + 118 + static int __init sirfsoc_irq_pm_init(void) 119 + { 120 + if (!sirfsoc_irqdomain) 121 + return 0; 122 + 123 + register_syscore_ops(&sirfsoc_irq_syscore_ops); 124 + return 0; 125 + } 126 + device_initcall(sirfsoc_irq_pm_init);
+4 -8
drivers/pinctrl/pinctrl-sirf.c
··· 1347 1347 struct sirfsoc_gpio_bank *bank = container_of(to_of_mm_gpio_chip(chip), 1348 1348 struct sirfsoc_gpio_bank, chip); 1349 1349 1350 - return irq_find_mapping(bank->domain, offset); 1350 + return irq_create_mapping(bank->domain, offset); 1351 1351 } 1352 1352 1353 1353 static inline int sirfsoc_gpio_to_offset(unsigned int gpio) ··· 1485 1485 struct sirfsoc_gpio_bank *bank = irq_get_handler_data(irq); 1486 1486 u32 status, ctrl; 1487 1487 int idx = 0; 1488 - unsigned int first_irq; 1489 1488 struct irq_chip *chip = irq_get_chip(irq); 1490 1489 1491 1490 chained_irq_enter(chip, desc); ··· 1498 1499 return; 1499 1500 } 1500 1501 1501 - first_irq = bank->domain->revmap_data.legacy.first_irq; 1502 - 1503 1502 while (status) { 1504 1503 ctrl = readl(bank->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, idx)); 1505 1504 ··· 1508 1511 if ((status & 0x1) && (ctrl & SIRFSOC_GPIO_CTL_INTR_EN_MASK)) { 1509 1512 pr_debug("%s: gpio id %d idx %d happens\n", 1510 1513 __func__, bank->id, idx); 1511 - generic_handle_irq(first_irq + idx); 1514 + generic_handle_irq(irq_find_mapping(bank->domain, idx)); 1512 1515 } 1513 1516 1514 1517 idx++; ··· 1767 1770 goto out; 1768 1771 } 1769 1772 1770 - bank->domain = irq_domain_add_legacy(np, SIRFSOC_GPIO_BANK_SIZE, 1771 - SIRFSOC_GPIO_IRQ_START + i * SIRFSOC_GPIO_BANK_SIZE, 0, 1772 - &sirfsoc_gpio_irq_simple_ops, bank); 1773 + bank->domain = irq_domain_add_linear(np, SIRFSOC_GPIO_BANK_SIZE, 1774 + &sirfsoc_gpio_irq_simple_ops, bank); 1773 1775 1774 1776 if (!bank->domain) { 1775 1777 pr_err("%s: Failed to create irqdomain\n", np->full_name);
+10 -2
include/linux/clocksource.h
··· 332 332 333 333 extern int clocksource_i8253_init(void); 334 334 335 + struct device_node; 336 + typedef void(*clocksource_of_init_fn)(struct device_node *); 335 337 #ifdef CONFIG_CLKSRC_OF 336 338 extern void clocksource_of_init(void); 337 339 338 340 #define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \ 339 341 static const struct of_device_id __clksrc_of_table_##name \ 340 342 __used __section(__clksrc_of_table) \ 341 - = { .compatible = compat, .data = fn }; 343 + = { .compatible = compat, \ 344 + .data = (fn == (clocksource_of_init_fn)NULL) ? fn : fn } 342 345 #else 343 - #define CLOCKSOURCE_OF_DECLARE(name, compat, fn) 346 + static inline void clocksource_of_init(void) {} 347 + #define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \ 348 + static const struct of_device_id __clksrc_of_table_##name \ 349 + __unused __section(__clksrc_of_table) \ 350 + = { .compatible = compat, \ 351 + .data = (fn == (clocksource_of_init_fn)NULL) ? fn : fn } 344 352 #endif 345 353 346 354 #endif /* _LINUX_CLOCKSOURCE_H */