diff options
3 files changed, 1799 insertions, 116 deletions
diff --git a/recipes-kernel/linux/linux-yocto/xlnx_3.8/0001-Forward-code-to-match-xlnx_3.8-branch-on-linux_xlnx..patch b/recipes-kernel/linux/linux-yocto/xlnx_3.8/0001-Forward-code-to-match-xlnx_3.8-branch-on-linux_xlnx..patch index 27c237cf..3166bbb0 100644 --- a/recipes-kernel/linux/linux-yocto/xlnx_3.8/0001-Forward-code-to-match-xlnx_3.8-branch-on-linux_xlnx..patch +++ b/recipes-kernel/linux/linux-yocto/xlnx_3.8/0001-Forward-code-to-match-xlnx_3.8-branch-on-linux_xlnx..patch | |||
@@ -1,6 +1,6 @@ | |||
1 | From d4b1e64e45771480df527ff7890be14fce90a61d Mon Sep 17 00:00:00 2001 | 1 | From bcc57cd6e8484be41c996fd98702d360191c3b98 Mon Sep 17 00:00:00 2001 |
2 | From: Sipke Vriend <sipke.vriend@xilinx.com> | 2 | From: Sipke Vriend <sipke.vriend@xilinx.com> |
3 | Date: Fri, 25 Oct 2013 10:26:31 +1000 | 3 | Date: Fri, 8 Nov 2013 14:47:49 +1000 |
4 | Subject: [PATCH] Forward code to match xlnx_3.8 branch on linux_xlnx.git | 4 | Subject: [PATCH] Forward code to match xlnx_3.8 branch on linux_xlnx.git |
5 | 5 | ||
6 | Forward to commit id 7a65c6dd165a8fc052ba0321eb706536e6cbef71 | 6 | Forward to commit id 7a65c6dd165a8fc052ba0321eb706536e6cbef71 |
@@ -11,6 +11,9 @@ Signed-off-by: Sipke Vriend <sipke.vriend@xilinx.com> | |||
11 | Documentation/ABI/testing/debugfs-aufs | 37 - | 11 | Documentation/ABI/testing/debugfs-aufs | 37 - |
12 | Documentation/ABI/testing/sysfs-aufs | 24 - | 12 | Documentation/ABI/testing/sysfs-aufs | 24 - |
13 | .../devicetree/bindings/clock/zynq-7000.txt | 122 +- | 13 | .../devicetree/bindings/clock/zynq-7000.txt | 122 +- |
14 | .../devicetree/bindings/gpio/gpio-xilinx.txt | 50 + | ||
15 | .../bindings/remoteproc/mb_remoteproc.txt | 46 + | ||
16 | Documentation/driver-model/devres.txt | 3 +- | ||
14 | Documentation/filesystems/aufs/README | 333 -- | 17 | Documentation/filesystems/aufs/README | 333 -- |
15 | Documentation/filesystems/aufs/design/01intro.txt | 162 - | 18 | Documentation/filesystems/aufs/design/01intro.txt | 162 - |
16 | Documentation/filesystems/aufs/design/02struct.txt | 226 - | 19 | Documentation/filesystems/aufs/design/02struct.txt | 226 - |
@@ -45,13 +48,15 @@ Signed-off-by: Sipke Vriend <sipke.vriend@xilinx.com> | |||
45 | arch/arm/boot/dts/zynq-zc770-xm012.dts | 472 +- | 48 | arch/arm/boot/dts/zynq-zc770-xm012.dts | 472 +- |
46 | arch/arm/boot/dts/zynq-zc770-xm013.dts | 509 +- | 49 | arch/arm/boot/dts/zynq-zc770-xm013.dts | 509 +- |
47 | arch/arm/boot/dts/zynq-zed.dts | 234 +- | 50 | arch/arm/boot/dts/zynq-zed.dts | 234 +- |
51 | arch/arm/common/gic.c | 1 + | ||
48 | arch/arm/configs/at91sam9g45_defconfig | 1 + | 52 | arch/arm/configs/at91sam9g45_defconfig | 1 + |
49 | arch/arm/configs/xilinx_zynq_apf_defconfig | 2954 ++++++++++++ | 53 | arch/arm/configs/xilinx_zynq_apf_defconfig | 2954 ++++++++++++ |
50 | arch/arm/configs/xilinx_zynq_base_trd_defconfig | 2843 +++++++++++ | 54 | arch/arm/configs/xilinx_zynq_base_trd_defconfig | 2843 +++++++++++ |
51 | arch/arm/configs/xilinx_zynq_defconfig | 15 +- | 55 | arch/arm/configs/xilinx_zynq_defconfig | 15 +- |
56 | arch/arm/include/asm/mach/irq.h | 31 - | ||
52 | arch/arm/include/asm/pgtable.h | 9 - | 57 | arch/arm/include/asm/pgtable.h | 9 - |
53 | arch/arm/kernel/entry-common.S | 3 +- | 58 | arch/arm/kernel/entry-common.S | 3 +- |
54 | arch/arm/lib/memset.S | 33 +- | 59 | arch/arm/mach-at91/gpio.c | 3 +- |
55 | arch/arm/mach-at91/setup.c | 2 +- | 60 | arch/arm/mach-at91/setup.c | 2 +- |
56 | arch/arm/mach-imx/headsmp.S | 47 - | 61 | arch/arm/mach-imx/headsmp.S | 47 - |
57 | arch/arm/mach-omap2/cpuidle34xx.c | 5 +- | 62 | arch/arm/mach-omap2/cpuidle34xx.c | 5 +- |
@@ -70,6 +75,8 @@ Signed-off-by: Sipke Vriend <sipke.vriend@xilinx.com> | |||
70 | arch/arm/mach-zynq/xaxipcie.c | 2 - | 75 | arch/arm/mach-zynq/xaxipcie.c | 2 - |
71 | arch/arm/mm/cache-v7.S | 46 + | 76 | arch/arm/mm/cache-v7.S | 46 + |
72 | arch/arm/mm/fault.c | 13 +- | 77 | arch/arm/mm/fault.c | 13 +- |
78 | arch/arm/plat-samsung/irq-vic-timer.c | 3 +- | ||
79 | arch/arm/plat-samsung/s5p-irq-gpioint.c | 3 +- | ||
73 | arch/arm/xen/enlighten.c | 2 +- | 80 | arch/arm/xen/enlighten.c | 2 +- |
74 | arch/arm64/mm/fault.c | 3 +- | 81 | arch/arm64/mm/fault.c | 3 +- |
75 | arch/avr32/configs/favr-32_defconfig | 1 + | 82 | arch/avr32/configs/favr-32_defconfig | 1 + |
@@ -79,6 +86,7 @@ Signed-off-by: Sipke Vriend <sipke.vriend@xilinx.com> | |||
79 | arch/ia64/kernel/irq.c | 8 - | 86 | arch/ia64/kernel/irq.c | 8 - |
80 | arch/ia64/kernel/mca.c | 37 +- | 87 | arch/ia64/kernel/mca.c | 37 +- |
81 | arch/ia64/kvm/vtlb.c | 2 +- | 88 | arch/ia64/kvm/vtlb.c | 2 +- |
89 | arch/microblaze/Kconfig | 4 - | ||
82 | arch/microblaze/configs/mmu_defconfig | 1 - | 90 | arch/microblaze/configs/mmu_defconfig | 1 - |
83 | arch/microblaze/include/asm/io.h | 2 +- | 91 | arch/microblaze/include/asm/io.h | 2 +- |
84 | arch/microblaze/include/asm/pci.h | 2 - | 92 | arch/microblaze/include/asm/pci.h | 2 - |
@@ -90,10 +98,9 @@ Signed-off-by: Sipke Vriend <sipke.vriend@xilinx.com> | |||
90 | arch/microblaze/kernel/early_printk.c | 17 +- | 98 | arch/microblaze/kernel/early_printk.c | 17 +- |
91 | arch/microblaze/kernel/exceptions.c | 27 +- | 99 | arch/microblaze/kernel/exceptions.c | 27 +- |
92 | arch/microblaze/kernel/ftrace.c | 44 +- | 100 | arch/microblaze/kernel/ftrace.c | 44 +- |
93 | arch/microblaze/kernel/head.S | 4 +- | 101 | arch/microblaze/kernel/head.S | 6 +- |
94 | arch/microblaze/kernel/heartbeat.c | 2 +- | 102 | arch/microblaze/kernel/heartbeat.c | 2 +- |
95 | arch/microblaze/kernel/intc.c | 4 +- | 103 | arch/microblaze/kernel/intc.c | 4 +- |
96 | arch/microblaze/kernel/kgdb.c | 2 +- | ||
97 | arch/microblaze/kernel/microblaze_ksyms.c | 2 +- | 104 | arch/microblaze/kernel/microblaze_ksyms.c | 2 +- |
98 | arch/microblaze/kernel/module.c | 5 +- | 105 | arch/microblaze/kernel/module.c | 5 +- |
99 | arch/microblaze/kernel/process.c | 24 +- | 106 | arch/microblaze/kernel/process.c | 24 +- |
@@ -167,8 +174,16 @@ Signed-off-by: Sipke Vriend <sipke.vriend@xilinx.com> | |||
167 | drivers/clk/zynq/pll.c | 243 + | 174 | drivers/clk/zynq/pll.c | 243 + |
168 | drivers/cpufreq/zynq-cpufreq.c | 45 +- | 175 | drivers/cpufreq/zynq-cpufreq.c | 45 +- |
169 | drivers/edac/edac_mc_sysfs.c | 12 +- | 176 | drivers/edac/edac_mc_sysfs.c | 12 +- |
177 | drivers/gpio/Kconfig | 1 + | ||
178 | drivers/gpio/gpio-msm-v2.c | 3 +- | ||
179 | drivers/gpio/gpio-mxc.c | 2 +- | ||
180 | drivers/gpio/gpio-omap.c | 3 +- | ||
181 | drivers/gpio/gpio-pl061.c | 2 +- | ||
182 | drivers/gpio/gpio-pxa.c | 3 +- | ||
170 | drivers/gpio/gpio-sch.c | 37 +- | 183 | drivers/gpio/gpio-sch.c | 37 +- |
171 | drivers/gpio/gpio-xilinxps.c | 7 +- | 184 | drivers/gpio/gpio-tegra.c | 3 +- |
185 | drivers/gpio/gpio-xilinx.c | 412 +- | ||
186 | drivers/gpio/gpio-xilinxps.c | 9 +- | ||
172 | drivers/gpu/drm/ast/ast_drv.h | 2 - | 187 | drivers/gpu/drm/ast/ast_drv.h | 2 - |
173 | drivers/gpu/drm/ast/ast_fb.c | 43 +- | 188 | drivers/gpu/drm/ast/ast_fb.c | 43 +- |
174 | drivers/gpu/drm/ast/ast_ttm.c | 2 +- | 189 | drivers/gpu/drm/ast/ast_ttm.c | 2 +- |
@@ -241,8 +256,13 @@ Signed-off-by: Sipke Vriend <sipke.vriend@xilinx.com> | |||
241 | drivers/net/wireless/rt2x00/rt2800lib.c | 8 +- | 256 | drivers/net/wireless/rt2x00/rt2800lib.c | 8 +- |
242 | drivers/pci/pci-driver.c | 4 - | 257 | drivers/pci/pci-driver.c | 4 - |
243 | drivers/pci/pci.c | 12 +- | 258 | drivers/pci/pci.c | 12 +- |
259 | drivers/pinctrl/pinctrl-at91.c | 3 +- | ||
260 | drivers/pinctrl/pinctrl-exynos.c | 3 +- | ||
261 | drivers/pinctrl/pinctrl-sirf.c | 2 +- | ||
262 | drivers/pinctrl/spear/pinctrl-plgpio.c | 2 +- | ||
244 | drivers/pwm/pwm-spear.c | 6 +- | 263 | drivers/pwm/pwm-spear.c | 6 +- |
245 | drivers/remoteproc/Kconfig | 5 +- | 264 | drivers/remoteproc/Kconfig | 5 + |
265 | drivers/remoteproc/mb_remoteproc.c | 291 +- | ||
246 | drivers/rpmsg/rpmsg_freertos_statistic.c | 1 - | 266 | drivers/rpmsg/rpmsg_freertos_statistic.c | 1 - |
247 | drivers/rtc/rtc-cmos.c | 4 +- | 267 | drivers/rtc/rtc-cmos.c | 4 +- |
248 | drivers/s390/char/sclp_cmd.c | 4 +- | 268 | drivers/s390/char/sclp_cmd.c | 4 +- |
@@ -260,6 +280,7 @@ Signed-off-by: Sipke Vriend <sipke.vriend@xilinx.com> | |||
260 | drivers/staging/apf/xlnk-ioctl.h | 39 + | 280 | drivers/staging/apf/xlnk-ioctl.h | 39 + |
261 | drivers/staging/apf/xlnk.c | 1261 +++++ | 281 | drivers/staging/apf/xlnk.c | 1261 +++++ |
262 | drivers/staging/apf/xlnk.h | 116 + | 282 | drivers/staging/apf/xlnk.h | 116 + |
283 | drivers/staging/imx-drm/ipu-v3/ipu-common.c | 2 +- | ||
263 | drivers/staging/video/axivdma/Kconfig | 16 + | 284 | drivers/staging/video/axivdma/Kconfig | 16 + |
264 | drivers/staging/video/axivdma/Makefile | 1 + | 285 | drivers/staging/video/axivdma/Makefile | 1 + |
265 | drivers/staging/video/axivdma/xvdma.c | 440 ++ | 286 | drivers/staging/video/axivdma/xvdma.c | 440 ++ |
@@ -461,9 +482,11 @@ Signed-off-by: Sipke Vriend <sipke.vriend@xilinx.com> | |||
461 | include/linux/clk-provider.h | 8 +- | 482 | include/linux/clk-provider.h | 8 +- |
462 | include/linux/clk.h | 22 +- | 483 | include/linux/clk.h | 22 +- |
463 | include/linux/clk/zynq.h | 28 +- | 484 | include/linux/clk/zynq.h | 28 +- |
485 | include/linux/device.h | 1 + | ||
464 | include/linux/fs.h | 1 - | 486 | include/linux/fs.h | 1 - |
465 | include/linux/hugetlb.h | 19 +- | 487 | include/linux/hugetlb.h | 19 +- |
466 | include/linux/ipc_namespace.h | 2 +- | 488 | include/linux/ipc_namespace.h | 2 +- |
489 | include/linux/irqchip/chained_irq.h | 52 + | ||
467 | include/linux/jbd2.h | 2 - | 490 | include/linux/jbd2.h | 2 - |
468 | include/linux/mm_types.h | 2 - | 491 | include/linux/mm_types.h | 2 - |
469 | include/linux/nfs_fs_sb.h | 3 - | 492 | include/linux/nfs_fs_sb.h | 3 - |
@@ -494,6 +517,7 @@ Signed-off-by: Sipke Vriend <sipke.vriend@xilinx.com> | |||
494 | kernel/trace/trace_stack.c | 76 +- | 517 | kernel/trace/trace_stack.c | 76 +- |
495 | kernel/trace/trace_stat.c | 2 - | 518 | kernel/trace/trace_stat.c | 2 - |
496 | kernel/uptime_limit.c | 166 - | 519 | kernel/uptime_limit.c | 166 - |
520 | lib/devres.c | 58 +- | ||
497 | lib/oid_registry.c | 5 - | 521 | lib/oid_registry.c | 5 - |
498 | mm/memory.c | 2 - | 522 | mm/memory.c | 2 - |
499 | mm/mmap.c | 21 +- | 523 | mm/mmap.c | 21 +- |
@@ -512,6 +536,7 @@ Signed-off-by: Sipke Vriend <sipke.vriend@xilinx.com> | |||
512 | net/netfilter/nf_conntrack_sip.c | 2 +- | 536 | net/netfilter/nf_conntrack_sip.c | 2 +- |
513 | net/netfilter/nf_nat_core.c | 40 +- | 537 | net/netfilter/nf_nat_core.c | 40 +- |
514 | net/wireless/reg.c | 2 +- | 538 | net/wireless/reg.c | 2 +- |
539 | scripts/coccinelle/api/devm_ioremap_resource.cocci | 90 + | ||
515 | scripts/kconfig/streamline_config.pl | 17 +- | 540 | scripts/kconfig/streamline_config.pl | 17 +- |
516 | scripts/mod/modpost.c | 6 +- | 541 | scripts/mod/modpost.c | 6 +- |
517 | security/commoncap.c | 2 - | 542 | security/commoncap.c | 2 - |
@@ -541,9 +566,11 @@ Signed-off-by: Sipke Vriend <sipke.vriend@xilinx.com> | |||
541 | tools/perf/util/include/linux/compiler.h | 1 - | 566 | tools/perf/util/include/linux/compiler.h | 1 - |
542 | .../util/scripting-engines/trace-event-python.c | 4 - | 567 | .../util/scripting-engines/trace-event-python.c | 4 - |
543 | usr/Makefile | 2 +- | 568 | usr/Makefile | 2 +- |
544 | 533 files changed, 15818 insertions(+), 53168 deletions(-) | 569 | 558 files changed, 16640 insertions(+), 53392 deletions(-) |
545 | delete mode 100644 Documentation/ABI/testing/debugfs-aufs | 570 | delete mode 100644 Documentation/ABI/testing/debugfs-aufs |
546 | delete mode 100644 Documentation/ABI/testing/sysfs-aufs | 571 | delete mode 100644 Documentation/ABI/testing/sysfs-aufs |
572 | create mode 100644 Documentation/devicetree/bindings/gpio/gpio-xilinx.txt | ||
573 | create mode 100644 Documentation/devicetree/bindings/remoteproc/mb_remoteproc.txt | ||
547 | delete mode 100644 Documentation/filesystems/aufs/README | 574 | delete mode 100644 Documentation/filesystems/aufs/README |
548 | delete mode 100644 Documentation/filesystems/aufs/design/01intro.txt | 575 | delete mode 100644 Documentation/filesystems/aufs/design/01intro.txt |
549 | delete mode 100644 Documentation/filesystems/aufs/design/02struct.txt | 576 | delete mode 100644 Documentation/filesystems/aufs/design/02struct.txt |
@@ -693,8 +720,10 @@ Signed-off-by: Sipke Vriend <sipke.vriend@xilinx.com> | |||
693 | delete mode 100644 fs/yaffs2/yaffs_yaffs2.h | 720 | delete mode 100644 fs/yaffs2/yaffs_yaffs2.h |
694 | delete mode 100644 fs/yaffs2/yportenv.h | 721 | delete mode 100644 fs/yaffs2/yportenv.h |
695 | delete mode 100644 include/linux/aufs_type.h | 722 | delete mode 100644 include/linux/aufs_type.h |
723 | create mode 100644 include/linux/irqchip/chained_irq.h | ||
696 | delete mode 100644 include/uapi/linux/aufs_type.h | 724 | delete mode 100644 include/uapi/linux/aufs_type.h |
697 | delete mode 100644 kernel/uptime_limit.c | 725 | delete mode 100644 kernel/uptime_limit.c |
726 | create mode 100644 scripts/coccinelle/api/devm_ioremap_resource.cocci | ||
698 | 727 | ||
699 | diff --git a/Documentation/ABI/testing/debugfs-aufs b/Documentation/ABI/testing/debugfs-aufs | 728 | diff --git a/Documentation/ABI/testing/debugfs-aufs b/Documentation/ABI/testing/debugfs-aufs |
700 | deleted file mode 100644 | 729 | deleted file mode 100644 |
@@ -907,6 +936,128 @@ index c282375..7f686c8 100644 | |||
907 | + clocks = <&clkc 16>, <&clk_foo>; | 936 | + clocks = <&clkc 16>, <&clk_foo>; |
908 | + clock-names = "gem1_emio_clk", "can_mio_clk_23"; | 937 | + clock-names = "gem1_emio_clk", "can_mio_clk_23"; |
909 | + }; | 938 | + }; |
939 | diff --git a/Documentation/devicetree/bindings/gpio/gpio-xilinx.txt b/Documentation/devicetree/bindings/gpio/gpio-xilinx.txt | ||
940 | new file mode 100644 | ||
941 | index 0000000..7efb339 | ||
942 | --- /dev/null | ||
943 | +++ b/Documentation/devicetree/bindings/gpio/gpio-xilinx.txt | ||
944 | @@ -0,0 +1,50 @@ | ||
945 | +Xilinx plb/axi GPIO controller | ||
946 | + | ||
947 | +Dual channel GPIO controller with configurable number of pins | ||
948 | +(from 1 to 32 per channel). Every pin can be configured as | ||
949 | +input/output/tristate. Both channels share the same global IRQ but | ||
950 | +local interrupts can be enabled on channel basis. | ||
951 | + | ||
952 | +Required properties: | ||
953 | +- compatible : Should be "xlnx,xps-gpio-1.00.a" | ||
954 | +- reg : Address and length of the register set for the device | ||
955 | +- #gpio-cells : Should be two. The first cell is the pin number and the | ||
956 | + second cell is used to specify channel offset: | ||
957 | + 0 - first channel | ||
958 | + 8 - second channel | ||
959 | +- gpio-controller : Marks the device node as a GPIO controller. | ||
960 | + | ||
961 | +Optional properties: | ||
962 | +- interrupts : Interrupt mapping for GPIO IRQ. | ||
963 | +- interrupt-parent : Phandle for the interrupt controller that | ||
964 | + services interrupts for this device. | ||
965 | +- xlnx,all-inputs : if n-th bit is setup, GPIO-n is input | ||
966 | +- xlnx,dout-default : if n-th bit is 1, GPIO-n default value is 1 | ||
967 | +- xlnx,gpio-width : gpio width | ||
968 | +- xlnx,tri-default : if n-th bit is 1, GPIO-n is in tristate mode | ||
969 | +- xlnx,is-dual : if 1, controller also uses the second channel | ||
970 | +- xlnx,all-inputs-2 : as above but for the second channel | ||
971 | +- xlnx,dout-default-2 : as above but the second channel | ||
972 | +- xlnx,gpio2-width : as above but for the second channel | ||
973 | +- xlnx,tri-default-2 : as above but for the second channel | ||
974 | + | ||
975 | + | ||
976 | +Example: | ||
977 | +gpio: gpio@40000000 { | ||
978 | + #gpio-cells = <2>; | ||
979 | + compatible = "xlnx,xps-gpio-1.00.a"; | ||
980 | + gpio-controller ; | ||
981 | + interrupt-parent = <µblaze_0_intc>; | ||
982 | + interrupts = < 6 2 >; | ||
983 | + reg = < 0x40000000 0x10000 >; | ||
984 | + xlnx,all-inputs = <0x0>; | ||
985 | + xlnx,all-inputs-2 = <0x0>; | ||
986 | + xlnx,dout-default = <0x0>; | ||
987 | + xlnx,dout-default-2 = <0x0>; | ||
988 | + xlnx,gpio-width = <0x2>; | ||
989 | + xlnx,gpio2-width = <0x2>; | ||
990 | + xlnx,interrupt-present = <0x1>; | ||
991 | + xlnx,is-dual = <0x1>; | ||
992 | + xlnx,tri-default = <0xffffffff>; | ||
993 | + xlnx,tri-default-2 = <0xffffffff>; | ||
994 | +} ; | ||
995 | diff --git a/Documentation/devicetree/bindings/remoteproc/mb_remoteproc.txt b/Documentation/devicetree/bindings/remoteproc/mb_remoteproc.txt | ||
996 | new file mode 100644 | ||
997 | index 0000000..ebc2b35 | ||
998 | --- /dev/null | ||
999 | +++ b/Documentation/devicetree/bindings/remoteproc/mb_remoteproc.txt | ||
1000 | @@ -0,0 +1,46 @@ | ||
1001 | +Xilinx ARM-Microblaze remoteproc driver | ||
1002 | + | ||
1003 | +This driver requires specific Zynq hardware design where Microblaze is added | ||
1004 | +to the programmable logic. | ||
1005 | +Microblaze is connected with PS block via axi bus connected to PS HP port | ||
1006 | +to ensure access to PS DDR. | ||
1007 | +Communication channels are done via soft GPIO IP connected to PS block | ||
1008 | +and to Microblaze. There are also 2 gpio control signals reset and debug | ||
1009 | +which are used for reseting Microblaze. | ||
1010 | + | ||
1011 | +Required properties: | ||
1012 | +- compatible : Should be "xlnx,mb_remoteproc" | ||
1013 | +- reg : Address and length of the ddr address space | ||
1014 | +- bram: Phandle to bram controller which can access Microblaze BRAM | ||
1015 | +- bram-firmware : Microblaze BRAM bootloader name | ||
1016 | +- firmware : Default firmware name which can be override by | ||
1017 | + "firmware" module parameter | ||
1018 | +- reset : Gpio phandle which reset Microblaze remoteproc | ||
1019 | +- debug : Gpio phandle which setup Microblaze to debug state | ||
1020 | +- ipino : Gpio phandle for Microblaze to ARM communication | ||
1021 | +- vring0 : Gpio phandle for ARM to Microblaze communication vring 0 | ||
1022 | +- vring1 : Gpio phandle for ARM to Microblaze communication vring 1 | ||
1023 | + | ||
1024 | +Microblaze SoC can be also connected to the PS block via a axi bus. | ||
1025 | +That's why there is the option to allocate interrupts for Microblaze use only. | ||
1026 | +The driver will allocate interrupts to itself and Microblaze sw has to ensure | ||
1027 | +that interrupts are properly enabled and handled by Microblaze interrupt | ||
1028 | +controller. | ||
1029 | + | ||
1030 | +Optional properties: | ||
1031 | + - interrupts : Interrupt mapping for remoteproc | ||
1032 | + - interrupt-parent : Phandle for the interrupt controller | ||
1033 | + | ||
1034 | +Example: | ||
1035 | +test_mb: mb_remoteproc-test@800000 { | ||
1036 | + compatible = "xlnx,mb_remoteproc"; | ||
1037 | + reg = < 0x8000000 0x8000000 >; | ||
1038 | + bram = <&axi_bram_ctrl_0>; | ||
1039 | + bram-firmware = "mb.bin"; | ||
1040 | + firmware = "image.elf"; | ||
1041 | + reset = <&zynq_gpio_reset 1 0>; | ||
1042 | + debug = <&zynq_gpio_reset 0 0>; | ||
1043 | + ipino = <&zynq_gpio_vring 0 0>; | ||
1044 | + vring0 = <&zynq_gpio_vring 1 0>; | ||
1045 | + vring1 = <&zynq_gpio_vring 2 0>; | ||
1046 | +} ; | ||
1047 | diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt | ||
1048 | index 43cff70..25240fc 100644 | ||
1049 | --- a/Documentation/driver-model/devres.txt | ||
1050 | +++ b/Documentation/driver-model/devres.txt | ||
1051 | @@ -266,7 +266,8 @@ IOMAP | ||
1052 | devm_ioremap() | ||
1053 | devm_ioremap_nocache() | ||
1054 | devm_iounmap() | ||
1055 | - devm_request_and_ioremap() : checks resource, requests region, ioremaps | ||
1056 | + devm_ioremap_resource() : checks resource, requests memory region, ioremaps | ||
1057 | + devm_request_and_ioremap() : obsoleted by devm_ioremap_resource() | ||
1058 | pcim_iomap() | ||
1059 | pcim_iounmap() | ||
1060 | pcim_iomap_table() : array of mapped addresses indexed by BAR | ||
910 | diff --git a/Documentation/filesystems/aufs/README b/Documentation/filesystems/aufs/README | 1061 | diff --git a/Documentation/filesystems/aufs/README b/Documentation/filesystems/aufs/README |
911 | deleted file mode 100644 | 1062 | deleted file mode 100644 |
912 | index 41bf3a7..0000000 | 1063 | index 41bf3a7..0000000 |
@@ -7897,6 +8048,18 @@ index cd0bc86..911b88a 100644 | |||
7897 | } ; | 8048 | } ; |
7898 | } ; | 8049 | } ; |
7899 | } ; | 8050 | } ; |
8051 | diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c | ||
8052 | index d4a9a45..9ec4eb3 100644 | ||
8053 | --- a/arch/arm/common/gic.c | ||
8054 | +++ b/arch/arm/common/gic.c | ||
8055 | @@ -39,6 +39,7 @@ | ||
8056 | #include <linux/interrupt.h> | ||
8057 | #include <linux/percpu.h> | ||
8058 | #include <linux/slab.h> | ||
8059 | +#include <linux/irqchip/chained_irq.h> | ||
8060 | |||
8061 | #include <asm/irq.h> | ||
8062 | #include <asm/exception.h> | ||
7900 | diff --git a/arch/arm/configs/at91sam9g45_defconfig b/arch/arm/configs/at91sam9g45_defconfig | 8063 | diff --git a/arch/arm/configs/at91sam9g45_defconfig b/arch/arm/configs/at91sam9g45_defconfig |
7901 | index 8aab786..606d48f 100644 | 8064 | index 8aab786..606d48f 100644 |
7902 | --- a/arch/arm/configs/at91sam9g45_defconfig | 8065 | --- a/arch/arm/configs/at91sam9g45_defconfig |
@@ -13760,6 +13923,46 @@ index 58c226e..95d4d3e 100644 | |||
13760 | # CONFIG_AUXDISPLAY is not set | 13923 | # CONFIG_AUXDISPLAY is not set |
13761 | CONFIG_UIO=y | 13924 | CONFIG_UIO=y |
13762 | # CONFIG_UIO_CIF is not set | 13925 | # CONFIG_UIO_CIF is not set |
13926 | diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h | ||
13927 | index 15cb035..33e625c 100644 | ||
13928 | --- a/arch/arm/include/asm/mach/irq.h | ||
13929 | +++ b/arch/arm/include/asm/mach/irq.h | ||
13930 | @@ -34,35 +34,4 @@ do { \ | ||
13931 | raw_spin_unlock(&desc->lock); \ | ||
13932 | } while(0) | ||
13933 | |||
13934 | -#ifndef __ASSEMBLY__ | ||
13935 | -/* | ||
13936 | - * Entry/exit functions for chained handlers where the primary IRQ chip | ||
13937 | - * may implement either fasteoi or level-trigger flow control. | ||
13938 | - */ | ||
13939 | -static inline void chained_irq_enter(struct irq_chip *chip, | ||
13940 | - struct irq_desc *desc) | ||
13941 | -{ | ||
13942 | - /* FastEOI controllers require no action on entry. */ | ||
13943 | - if (chip->irq_eoi) | ||
13944 | - return; | ||
13945 | - | ||
13946 | - if (chip->irq_mask_ack) { | ||
13947 | - chip->irq_mask_ack(&desc->irq_data); | ||
13948 | - } else { | ||
13949 | - chip->irq_mask(&desc->irq_data); | ||
13950 | - if (chip->irq_ack) | ||
13951 | - chip->irq_ack(&desc->irq_data); | ||
13952 | - } | ||
13953 | -} | ||
13954 | - | ||
13955 | -static inline void chained_irq_exit(struct irq_chip *chip, | ||
13956 | - struct irq_desc *desc) | ||
13957 | -{ | ||
13958 | - if (chip->irq_eoi) | ||
13959 | - chip->irq_eoi(&desc->irq_data); | ||
13960 | - else | ||
13961 | - chip->irq_unmask(&desc->irq_data); | ||
13962 | -} | ||
13963 | -#endif | ||
13964 | - | ||
13965 | #endif | ||
13763 | diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h | 13966 | diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h |
13764 | index 26e9ce4..c094749 100644 | 13967 | index 26e9ce4..c094749 100644 |
13765 | --- a/arch/arm/include/asm/pgtable.h | 13968 | --- a/arch/arm/include/asm/pgtable.h |
@@ -13794,60 +13997,22 @@ index a58dd49..a6c301e 100644 | |||
13794 | #define OBSOLETE(syscall) sys_ni_syscall | 13997 | #define OBSOLETE(syscall) sys_ni_syscall |
13795 | #else | 13998 | #else |
13796 | #define OBSOLETE(syscall) syscall | 13999 | #define OBSOLETE(syscall) syscall |
13797 | diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S | 14000 | diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c |
13798 | index 94b0650..d912e73 100644 | 14001 | index c5d7e1e..a5afcf7 100644 |
13799 | --- a/arch/arm/lib/memset.S | 14002 | --- a/arch/arm/mach-at91/gpio.c |
13800 | +++ b/arch/arm/lib/memset.S | 14003 | +++ b/arch/arm/mach-at91/gpio.c |
13801 | @@ -14,15 +14,31 @@ | 14004 | @@ -22,10 +22,9 @@ |
13802 | 14005 | #include <linux/module.h> | |
13803 | .text | 14006 | #include <linux/io.h> |
13804 | .align 5 | 14007 | #include <linux/irqdomain.h> |
13805 | + .word 0 | 14008 | +#include <linux/irqchip/chained_irq.h> |
13806 | + | 14009 | #include <linux/of_address.h> |
13807 | +1: subs r2, r2, #4 @ 1 do we have enough | 14010 | |
13808 | + blt 5f @ 1 bytes to align with? | 14011 | -#include <asm/mach/irq.h> |
13809 | + cmp r3, #2 @ 1 | 14012 | - |
13810 | + strltb r1, [ip], #1 @ 1 | 14013 | #include <mach/hardware.h> |
13811 | + strleb r1, [ip], #1 @ 1 | 14014 | #include <mach/at91_pio.h> |
13812 | + strb r1, [ip], #1 @ 1 | ||
13813 | + add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3)) | ||
13814 | +/* | ||
13815 | + * The pointer is now aligned and the length is adjusted. Try doing the | ||
13816 | + * memset again. | ||
13817 | + */ | ||
13818 | 14015 | ||
13819 | ENTRY(memset) | ||
13820 | - ands r3, r0, #3 @ 1 unaligned? | ||
13821 | - mov ip, r0 @ preserve r0 as return value | ||
13822 | - bne 6f @ 1 | ||
13823 | +/* | ||
13824 | + * Preserve the contents of r0 for the return value. | ||
13825 | + */ | ||
13826 | + mov ip, r0 | ||
13827 | + ands r3, ip, #3 @ 1 unaligned? | ||
13828 | + bne 1b @ 1 | ||
13829 | /* | ||
13830 | * we know that the pointer in ip is aligned to a word boundary. | ||
13831 | */ | ||
13832 | -1: orr r1, r1, r1, lsl #8 | ||
13833 | + orr r1, r1, r1, lsl #8 | ||
13834 | orr r1, r1, r1, lsl #16 | ||
13835 | mov r3, r1 | ||
13836 | cmp r2, #16 | ||
13837 | @@ -111,13 +127,4 @@ ENTRY(memset) | ||
13838 | tst r2, #1 | ||
13839 | strneb r1, [ip], #1 | ||
13840 | mov pc, lr | ||
13841 | - | ||
13842 | -6: subs r2, r2, #4 @ 1 do we have enough | ||
13843 | - blt 5b @ 1 bytes to align with? | ||
13844 | - cmp r3, #2 @ 1 | ||
13845 | - strltb r1, [ip], #1 @ 1 | ||
13846 | - strleb r1, [ip], #1 @ 1 | ||
13847 | - strb r1, [ip], #1 @ 1 | ||
13848 | - add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3)) | ||
13849 | - b 1b | ||
13850 | ENDPROC(memset) | ||
13851 | diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c | 14016 | diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c |
13852 | index 6b4608d..4b67847 100644 | 14017 | index 6b4608d..4b67847 100644 |
13853 | --- a/arch/arm/mach-at91/setup.c | 14018 | --- a/arch/arm/mach-at91/setup.c |
@@ -16164,6 +16329,48 @@ index e207aa5..5dbf13f 100644 | |||
16164 | return 0; | 16329 | return 0; |
16165 | 16330 | ||
16166 | bad_area: | 16331 | bad_area: |
16332 | diff --git a/arch/arm/plat-samsung/irq-vic-timer.c b/arch/arm/plat-samsung/irq-vic-timer.c | ||
16333 | index f980cf3..5d205e7 100644 | ||
16334 | --- a/arch/arm/plat-samsung/irq-vic-timer.c | ||
16335 | +++ b/arch/arm/plat-samsung/irq-vic-timer.c | ||
16336 | @@ -16,6 +16,7 @@ | ||
16337 | #include <linux/kernel.h> | ||
16338 | #include <linux/interrupt.h> | ||
16339 | #include <linux/irq.h> | ||
16340 | +#include <linux/irqchip/chained_irq.h> | ||
16341 | #include <linux/io.h> | ||
16342 | |||
16343 | #include <mach/map.h> | ||
16344 | @@ -23,8 +24,6 @@ | ||
16345 | #include <plat/irq-vic-timer.h> | ||
16346 | #include <plat/regs-timer.h> | ||
16347 | |||
16348 | -#include <asm/mach/irq.h> | ||
16349 | - | ||
16350 | static void s3c_irq_demux_vic_timer(unsigned int irq, struct irq_desc *desc) | ||
16351 | { | ||
16352 | struct irq_chip *chip = irq_get_chip(irq); | ||
16353 | diff --git a/arch/arm/plat-samsung/s5p-irq-gpioint.c b/arch/arm/plat-samsung/s5p-irq-gpioint.c | ||
16354 | index bae5613..fafdb05 100644 | ||
16355 | --- a/arch/arm/plat-samsung/s5p-irq-gpioint.c | ||
16356 | +++ b/arch/arm/plat-samsung/s5p-irq-gpioint.c | ||
16357 | @@ -14,6 +14,7 @@ | ||
16358 | #include <linux/kernel.h> | ||
16359 | #include <linux/interrupt.h> | ||
16360 | #include <linux/irq.h> | ||
16361 | +#include <linux/irqchip/chained_irq.h> | ||
16362 | #include <linux/io.h> | ||
16363 | #include <linux/gpio.h> | ||
16364 | #include <linux/slab.h> | ||
16365 | @@ -22,8 +23,6 @@ | ||
16366 | #include <plat/gpio-core.h> | ||
16367 | #include <plat/gpio-cfg.h> | ||
16368 | |||
16369 | -#include <asm/mach/irq.h> | ||
16370 | - | ||
16371 | #define GPIO_BASE(chip) ((void __iomem *)((unsigned long)((chip)->base) & 0xFFFFF000u)) | ||
16372 | |||
16373 | #define CON_OFFSET 0x700 | ||
16167 | diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c | 16374 | diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c |
16168 | index 01b20a2..7a32976 100644 | 16375 | index 01b20a2..7a32976 100644 |
16169 | --- a/arch/arm/xen/enlighten.c | 16376 | --- a/arch/arm/xen/enlighten.c |
@@ -16354,6 +16561,21 @@ index a7869f8..4332f7e 100644 | |||
16354 | 16561 | ||
16355 | return ret; | 16562 | return ret; |
16356 | } | 16563 | } |
16564 | diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig | ||
16565 | index aa8976e..3a1e6a2 100644 | ||
16566 | --- a/arch/microblaze/Kconfig | ||
16567 | +++ b/arch/microblaze/Kconfig | ||
16568 | @@ -254,10 +254,6 @@ config MICROBLAZE_64K_PAGES | ||
16569 | |||
16570 | endchoice | ||
16571 | |||
16572 | -config KERNEL_PAD | ||
16573 | - hex "Kernel PAD for unpacking" if ADVANCED_OPTIONS | ||
16574 | - default "0x80000" if MMU | ||
16575 | - | ||
16576 | endmenu | ||
16577 | |||
16578 | source "mm/Kconfig" | ||
16357 | diff --git a/arch/microblaze/configs/mmu_defconfig b/arch/microblaze/configs/mmu_defconfig | 16579 | diff --git a/arch/microblaze/configs/mmu_defconfig b/arch/microblaze/configs/mmu_defconfig |
16358 | index d2b097a..3649a8b 100644 | 16580 | index d2b097a..3649a8b 100644 |
16359 | --- a/arch/microblaze/configs/mmu_defconfig | 16581 | --- a/arch/microblaze/configs/mmu_defconfig |
@@ -17010,7 +17232,7 @@ index 357d56a..e8a5e9c 100644 | |||
17010 | : "r" (addr), "r" (value) | 17232 | : "r" (addr), "r" (value) |
17011 | ); | 17233 | ); |
17012 | diff --git a/arch/microblaze/kernel/head.S b/arch/microblaze/kernel/head.S | 17234 | diff --git a/arch/microblaze/kernel/head.S b/arch/microblaze/kernel/head.S |
17013 | index a8ce682..fcc797f 100644 | 17235 | index a8ce682..817b7ee 100644 |
17014 | --- a/arch/microblaze/kernel/head.S | 17236 | --- a/arch/microblaze/kernel/head.S |
17015 | +++ b/arch/microblaze/kernel/head.S | 17237 | +++ b/arch/microblaze/kernel/head.S |
17016 | @@ -120,7 +120,7 @@ _copy_command_line: | 17238 | @@ -120,7 +120,7 @@ _copy_command_line: |
@@ -17031,6 +17253,15 @@ index a8ce682..fcc797f 100644 | |||
17031 | addik r11, r11, 4 /* increment counting */ | 17253 | addik r11, r11, 4 /* increment counting */ |
17032 | bgtid r3, _copy_bram /* loop for all entries */ | 17254 | bgtid r3, _copy_bram /* loop for all entries */ |
17033 | addik r3, r3, -4 /* descrement loop */ | 17255 | addik r3, r3, -4 /* descrement loop */ |
17256 | @@ -176,7 +176,7 @@ _invalidate: | ||
17257 | /* start to do TLB calculation */ | ||
17258 | addik r12, r0, _end | ||
17259 | rsub r12, r3, r12 | ||
17260 | - addik r12, r12, CONFIG_KERNEL_PAD /* that's the pad */ | ||
17261 | + addik r12, r12, CONFIG_LOWMEM_SIZE >> PTE_SHIFT /* that's the pad */ | ||
17262 | |||
17263 | or r9, r0, r0 /* TLB0 = 0 */ | ||
17264 | or r10, r0, r0 /* TLB1 = 0 */ | ||
17034 | diff --git a/arch/microblaze/kernel/heartbeat.c b/arch/microblaze/kernel/heartbeat.c | 17265 | diff --git a/arch/microblaze/kernel/heartbeat.c b/arch/microblaze/kernel/heartbeat.c |
17035 | index 154756f..1879a05 100644 | 17266 | index 154756f..1879a05 100644 |
17036 | --- a/arch/microblaze/kernel/heartbeat.c | 17267 | --- a/arch/microblaze/kernel/heartbeat.c |
@@ -17063,19 +17294,6 @@ index 9422699..d85fa3a 100644 | |||
17063 | intc->name, intc_baseaddr, nr_irq, intr_mask); | 17294 | intc->name, intc_baseaddr, nr_irq, intr_mask); |
17064 | 17295 | ||
17065 | /* | 17296 | /* |
17066 | diff --git a/arch/microblaze/kernel/kgdb.c b/arch/microblaze/kernel/kgdb.c | ||
17067 | index 09a5e82..8adc9244 100644 | ||
17068 | --- a/arch/microblaze/kernel/kgdb.c | ||
17069 | +++ b/arch/microblaze/kernel/kgdb.c | ||
17070 | @@ -141,7 +141,7 @@ void kgdb_arch_exit(void) | ||
17071 | /* | ||
17072 | * Global data | ||
17073 | */ | ||
17074 | -struct kgdb_arch arch_kgdb_ops = { | ||
17075 | +const struct kgdb_arch arch_kgdb_ops = { | ||
17076 | #ifdef __MICROBLAZEEL__ | ||
17077 | .gdb_bpt_instr = {0x18, 0x00, 0x0c, 0xba}, /* brki r16, 0x18 */ | ||
17078 | #else | ||
17079 | diff --git a/arch/microblaze/kernel/microblaze_ksyms.c b/arch/microblaze/kernel/microblaze_ksyms.c | 17297 | diff --git a/arch/microblaze/kernel/microblaze_ksyms.c b/arch/microblaze/kernel/microblaze_ksyms.c |
17080 | index 2b25bcf..9f1d02c4 100644 | 17298 | index 2b25bcf..9f1d02c4 100644 |
17081 | --- a/arch/microblaze/kernel/microblaze_ksyms.c | 17299 | --- a/arch/microblaze/kernel/microblaze_ksyms.c |
@@ -21619,6 +21837,115 @@ index c9303ed..0ca1ca7 100644 | |||
21619 | channel_ce_count_show, NULL, 5); | 21837 | channel_ce_count_show, NULL, 5); |
21620 | 21838 | ||
21621 | /* Total possible dynamic ce_count attribute file table */ | 21839 | /* Total possible dynamic ce_count attribute file table */ |
21840 | diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig | ||
21841 | index 5b6ccf1..4510330 100644 | ||
21842 | --- a/drivers/gpio/Kconfig | ||
21843 | +++ b/drivers/gpio/Kconfig | ||
21844 | @@ -233,6 +233,7 @@ config GPIO_VT8500 | ||
21845 | config GPIO_XILINX | ||
21846 | bool "Xilinx GPIO support" | ||
21847 | depends on PPC_OF || MICROBLAZE || ARCH_ZYNQ | ||
21848 | + select GENERIC_IRQ_CHIP | ||
21849 | help | ||
21850 | Say yes here to support the Xilinx AXI/XPS GPIO device | ||
21851 | |||
21852 | diff --git a/drivers/gpio/gpio-msm-v2.c b/drivers/gpio/gpio-msm-v2.c | ||
21853 | index 55a7e77..dd2edde 100644 | ||
21854 | --- a/drivers/gpio/gpio-msm-v2.c | ||
21855 | +++ b/drivers/gpio/gpio-msm-v2.c | ||
21856 | @@ -23,13 +23,12 @@ | ||
21857 | #include <linux/init.h> | ||
21858 | #include <linux/interrupt.h> | ||
21859 | #include <linux/io.h> | ||
21860 | +#include <linux/irqchip/chained_irq.h> | ||
21861 | #include <linux/irq.h> | ||
21862 | #include <linux/module.h> | ||
21863 | #include <linux/platform_device.h> | ||
21864 | #include <linux/spinlock.h> | ||
21865 | |||
21866 | -#include <asm/mach/irq.h> | ||
21867 | - | ||
21868 | #include <mach/msm_gpiomux.h> | ||
21869 | #include <mach/msm_iomap.h> | ||
21870 | |||
21871 | diff --git a/drivers/gpio/gpio-mxc.c b/drivers/gpio/gpio-mxc.c | ||
21872 | index 7877335..7176743 100644 | ||
21873 | --- a/drivers/gpio/gpio-mxc.c | ||
21874 | +++ b/drivers/gpio/gpio-mxc.c | ||
21875 | @@ -24,6 +24,7 @@ | ||
21876 | #include <linux/io.h> | ||
21877 | #include <linux/irq.h> | ||
21878 | #include <linux/irqdomain.h> | ||
21879 | +#include <linux/irqchip/chained_irq.h> | ||
21880 | #include <linux/gpio.h> | ||
21881 | #include <linux/platform_device.h> | ||
21882 | #include <linux/slab.h> | ||
21883 | @@ -32,7 +33,6 @@ | ||
21884 | #include <linux/of_device.h> | ||
21885 | #include <linux/module.h> | ||
21886 | #include <asm-generic/bug.h> | ||
21887 | -#include <asm/mach/irq.h> | ||
21888 | |||
21889 | enum mxc_gpio_hwtype { | ||
21890 | IMX1_GPIO, /* runs on i.mx1 */ | ||
21891 | diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c | ||
21892 | index f1fbedb2..6996da9 100644 | ||
21893 | --- a/drivers/gpio/gpio-omap.c | ||
21894 | +++ b/drivers/gpio/gpio-omap.c | ||
21895 | @@ -25,11 +25,10 @@ | ||
21896 | #include <linux/of.h> | ||
21897 | #include <linux/of_device.h> | ||
21898 | #include <linux/irqdomain.h> | ||
21899 | +#include <linux/irqchip/chained_irq.h> | ||
21900 | #include <linux/gpio.h> | ||
21901 | #include <linux/platform_data/gpio-omap.h> | ||
21902 | |||
21903 | -#include <asm/mach/irq.h> | ||
21904 | - | ||
21905 | #define OFF_MODE 1 | ||
21906 | |||
21907 | static LIST_HEAD(omap_gpio_list); | ||
21908 | diff --git a/drivers/gpio/gpio-pl061.c b/drivers/gpio/gpio-pl061.c | ||
21909 | index c1720de..175c33b 100644 | ||
21910 | --- a/drivers/gpio/gpio-pl061.c | ||
21911 | +++ b/drivers/gpio/gpio-pl061.c | ||
21912 | @@ -15,6 +15,7 @@ | ||
21913 | #include <linux/io.h> | ||
21914 | #include <linux/ioport.h> | ||
21915 | #include <linux/irq.h> | ||
21916 | +#include <linux/irqchip/chained_irq.h> | ||
21917 | #include <linux/bitops.h> | ||
21918 | #include <linux/workqueue.h> | ||
21919 | #include <linux/gpio.h> | ||
21920 | @@ -23,7 +24,6 @@ | ||
21921 | #include <linux/amba/pl061.h> | ||
21922 | #include <linux/slab.h> | ||
21923 | #include <linux/pm.h> | ||
21924 | -#include <asm/mach/irq.h> | ||
21925 | |||
21926 | #define GPIODIR 0x400 | ||
21927 | #define GPIOIS 0x404 | ||
21928 | diff --git a/drivers/gpio/gpio-pxa.c b/drivers/gpio/gpio-pxa.c | ||
21929 | index 8325f58..2d3af98 100644 | ||
21930 | --- a/drivers/gpio/gpio-pxa.c | ||
21931 | +++ b/drivers/gpio/gpio-pxa.c | ||
21932 | @@ -19,6 +19,7 @@ | ||
21933 | #include <linux/init.h> | ||
21934 | #include <linux/irq.h> | ||
21935 | #include <linux/irqdomain.h> | ||
21936 | +#include <linux/irqchip/chained_irq.h> | ||
21937 | #include <linux/io.h> | ||
21938 | #include <linux/of.h> | ||
21939 | #include <linux/of_device.h> | ||
21940 | @@ -26,8 +27,6 @@ | ||
21941 | #include <linux/syscore_ops.h> | ||
21942 | #include <linux/slab.h> | ||
21943 | |||
21944 | -#include <asm/mach/irq.h> | ||
21945 | - | ||
21946 | #include <mach/irqs.h> | ||
21947 | |||
21948 | /* | ||
21622 | diff --git a/drivers/gpio/gpio-sch.c b/drivers/gpio/gpio-sch.c | 21949 | diff --git a/drivers/gpio/gpio-sch.c b/drivers/gpio/gpio-sch.c |
21623 | index 529c488..edae963 100644 | 21950 | index 529c488..edae963 100644 |
21624 | --- a/drivers/gpio/gpio-sch.c | 21951 | --- a/drivers/gpio/gpio-sch.c |
@@ -21702,10 +22029,621 @@ index 529c488..edae963 100644 | |||
21702 | 22029 | ||
21703 | spin_unlock(&gpio_lock); | 22030 | spin_unlock(&gpio_lock); |
21704 | return 0; | 22031 | return 0; |
22032 | diff --git a/drivers/gpio/gpio-tegra.c b/drivers/gpio/gpio-tegra.c | ||
22033 | index 63cb643..48117e6 100644 | ||
22034 | --- a/drivers/gpio/gpio-tegra.c | ||
22035 | +++ b/drivers/gpio/gpio-tegra.c | ||
22036 | @@ -26,11 +26,10 @@ | ||
22037 | #include <linux/platform_device.h> | ||
22038 | #include <linux/module.h> | ||
22039 | #include <linux/irqdomain.h> | ||
22040 | +#include <linux/irqchip/chained_irq.h> | ||
22041 | #include <linux/pinctrl/consumer.h> | ||
22042 | #include <linux/pm.h> | ||
22043 | |||
22044 | -#include <asm/mach/irq.h> | ||
22045 | - | ||
22046 | #define GPIO_BANK(x) ((x) >> 5) | ||
22047 | #define GPIO_PORT(x) (((x) >> 3) & 0x3) | ||
22048 | #define GPIO_BIT(x) ((x) & 0x7) | ||
22049 | diff --git a/drivers/gpio/gpio-xilinx.c b/drivers/gpio/gpio-xilinx.c | ||
22050 | index 1fa1519..566a306 100644 | ||
22051 | --- a/drivers/gpio/gpio-xilinx.c | ||
22052 | +++ b/drivers/gpio/gpio-xilinx.c | ||
22053 | @@ -1,7 +1,7 @@ | ||
22054 | /* | ||
22055 | * Xilinx gpio driver for xps/axi_gpio IP. | ||
22056 | * | ||
22057 | - * Copyright 2008, 2011 Xilinx, Inc. | ||
22058 | + * Copyright 2008 - 2013 Xilinx, Inc. | ||
22059 | * | ||
22060 | * This program is free software; you can redistribute it and/or modify | ||
22061 | * it under the terms of the GNU General Public License version 2 | ||
22062 | @@ -12,32 +12,62 @@ | ||
22063 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
22064 | */ | ||
22065 | |||
22066 | +#include <linux/bitops.h> | ||
22067 | #include <linux/init.h> | ||
22068 | #include <linux/errno.h> | ||
22069 | #include <linux/module.h> | ||
22070 | #include <linux/of_device.h> | ||
22071 | +#include <linux/of_irq.h> | ||
22072 | #include <linux/of_platform.h> | ||
22073 | #include <linux/of_gpio.h> | ||
22074 | +#include <linux/interrupt.h> | ||
22075 | #include <linux/io.h> | ||
22076 | +#include <linux/irq.h> | ||
22077 | +#include <linux/irqchip/chained_irq.h> | ||
22078 | +#include <linux/irqdomain.h> | ||
22079 | #include <linux/gpio.h> | ||
22080 | #include <linux/slab.h> | ||
22081 | |||
22082 | /* Register Offset Definitions */ | ||
22083 | -#define XGPIO_DATA_OFFSET (0x0) /* Data register */ | ||
22084 | -#define XGPIO_TRI_OFFSET (0x4) /* I/O direction register */ | ||
22085 | +#define XGPIO_DATA_OFFSET 0x0 /* Data register */ | ||
22086 | +#define XGPIO_TRI_OFFSET 0x4 /* I/O direction register */ | ||
22087 | +#define XGPIO_GIER_OFFSET 0x11c /* Global Interrupt Enable */ | ||
22088 | +#define XGPIO_GIER_IE BIT(31) | ||
22089 | + | ||
22090 | +#define XGPIO_IPISR_OFFSET 0x120 /* IP Interrupt Status */ | ||
22091 | +#define XGPIO_IPIER_OFFSET 0x128 /* IP Interrupt Enable */ | ||
22092 | |||
22093 | #define XGPIO_CHANNEL_OFFSET 0x8 | ||
22094 | |||
22095 | /* Read/Write access to the GPIO registers */ | ||
22096 | -#define xgpio_readreg(offset) __raw_readl(offset) | ||
22097 | -#define xgpio_writereg(offset, val) __raw_writel(val, offset) | ||
22098 | +#ifdef CONFIG_ARCH_ZYNQ | ||
22099 | +# define xgpio_readreg(offset) readl(offset) | ||
22100 | +# define xgpio_writereg(offset, val) writel(val, offset) | ||
22101 | +#else | ||
22102 | +# define xgpio_readreg(offset) __raw_readl(offset) | ||
22103 | +# define xgpio_writereg(offset, val) __raw_writel(val, offset) | ||
22104 | +#endif | ||
22105 | |||
22106 | +/** | ||
22107 | + * struct xgpio_instance - Stores information about GPIO device | ||
22108 | + * @mmchip: OF GPIO chip for memory mapped banks | ||
22109 | + * @gpio_state: GPIO state shadow register | ||
22110 | + * @gpio_dir: GPIO direction shadow register | ||
22111 | + * @offset: GPIO channel offset | ||
22112 | + * @irq_base: GPIO channel irq base address | ||
22113 | + * @irq_enable: GPIO irq enable/disable bitfield | ||
22114 | + * @gpio_lock: Lock used for synchronization | ||
22115 | + * @irq_domain: irq_domain of the controller | ||
22116 | + */ | ||
22117 | struct xgpio_instance { | ||
22118 | struct of_mm_gpio_chip mmchip; | ||
22119 | - u32 gpio_state; /* GPIO state shadow register */ | ||
22120 | - u32 gpio_dir; /* GPIO direction shadow register */ | ||
22121 | + u32 gpio_state; | ||
22122 | + u32 gpio_dir; | ||
22123 | u32 offset; | ||
22124 | - spinlock_t gpio_lock; /* Lock used for synchronization */ | ||
22125 | + int irq_base; | ||
22126 | + u32 irq_enable; | ||
22127 | + spinlock_t gpio_lock; | ||
22128 | + struct irq_domain *irq_domain; | ||
22129 | }; | ||
22130 | |||
22131 | /** | ||
22132 | @@ -45,8 +75,11 @@ struct xgpio_instance { | ||
22133 | * @gc: Pointer to gpio_chip device structure. | ||
22134 | * @gpio: GPIO signal number. | ||
22135 | * | ||
22136 | - * This function reads the specified signal of the GPIO device. It returns 0 if | ||
22137 | - * the signal clear, 1 if signal is set or negative value on error. | ||
22138 | + * This function reads the specified signal of the GPIO device. | ||
22139 | + * | ||
22140 | + * Return: | ||
22141 | + * 0 if direction of GPIO signals is set as input otherwise it | ||
22142 | + * returns negative error value. | ||
22143 | */ | ||
22144 | static int xgpio_get(struct gpio_chip *gc, unsigned int gpio) | ||
22145 | { | ||
22146 | @@ -56,7 +89,7 @@ static int xgpio_get(struct gpio_chip *gc, unsigned int gpio) | ||
22147 | |||
22148 | void __iomem *regs = mm_gc->regs + chip->offset; | ||
22149 | |||
22150 | - return (xgpio_readreg(regs + XGPIO_DATA_OFFSET) >> gpio) & 1; | ||
22151 | + return !!(xgpio_readreg(regs + XGPIO_DATA_OFFSET) & BIT(gpio)); | ||
22152 | } | ||
22153 | |||
22154 | /** | ||
22155 | @@ -80,9 +113,9 @@ static void xgpio_set(struct gpio_chip *gc, unsigned int gpio, int val) | ||
22156 | |||
22157 | /* Write to GPIO signal and set its direction to output */ | ||
22158 | if (val) | ||
22159 | - chip->gpio_state |= 1 << gpio; | ||
22160 | + chip->gpio_state |= BIT(gpio); | ||
22161 | else | ||
22162 | - chip->gpio_state &= ~(1 << gpio); | ||
22163 | + chip->gpio_state &= ~BIT(gpio); | ||
22164 | |||
22165 | xgpio_writereg(regs + chip->offset + XGPIO_DATA_OFFSET, | ||
22166 | chip->gpio_state); | ||
22167 | @@ -96,8 +129,10 @@ static void xgpio_set(struct gpio_chip *gc, unsigned int gpio, int val) | ||
22168 | * @gpio: GPIO signal number. | ||
22169 | * | ||
22170 | * This function sets the direction of specified GPIO signal as input. | ||
22171 | - * It returns 0 if direction of GPIO signals is set as input otherwise it | ||
22172 | - * returns negative error value. | ||
22173 | + * | ||
22174 | + * Return: | ||
22175 | + * 0 - if direction of GPIO signals is set as input | ||
22176 | + * otherwise it returns negative error value. | ||
22177 | */ | ||
22178 | static int xgpio_dir_in(struct gpio_chip *gc, unsigned int gpio) | ||
22179 | { | ||
22180 | @@ -110,7 +145,7 @@ static int xgpio_dir_in(struct gpio_chip *gc, unsigned int gpio) | ||
22181 | spin_lock_irqsave(&chip->gpio_lock, flags); | ||
22182 | |||
22183 | /* Set the GPIO bit in shadow register and set direction as input */ | ||
22184 | - chip->gpio_dir |= (1 << gpio); | ||
22185 | + chip->gpio_dir |= BIT(gpio); | ||
22186 | xgpio_writereg(regs + chip->offset + XGPIO_TRI_OFFSET, chip->gpio_dir); | ||
22187 | |||
22188 | spin_unlock_irqrestore(&chip->gpio_lock, flags); | ||
22189 | @@ -124,8 +159,10 @@ static int xgpio_dir_in(struct gpio_chip *gc, unsigned int gpio) | ||
22190 | * @gpio: GPIO signal number. | ||
22191 | * @val: Value to be written to specified signal. | ||
22192 | * | ||
22193 | - * This function sets the direction of specified GPIO signal as output. If all | ||
22194 | - * GPIO signals of GPIO chip is configured as input then it returns | ||
22195 | + * This function sets the direction of specified GPIO signal as output. | ||
22196 | + * | ||
22197 | + * Return: | ||
22198 | + * If all GPIO signals of GPIO chip is configured as input then it returns | ||
22199 | * error otherwise it returns 0. | ||
22200 | */ | ||
22201 | static int xgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val) | ||
22202 | @@ -140,13 +177,14 @@ static int xgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val) | ||
22203 | |||
22204 | /* Write state of GPIO signal */ | ||
22205 | if (val) | ||
22206 | - chip->gpio_state |= 1 << gpio; | ||
22207 | + chip->gpio_state |= BIT(gpio); | ||
22208 | else | ||
22209 | - chip->gpio_state &= ~(1 << gpio); | ||
22210 | - xgpio_writereg(regs + chip->offset + XGPIO_DATA_OFFSET, chip->gpio_state); | ||
22211 | + chip->gpio_state &= ~BIT(gpio); | ||
22212 | + xgpio_writereg(regs + chip->offset + XGPIO_DATA_OFFSET, | ||
22213 | + chip->gpio_state); | ||
22214 | |||
22215 | /* Clear the GPIO bit in shadow register and set direction as output */ | ||
22216 | - chip->gpio_dir &= (~(1 << gpio)); | ||
22217 | + chip->gpio_dir &= ~BIT(gpio); | ||
22218 | xgpio_writereg(regs + chip->offset + XGPIO_TRI_OFFSET, chip->gpio_dir); | ||
22219 | |||
22220 | spin_unlock_irqrestore(&chip->gpio_lock, flags); | ||
22221 | @@ -156,7 +194,7 @@ static int xgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val) | ||
22222 | |||
22223 | /** | ||
22224 | * xgpio_save_regs - Set initial values of GPIO pins | ||
22225 | - * @mm_gc: pointer to memory mapped GPIO chip structure | ||
22226 | + * @mm_gc: Pointer to memory mapped GPIO chip structure | ||
22227 | */ | ||
22228 | static void xgpio_save_regs(struct of_mm_gpio_chip *mm_gc) | ||
22229 | { | ||
22230 | @@ -170,42 +208,263 @@ static void xgpio_save_regs(struct of_mm_gpio_chip *mm_gc) | ||
22231 | } | ||
22232 | |||
22233 | /** | ||
22234 | + * xgpio_xlate - Set initial values of GPIO pins | ||
22235 | + * @gc: Pointer to gpio_chip device structure. | ||
22236 | + * @gpiospec: gpio specifier as found in the device tree | ||
22237 | + * @flags: A flags pointer based on binding | ||
22238 | + * | ||
22239 | + * Return: | ||
22240 | + * irq number otherwise -EINVAL | ||
22241 | + */ | ||
22242 | +static int xgpio_xlate(struct gpio_chip *gc, | ||
22243 | + const struct of_phandle_args *gpiospec, u32 *flags) | ||
22244 | +{ | ||
22245 | + struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); | ||
22246 | + struct xgpio_instance *chip = container_of(mm_gc, struct xgpio_instance, | ||
22247 | + mmchip); | ||
22248 | + | ||
22249 | + if (gpiospec->args[1] == chip->offset) | ||
22250 | + return gpiospec->args[0]; | ||
22251 | + | ||
22252 | + return -EINVAL; | ||
22253 | +} | ||
22254 | + | ||
22255 | +/** | ||
22256 | + * xgpio_irq_mask - Write the specified signal of the GPIO device. | ||
22257 | + * @irq_data: per irq and chip data passed down to chip functions | ||
22258 | + */ | ||
22259 | +static void xgpio_irq_mask(struct irq_data *irq_data) | ||
22260 | +{ | ||
22261 | + unsigned long flags; | ||
22262 | + struct xgpio_instance *chip = irq_data_get_irq_chip_data(irq_data); | ||
22263 | + struct of_mm_gpio_chip *mm_gc = &chip->mmchip; | ||
22264 | + u32 offset = irq_data->irq - chip->irq_base; | ||
22265 | + u32 temp; | ||
22266 | + | ||
22267 | + pr_debug("%s: Disable %d irq, irq_enable_mask 0x%x\n", | ||
22268 | + __func__, offset, chip->irq_enable); | ||
22269 | + | ||
22270 | + spin_lock_irqsave(&chip->gpio_lock, flags); | ||
22271 | + | ||
22272 | + chip->irq_enable &= ~BIT(offset); | ||
22273 | + | ||
22274 | + if (!chip->irq_enable) { | ||
22275 | + /* Enable per channel interrupt */ | ||
22276 | + temp = xgpio_readreg(mm_gc->regs + XGPIO_IPIER_OFFSET); | ||
22277 | + temp &= chip->offset / XGPIO_CHANNEL_OFFSET + 1; | ||
22278 | + xgpio_writereg(mm_gc->regs + XGPIO_IPIER_OFFSET, temp); | ||
22279 | + | ||
22280 | + /* Disable global interrupt if channel interrupts are unused */ | ||
22281 | + temp = xgpio_readreg(mm_gc->regs + XGPIO_IPIER_OFFSET); | ||
22282 | + if (!temp) | ||
22283 | + xgpio_writereg(mm_gc->regs + XGPIO_GIER_OFFSET, | ||
22284 | + ~XGPIO_GIER_IE); | ||
22285 | + | ||
22286 | + } | ||
22287 | + spin_unlock_irqrestore(&chip->gpio_lock, flags); | ||
22288 | +} | ||
22289 | + | ||
22290 | +/** | ||
22291 | + * xgpio_irq_unmask - Write the specified signal of the GPIO device. | ||
22292 | + * @irq_data: per irq and chip data passed down to chip functions | ||
22293 | + */ | ||
22294 | +static void xgpio_irq_unmask(struct irq_data *irq_data) | ||
22295 | +{ | ||
22296 | + unsigned long flags; | ||
22297 | + struct xgpio_instance *chip = irq_data_get_irq_chip_data(irq_data); | ||
22298 | + struct of_mm_gpio_chip *mm_gc = &chip->mmchip; | ||
22299 | + u32 offset = irq_data->irq - chip->irq_base; | ||
22300 | + u32 temp; | ||
22301 | + | ||
22302 | + pr_debug("%s: Enable %d irq, irq_enable_mask 0x%x\n", | ||
22303 | + __func__, offset, chip->irq_enable); | ||
22304 | + | ||
22305 | + /* Setup pin as input */ | ||
22306 | + xgpio_dir_in(&mm_gc->gc, offset); | ||
22307 | + | ||
22308 | + spin_lock_irqsave(&chip->gpio_lock, flags); | ||
22309 | + | ||
22310 | + chip->irq_enable |= BIT(offset); | ||
22311 | + | ||
22312 | + if (chip->irq_enable) { | ||
22313 | + | ||
22314 | + /* Enable per channel interrupt */ | ||
22315 | + temp = xgpio_readreg(mm_gc->regs + XGPIO_IPIER_OFFSET); | ||
22316 | + temp |= chip->offset / XGPIO_CHANNEL_OFFSET + 1; | ||
22317 | + xgpio_writereg(mm_gc->regs + XGPIO_IPIER_OFFSET, temp); | ||
22318 | + | ||
22319 | + /* Enable global interrupts */ | ||
22320 | + xgpio_writereg(mm_gc->regs + XGPIO_GIER_OFFSET, XGPIO_GIER_IE); | ||
22321 | + } | ||
22322 | + | ||
22323 | + spin_unlock_irqrestore(&chip->gpio_lock, flags); | ||
22324 | +} | ||
22325 | + | ||
22326 | +/** | ||
22327 | + * xgpio_set_irq_type - Write the specified signal of the GPIO device. | ||
22328 | + * @irq_data: Per irq and chip data passed down to chip functions | ||
22329 | + * @type: Interrupt type that is to be set for the gpio pin | ||
22330 | + * | ||
22331 | + * Return: | ||
22332 | + * 0 if interrupt type is supported otherwise otherwise -EINVAL | ||
22333 | + */ | ||
22334 | +static int xgpio_set_irq_type(struct irq_data *irq_data, unsigned int type) | ||
22335 | +{ | ||
22336 | + /* Only rising edge case is supported now */ | ||
22337 | + if (type == IRQ_TYPE_EDGE_RISING) | ||
22338 | + return 0; | ||
22339 | + | ||
22340 | + return -EINVAL; | ||
22341 | +} | ||
22342 | + | ||
22343 | +/* irq chip descriptor */ | ||
22344 | +static struct irq_chip xgpio_irqchip = { | ||
22345 | + .name = "xgpio", | ||
22346 | + .irq_mask = xgpio_irq_mask, | ||
22347 | + .irq_unmask = xgpio_irq_unmask, | ||
22348 | + .irq_set_type = xgpio_set_irq_type, | ||
22349 | +}; | ||
22350 | + | ||
22351 | +/** | ||
22352 | + * xgpio_to_irq - Find out gpio to Linux irq mapping | ||
22353 | + * @gc: Pointer to gpio_chip device structure. | ||
22354 | + * @offset: Gpio pin offset | ||
22355 | + * | ||
22356 | + * Return: | ||
22357 | + * irq number otherwise -EINVAL | ||
22358 | + */ | ||
22359 | +static int xgpio_to_irq(struct gpio_chip *gc, unsigned offset) | ||
22360 | +{ | ||
22361 | + struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); | ||
22362 | + struct xgpio_instance *chip = container_of(mm_gc, struct xgpio_instance, | ||
22363 | + mmchip); | ||
22364 | + | ||
22365 | + return irq_find_mapping(chip->irq_domain, offset); | ||
22366 | +} | ||
22367 | + | ||
22368 | +/** | ||
22369 | + * xgpio_irqhandler - Gpio interrupt service routine | ||
22370 | + * @irq: gpio irq number | ||
22371 | + * @desc: Pointer to interrupt description | ||
22372 | + */ | ||
22373 | +static void xgpio_irqhandler(unsigned int irq, struct irq_desc *desc) | ||
22374 | +{ | ||
22375 | + struct xgpio_instance *chip = (struct xgpio_instance *) | ||
22376 | + irq_get_handler_data(irq); | ||
22377 | + struct of_mm_gpio_chip *mm_gc = &chip->mmchip; | ||
22378 | + struct irq_chip *irqchip = irq_desc_get_chip(desc); | ||
22379 | + int offset; | ||
22380 | + unsigned long val; | ||
22381 | + | ||
22382 | + chained_irq_enter(irqchip, desc); | ||
22383 | + | ||
22384 | + val = xgpio_readreg(mm_gc->regs + chip->offset); | ||
22385 | + /* Only rising edge is supported */ | ||
22386 | + val &= chip->irq_enable; | ||
22387 | + | ||
22388 | + for_each_set_bit(offset, &val, chip->mmchip.gc.ngpio) { | ||
22389 | + generic_handle_irq(chip->irq_base + offset); | ||
22390 | + } | ||
22391 | + | ||
22392 | + xgpio_writereg(mm_gc->regs + XGPIO_IPISR_OFFSET, | ||
22393 | + chip->offset / XGPIO_CHANNEL_OFFSET + 1); | ||
22394 | + | ||
22395 | + chained_irq_exit(irqchip, desc); | ||
22396 | +} | ||
22397 | + | ||
22398 | +static struct lock_class_key gpio_lock_class; | ||
22399 | + | ||
22400 | +/** | ||
22401 | + * xgpio_irq_setup - Allocate irq for gpio and setup appropriate functions | ||
22402 | + * @np: Device node of the GPIO chip | ||
22403 | + * @chip: Pointer to private gpio channel structure | ||
22404 | + * | ||
22405 | + * Return: | ||
22406 | + * 0 if success, otherwise -1 | ||
22407 | + */ | ||
22408 | +static int xgpio_irq_setup(struct device_node *np, struct xgpio_instance *chip) | ||
22409 | +{ | ||
22410 | + u32 pin_num; | ||
22411 | + struct resource res; | ||
22412 | + | ||
22413 | + int ret = of_irq_to_resource(np, 0, &res); | ||
22414 | + if (!ret) { | ||
22415 | + pr_info("GPIO IRQ not connected\n"); | ||
22416 | + return 0; | ||
22417 | + } | ||
22418 | + | ||
22419 | + chip->mmchip.gc.of_xlate = xgpio_xlate; | ||
22420 | + chip->mmchip.gc.of_gpio_n_cells = 2; | ||
22421 | + chip->mmchip.gc.to_irq = xgpio_to_irq; | ||
22422 | + | ||
22423 | + chip->irq_base = irq_alloc_descs(-1, 0, chip->mmchip.gc.ngpio, 0); | ||
22424 | + if (chip->irq_base < 0) { | ||
22425 | + pr_err("Couldn't allocate IRQ numbers\n"); | ||
22426 | + return -1; | ||
22427 | + } | ||
22428 | + chip->irq_domain = irq_domain_add_legacy(np, chip->mmchip.gc.ngpio, | ||
22429 | + chip->irq_base, 0, | ||
22430 | + &irq_domain_simple_ops, NULL); | ||
22431 | + | ||
22432 | + /* | ||
22433 | + * set the irq chip, handler and irq chip data for callbacks for | ||
22434 | + * each pin | ||
22435 | + */ | ||
22436 | + for (pin_num = 0; pin_num < chip->mmchip.gc.ngpio; pin_num++) { | ||
22437 | + u32 gpio_irq = irq_find_mapping(chip->irq_domain, pin_num); | ||
22438 | + irq_set_lockdep_class(gpio_irq, &gpio_lock_class); | ||
22439 | + pr_debug("IRQ Base: %d, Pin %d = IRQ %d\n", | ||
22440 | + chip->irq_base, pin_num, gpio_irq); | ||
22441 | + irq_set_chip_and_handler(gpio_irq, &xgpio_irqchip, | ||
22442 | + handle_simple_irq); | ||
22443 | + irq_set_chip_data(gpio_irq, (void *)chip); | ||
22444 | +#ifdef CONFIG_ARCH_ZYNQ | ||
22445 | + set_irq_flags(gpio_irq, IRQF_VALID); | ||
22446 | +#endif | ||
22447 | + } | ||
22448 | + irq_set_handler_data(res.start, (void *)chip); | ||
22449 | + irq_set_chained_handler(res.start, xgpio_irqhandler); | ||
22450 | + | ||
22451 | + return 0; | ||
22452 | +} | ||
22453 | + | ||
22454 | +/** | ||
22455 | * xgpio_of_probe - Probe method for the GPIO device. | ||
22456 | * @np: pointer to device tree node | ||
22457 | * | ||
22458 | * This function probes the GPIO device in the device tree. It initializes the | ||
22459 | - * driver data structure. It returns 0, if the driver is bound to the GPIO | ||
22460 | - * device, or a negative value if there is an error. | ||
22461 | + * driver data structure. | ||
22462 | + * | ||
22463 | + * Return: | ||
22464 | + * It returns 0, if the driver is bound to the GPIO device, or | ||
22465 | + * a negative value if there is an error. | ||
22466 | */ | ||
22467 | -static int xgpio_of_probe(struct device_node *np) | ||
22468 | +static int xgpio_of_probe(struct platform_device *pdev) | ||
22469 | { | ||
22470 | + struct device_node *np = pdev->dev.of_node; | ||
22471 | struct xgpio_instance *chip; | ||
22472 | int status = 0; | ||
22473 | const u32 *tree_info; | ||
22474 | |||
22475 | - chip = kzalloc(sizeof(*chip), GFP_KERNEL); | ||
22476 | + chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL); | ||
22477 | if (!chip) | ||
22478 | return -ENOMEM; | ||
22479 | |||
22480 | /* Update GPIO state shadow register with default value */ | ||
22481 | - tree_info = of_get_property(np, "xlnx,dout-default", NULL); | ||
22482 | - if (tree_info) | ||
22483 | - chip->gpio_state = be32_to_cpup(tree_info); | ||
22484 | + of_property_read_u32(np, "xlnx,dout-default", &chip->gpio_state); | ||
22485 | + | ||
22486 | + /* By default, all pins are inputs */ | ||
22487 | + chip->gpio_dir = 0xFFFFFFFF; | ||
22488 | |||
22489 | /* Update GPIO direction shadow register with default value */ | ||
22490 | - chip->gpio_dir = 0xFFFFFFFF; /* By default, all pins are inputs */ | ||
22491 | - tree_info = of_get_property(np, "xlnx,tri-default", NULL); | ||
22492 | - if (tree_info) | ||
22493 | - chip->gpio_dir = be32_to_cpup(tree_info); | ||
22494 | + of_property_read_u32(np, "xlnx,tri-default", &chip->gpio_dir); | ||
22495 | + | ||
22496 | + /* By default assume full GPIO controller */ | ||
22497 | + chip->mmchip.gc.ngpio = 32; | ||
22498 | |||
22499 | /* Check device node and parent device node for device width */ | ||
22500 | - chip->mmchip.gc.ngpio = 32; /* By default assume full GPIO controller */ | ||
22501 | - tree_info = of_get_property(np, "xlnx,gpio-width", NULL); | ||
22502 | - if (!tree_info) | ||
22503 | - tree_info = of_get_property(np->parent, | ||
22504 | - "xlnx,gpio-width", NULL); | ||
22505 | - if (tree_info) | ||
22506 | - chip->mmchip.gc.ngpio = be32_to_cpup(tree_info); | ||
22507 | + of_property_read_u32(np, "xlnx,gpio-width", | ||
22508 | + (u32 *)&chip->mmchip.gc.ngpio); | ||
22509 | |||
22510 | spin_lock_init(&chip->gpio_lock); | ||
22511 | |||
22512 | @@ -219,29 +478,24 @@ static int xgpio_of_probe(struct device_node *np) | ||
22513 | /* Call the OF gpio helper to setup and register the GPIO device */ | ||
22514 | status = of_mm_gpiochip_add(np, &chip->mmchip); | ||
22515 | if (status) { | ||
22516 | - kfree(chip); | ||
22517 | pr_err("%s: error in probe function with status %d\n", | ||
22518 | np->full_name, status); | ||
22519 | return status; | ||
22520 | } | ||
22521 | |||
22522 | + status = xgpio_irq_setup(np, chip); | ||
22523 | + if (status) { | ||
22524 | + pr_err("%s: GPIO IRQ initialization failed %d\n", | ||
22525 | + np->full_name, status); | ||
22526 | + return status; | ||
22527 | + } | ||
22528 | + | ||
22529 | pr_info("XGpio: %s: registered, base is %d\n", np->full_name, | ||
22530 | chip->mmchip.gc.base); | ||
22531 | |||
22532 | tree_info = of_get_property(np, "xlnx,is-dual", NULL); | ||
22533 | if (tree_info && be32_to_cpup(tree_info)) { | ||
22534 | - /* Distinguish dual gpio chip */ | ||
22535 | - /* NOTE baseaddr ends with zero address XGPIO_CHANNEL_OFFSET */ | ||
22536 | - /* | ||
22537 | - * FIXME | ||
22538 | - * drivers/gpio/gpio-xilinx.c: In function 'xgpio_of_probe': | ||
22539 | - * drivers/gpio/gpio-xilinx.c:235:3: error: assignment of | ||
22540 | - * read-only location '*(np->full_name + ((unsigned int)strlen | ||
22541 | - * (np->full_name) + 0xffffffffffffffffffffffffffffffffu))' | ||
22542 | - */ | ||
22543 | - /* np->full_name[strlen(np->full_name) - 1] = '8'; */ | ||
22544 | - | ||
22545 | - chip = kzalloc(sizeof(*chip), GFP_KERNEL); | ||
22546 | + chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL); | ||
22547 | if (!chip) | ||
22548 | return -ENOMEM; | ||
22549 | |||
22550 | @@ -249,26 +503,21 @@ static int xgpio_of_probe(struct device_node *np) | ||
22551 | chip->offset = XGPIO_CHANNEL_OFFSET; | ||
22552 | |||
22553 | /* Update GPIO state shadow register with default value */ | ||
22554 | - tree_info = of_get_property(np, "xlnx,dout-default-2", NULL); | ||
22555 | - if (tree_info) | ||
22556 | - chip->gpio_state = be32_to_cpup(tree_info); | ||
22557 | + of_property_read_u32(np, "xlnx,dout-default-2", | ||
22558 | + &chip->gpio_state); | ||
22559 | |||
22560 | - /* Update GPIO direction shadow register with default value */ | ||
22561 | /* By default, all pins are inputs */ | ||
22562 | chip->gpio_dir = 0xFFFFFFFF; | ||
22563 | - tree_info = of_get_property(np, "xlnx,tri-default-2", NULL); | ||
22564 | - if (tree_info) | ||
22565 | - chip->gpio_dir = be32_to_cpup(tree_info); | ||
22566 | |||
22567 | - /* Check device node and parent device node for device width */ | ||
22568 | + /* Update GPIO direction shadow register with default value */ | ||
22569 | + of_property_read_u32(np, "xlnx,tri-default-2", &chip->gpio_dir); | ||
22570 | + | ||
22571 | /* By default assume full GPIO controller */ | ||
22572 | chip->mmchip.gc.ngpio = 32; | ||
22573 | - tree_info = of_get_property(np, "xlnx,gpio2-width", NULL); | ||
22574 | - if (!tree_info) | ||
22575 | - tree_info = of_get_property(np->parent, | ||
22576 | - "xlnx,gpio2-width", NULL); | ||
22577 | - if (tree_info) | ||
22578 | - chip->mmchip.gc.ngpio = be32_to_cpup(tree_info); | ||
22579 | + | ||
22580 | + /* Check device node and parent device node for device width */ | ||
22581 | + of_property_read_u32(np, "xlnx,gpio2-width", | ||
22582 | + (u32 *)&chip->mmchip.gc.ngpio); | ||
22583 | |||
22584 | spin_lock_init(&chip->gpio_lock); | ||
22585 | |||
22586 | @@ -279,12 +528,18 @@ static int xgpio_of_probe(struct device_node *np) | ||
22587 | |||
22588 | chip->mmchip.save_regs = xgpio_save_regs; | ||
22589 | |||
22590 | + status = xgpio_irq_setup(np, chip); | ||
22591 | + if (status) { | ||
22592 | + pr_err("%s: GPIO IRQ initialization failed %d\n", | ||
22593 | + np->full_name, status); | ||
22594 | + return status; | ||
22595 | + } | ||
22596 | + | ||
22597 | /* Call the OF gpio helper to setup and register the GPIO dev */ | ||
22598 | status = of_mm_gpiochip_add(np, &chip->mmchip); | ||
22599 | if (status) { | ||
22600 | - kfree(chip); | ||
22601 | pr_err("%s: error in probe function with status %d\n", | ||
22602 | - np->full_name, status); | ||
22603 | + np->full_name, status); | ||
22604 | return status; | ||
22605 | } | ||
22606 | pr_info("XGpio: %s: dual channel registered, base is %d\n", | ||
22607 | @@ -298,15 +553,20 @@ static struct of_device_id xgpio_of_match[] = { | ||
22608 | { .compatible = "xlnx,xps-gpio-1.00.a", }, | ||
22609 | { /* end of list */ }, | ||
22610 | }; | ||
22611 | +MODULE_DEVICE_TABLE(of, xgpio_of_match); | ||
22612 | + | ||
22613 | +static struct platform_driver xilinx_gpio_driver = { | ||
22614 | + .probe = xgpio_of_probe, | ||
22615 | + .driver = { | ||
22616 | + .owner = THIS_MODULE, | ||
22617 | + .name = "xilinx-gpio", | ||
22618 | + .of_match_table = xgpio_of_match, | ||
22619 | + }, | ||
22620 | +}; | ||
22621 | |||
22622 | static int __init xgpio_init(void) | ||
22623 | { | ||
22624 | - struct device_node *np; | ||
22625 | - | ||
22626 | - for_each_matching_node(np, xgpio_of_match) | ||
22627 | - xgpio_of_probe(np); | ||
22628 | - | ||
22629 | - return 0; | ||
22630 | + return platform_driver_register(&xilinx_gpio_driver); | ||
22631 | } | ||
22632 | |||
22633 | /* Make sure we get initialized before anyone else tries to use us */ | ||
21705 | diff --git a/drivers/gpio/gpio-xilinxps.c b/drivers/gpio/gpio-xilinxps.c | 22634 | diff --git a/drivers/gpio/gpio-xilinxps.c b/drivers/gpio/gpio-xilinxps.c |
21706 | index 8c51700..dbe0a9f 100644 | 22635 | index 8c51700..d953580 100644 |
21707 | --- a/drivers/gpio/gpio-xilinxps.c | 22636 | --- a/drivers/gpio/gpio-xilinxps.c |
21708 | +++ b/drivers/gpio/gpio-xilinxps.c | 22637 | +++ b/drivers/gpio/gpio-xilinxps.c |
22638 | @@ -26,7 +26,7 @@ | ||
22639 | #include <linux/pm_runtime.h> | ||
22640 | #include <linux/pm_wakeup.h> | ||
22641 | #include <linux/slab.h> | ||
22642 | -#include <asm/mach/irq.h> | ||
22643 | +#include <linux/irqchip/chained_irq.h> | ||
22644 | #include <linux/irqdomain.h> | ||
22645 | |||
22646 | #define DRIVER_NAME "xgpiops" | ||
21709 | @@ -426,8 +426,7 @@ static void xgpiops_irqhandler(unsigned int irq, struct irq_desc *desc) | 22647 | @@ -426,8 +426,7 @@ static void xgpiops_irqhandler(unsigned int irq, struct irq_desc *desc) |
21710 | generic_handle_irq(gpio_irq); | 22648 | generic_handle_irq(gpio_irq); |
21711 | } | 22649 | } |
@@ -25390,6 +26328,84 @@ index d1b4e00..5cb5820 100644 | |||
25390 | 26328 | ||
25391 | return error; | 26329 | return error; |
25392 | } | 26330 | } |
26331 | diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c | ||
26332 | index 471c71f..0b3d463 100644 | ||
26333 | --- a/drivers/pinctrl/pinctrl-at91.c | ||
26334 | +++ b/drivers/pinctrl/pinctrl-at91.c | ||
26335 | @@ -18,6 +18,7 @@ | ||
26336 | #include <linux/interrupt.h> | ||
26337 | #include <linux/irq.h> | ||
26338 | #include <linux/irqdomain.h> | ||
26339 | +#include <linux/irqchip/chained_irq.h> | ||
26340 | #include <linux/io.h> | ||
26341 | #include <linux/gpio.h> | ||
26342 | #include <linux/pinctrl/machine.h> | ||
26343 | @@ -27,8 +28,6 @@ | ||
26344 | /* Since we request GPIOs from ourself */ | ||
26345 | #include <linux/pinctrl/consumer.h> | ||
26346 | |||
26347 | -#include <asm/mach/irq.h> | ||
26348 | - | ||
26349 | #include <mach/hardware.h> | ||
26350 | #include <mach/at91_pio.h> | ||
26351 | |||
26352 | diff --git a/drivers/pinctrl/pinctrl-exynos.c b/drivers/pinctrl/pinctrl-exynos.c | ||
26353 | index 538b9dd..7265e55 100644 | ||
26354 | --- a/drivers/pinctrl/pinctrl-exynos.c | ||
26355 | +++ b/drivers/pinctrl/pinctrl-exynos.c | ||
26356 | @@ -23,13 +23,12 @@ | ||
26357 | #include <linux/interrupt.h> | ||
26358 | #include <linux/irqdomain.h> | ||
26359 | #include <linux/irq.h> | ||
26360 | +#include <linux/irqchip/chained_irq.h> | ||
26361 | #include <linux/of_irq.h> | ||
26362 | #include <linux/io.h> | ||
26363 | #include <linux/slab.h> | ||
26364 | #include <linux/err.h> | ||
26365 | |||
26366 | -#include <asm/mach/irq.h> | ||
26367 | - | ||
26368 | #include "pinctrl-samsung.h" | ||
26369 | #include "pinctrl-exynos.h" | ||
26370 | |||
26371 | diff --git a/drivers/pinctrl/pinctrl-sirf.c b/drivers/pinctrl/pinctrl-sirf.c | ||
26372 | index d02498b..ab26b4b 100644 | ||
26373 | --- a/drivers/pinctrl/pinctrl-sirf.c | ||
26374 | +++ b/drivers/pinctrl/pinctrl-sirf.c | ||
26375 | @@ -14,6 +14,7 @@ | ||
26376 | #include <linux/slab.h> | ||
26377 | #include <linux/err.h> | ||
26378 | #include <linux/irqdomain.h> | ||
26379 | +#include <linux/irqchip/chained_irq.h> | ||
26380 | #include <linux/pinctrl/pinctrl.h> | ||
26381 | #include <linux/pinctrl/pinmux.h> | ||
26382 | #include <linux/pinctrl/consumer.h> | ||
26383 | @@ -25,7 +26,6 @@ | ||
26384 | #include <linux/bitops.h> | ||
26385 | #include <linux/gpio.h> | ||
26386 | #include <linux/of_gpio.h> | ||
26387 | -#include <asm/mach/irq.h> | ||
26388 | |||
26389 | #define DRIVER_NAME "pinmux-sirf" | ||
26390 | |||
26391 | diff --git a/drivers/pinctrl/spear/pinctrl-plgpio.c b/drivers/pinctrl/spear/pinctrl-plgpio.c | ||
26392 | index 3cf4ecd..5c2d86e 100644 | ||
26393 | --- a/drivers/pinctrl/spear/pinctrl-plgpio.c | ||
26394 | +++ b/drivers/pinctrl/spear/pinctrl-plgpio.c | ||
26395 | @@ -15,12 +15,12 @@ | ||
26396 | #include <linux/io.h> | ||
26397 | #include <linux/irq.h> | ||
26398 | #include <linux/irqdomain.h> | ||
26399 | +#include <linux/irqchip/chained_irq.h> | ||
26400 | #include <linux/module.h> | ||
26401 | #include <linux/pinctrl/consumer.h> | ||
26402 | #include <linux/platform_device.h> | ||
26403 | #include <linux/pm.h> | ||
26404 | #include <linux/spinlock.h> | ||
26405 | -#include <asm/mach/irq.h> | ||
26406 | |||
26407 | #define MAX_GPIO_PER_REG 32 | ||
26408 | #define PIN_OFFSET(pin) (pin % MAX_GPIO_PER_REG) | ||
25393 | diff --git a/drivers/pwm/pwm-spear.c b/drivers/pwm/pwm-spear.c | 26409 | diff --git a/drivers/pwm/pwm-spear.c b/drivers/pwm/pwm-spear.c |
25394 | index 0c644e7..83b21d9 100644 | 26410 | index 0c644e7..83b21d9 100644 |
25395 | --- a/drivers/pwm/pwm-spear.c | 26411 | --- a/drivers/pwm/pwm-spear.c |
@@ -25419,7 +26435,7 @@ index 0c644e7..83b21d9 100644 | |||
25419 | return ret; | 26435 | return ret; |
25420 | } | 26436 | } |
25421 | diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig | 26437 | diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig |
25422 | index 36d7805..c88b8c2 100644 | 26438 | index 36d7805..823df2c 100644 |
25423 | --- a/drivers/remoteproc/Kconfig | 26439 | --- a/drivers/remoteproc/Kconfig |
25424 | +++ b/drivers/remoteproc/Kconfig | 26440 | +++ b/drivers/remoteproc/Kconfig |
25425 | @@ -44,6 +44,8 @@ config STE_MODEM_RPROC | 26441 | @@ -44,6 +44,8 @@ config STE_MODEM_RPROC |
@@ -25431,16 +26447,436 @@ index 36d7805..c88b8c2 100644 | |||
25431 | select REMOTEPROC | 26447 | select REMOTEPROC |
25432 | select RPMSG | 26448 | select RPMSG |
25433 | select HOTPLUG_CPU | 26449 | select HOTPLUG_CPU |
25434 | @@ -55,7 +57,8 @@ config ZYNQ_REMOTEPROC | 26450 | @@ -55,6 +57,9 @@ config ZYNQ_REMOTEPROC |
25435 | config MB_REMOTEPROC | 26451 | config MB_REMOTEPROC |
25436 | tristate "Support Microblaze remoteproc" | 26452 | tristate "Support Microblaze remoteproc" |
25437 | depends on ARCH_ZYNQ | 26453 | depends on ARCH_ZYNQ |
25438 | - select REMOTEPROC | ||
25439 | + depends on EXPERIMENTAL | 26454 | + depends on EXPERIMENTAL |
25440 | + depends on HAS_DMA | 26455 | + depends on HAS_DMA |
26456 | + select GPIO_XILINX | ||
26457 | select REMOTEPROC | ||
25441 | select RPMSG | 26458 | select RPMSG |
25442 | default m | 26459 | default m |
25443 | help | 26460 | diff --git a/drivers/remoteproc/mb_remoteproc.c b/drivers/remoteproc/mb_remoteproc.c |
26461 | index 470ff9d..860847d 100644 | ||
26462 | --- a/drivers/remoteproc/mb_remoteproc.c | ||
26463 | +++ b/drivers/remoteproc/mb_remoteproc.c | ||
26464 | @@ -1,7 +1,8 @@ | ||
26465 | /* | ||
26466 | * Microblaze Remote Processor driver | ||
26467 | * | ||
26468 | - * Copyright (C) 2012 Michal Simek <monstr@monstr.eu> | ||
26469 | + * Copyright (C) 2012 - 2013 Michal Simek <monstr@monstr.eu> | ||
26470 | + * Copyright (C) 2013 Xilinx, Inc. | ||
26471 | * Copyright (C) 2012 PetaLogix | ||
26472 | * | ||
26473 | * Based on origin OMAP Remote Processor driver | ||
26474 | @@ -21,55 +22,97 @@ | ||
26475 | |||
26476 | #include <linux/kernel.h> | ||
26477 | #include <linux/module.h> | ||
26478 | -#include <linux/moduleloader.h> | ||
26479 | #include <linux/err.h> | ||
26480 | #include <linux/platform_device.h> | ||
26481 | #include <linux/dma-mapping.h> | ||
26482 | #include <linux/remoteproc.h> | ||
26483 | #include <linux/interrupt.h> | ||
26484 | #include <linux/of_irq.h> | ||
26485 | +#include <linux/of_gpio.h> | ||
26486 | +#include <linux/of_platform.h> | ||
26487 | #include <linux/smp.h> | ||
26488 | #include <asm/hardware/gic.h> | ||
26489 | #include <asm/outercache.h> | ||
26490 | #include <asm/cacheflush.h> | ||
26491 | #include <linux/slab.h> | ||
26492 | #include <linux/cpu.h> | ||
26493 | +#include <linux/gpio.h> | ||
26494 | +#include <linux/io.h> | ||
26495 | +#include <linux/delay.h> | ||
26496 | |||
26497 | #include "remoteproc_internal.h" | ||
26498 | |||
26499 | -extern int __cpuinit zynq_cpun_start(u32 address, int cpu); | ||
26500 | - | ||
26501 | /* Module parameter */ | ||
26502 | static char *firmware; | ||
26503 | |||
26504 | -/* Structure for storing IRQs */ | ||
26505 | -struct irq_list { | ||
26506 | - int irq; | ||
26507 | - struct list_head list; | ||
26508 | -}; | ||
26509 | - | ||
26510 | /* Private data */ | ||
26511 | struct mb_rproc_pdata { | ||
26512 | - struct irq_list mylist; | ||
26513 | struct rproc *rproc; | ||
26514 | u32 mem_start; | ||
26515 | u32 mem_end; | ||
26516 | - u32 *gpio_reset_addr; | ||
26517 | - u32 reset_gpio_pin; | ||
26518 | + int reset_gpio; | ||
26519 | + int mb_debug_gpio; | ||
26520 | + int ipi; | ||
26521 | + int vring0; | ||
26522 | + int vring1; | ||
26523 | + void __iomem *vbase; | ||
26524 | + const unsigned char *bootloader; | ||
26525 | }; | ||
26526 | |||
26527 | +/* Store rproc for IPI handler */ | ||
26528 | +static struct platform_device *remoteprocdev; | ||
26529 | +static struct work_struct workqueue; | ||
26530 | + | ||
26531 | +static void handle_event(struct work_struct *work) | ||
26532 | +{ | ||
26533 | + struct mb_rproc_pdata *local = platform_get_drvdata(remoteprocdev); | ||
26534 | + | ||
26535 | + flush_cache_all(); | ||
26536 | + outer_flush_range(local->mem_start, local->mem_end); | ||
26537 | + | ||
26538 | + if (rproc_vq_interrupt(local->rproc, 0) == IRQ_NONE) | ||
26539 | + dev_info(&remoteprocdev->dev, "no message found in vqid 0\n"); | ||
26540 | +} | ||
26541 | + | ||
26542 | +static irqreturn_t ipi_kick(int irq, void *dev_id) | ||
26543 | +{ | ||
26544 | + dev_dbg(&remoteprocdev->dev, "KICK Linux because of pending message\n"); | ||
26545 | + schedule_work(&workqueue); | ||
26546 | + dev_dbg(&remoteprocdev->dev, "KICK Linux handled\n"); | ||
26547 | + | ||
26548 | + return IRQ_HANDLED; | ||
26549 | +} | ||
26550 | + | ||
26551 | static int mb_rproc_start(struct rproc *rproc) | ||
26552 | { | ||
26553 | struct device *dev = rproc->dev.parent; | ||
26554 | struct platform_device *pdev = to_platform_device(dev); | ||
26555 | struct mb_rproc_pdata *local = platform_get_drvdata(pdev); | ||
26556 | + const struct firmware *fw; | ||
26557 | + int ret; | ||
26558 | |||
26559 | dev_info(dev, "%s\n", __func__); | ||
26560 | + INIT_WORK(&workqueue, handle_event); | ||
26561 | |||
26562 | flush_cache_all(); | ||
26563 | outer_flush_range(local->mem_start, local->mem_end); | ||
26564 | |||
26565 | - *local->gpio_reset_addr &= ~(1 << local->reset_gpio_pin); | ||
26566 | + remoteprocdev = pdev; | ||
26567 | + | ||
26568 | + ret = request_firmware(&fw, local->bootloader, &pdev->dev); | ||
26569 | + if (ret < 0) { | ||
26570 | + dev_err(&pdev->dev, "request_firmware failed\n"); | ||
26571 | + return ret; | ||
26572 | + } | ||
26573 | + /* Copy bootloader to memory */ | ||
26574 | + memcpy(local->vbase, fw->data, fw->size); | ||
26575 | + release_firmware(fw); | ||
26576 | + | ||
26577 | + /* Just for sure synchronize memories */ | ||
26578 | + dsb(); | ||
26579 | + | ||
26580 | + /* Release Microblaze from reset */ | ||
26581 | + gpio_set_value(local->reset_gpio, 0); | ||
26582 | |||
26583 | return 0; | ||
26584 | } | ||
26585 | @@ -78,9 +121,28 @@ static int mb_rproc_start(struct rproc *rproc) | ||
26586 | static void mb_rproc_kick(struct rproc *rproc, int vqid) | ||
26587 | { | ||
26588 | struct device *dev = rproc->dev.parent; | ||
26589 | + struct platform_device *pdev = to_platform_device(dev); | ||
26590 | + struct mb_rproc_pdata *local = platform_get_drvdata(pdev); | ||
26591 | + | ||
26592 | + dev_dbg(dev, "KICK Firmware to start send messages vqid %d\n", vqid); | ||
26593 | |||
26594 | - dev_info(dev, "KICK Firmware to start send messages vqid %d\n", | ||
26595 | - vqid); | ||
26596 | + flush_cache_all(); | ||
26597 | + outer_flush_all(); | ||
26598 | + | ||
26599 | + /* Send swirq to firmware */ | ||
26600 | + gpio_set_value(local->vring0, 0); | ||
26601 | + gpio_set_value(local->vring1, 0); | ||
26602 | + dsb(); | ||
26603 | + | ||
26604 | + if (!vqid) { | ||
26605 | + udelay(500); | ||
26606 | + gpio_set_value(local->vring0, 1); | ||
26607 | + dsb(); | ||
26608 | + } else { | ||
26609 | + udelay(100); | ||
26610 | + gpio_set_value(local->vring1, 1); | ||
26611 | + dsb(); | ||
26612 | + } | ||
26613 | } | ||
26614 | |||
26615 | /* power off the remote processor */ | ||
26616 | @@ -90,10 +152,21 @@ static int mb_rproc_stop(struct rproc *rproc) | ||
26617 | struct platform_device *pdev = to_platform_device(dev); | ||
26618 | struct mb_rproc_pdata *local = platform_get_drvdata(pdev); | ||
26619 | |||
26620 | - dev_info(dev, "%s\n", __func__); | ||
26621 | + /* Setup MB to the state where all memory transactions are done */ | ||
26622 | + gpio_set_value(local->mb_debug_gpio, 1); | ||
26623 | + dsb(); /* Be sure that this write has been done */ | ||
26624 | + /* | ||
26625 | + * This should be enough to ensure one CLK as | ||
26626 | + * it is written in MB ref guide | ||
26627 | + */ | ||
26628 | + gpio_set_value(local->mb_debug_gpio, 0); | ||
26629 | + | ||
26630 | + udelay(1000); /* Wait some time to finish all mem transactions */ | ||
26631 | |||
26632 | - *local->gpio_reset_addr |= 1 << local->reset_gpio_pin; | ||
26633 | + /* Add Microblaze to reset state */ | ||
26634 | + gpio_set_value(local->reset_gpio, 1); | ||
26635 | |||
26636 | + /* No reason to wait that operations where done */ | ||
26637 | return 0; | ||
26638 | } | ||
26639 | |||
26640 | @@ -113,33 +186,17 @@ static irqreturn_t mb_remoteproc_interrupt(int irq, void *dev_id) | ||
26641 | return IRQ_HANDLED; | ||
26642 | } | ||
26643 | |||
26644 | -static void clear_irq(struct platform_device *pdev) | ||
26645 | -{ | ||
26646 | - struct list_head *pos, *q; | ||
26647 | - struct irq_list *tmp; | ||
26648 | - struct mb_rproc_pdata *local = platform_get_drvdata(pdev); | ||
26649 | - | ||
26650 | - dev_info(&pdev->dev, "Deleting the irq_list\n"); | ||
26651 | - list_for_each_safe(pos, q, &local->mylist.list) { | ||
26652 | - tmp = list_entry(pos, struct irq_list, list); | ||
26653 | - free_irq(tmp->irq, &pdev->dev); | ||
26654 | - list_del(pos); | ||
26655 | - kfree(tmp); | ||
26656 | - } | ||
26657 | -} | ||
26658 | - | ||
26659 | static int mb_remoteproc_probe(struct platform_device *pdev) | ||
26660 | { | ||
26661 | const unsigned char *prop; | ||
26662 | - const void *of_prop; | ||
26663 | + struct platform_device *bram_pdev; | ||
26664 | + struct device_node *bram_dev; | ||
26665 | struct resource *res; /* IO mem resources */ | ||
26666 | int ret = 0; | ||
26667 | - struct irq_list *tmp; | ||
26668 | - int count; | ||
26669 | + int count = 0; | ||
26670 | struct mb_rproc_pdata *local; | ||
26671 | |||
26672 | - | ||
26673 | - local = kzalloc(sizeof(struct mb_rproc_pdata), GFP_KERNEL); | ||
26674 | + local = devm_kzalloc(&pdev->dev, sizeof(*local), GFP_KERNEL); | ||
26675 | if (!local) { | ||
26676 | dev_err(&pdev->dev, "Unable to alloc private data\n"); | ||
26677 | return -ENOMEM; | ||
26678 | @@ -172,58 +229,123 @@ static int mb_remoteproc_probe(struct platform_device *pdev) | ||
26679 | return ret; | ||
26680 | } | ||
26681 | |||
26682 | - /* Init list for IRQs - it can be long list */ | ||
26683 | - INIT_LIST_HEAD(&local->mylist.list); | ||
26684 | - | ||
26685 | - count = of_irq_count(pdev->dev.of_node); | ||
26686 | /* Alloc IRQ based on DTS to be sure that no other driver will use it */ | ||
26687 | - while (count--) { | ||
26688 | - tmp = kzalloc(sizeof(struct irq_list), GFP_KERNEL); | ||
26689 | - if (!tmp) { | ||
26690 | - dev_err(&pdev->dev, "Unable to alloc irq list\n"); | ||
26691 | - ret = -ENOMEM; | ||
26692 | - goto irq_fault; | ||
26693 | - } | ||
26694 | - | ||
26695 | - tmp->irq = irq_of_parse_and_map(pdev->dev.of_node, count); | ||
26696 | - | ||
26697 | - dev_info(&pdev->dev, "%d: Alloc irq: %d\n", count, tmp->irq); | ||
26698 | - | ||
26699 | + while (1) { | ||
26700 | + int irq; | ||
26701 | /* Allocating shared IRQs will ensure that any module will | ||
26702 | * use these IRQs */ | ||
26703 | - ret = request_irq(tmp->irq, mb_remoteproc_interrupt, 0, | ||
26704 | - dev_name(&pdev->dev), &pdev->dev); | ||
26705 | + irq = platform_get_irq(pdev, count++); | ||
26706 | + if (irq == -ENXIO) | ||
26707 | + break; | ||
26708 | + ret = devm_request_irq(&pdev->dev, irq, mb_remoteproc_interrupt, | ||
26709 | + 0, dev_name(&pdev->dev), &pdev->dev); | ||
26710 | if (ret) { | ||
26711 | - dev_err(&pdev->dev, "IRQ %d already allocated\n", | ||
26712 | - tmp->irq); | ||
26713 | - goto irq_fault; | ||
26714 | + dev_err(&pdev->dev, "IRQ %d already allocated\n", irq); | ||
26715 | + return ret; | ||
26716 | } | ||
26717 | |||
26718 | - list_add(&(tmp->list), &(local->mylist.list)); | ||
26719 | + dev_info(&pdev->dev, "%d: Alloc irq: %d\n", count, irq); | ||
26720 | } | ||
26721 | |||
26722 | + /* Find out reset gpio and keep microblaze in reset */ | ||
26723 | + local->reset_gpio = of_get_named_gpio(pdev->dev.of_node, "reset", 0); | ||
26724 | + if (local->reset_gpio < 0) { | ||
26725 | + dev_err(&pdev->dev, "reset-gpio property not found\n"); | ||
26726 | + return local->reset_gpio; | ||
26727 | + } | ||
26728 | + ret = devm_gpio_request_one(&pdev->dev, local->reset_gpio, | ||
26729 | + GPIOF_OUT_INIT_HIGH, "mb_reset"); | ||
26730 | + if (ret) { | ||
26731 | + dev_err(&pdev->dev, "Please specify gpio reset addr\n"); | ||
26732 | + return ret; | ||
26733 | + } | ||
26734 | + | ||
26735 | + /* Find out reset gpio and keep microblaze in reset */ | ||
26736 | + local->mb_debug_gpio = of_get_named_gpio(pdev->dev.of_node, "debug", 0); | ||
26737 | + if (local->mb_debug_gpio < 0) { | ||
26738 | + dev_err(&pdev->dev, "mb-debug-gpio property not found\n"); | ||
26739 | + return local->mb_debug_gpio; | ||
26740 | + } | ||
26741 | + ret = devm_gpio_request_one(&pdev->dev, local->mb_debug_gpio, | ||
26742 | + GPIOF_OUT_INIT_LOW, "mb_debug"); | ||
26743 | + if (ret) { | ||
26744 | + dev_err(&pdev->dev, "Please specify gpio debug pin\n"); | ||
26745 | + return ret; | ||
26746 | + } | ||
26747 | + | ||
26748 | + /* IPI number for getting irq from firmware */ | ||
26749 | + local->ipi = of_get_named_gpio(pdev->dev.of_node, "ipino", 0); | ||
26750 | + if (local->ipi < 0) { | ||
26751 | + dev_err(&pdev->dev, "ipi-gpio property not found\n"); | ||
26752 | + return local->ipi; | ||
26753 | + } | ||
26754 | + ret = devm_gpio_request_one(&pdev->dev, local->ipi, GPIOF_IN, "mb_ipi"); | ||
26755 | + if (ret) { | ||
26756 | + dev_err(&pdev->dev, "Please specify gpio reset addr\n"); | ||
26757 | + return ret; | ||
26758 | + } | ||
26759 | + ret = devm_request_irq(&pdev->dev, gpio_to_irq(local->ipi), | ||
26760 | + ipi_kick, IRQF_SHARED|IRQF_TRIGGER_RISING, | ||
26761 | + dev_name(&pdev->dev), local); | ||
26762 | + if (ret) { | ||
26763 | + dev_err(&pdev->dev, "IRQ %d already allocated\n", local->ipi); | ||
26764 | + return ret; | ||
26765 | + } | ||
26766 | + | ||
26767 | + /* Find out vring0 pin */ | ||
26768 | + local->vring0 = of_get_named_gpio(pdev->dev.of_node, "vring0", 0); | ||
26769 | + if (local->vring0 < 0) { | ||
26770 | + dev_err(&pdev->dev, "reset-gpio property not found\n"); | ||
26771 | + return local->vring0; | ||
26772 | + } | ||
26773 | + ret = devm_gpio_request_one(&pdev->dev, local->vring0, | ||
26774 | + GPIOF_DIR_OUT, "mb_vring0"); | ||
26775 | + if (ret) { | ||
26776 | + dev_err(&pdev->dev, "Please specify gpio reset addr\n"); | ||
26777 | + return ret; | ||
26778 | + } | ||
26779 | |||
26780 | - of_prop = of_get_property(pdev->dev.of_node, "reset-gpio", NULL); | ||
26781 | - if (!of_prop) { | ||
26782 | + /* Find out vring1 pin */ | ||
26783 | + local->vring1 = of_get_named_gpio(pdev->dev.of_node, "vring1", 0); | ||
26784 | + if (local->vring1 < 0) { | ||
26785 | + dev_err(&pdev->dev, "reset-gpio property not found\n"); | ||
26786 | + return local->vring1; | ||
26787 | + } | ||
26788 | + ret = devm_gpio_request_one(&pdev->dev, local->vring1, | ||
26789 | + GPIOF_DIR_OUT, "mb_vring1"); | ||
26790 | + if (ret) { | ||
26791 | dev_err(&pdev->dev, "Please specify gpio reset addr\n"); | ||
26792 | - goto irq_fault; | ||
26793 | + return ret; | ||
26794 | } | ||
26795 | |||
26796 | - local->gpio_reset_addr = ioremap(be32_to_cpup(of_prop), 0x1000); | ||
26797 | - if (!local->gpio_reset_addr) { | ||
26798 | - dev_err(&pdev->dev, "Reset GPIO ioremap failed\n"); | ||
26799 | - goto irq_fault; | ||
26800 | + /* Allocate bram device */ | ||
26801 | + bram_dev = of_parse_phandle(pdev->dev.of_node, "bram", 0); | ||
26802 | + if (!bram_dev) { | ||
26803 | + dev_err(&pdev->dev, "Please specify bram connection\n"); | ||
26804 | + return -ENODEV; | ||
26805 | + } | ||
26806 | + bram_pdev = of_find_device_by_node(bram_dev); | ||
26807 | + if (!bram_pdev) { | ||
26808 | + dev_err(&pdev->dev, "BRAM device hasn't found\n"); | ||
26809 | + return -ENODEV; | ||
26810 | + } | ||
26811 | + res = platform_get_resource(bram_pdev, IORESOURCE_MEM, 0); | ||
26812 | + local->vbase = devm_ioremap_resource(&pdev->dev, res); | ||
26813 | + if (!local->vbase) { | ||
26814 | + dev_err(&pdev->dev, "BRAM devm ioremap failed\n"); | ||
26815 | + return -ENODEV; | ||
26816 | } | ||
26817 | |||
26818 | - of_prop = of_get_property(pdev->dev.of_node, "reset-gpio-pin", NULL); | ||
26819 | - if (!of_prop) { | ||
26820 | - dev_err(&pdev->dev, "Please specify cpu number\n"); | ||
26821 | - goto irq_fault; | ||
26822 | + /* Load simple bootloader to bram */ | ||
26823 | + local->bootloader = of_get_property(pdev->dev.of_node, | ||
26824 | + "bram-firmware", NULL); | ||
26825 | + if (!local->bootloader) { | ||
26826 | + dev_err(&pdev->dev, "Please specify BRAM firmware\n"); | ||
26827 | + return -ENODEV; | ||
26828 | } | ||
26829 | - local->reset_gpio_pin = be32_to_cpup(of_prop); | ||
26830 | |||
26831 | - /* Keep mb in reset */ | ||
26832 | - *local->gpio_reset_addr |= 1 << local->reset_gpio_pin; | ||
26833 | + dev_info(&pdev->dev, "Using microblaze BRAM bootloader: %s\n", | ||
26834 | + local->bootloader); | ||
26835 | |||
26836 | /* Module param firmware first */ | ||
26837 | if (firmware) | ||
26838 | @@ -237,26 +359,19 @@ static int mb_remoteproc_probe(struct platform_device *pdev) | ||
26839 | &mb_rproc_ops, prop, sizeof(struct rproc)); | ||
26840 | if (!local->rproc) { | ||
26841 | dev_err(&pdev->dev, "rproc allocation failed\n"); | ||
26842 | - goto rproc_fault; | ||
26843 | + return -ENOMEM; | ||
26844 | } | ||
26845 | |||
26846 | ret = rproc_add(local->rproc); | ||
26847 | if (ret) { | ||
26848 | dev_err(&pdev->dev, "rproc registration failed\n"); | ||
26849 | - goto rproc_fault; | ||
26850 | + rproc_put(local->rproc); | ||
26851 | + return ret; | ||
26852 | } | ||
26853 | + return 0; | ||
26854 | + } | ||
26855 | |||
26856 | - return ret; | ||
26857 | - } else | ||
26858 | - ret = -ENODEV; | ||
26859 | - | ||
26860 | -rproc_fault: | ||
26861 | - rproc_put(local->rproc); | ||
26862 | - | ||
26863 | -irq_fault: | ||
26864 | - clear_irq(pdev); | ||
26865 | - | ||
26866 | - return ret; | ||
26867 | + return -ENODEV; | ||
26868 | } | ||
26869 | |||
26870 | static int mb_remoteproc_remove(struct platform_device *pdev) | ||
26871 | @@ -267,8 +382,6 @@ static int mb_remoteproc_remove(struct platform_device *pdev) | ||
26872 | |||
26873 | dma_release_declared_memory(&pdev->dev); | ||
26874 | |||
26875 | - clear_irq(pdev); | ||
26876 | - | ||
26877 | rproc_del(local->rproc); | ||
26878 | rproc_put(local->rproc); | ||
26879 | |||
25444 | diff --git a/drivers/rpmsg/rpmsg_freertos_statistic.c b/drivers/rpmsg/rpmsg_freertos_statistic.c | 26880 | diff --git a/drivers/rpmsg/rpmsg_freertos_statistic.c b/drivers/rpmsg/rpmsg_freertos_statistic.c |
25445 | index 021dd7e..c09301a 100644 | 26881 | index 021dd7e..c09301a 100644 |
25446 | --- a/drivers/rpmsg/rpmsg_freertos_statistic.c | 26882 | --- a/drivers/rpmsg/rpmsg_freertos_statistic.c |
@@ -28737,6 +30173,20 @@ index 0000000..e44fad7 | |||
28737 | + | 30173 | + |
28738 | + | 30174 | + |
28739 | +#endif | 30175 | +#endif |
30176 | diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-common.c b/drivers/staging/imx-drm/ipu-v3/ipu-common.c | ||
30177 | index f7059cd..fabd3ed 100644 | ||
30178 | --- a/drivers/staging/imx-drm/ipu-v3/ipu-common.c | ||
30179 | +++ b/drivers/staging/imx-drm/ipu-v3/ipu-common.c | ||
30180 | @@ -25,8 +25,8 @@ | ||
30181 | #include <linux/clk.h> | ||
30182 | #include <linux/list.h> | ||
30183 | #include <linux/irq.h> | ||
30184 | +#include <linux/irqchip/chained_irq.h> | ||
30185 | #include <linux/of_device.h> | ||
30186 | -#include <asm/mach/irq.h> | ||
30187 | |||
30188 | #include "imx-ipu-v3.h" | ||
30189 | #include "ipu-prv.h" | ||
28740 | diff --git a/drivers/staging/video/axivdma/Kconfig b/drivers/staging/video/axivdma/Kconfig | 30190 | diff --git a/drivers/staging/video/axivdma/Kconfig b/drivers/staging/video/axivdma/Kconfig |
28741 | new file mode 100644 | 30191 | new file mode 100644 |
28742 | index 0000000..f3b401b | 30192 | index 0000000..f3b401b |
@@ -77566,6 +79016,18 @@ index a501169..d9718ee 100644 | |||
77566 | + spinlock_t *lock); | 79016 | + spinlock_t *lock); |
77567 | 79017 | ||
77568 | #endif | 79018 | #endif |
79019 | diff --git a/include/linux/device.h b/include/linux/device.h | ||
79020 | index 43dcda9..251f33b 100644 | ||
79021 | --- a/include/linux/device.h | ||
79022 | +++ b/include/linux/device.h | ||
79023 | @@ -573,6 +573,7 @@ extern int devres_release_group(struct device *dev, void *id); | ||
79024 | extern void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp); | ||
79025 | extern void devm_kfree(struct device *dev, void *p); | ||
79026 | |||
79027 | +void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res); | ||
79028 | void __iomem *devm_request_and_ioremap(struct device *dev, | ||
79029 | struct resource *res); | ||
79030 | |||
77569 | diff --git a/include/linux/fs.h b/include/linux/fs.h | 79031 | diff --git a/include/linux/fs.h b/include/linux/fs.h |
77570 | index 1a39c33..7617ee0 100644 | 79032 | index 1a39c33..7617ee0 100644 |
77571 | --- a/include/linux/fs.h | 79033 | --- a/include/linux/fs.h |
@@ -77653,6 +79115,64 @@ index c4d870b..ae221a7 100644 | |||
77653 | /* | 79115 | /* |
77654 | * Defines whether IPC_RMID is forced for _all_ shm segments regardless | 79116 | * Defines whether IPC_RMID is forced for _all_ shm segments regardless |
77655 | * of shmctl() | 79117 | * of shmctl() |
79118 | diff --git a/include/linux/irqchip/chained_irq.h b/include/linux/irqchip/chained_irq.h | ||
79119 | new file mode 100644 | ||
79120 | index 0000000..adf4c30 | ||
79121 | --- /dev/null | ||
79122 | +++ b/include/linux/irqchip/chained_irq.h | ||
79123 | @@ -0,0 +1,52 @@ | ||
79124 | +/* | ||
79125 | + * Chained IRQ handlers support. | ||
79126 | + * | ||
79127 | + * Copyright (C) 2011 ARM Ltd. | ||
79128 | + * | ||
79129 | + * This program is free software: you can redistribute it and/or modify | ||
79130 | + * it under the terms of the GNU General Public License version 2 as | ||
79131 | + * published by the Free Software Foundation. | ||
79132 | + * | ||
79133 | + * This program is distributed in the hope that it will be useful, | ||
79134 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
79135 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
79136 | + * GNU General Public License for more details. | ||
79137 | + * | ||
79138 | + * You should have received a copy of the GNU General Public License | ||
79139 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
79140 | + */ | ||
79141 | +#ifndef __IRQCHIP_CHAINED_IRQ_H | ||
79142 | +#define __IRQCHIP_CHAINED_IRQ_H | ||
79143 | + | ||
79144 | +#include <linux/irq.h> | ||
79145 | + | ||
79146 | +/* | ||
79147 | + * Entry/exit functions for chained handlers where the primary IRQ chip | ||
79148 | + * may implement either fasteoi or level-trigger flow control. | ||
79149 | + */ | ||
79150 | +static inline void chained_irq_enter(struct irq_chip *chip, | ||
79151 | + struct irq_desc *desc) | ||
79152 | +{ | ||
79153 | + /* FastEOI controllers require no action on entry. */ | ||
79154 | + if (chip->irq_eoi) | ||
79155 | + return; | ||
79156 | + | ||
79157 | + if (chip->irq_mask_ack) { | ||
79158 | + chip->irq_mask_ack(&desc->irq_data); | ||
79159 | + } else { | ||
79160 | + chip->irq_mask(&desc->irq_data); | ||
79161 | + if (chip->irq_ack) | ||
79162 | + chip->irq_ack(&desc->irq_data); | ||
79163 | + } | ||
79164 | +} | ||
79165 | + | ||
79166 | +static inline void chained_irq_exit(struct irq_chip *chip, | ||
79167 | + struct irq_desc *desc) | ||
79168 | +{ | ||
79169 | + if (chip->irq_eoi) | ||
79170 | + chip->irq_eoi(&desc->irq_data); | ||
79171 | + else | ||
79172 | + chip->irq_unmask(&desc->irq_data); | ||
79173 | +} | ||
79174 | + | ||
79175 | +#endif /* __IRQCHIP_CHAINED_IRQ_H */ | ||
77656 | diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h | 79176 | diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h |
77657 | index 383bef0..e30b663 100644 | 79177 | index 383bef0..e30b663 100644 |
77658 | --- a/include/linux/jbd2.h | 79178 | --- a/include/linux/jbd2.h |
@@ -78921,6 +80441,109 @@ index b6a1a5e..0000000 | |||
78921 | - return err; | 80441 | - return err; |
78922 | -} | 80442 | -} |
78923 | -device_initcall(timelimit_init); | 80443 | -device_initcall(timelimit_init); |
80444 | diff --git a/lib/devres.c b/lib/devres.c | ||
80445 | index 80b9c76..88ad759 100644 | ||
80446 | --- a/lib/devres.c | ||
80447 | +++ b/lib/devres.c | ||
80448 | @@ -1,3 +1,4 @@ | ||
80449 | +#include <linux/err.h> | ||
80450 | #include <linux/pci.h> | ||
80451 | #include <linux/io.h> | ||
80452 | #include <linux/gfp.h> | ||
80453 | @@ -86,22 +87,24 @@ void devm_iounmap(struct device *dev, void __iomem *addr) | ||
80454 | EXPORT_SYMBOL(devm_iounmap); | ||
80455 | |||
80456 | /** | ||
80457 | - * devm_request_and_ioremap() - Check, request region, and ioremap resource | ||
80458 | - * @dev: Generic device to handle the resource for | ||
80459 | + * devm_ioremap_resource() - check, request region, and ioremap resource | ||
80460 | + * @dev: generic device to handle the resource for | ||
80461 | * @res: resource to be handled | ||
80462 | * | ||
80463 | - * Takes all necessary steps to ioremap a mem resource. Uses managed device, so | ||
80464 | - * everything is undone on driver detach. Checks arguments, so you can feed | ||
80465 | - * it the result from e.g. platform_get_resource() directly. Returns the | ||
80466 | - * remapped pointer or NULL on error. Usage example: | ||
80467 | + * Checks that a resource is a valid memory region, requests the memory region | ||
80468 | + * and ioremaps it either as cacheable or as non-cacheable memory depending on | ||
80469 | + * the resource's flags. All operations are managed and will be undone on | ||
80470 | + * driver detach. | ||
80471 | + * | ||
80472 | + * Returns a pointer to the remapped memory or an ERR_PTR() encoded error code | ||
80473 | + * on failure. Usage example: | ||
80474 | * | ||
80475 | * res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
80476 | - * base = devm_request_and_ioremap(&pdev->dev, res); | ||
80477 | - * if (!base) | ||
80478 | - * return -EADDRNOTAVAIL; | ||
80479 | + * base = devm_ioremap_resource(&pdev->dev, res); | ||
80480 | + * if (IS_ERR(base)) | ||
80481 | + * return PTR_ERR(base); | ||
80482 | */ | ||
80483 | -void __iomem *devm_request_and_ioremap(struct device *dev, | ||
80484 | - struct resource *res) | ||
80485 | +void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res) | ||
80486 | { | ||
80487 | resource_size_t size; | ||
80488 | const char *name; | ||
80489 | @@ -111,7 +114,7 @@ void __iomem *devm_request_and_ioremap(struct device *dev, | ||
80490 | |||
80491 | if (!res || resource_type(res) != IORESOURCE_MEM) { | ||
80492 | dev_err(dev, "invalid resource\n"); | ||
80493 | - return NULL; | ||
80494 | + return ERR_PTR(-EINVAL); | ||
80495 | } | ||
80496 | |||
80497 | size = resource_size(res); | ||
80498 | @@ -119,7 +122,7 @@ void __iomem *devm_request_and_ioremap(struct device *dev, | ||
80499 | |||
80500 | if (!devm_request_mem_region(dev, res->start, size, name)) { | ||
80501 | dev_err(dev, "can't request region for resource %pR\n", res); | ||
80502 | - return NULL; | ||
80503 | + return ERR_PTR(-EBUSY); | ||
80504 | } | ||
80505 | |||
80506 | if (res->flags & IORESOURCE_CACHEABLE) | ||
80507 | @@ -130,10 +133,39 @@ void __iomem *devm_request_and_ioremap(struct device *dev, | ||
80508 | if (!dest_ptr) { | ||
80509 | dev_err(dev, "ioremap failed for resource %pR\n", res); | ||
80510 | devm_release_mem_region(dev, res->start, size); | ||
80511 | + dest_ptr = ERR_PTR(-ENOMEM); | ||
80512 | } | ||
80513 | |||
80514 | return dest_ptr; | ||
80515 | } | ||
80516 | +EXPORT_SYMBOL(devm_ioremap_resource); | ||
80517 | + | ||
80518 | +/** | ||
80519 | + * devm_request_and_ioremap() - Check, request region, and ioremap resource | ||
80520 | + * @dev: Generic device to handle the resource for | ||
80521 | + * @res: resource to be handled | ||
80522 | + * | ||
80523 | + * Takes all necessary steps to ioremap a mem resource. Uses managed device, so | ||
80524 | + * everything is undone on driver detach. Checks arguments, so you can feed | ||
80525 | + * it the result from e.g. platform_get_resource() directly. Returns the | ||
80526 | + * remapped pointer or NULL on error. Usage example: | ||
80527 | + * | ||
80528 | + * res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
80529 | + * base = devm_request_and_ioremap(&pdev->dev, res); | ||
80530 | + * if (!base) | ||
80531 | + * return -EADDRNOTAVAIL; | ||
80532 | + */ | ||
80533 | +void __iomem *devm_request_and_ioremap(struct device *device, | ||
80534 | + struct resource *res) | ||
80535 | +{ | ||
80536 | + void __iomem *dest_ptr; | ||
80537 | + | ||
80538 | + dest_ptr = devm_ioremap_resource(device, res); | ||
80539 | + if (IS_ERR(dest_ptr)) | ||
80540 | + return NULL; | ||
80541 | + | ||
80542 | + return dest_ptr; | ||
80543 | +} | ||
80544 | EXPORT_SYMBOL(devm_request_and_ioremap); | ||
80545 | |||
80546 | #ifdef CONFIG_HAS_IOPORT | ||
78924 | diff --git a/lib/oid_registry.c b/lib/oid_registry.c | 80547 | diff --git a/lib/oid_registry.c b/lib/oid_registry.c |
78925 | index 318f382..d8de11f 100644 | 80548 | index 318f382..d8de11f 100644 |
78926 | --- a/lib/oid_registry.c | 80549 | --- a/lib/oid_registry.c |
@@ -79424,6 +81047,102 @@ index 91ef82b..82c4fc7 100644 | |||
79424 | return; | 81047 | return; |
79425 | } | 81048 | } |
79426 | 81049 | ||
81050 | diff --git a/scripts/coccinelle/api/devm_ioremap_resource.cocci b/scripts/coccinelle/api/devm_ioremap_resource.cocci | ||
81051 | new file mode 100644 | ||
81052 | index 0000000..495daa3 | ||
81053 | --- /dev/null | ||
81054 | +++ b/scripts/coccinelle/api/devm_ioremap_resource.cocci | ||
81055 | @@ -0,0 +1,90 @@ | ||
81056 | +virtual patch | ||
81057 | +virtual report | ||
81058 | + | ||
81059 | +@depends on patch@ | ||
81060 | +expression base, dev, res; | ||
81061 | +@@ | ||
81062 | + | ||
81063 | +-base = devm_request_and_ioremap(dev, res); | ||
81064 | ++base = devm_ioremap_resource(dev, res); | ||
81065 | + ... | ||
81066 | + if ( | ||
81067 | +-base == NULL | ||
81068 | ++IS_ERR(base) | ||
81069 | + || ...) { | ||
81070 | +<... | ||
81071 | +- return ...; | ||
81072 | ++ return PTR_ERR(base); | ||
81073 | +...> | ||
81074 | + } | ||
81075 | + | ||
81076 | +@depends on patch@ | ||
81077 | +expression e, E, ret; | ||
81078 | +identifier l; | ||
81079 | +@@ | ||
81080 | + | ||
81081 | + e = devm_ioremap_resource(...); | ||
81082 | + ... | ||
81083 | + if (IS_ERR(e) || ...) { | ||
81084 | + ... when any | ||
81085 | +- ret = E; | ||
81086 | ++ ret = PTR_ERR(e); | ||
81087 | + ... | ||
81088 | +( | ||
81089 | + return ret; | ||
81090 | +| | ||
81091 | + goto l; | ||
81092 | +) | ||
81093 | + } | ||
81094 | + | ||
81095 | +@depends on patch@ | ||
81096 | +expression e; | ||
81097 | +@@ | ||
81098 | + | ||
81099 | + e = devm_ioremap_resource(...); | ||
81100 | + ... | ||
81101 | + if (IS_ERR(e) || ...) { | ||
81102 | + ... | ||
81103 | +- \(dev_dbg\|dev_err\|pr_debug\|pr_err\|DRM_ERROR\)(...); | ||
81104 | + ... | ||
81105 | + } | ||
81106 | + | ||
81107 | +@depends on patch@ | ||
81108 | +expression e; | ||
81109 | +identifier l; | ||
81110 | +@@ | ||
81111 | + | ||
81112 | + e = devm_ioremap_resource(...); | ||
81113 | + ... | ||
81114 | + if (IS_ERR(e) || ...) | ||
81115 | +-{ | ||
81116 | +( | ||
81117 | + return ...; | ||
81118 | +| | ||
81119 | + goto l; | ||
81120 | +) | ||
81121 | +-} | ||
81122 | + | ||
81123 | +@r depends on report@ | ||
81124 | +expression e; | ||
81125 | +identifier l; | ||
81126 | +position p1; | ||
81127 | +@@ | ||
81128 | + | ||
81129 | +*e = devm_request_and_ioremap@p1(...); | ||
81130 | + ... | ||
81131 | + if (e == NULL || ...) { | ||
81132 | + ... | ||
81133 | +( | ||
81134 | + return ...; | ||
81135 | +| | ||
81136 | + goto l; | ||
81137 | +) | ||
81138 | + } | ||
81139 | + | ||
81140 | +@script:python depends on r@ | ||
81141 | +p1 << r.p1; | ||
81142 | +@@ | ||
81143 | + | ||
81144 | +msg = "ERROR: deprecated devm_request_and_ioremap() API used on line %s" % (p1[0].line) | ||
81145 | +coccilib.report.print_report(p1[0], msg) | ||
79427 | diff --git a/scripts/kconfig/streamline_config.pl b/scripts/kconfig/streamline_config.pl | 81146 | diff --git a/scripts/kconfig/streamline_config.pl b/scripts/kconfig/streamline_config.pl |
79428 | index 68b85e1..3368939 100644 | 81147 | index 68b85e1..3368939 100644 |
79429 | --- a/scripts/kconfig/streamline_config.pl | 81148 | --- a/scripts/kconfig/streamline_config.pl |
diff --git a/recipes-kernel/linux/linux-yocto/xlnx_3.8/0002-microblaze-Dont-mark-arch_kgdb_ops-as-const.patch b/recipes-kernel/linux/linux-yocto/xlnx_3.8/0002-microblaze-Dont-mark-arch_kgdb_ops-as-const.patch deleted file mode 100644 index 53be2bf4..00000000 --- a/recipes-kernel/linux/linux-yocto/xlnx_3.8/0002-microblaze-Dont-mark-arch_kgdb_ops-as-const.patch +++ /dev/null | |||
@@ -1,35 +0,0 @@ | |||
1 | From fd2c402c79a9a73e5b2384f0897f3f95f599afdd Mon Sep 17 00:00:00 2001 | ||
2 | From: Graeme Smecher <gsmecher@threespeedlogic.com> | ||
3 | Date: Sat, 8 Jun 2013 09:52:08 -0700 | ||
4 | Subject: [PATCH] microblaze: Don't mark arch_kgdb_ops as const. | ||
5 | |||
6 | Other architectures don't do it, and it conflicts with the extern'd definition | ||
7 | in include/linux/kgdb.h. | ||
8 | |||
9 | The patch fails checkpatch but it reflects current | ||
10 | functions declaration and solved compilation error. | ||
11 | |||
12 | Signed-off-by: Graeme Smecher <gsmecher@threespeedlogic.com> | ||
13 | CC: Michal Simek <monstr@monstr.eu> | ||
14 | CC: linux-kernel@vger.kernel.org | ||
15 | Signed-off-by: Michal Simek <michal.simek@xilinx.com> | ||
16 | --- | ||
17 | arch/microblaze/kernel/kgdb.c | 2 +- | ||
18 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
19 | |||
20 | diff --git a/arch/microblaze/kernel/kgdb.c b/arch/microblaze/kernel/kgdb.c | ||
21 | index 8adc9244..09a5e82 100644 | ||
22 | --- a/arch/microblaze/kernel/kgdb.c | ||
23 | +++ b/arch/microblaze/kernel/kgdb.c | ||
24 | @@ -141,7 +141,7 @@ void kgdb_arch_exit(void) | ||
25 | /* | ||
26 | * Global data | ||
27 | */ | ||
28 | -const struct kgdb_arch arch_kgdb_ops = { | ||
29 | +struct kgdb_arch arch_kgdb_ops = { | ||
30 | #ifdef __MICROBLAZEEL__ | ||
31 | .gdb_bpt_instr = {0x18, 0x00, 0x0c, 0xba}, /* brki r16, 0x18 */ | ||
32 | #else | ||
33 | -- | ||
34 | 1.8.4 | ||
35 | |||
diff --git a/recipes-kernel/linux/linux-yocto/xlnx_3.8_modifications_to_v14.5.scc b/recipes-kernel/linux/linux-yocto/xlnx_3.8_modifications_to_v14.5.scc index 1f4a6e5b..fc1aca30 100644 --- a/recipes-kernel/linux/linux-yocto/xlnx_3.8_modifications_to_v14.5.scc +++ b/recipes-kernel/linux/linux-yocto/xlnx_3.8_modifications_to_v14.5.scc | |||
@@ -1,3 +1,2 @@ | |||
1 | patch xlnx_3.8/0001-Forward-code-to-match-xlnx_3.8-branch-on-linux_xlnx..patch | 1 | patch xlnx_3.8/0001-Forward-code-to-match-xlnx_3.8-branch-on-linux_xlnx..patch |
2 | patch xlnx_3.8/0002-microblaze-Dont-mark-arch_kgdb_ops-as-const.patch | ||
3 | 2 | ||