diff options
author | Grant Likely <grant.likely@secretlab.ca> | 2011-06-15 16:57:39 -0400 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2011-06-15 16:57:39 -0400 |
commit | 2bc7c85210d75b7a8a7326284b4f608a16f52ffc (patch) | |
tree | ca306d89f64ceeee92531cc0a9ba5d246d09f044 /arch | |
parent | 12610be33df5563d3f8cb141f231d4dc5b2a317f (diff) | |
parent | df2212270ce94f12e9caed6ca04c7077672d588e (diff) |
Merge branch 'gpio/next-tegra' into gpio/next
Conflicts:
drivers/gpio/Kconfig
drivers/gpio/Makefile
Diffstat (limited to 'arch')
134 files changed, 2002 insertions, 1545 deletions
diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index a6b3fb20877..b80d9670cdd 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c | |||
@@ -416,11 +416,15 @@ static struct resource ep93xx_eth_resource[] = { | |||
416 | } | 416 | } |
417 | }; | 417 | }; |
418 | 418 | ||
419 | static u64 ep93xx_eth_dma_mask = DMA_BIT_MASK(32); | ||
420 | |||
419 | static struct platform_device ep93xx_eth_device = { | 421 | static struct platform_device ep93xx_eth_device = { |
420 | .name = "ep93xx-eth", | 422 | .name = "ep93xx-eth", |
421 | .id = -1, | 423 | .id = -1, |
422 | .dev = { | 424 | .dev = { |
423 | .platform_data = &ep93xx_eth_data, | 425 | .platform_data = &ep93xx_eth_data, |
426 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
427 | .dma_mask = &ep93xx_eth_dma_mask, | ||
424 | }, | 428 | }, |
425 | .num_resources = ARRAY_SIZE(ep93xx_eth_resource), | 429 | .num_resources = ARRAY_SIZE(ep93xx_eth_resource), |
426 | .resource = ep93xx_eth_resource, | 430 | .resource = ep93xx_eth_resource, |
diff --git a/arch/arm/mach-exynos4/Kconfig b/arch/arm/mach-exynos4/Kconfig index b92c1e55714..1435fc31c4b 100644 --- a/arch/arm/mach-exynos4/Kconfig +++ b/arch/arm/mach-exynos4/Kconfig | |||
@@ -91,6 +91,11 @@ config EXYNOS4_SETUP_FIMC | |||
91 | help | 91 | help |
92 | Common setup code for the camera interfaces. | 92 | Common setup code for the camera interfaces. |
93 | 93 | ||
94 | config EXYNOS4_SETUP_USB_PHY | ||
95 | bool | ||
96 | help | ||
97 | Common setup code for USB PHY controller | ||
98 | |||
94 | # machine support | 99 | # machine support |
95 | 100 | ||
96 | menu "EXYNOS4 Machines" | 101 | menu "EXYNOS4 Machines" |
@@ -176,6 +181,7 @@ config MACH_NURI | |||
176 | select EXYNOS4_SETUP_I2C3 | 181 | select EXYNOS4_SETUP_I2C3 |
177 | select EXYNOS4_SETUP_I2C5 | 182 | select EXYNOS4_SETUP_I2C5 |
178 | select EXYNOS4_SETUP_SDHCI | 183 | select EXYNOS4_SETUP_SDHCI |
184 | select EXYNOS4_SETUP_USB_PHY | ||
179 | select SAMSUNG_DEV_PWM | 185 | select SAMSUNG_DEV_PWM |
180 | help | 186 | help |
181 | Machine support for Samsung Mobile NURI Board. | 187 | Machine support for Samsung Mobile NURI Board. |
diff --git a/arch/arm/mach-exynos4/Makefile b/arch/arm/mach-exynos4/Makefile index a9bb94fabaa..60fe5ecf359 100644 --- a/arch/arm/mach-exynos4/Makefile +++ b/arch/arm/mach-exynos4/Makefile | |||
@@ -56,4 +56,4 @@ obj-$(CONFIG_EXYNOS4_SETUP_KEYPAD) += setup-keypad.o | |||
56 | obj-$(CONFIG_EXYNOS4_SETUP_SDHCI) += setup-sdhci.o | 56 | obj-$(CONFIG_EXYNOS4_SETUP_SDHCI) += setup-sdhci.o |
57 | obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | 57 | obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o |
58 | 58 | ||
59 | obj-$(CONFIG_USB_SUPPORT) += usb-phy.o | 59 | obj-$(CONFIG_EXYNOS4_SETUP_USB_PHY) += setup-usb-phy.o |
diff --git a/arch/arm/mach-exynos4/cpu.c b/arch/arm/mach-exynos4/cpu.c index 08813a6f66b..9babe4473e8 100644 --- a/arch/arm/mach-exynos4/cpu.c +++ b/arch/arm/mach-exynos4/cpu.c | |||
@@ -98,7 +98,7 @@ static struct map_desc exynos4_iodesc[] __initdata = { | |||
98 | .length = SZ_4K, | 98 | .length = SZ_4K, |
99 | .type = MT_DEVICE, | 99 | .type = MT_DEVICE, |
100 | }, { | 100 | }, { |
101 | .virtual = (unsigned long)S5P_VA_USB_HSPHY, | 101 | .virtual = (unsigned long)S3C_VA_USB_HSPHY, |
102 | .pfn = __phys_to_pfn(EXYNOS4_PA_HSPHY), | 102 | .pfn = __phys_to_pfn(EXYNOS4_PA_HSPHY), |
103 | .length = SZ_4K, | 103 | .length = SZ_4K, |
104 | .type = MT_DEVICE, | 104 | .type = MT_DEVICE, |
diff --git a/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h b/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h index 703118d5173..c337cf3a71b 100644 --- a/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h +++ b/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h | |||
@@ -11,7 +11,7 @@ | |||
11 | #ifndef __PLAT_S5P_REGS_USB_PHY_H | 11 | #ifndef __PLAT_S5P_REGS_USB_PHY_H |
12 | #define __PLAT_S5P_REGS_USB_PHY_H | 12 | #define __PLAT_S5P_REGS_USB_PHY_H |
13 | 13 | ||
14 | #define EXYNOS4_HSOTG_PHYREG(x) ((x) + S5P_VA_USB_HSPHY) | 14 | #define EXYNOS4_HSOTG_PHYREG(x) ((x) + S3C_VA_USB_HSPHY) |
15 | 15 | ||
16 | #define EXYNOS4_PHYPWR EXYNOS4_HSOTG_PHYREG(0x00) | 16 | #define EXYNOS4_PHYPWR EXYNOS4_HSOTG_PHYREG(0x00) |
17 | #define PHY1_HSIC_NORMAL_MASK (0xf << 9) | 17 | #define PHY1_HSIC_NORMAL_MASK (0xf << 9) |
diff --git a/arch/arm/mach-exynos4/usb-phy.c b/arch/arm/mach-exynos4/setup-usb-phy.c index 0883c1b824b..0883c1b824b 100644 --- a/arch/arm/mach-exynos4/usb-phy.c +++ b/arch/arm/mach-exynos4/setup-usb-phy.c | |||
diff --git a/arch/arm/mach-exynos4/time.c b/arch/arm/mach-exynos4/time.c index 86b9fa0d363..ebb8f38d540 100644 --- a/arch/arm/mach-exynos4/time.c +++ b/arch/arm/mach-exynos4/time.c | |||
@@ -206,6 +206,7 @@ static cycle_t exynos4_pwm4_read(struct clocksource *cs) | |||
206 | return (cycle_t) ~__raw_readl(S3C_TIMERREG(0x40)); | 206 | return (cycle_t) ~__raw_readl(S3C_TIMERREG(0x40)); |
207 | } | 207 | } |
208 | 208 | ||
209 | #ifdef CONFIG_PM | ||
209 | static void exynos4_pwm4_resume(struct clocksource *cs) | 210 | static void exynos4_pwm4_resume(struct clocksource *cs) |
210 | { | 211 | { |
211 | unsigned long pclk; | 212 | unsigned long pclk; |
@@ -218,6 +219,7 @@ static void exynos4_pwm4_resume(struct clocksource *cs) | |||
218 | exynos4_pwm_init(4, ~0); | 219 | exynos4_pwm_init(4, ~0); |
219 | exynos4_pwm_start(4, 1); | 220 | exynos4_pwm_start(4, 1); |
220 | } | 221 | } |
222 | #endif | ||
221 | 223 | ||
222 | struct clocksource pwm_clocksource = { | 224 | struct clocksource pwm_clocksource = { |
223 | .name = "pwm_timer4", | 225 | .name = "pwm_timer4", |
diff --git a/arch/arm/mach-omap1/dma.c b/arch/arm/mach-omap1/dma.c index d8559344c6e..f5a52204b89 100644 --- a/arch/arm/mach-omap1/dma.c +++ b/arch/arm/mach-omap1/dma.c | |||
@@ -284,14 +284,15 @@ static int __init omap1_system_dma_init(void) | |||
284 | dma_base = ioremap(res[0].start, resource_size(&res[0])); | 284 | dma_base = ioremap(res[0].start, resource_size(&res[0])); |
285 | if (!dma_base) { | 285 | if (!dma_base) { |
286 | pr_err("%s: Unable to ioremap\n", __func__); | 286 | pr_err("%s: Unable to ioremap\n", __func__); |
287 | return -ENODEV; | 287 | ret = -ENODEV; |
288 | goto exit_device_put; | ||
288 | } | 289 | } |
289 | 290 | ||
290 | ret = platform_device_add_resources(pdev, res, ARRAY_SIZE(res)); | 291 | ret = platform_device_add_resources(pdev, res, ARRAY_SIZE(res)); |
291 | if (ret) { | 292 | if (ret) { |
292 | dev_err(&pdev->dev, "%s: Unable to add resources for %s%d\n", | 293 | dev_err(&pdev->dev, "%s: Unable to add resources for %s%d\n", |
293 | __func__, pdev->name, pdev->id); | 294 | __func__, pdev->name, pdev->id); |
294 | goto exit_device_del; | 295 | goto exit_device_put; |
295 | } | 296 | } |
296 | 297 | ||
297 | p = kzalloc(sizeof(struct omap_system_dma_plat_info), GFP_KERNEL); | 298 | p = kzalloc(sizeof(struct omap_system_dma_plat_info), GFP_KERNEL); |
@@ -299,7 +300,7 @@ static int __init omap1_system_dma_init(void) | |||
299 | dev_err(&pdev->dev, "%s: Unable to allocate 'p' for %s\n", | 300 | dev_err(&pdev->dev, "%s: Unable to allocate 'p' for %s\n", |
300 | __func__, pdev->name); | 301 | __func__, pdev->name); |
301 | ret = -ENOMEM; | 302 | ret = -ENOMEM; |
302 | goto exit_device_put; | 303 | goto exit_device_del; |
303 | } | 304 | } |
304 | 305 | ||
305 | d = kzalloc(sizeof(struct omap_dma_dev_attr), GFP_KERNEL); | 306 | d = kzalloc(sizeof(struct omap_dma_dev_attr), GFP_KERNEL); |
@@ -380,10 +381,10 @@ exit_release_d: | |||
380 | kfree(d); | 381 | kfree(d); |
381 | exit_release_p: | 382 | exit_release_p: |
382 | kfree(p); | 383 | kfree(p); |
383 | exit_device_put: | ||
384 | platform_device_put(pdev); | ||
385 | exit_device_del: | 384 | exit_device_del: |
386 | platform_device_del(pdev); | 385 | platform_device_del(pdev); |
386 | exit_device_put: | ||
387 | platform_device_put(pdev); | ||
387 | 388 | ||
388 | return ret; | 389 | return ret; |
389 | } | 390 | } |
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index d54969be0a5..5de6eac0a72 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c | |||
@@ -26,13 +26,13 @@ | |||
26 | #include <linux/err.h> | 26 | #include <linux/err.h> |
27 | #include <linux/clk.h> | 27 | #include <linux/clk.h> |
28 | #include <linux/io.h> | 28 | #include <linux/io.h> |
29 | #include <linux/gpio.h> | ||
29 | 30 | ||
30 | #include <mach/hardware.h> | 31 | #include <mach/hardware.h> |
31 | #include <asm/mach-types.h> | 32 | #include <asm/mach-types.h> |
32 | #include <asm/mach/arch.h> | 33 | #include <asm/mach/arch.h> |
33 | #include <asm/mach/map.h> | 34 | #include <asm/mach/map.h> |
34 | 35 | ||
35 | #include <mach/gpio.h> | ||
36 | #include <plat/board.h> | 36 | #include <plat/board.h> |
37 | #include <plat/common.h> | 37 | #include <plat/common.h> |
38 | #include <plat/gpmc.h> | 38 | #include <plat/gpmc.h> |
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index ae2963a9804..5dac974be62 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c | |||
@@ -622,19 +622,19 @@ static struct omap_device_pad serial3_pads[] __initdata = { | |||
622 | OMAP_MUX_MODE0), | 622 | OMAP_MUX_MODE0), |
623 | }; | 623 | }; |
624 | 624 | ||
625 | static struct omap_board_data serial1_data = { | 625 | static struct omap_board_data serial1_data __initdata = { |
626 | .id = 0, | 626 | .id = 0, |
627 | .pads = serial1_pads, | 627 | .pads = serial1_pads, |
628 | .pads_cnt = ARRAY_SIZE(serial1_pads), | 628 | .pads_cnt = ARRAY_SIZE(serial1_pads), |
629 | }; | 629 | }; |
630 | 630 | ||
631 | static struct omap_board_data serial2_data = { | 631 | static struct omap_board_data serial2_data __initdata = { |
632 | .id = 1, | 632 | .id = 1, |
633 | .pads = serial2_pads, | 633 | .pads = serial2_pads, |
634 | .pads_cnt = ARRAY_SIZE(serial2_pads), | 634 | .pads_cnt = ARRAY_SIZE(serial2_pads), |
635 | }; | 635 | }; |
636 | 636 | ||
637 | static struct omap_board_data serial3_data = { | 637 | static struct omap_board_data serial3_data __initdata = { |
638 | .id = 2, | 638 | .id = 2, |
639 | .pads = serial3_pads, | 639 | .pads = serial3_pads, |
640 | .pads_cnt = ARRAY_SIZE(serial3_pads), | 640 | .pads_cnt = ARRAY_SIZE(serial3_pads), |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 73fa90bb695..63de2d396e2 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
@@ -258,7 +258,7 @@ static struct gpio sdp4430_eth_gpios[] __initdata = { | |||
258 | { ETH_KS8851_IRQ, GPIOF_IN, "eth_irq" }, | 258 | { ETH_KS8851_IRQ, GPIOF_IN, "eth_irq" }, |
259 | }; | 259 | }; |
260 | 260 | ||
261 | static int omap_ethernet_init(void) | 261 | static int __init omap_ethernet_init(void) |
262 | { | 262 | { |
263 | int status; | 263 | int status; |
264 | 264 | ||
@@ -322,6 +322,7 @@ static struct omap2_hsmmc_info mmc[] = { | |||
322 | .gpio_wp = -EINVAL, | 322 | .gpio_wp = -EINVAL, |
323 | .nonremovable = true, | 323 | .nonremovable = true, |
324 | .ocr_mask = MMC_VDD_29_30, | 324 | .ocr_mask = MMC_VDD_29_30, |
325 | .no_off_init = true, | ||
325 | }, | 326 | }, |
326 | { | 327 | { |
327 | .mmc = 1, | 328 | .mmc = 1, |
@@ -681,19 +682,19 @@ static struct omap_device_pad serial4_pads[] __initdata = { | |||
681 | OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), | 682 | OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), |
682 | }; | 683 | }; |
683 | 684 | ||
684 | static struct omap_board_data serial2_data = { | 685 | static struct omap_board_data serial2_data __initdata = { |
685 | .id = 1, | 686 | .id = 1, |
686 | .pads = serial2_pads, | 687 | .pads = serial2_pads, |
687 | .pads_cnt = ARRAY_SIZE(serial2_pads), | 688 | .pads_cnt = ARRAY_SIZE(serial2_pads), |
688 | }; | 689 | }; |
689 | 690 | ||
690 | static struct omap_board_data serial3_data = { | 691 | static struct omap_board_data serial3_data __initdata = { |
691 | .id = 2, | 692 | .id = 2, |
692 | .pads = serial3_pads, | 693 | .pads = serial3_pads, |
693 | .pads_cnt = ARRAY_SIZE(serial3_pads), | 694 | .pads_cnt = ARRAY_SIZE(serial3_pads), |
694 | }; | 695 | }; |
695 | 696 | ||
696 | static struct omap_board_data serial4_data = { | 697 | static struct omap_board_data serial4_data __initdata = { |
697 | .id = 3, | 698 | .id = 3, |
698 | .pads = serial4_pads, | 699 | .pads = serial4_pads, |
699 | .pads_cnt = ARRAY_SIZE(serial4_pads), | 700 | .pads_cnt = ARRAY_SIZE(serial4_pads), |
@@ -729,7 +730,7 @@ static void __init omap_4430sdp_init(void) | |||
729 | 730 | ||
730 | if (omap_rev() == OMAP4430_REV_ES1_0) | 731 | if (omap_rev() == OMAP4430_REV_ES1_0) |
731 | package = OMAP_PACKAGE_CBL; | 732 | package = OMAP_PACKAGE_CBL; |
732 | omap4_mux_init(board_mux, package); | 733 | omap4_mux_init(board_mux, NULL, package); |
733 | 734 | ||
734 | omap_board_config = sdp4430_config; | 735 | omap_board_config = sdp4430_config; |
735 | omap_board_config_size = ARRAY_SIZE(sdp4430_config); | 736 | omap_board_config_size = ARRAY_SIZE(sdp4430_config); |
diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index f3beb8eeef7..b124bdfb423 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c | |||
@@ -27,13 +27,13 @@ | |||
27 | #include <linux/err.h> | 27 | #include <linux/err.h> |
28 | #include <linux/clk.h> | 28 | #include <linux/clk.h> |
29 | #include <linux/smc91x.h> | 29 | #include <linux/smc91x.h> |
30 | #include <linux/gpio.h> | ||
30 | 31 | ||
31 | #include <mach/hardware.h> | 32 | #include <mach/hardware.h> |
32 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
33 | #include <asm/mach/arch.h> | 34 | #include <asm/mach/arch.h> |
34 | #include <asm/mach/flash.h> | 35 | #include <asm/mach/flash.h> |
35 | 36 | ||
36 | #include <mach/gpio.h> | ||
37 | #include <plat/led.h> | 37 | #include <plat/led.h> |
38 | #include <plat/usb.h> | 38 | #include <plat/usb.h> |
39 | #include <plat/board.h> | 39 | #include <plat/board.h> |
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index c63115bc153..77456dec93e 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c | |||
@@ -63,8 +63,6 @@ | |||
63 | #define SB_T35_SMSC911X_CS 4 | 63 | #define SB_T35_SMSC911X_CS 4 |
64 | #define SB_T35_SMSC911X_GPIO 65 | 64 | #define SB_T35_SMSC911X_GPIO 65 |
65 | 65 | ||
66 | #define NAND_BLOCK_SIZE SZ_128K | ||
67 | |||
68 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) | 66 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) |
69 | #include <linux/smsc911x.h> | 67 | #include <linux/smsc911x.h> |
70 | #include <plat/gpmc-smsc911x.h> | 68 | #include <plat/gpmc-smsc911x.h> |
diff --git a/arch/arm/mach-omap2/board-cm-t3517.c b/arch/arm/mach-omap2/board-cm-t3517.c index 08f08e81249..c3a9fd35034 100644 --- a/arch/arm/mach-omap2/board-cm-t3517.c +++ b/arch/arm/mach-omap2/board-cm-t3517.c | |||
@@ -48,6 +48,7 @@ | |||
48 | 48 | ||
49 | #include "mux.h" | 49 | #include "mux.h" |
50 | #include "control.h" | 50 | #include "control.h" |
51 | #include "common-board-devices.h" | ||
51 | 52 | ||
52 | #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) | 53 | #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) |
53 | static struct gpio_led cm_t3517_leds[] = { | 54 | static struct gpio_led cm_t3517_leds[] = { |
@@ -177,7 +178,7 @@ static struct usbhs_omap_board_data cm_t3517_ehci_pdata __initdata = { | |||
177 | .reset_gpio_port[2] = -EINVAL, | 178 | .reset_gpio_port[2] = -EINVAL, |
178 | }; | 179 | }; |
179 | 180 | ||
180 | static int cm_t3517_init_usbh(void) | 181 | static int __init cm_t3517_init_usbh(void) |
181 | { | 182 | { |
182 | int err; | 183 | int err; |
183 | 184 | ||
@@ -203,8 +204,6 @@ static inline int cm_t3517_init_usbh(void) | |||
203 | #endif | 204 | #endif |
204 | 205 | ||
205 | #if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE) | 206 | #if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE) |
206 | #define NAND_BLOCK_SIZE SZ_128K | ||
207 | |||
208 | static struct mtd_partition cm_t3517_nand_partitions[] = { | 207 | static struct mtd_partition cm_t3517_nand_partitions[] = { |
209 | { | 208 | { |
210 | .name = "xloader", | 209 | .name = "xloader", |
diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c index cf520d7dd61..34956ec8329 100644 --- a/arch/arm/mach-omap2/board-devkit8000.c +++ b/arch/arm/mach-omap2/board-devkit8000.c | |||
@@ -61,8 +61,6 @@ | |||
61 | #include "timer-gp.h" | 61 | #include "timer-gp.h" |
62 | #include "common-board-devices.h" | 62 | #include "common-board-devices.h" |
63 | 63 | ||
64 | #define NAND_BLOCK_SIZE SZ_128K | ||
65 | |||
66 | #define OMAP_DM9000_GPIO_IRQ 25 | 64 | #define OMAP_DM9000_GPIO_IRQ 25 |
67 | #define OMAP3_DEVKIT_TS_GPIO 27 | 65 | #define OMAP3_DEVKIT_TS_GPIO 27 |
68 | 66 | ||
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index be71426359f..7f21d24bd43 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c | |||
@@ -54,8 +54,6 @@ | |||
54 | #include "pm.h" | 54 | #include "pm.h" |
55 | #include "common-board-devices.h" | 55 | #include "common-board-devices.h" |
56 | 56 | ||
57 | #define NAND_BLOCK_SIZE SZ_128K | ||
58 | |||
59 | /* | 57 | /* |
60 | * OMAP3 Beagle revision | 58 | * OMAP3 Beagle revision |
61 | * Run time detection of Beagle revision is done by reading GPIO. | 59 | * Run time detection of Beagle revision is done by reading GPIO. |
@@ -106,6 +104,9 @@ static void __init omap3_beagle_init_rev(void) | |||
106 | beagle_rev = gpio_get_value(171) | (gpio_get_value(172) << 1) | 104 | beagle_rev = gpio_get_value(171) | (gpio_get_value(172) << 1) |
107 | | (gpio_get_value(173) << 2); | 105 | | (gpio_get_value(173) << 2); |
108 | 106 | ||
107 | gpio_free_array(omap3_beagle_rev_gpios, | ||
108 | ARRAY_SIZE(omap3_beagle_rev_gpios)); | ||
109 | |||
109 | switch (beagle_rev) { | 110 | switch (beagle_rev) { |
110 | case 7: | 111 | case 7: |
111 | printk(KERN_INFO "OMAP3 Beagle Rev: Ax/Bx\n"); | 112 | printk(KERN_INFO "OMAP3 Beagle Rev: Ax/Bx\n"); |
@@ -579,6 +580,9 @@ static void __init omap3_beagle_init(void) | |||
579 | omap_nand_flash_init(NAND_BUSWIDTH_16, omap3beagle_nand_partitions, | 580 | omap_nand_flash_init(NAND_BUSWIDTH_16, omap3beagle_nand_partitions, |
580 | ARRAY_SIZE(omap3beagle_nand_partitions)); | 581 | ARRAY_SIZE(omap3beagle_nand_partitions)); |
581 | 582 | ||
583 | /* Ensure msecure is mux'd to be able to set the RTC. */ | ||
584 | omap_mux_init_signal("sys_drm_msecure", OMAP_PIN_OFF_OUTPUT_HIGH); | ||
585 | |||
582 | /* Ensure SDRC pins are mux'd for self-refresh */ | 586 | /* Ensure SDRC pins are mux'd for self-refresh */ |
583 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); | 587 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); |
584 | omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT); | 588 | omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT); |
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index 1d10736c6d3..2a0bb4818ca 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/leds.h> | 30 | #include <linux/leds.h> |
31 | #include <linux/input.h> | 31 | #include <linux/input.h> |
32 | #include <linux/input/matrix_keypad.h> | 32 | #include <linux/input/matrix_keypad.h> |
33 | #include <linux/gpio.h> | ||
33 | #include <linux/gpio_keys.h> | 34 | #include <linux/gpio_keys.h> |
34 | #include <linux/mmc/host.h> | 35 | #include <linux/mmc/host.h> |
35 | #include <linux/mmc/card.h> | 36 | #include <linux/mmc/card.h> |
@@ -41,7 +42,6 @@ | |||
41 | 42 | ||
42 | #include <plat/board.h> | 43 | #include <plat/board.h> |
43 | #include <plat/common.h> | 44 | #include <plat/common.h> |
44 | #include <mach/gpio.h> | ||
45 | #include <mach/hardware.h> | 45 | #include <mach/hardware.h> |
46 | #include <plat/mcspi.h> | 46 | #include <plat/mcspi.h> |
47 | #include <plat/usb.h> | 47 | #include <plat/usb.h> |
@@ -57,8 +57,6 @@ | |||
57 | #define PANDORA_WIFI_NRESET_GPIO 23 | 57 | #define PANDORA_WIFI_NRESET_GPIO 23 |
58 | #define OMAP3_PANDORA_TS_GPIO 94 | 58 | #define OMAP3_PANDORA_TS_GPIO 94 |
59 | 59 | ||
60 | #define NAND_BLOCK_SIZE SZ_128K | ||
61 | |||
62 | static struct mtd_partition omap3pandora_nand_partitions[] = { | 60 | static struct mtd_partition omap3pandora_nand_partitions[] = { |
63 | { | 61 | { |
64 | .name = "xloader", | 62 | .name = "xloader", |
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c index 82872d7d313..5f649faf737 100644 --- a/arch/arm/mach-omap2/board-omap3touchbook.c +++ b/arch/arm/mach-omap2/board-omap3touchbook.c | |||
@@ -56,8 +56,6 @@ | |||
56 | 56 | ||
57 | #include <asm/setup.h> | 57 | #include <asm/setup.h> |
58 | 58 | ||
59 | #define NAND_BLOCK_SIZE SZ_128K | ||
60 | |||
61 | #define OMAP3_AC_GPIO 136 | 59 | #define OMAP3_AC_GPIO 136 |
62 | #define OMAP3_TS_GPIO 162 | 60 | #define OMAP3_TS_GPIO 162 |
63 | #define TB_BL_PWM_TIMER 9 | 61 | #define TB_BL_PWM_TIMER 9 |
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 90485fced97..0cfe2005cb5 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
@@ -526,19 +526,19 @@ static struct omap_device_pad serial4_pads[] __initdata = { | |||
526 | OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), | 526 | OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), |
527 | }; | 527 | }; |
528 | 528 | ||
529 | static struct omap_board_data serial2_data = { | 529 | static struct omap_board_data serial2_data __initdata = { |
530 | .id = 1, | 530 | .id = 1, |
531 | .pads = serial2_pads, | 531 | .pads = serial2_pads, |
532 | .pads_cnt = ARRAY_SIZE(serial2_pads), | 532 | .pads_cnt = ARRAY_SIZE(serial2_pads), |
533 | }; | 533 | }; |
534 | 534 | ||
535 | static struct omap_board_data serial3_data = { | 535 | static struct omap_board_data serial3_data __initdata = { |
536 | .id = 2, | 536 | .id = 2, |
537 | .pads = serial3_pads, | 537 | .pads = serial3_pads, |
538 | .pads_cnt = ARRAY_SIZE(serial3_pads), | 538 | .pads_cnt = ARRAY_SIZE(serial3_pads), |
539 | }; | 539 | }; |
540 | 540 | ||
541 | static struct omap_board_data serial4_data = { | 541 | static struct omap_board_data serial4_data __initdata = { |
542 | .id = 3, | 542 | .id = 3, |
543 | .pads = serial4_pads, | 543 | .pads = serial4_pads, |
544 | .pads_cnt = ARRAY_SIZE(serial4_pads), | 544 | .pads_cnt = ARRAY_SIZE(serial4_pads), |
@@ -687,7 +687,7 @@ static void __init omap4_panda_init(void) | |||
687 | 687 | ||
688 | if (omap_rev() == OMAP4430_REV_ES1_0) | 688 | if (omap_rev() == OMAP4430_REV_ES1_0) |
689 | package = OMAP_PACKAGE_CBL; | 689 | package = OMAP_PACKAGE_CBL; |
690 | omap4_mux_init(board_mux, package); | 690 | omap4_mux_init(board_mux, NULL, package); |
691 | 691 | ||
692 | if (wl12xx_set_platform_data(&omap_panda_wlan_data)) | 692 | if (wl12xx_set_platform_data(&omap_panda_wlan_data)) |
693 | pr_err("error setting wl12xx data\n"); | 693 | pr_err("error setting wl12xx data\n"); |
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index 1555918e3ff..175e1ab2b04 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/err.h> | 24 | #include <linux/err.h> |
25 | #include <linux/init.h> | 25 | #include <linux/init.h> |
26 | #include <linux/io.h> | 26 | #include <linux/io.h> |
27 | #include <linux/gpio.h> | ||
27 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
28 | #include <linux/platform_device.h> | 29 | #include <linux/platform_device.h> |
29 | #include <linux/i2c/twl.h> | 30 | #include <linux/i2c/twl.h> |
@@ -45,7 +46,6 @@ | |||
45 | #include <plat/common.h> | 46 | #include <plat/common.h> |
46 | #include <video/omapdss.h> | 47 | #include <video/omapdss.h> |
47 | #include <video/omap-panel-generic-dpi.h> | 48 | #include <video/omap-panel-generic-dpi.h> |
48 | #include <mach/gpio.h> | ||
49 | #include <plat/gpmc.h> | 49 | #include <plat/gpmc.h> |
50 | #include <mach/hardware.h> | 50 | #include <mach/hardware.h> |
51 | #include <plat/nand.h> | 51 | #include <plat/nand.h> |
@@ -65,8 +65,6 @@ | |||
65 | #define OVERO_GPIO_USBH_CPEN 168 | 65 | #define OVERO_GPIO_USBH_CPEN 168 |
66 | #define OVERO_GPIO_USBH_NRESET 183 | 66 | #define OVERO_GPIO_USBH_NRESET 183 |
67 | 67 | ||
68 | #define NAND_BLOCK_SIZE SZ_128K | ||
69 | |||
70 | #define OVERO_SMSC911X_CS 5 | 68 | #define OVERO_SMSC911X_CS 5 |
71 | #define OVERO_SMSC911X_GPIO 176 | 69 | #define OVERO_SMSC911X_GPIO 176 |
72 | #define OVERO_SMSC911X2_CS 4 | 70 | #define OVERO_SMSC911X2_CS 4 |
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index f6247e71a19..990366726c5 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c | |||
@@ -488,6 +488,7 @@ static struct regulator_init_data rx51_vmmc2 = { | |||
488 | .name = "V28_A", | 488 | .name = "V28_A", |
489 | .min_uV = 2800000, | 489 | .min_uV = 2800000, |
490 | .max_uV = 3000000, | 490 | .max_uV = 3000000, |
491 | .always_on = true, /* due VIO leak to AIC34 VDDs */ | ||
491 | .apply_uV = true, | 492 | .apply_uV = true, |
492 | .valid_modes_mask = REGULATOR_MODE_NORMAL | 493 | .valid_modes_mask = REGULATOR_MODE_NORMAL |
493 | | REGULATOR_MODE_STANDBY, | 494 | | REGULATOR_MODE_STANDBY, |
@@ -582,7 +583,7 @@ static int rx51_twlgpio_setup(struct device *dev, unsigned gpio, unsigned n) | |||
582 | { | 583 | { |
583 | /* FIXME this gpio setup is just a placeholder for now */ | 584 | /* FIXME this gpio setup is just a placeholder for now */ |
584 | gpio_request_one(gpio + 6, GPIOF_OUT_INIT_LOW, "backlight_pwm"); | 585 | gpio_request_one(gpio + 6, GPIOF_OUT_INIT_LOW, "backlight_pwm"); |
585 | gpio_request_one(gpio + 7, GPIOF_OUT_INIT_HIGH, "speaker_en"); | 586 | gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "speaker_en"); |
586 | 587 | ||
587 | return 0; | 588 | return 0; |
588 | } | 589 | } |
diff --git a/arch/arm/mach-omap2/board-zoom-display.c b/arch/arm/mach-omap2/board-zoom-display.c index c7c6beb1ec2..d4683ba5f72 100644 --- a/arch/arm/mach-omap2/board-zoom-display.c +++ b/arch/arm/mach-omap2/board-zoom-display.c | |||
@@ -26,7 +26,7 @@ static struct gpio zoom_lcd_gpios[] __initdata = { | |||
26 | { LCD_PANEL_QVGA_GPIO, GPIOF_OUT_INIT_HIGH, "lcd qvga" }, | 26 | { LCD_PANEL_QVGA_GPIO, GPIOF_OUT_INIT_HIGH, "lcd qvga" }, |
27 | }; | 27 | }; |
28 | 28 | ||
29 | static void zoom_lcd_panel_init(void) | 29 | static void __init zoom_lcd_panel_init(void) |
30 | { | 30 | { |
31 | zoom_lcd_gpios[0].gpio = (omap_rev() > OMAP3430_REV_ES3_0) ? | 31 | zoom_lcd_gpios[0].gpio = (omap_rev() > OMAP3430_REV_ES3_0) ? |
32 | LCD_PANEL_RESET_GPIO_PROD : | 32 | LCD_PANEL_RESET_GPIO_PROD : |
diff --git a/arch/arm/mach-omap2/common-board-devices.c b/arch/arm/mach-omap2/common-board-devices.c index e94903b2c65..94ccf464677 100644 --- a/arch/arm/mach-omap2/common-board-devices.c +++ b/arch/arm/mach-omap2/common-board-devices.c | |||
@@ -85,17 +85,17 @@ void __init omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce, | |||
85 | struct spi_board_info *spi_bi = &ads7846_spi_board_info; | 85 | struct spi_board_info *spi_bi = &ads7846_spi_board_info; |
86 | int err; | 86 | int err; |
87 | 87 | ||
88 | err = gpio_request(gpio_pendown, "TS PenDown"); | 88 | if (board_pdata && board_pdata->get_pendown_state) { |
89 | if (err) { | 89 | err = gpio_request_one(gpio_pendown, GPIOF_IN, "TSPenDown"); |
90 | pr_err("Could not obtain gpio for TS PenDown: %d\n", err); | 90 | if (err) { |
91 | return; | 91 | pr_err("Couldn't obtain gpio for TSPenDown: %d\n", err); |
92 | } | 92 | return; |
93 | 93 | } | |
94 | gpio_direction_input(gpio_pendown); | 94 | gpio_export(gpio_pendown, 0); |
95 | gpio_export(gpio_pendown, 0); | ||
96 | 95 | ||
97 | if (gpio_debounce) | 96 | if (gpio_debounce) |
98 | gpio_set_debounce(gpio_pendown, gpio_debounce); | 97 | gpio_set_debounce(gpio_pendown, gpio_debounce); |
98 | } | ||
99 | 99 | ||
100 | ads7846_config.gpio_pendown = gpio_pendown; | 100 | ads7846_config.gpio_pendown = gpio_pendown; |
101 | 101 | ||
diff --git a/arch/arm/mach-omap2/common-board-devices.h b/arch/arm/mach-omap2/common-board-devices.h index eb80b3b0ef4..679719051df 100644 --- a/arch/arm/mach-omap2/common-board-devices.h +++ b/arch/arm/mach-omap2/common-board-devices.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __OMAP_COMMON_BOARD_DEVICES__ | 1 | #ifndef __OMAP_COMMON_BOARD_DEVICES__ |
2 | #define __OMAP_COMMON_BOARD_DEVICES__ | 2 | #define __OMAP_COMMON_BOARD_DEVICES__ |
3 | 3 | ||
4 | #define NAND_BLOCK_SIZE SZ_128K | ||
5 | |||
4 | struct twl4030_platform_data; | 6 | struct twl4030_platform_data; |
5 | struct mtd_partition; | 7 | struct mtd_partition; |
6 | 8 | ||
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 7b855856459..5b8ca680ed9 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c | |||
@@ -97,7 +97,7 @@ static int __init omap4_l3_init(void) | |||
97 | 97 | ||
98 | WARN(IS_ERR(od), "could not build omap_device for %s\n", oh_name); | 98 | WARN(IS_ERR(od), "could not build omap_device for %s\n", oh_name); |
99 | 99 | ||
100 | return PTR_ERR(od); | 100 | return IS_ERR(od) ? PTR_ERR(od) : 0; |
101 | } | 101 | } |
102 | postcore_initcall(omap4_l3_init); | 102 | postcore_initcall(omap4_l3_init); |
103 | 103 | ||
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index b2f30bed5a2..66868c5d5a2 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c | |||
@@ -145,6 +145,7 @@ static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot, | |||
145 | int power_on, int vdd) | 145 | int power_on, int vdd) |
146 | { | 146 | { |
147 | u32 reg; | 147 | u32 reg; |
148 | unsigned long timeout; | ||
148 | 149 | ||
149 | if (power_on) { | 150 | if (power_on) { |
150 | reg = omap4_ctrl_pad_readl(control_pbias_offset); | 151 | reg = omap4_ctrl_pad_readl(control_pbias_offset); |
@@ -157,9 +158,15 @@ static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot, | |||
157 | OMAP4_MMC1_PWRDNZ_MASK | | 158 | OMAP4_MMC1_PWRDNZ_MASK | |
158 | OMAP4_USBC1_ICUSB_PWRDNZ_MASK); | 159 | OMAP4_USBC1_ICUSB_PWRDNZ_MASK); |
159 | omap4_ctrl_pad_writel(reg, control_pbias_offset); | 160 | omap4_ctrl_pad_writel(reg, control_pbias_offset); |
160 | /* 4 microsec delay for comparator to generate an error*/ | 161 | |
161 | udelay(4); | 162 | timeout = jiffies + msecs_to_jiffies(5); |
162 | reg = omap4_ctrl_pad_readl(control_pbias_offset); | 163 | do { |
164 | reg = omap4_ctrl_pad_readl(control_pbias_offset); | ||
165 | if (!(reg & OMAP4_MMC1_PBIASLITE_VMODE_ERROR_MASK)) | ||
166 | break; | ||
167 | usleep_range(100, 200); | ||
168 | } while (!time_after(jiffies, timeout)); | ||
169 | |||
163 | if (reg & OMAP4_MMC1_PBIASLITE_VMODE_ERROR_MASK) { | 170 | if (reg & OMAP4_MMC1_PBIASLITE_VMODE_ERROR_MASK) { |
164 | pr_err("Pbias Voltage is not same as LDO\n"); | 171 | pr_err("Pbias Voltage is not same as LDO\n"); |
165 | /* Caution : On VMODE_ERROR Power Down MMC IO */ | 172 | /* Caution : On VMODE_ERROR Power Down MMC IO */ |
@@ -331,6 +338,9 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, | |||
331 | if (c->no_off) | 338 | if (c->no_off) |
332 | mmc->slots[0].no_off = 1; | 339 | mmc->slots[0].no_off = 1; |
333 | 340 | ||
341 | if (c->no_off_init) | ||
342 | mmc->slots[0].no_regulator_off_init = c->no_off_init; | ||
343 | |||
334 | if (c->vcc_aux_disable_is_sleep) | 344 | if (c->vcc_aux_disable_is_sleep) |
335 | mmc->slots[0].vcc_aux_disable_is_sleep = 1; | 345 | mmc->slots[0].vcc_aux_disable_is_sleep = 1; |
336 | 346 | ||
diff --git a/arch/arm/mach-omap2/hsmmc.h b/arch/arm/mach-omap2/hsmmc.h index f119348827d..f757e78d4d4 100644 --- a/arch/arm/mach-omap2/hsmmc.h +++ b/arch/arm/mach-omap2/hsmmc.h | |||
@@ -18,6 +18,7 @@ struct omap2_hsmmc_info { | |||
18 | bool nonremovable; /* Nonremovable e.g. eMMC */ | 18 | bool nonremovable; /* Nonremovable e.g. eMMC */ |
19 | bool power_saving; /* Try to sleep or power off when possible */ | 19 | bool power_saving; /* Try to sleep or power off when possible */ |
20 | bool no_off; /* power_saving and power is not to go off */ | 20 | bool no_off; /* power_saving and power is not to go off */ |
21 | bool no_off_init; /* no power off when not in MMC sleep state */ | ||
21 | bool vcc_aux_disable_is_sleep; /* Regulator off remapped to sleep */ | 22 | bool vcc_aux_disable_is_sleep; /* Regulator off remapped to sleep */ |
22 | int gpio_cd; /* or -EINVAL */ | 23 | int gpio_cd; /* or -EINVAL */ |
23 | int gpio_wp; /* or -EINVAL */ | 24 | int gpio_wp; /* or -EINVAL */ |
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index a4ab1e36431..c7fb22abc21 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c | |||
@@ -83,6 +83,9 @@ void omap_mux_write(struct omap_mux_partition *partition, u16 val, | |||
83 | void omap_mux_write_array(struct omap_mux_partition *partition, | 83 | void omap_mux_write_array(struct omap_mux_partition *partition, |
84 | struct omap_board_mux *board_mux) | 84 | struct omap_board_mux *board_mux) |
85 | { | 85 | { |
86 | if (!board_mux) | ||
87 | return; | ||
88 | |||
86 | while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) { | 89 | while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) { |
87 | omap_mux_write(partition, board_mux->value, | 90 | omap_mux_write(partition, board_mux->value, |
88 | board_mux->reg_offset); | 91 | board_mux->reg_offset); |
@@ -906,7 +909,7 @@ static struct omap_mux *omap_mux_get_by_gpio( | |||
906 | u16 omap_mux_get_gpio(int gpio) | 909 | u16 omap_mux_get_gpio(int gpio) |
907 | { | 910 | { |
908 | struct omap_mux_partition *partition; | 911 | struct omap_mux_partition *partition; |
909 | struct omap_mux *m; | 912 | struct omap_mux *m = NULL; |
910 | 913 | ||
911 | list_for_each_entry(partition, &mux_partitions, node) { | 914 | list_for_each_entry(partition, &mux_partitions, node) { |
912 | m = omap_mux_get_by_gpio(partition, gpio); | 915 | m = omap_mux_get_by_gpio(partition, gpio); |
diff --git a/arch/arm/mach-omap2/mux.h b/arch/arm/mach-omap2/mux.h index 137f321c029..2132308ad1e 100644 --- a/arch/arm/mach-omap2/mux.h +++ b/arch/arm/mach-omap2/mux.h | |||
@@ -323,10 +323,12 @@ int omap3_mux_init(struct omap_board_mux *board_mux, int flags); | |||
323 | 323 | ||
324 | /** | 324 | /** |
325 | * omap4_mux_init() - initialize mux system with board specific set | 325 | * omap4_mux_init() - initialize mux system with board specific set |
326 | * @board_mux: Board specific mux table | 326 | * @board_subset: Board specific mux table |
327 | * @board_wkup_subset: Board specific mux table for wakeup instance | ||
327 | * @flags: OMAP package type used for the board | 328 | * @flags: OMAP package type used for the board |
328 | */ | 329 | */ |
329 | int omap4_mux_init(struct omap_board_mux *board_mux, int flags); | 330 | int omap4_mux_init(struct omap_board_mux *board_subset, |
331 | struct omap_board_mux *board_wkup_subset, int flags); | ||
330 | 332 | ||
331 | /** | 333 | /** |
332 | * omap_mux_init - private mux init function, do not call | 334 | * omap_mux_init - private mux init function, do not call |
diff --git a/arch/arm/mach-omap2/mux44xx.c b/arch/arm/mach-omap2/mux44xx.c index 9a66445112a..f5a74daab2f 100644 --- a/arch/arm/mach-omap2/mux44xx.c +++ b/arch/arm/mach-omap2/mux44xx.c | |||
@@ -1309,7 +1309,8 @@ static struct omap_ball __initdata omap4_wkup_cbl_cbs_ball[] = { | |||
1309 | #define omap4_wkup_cbl_cbs_ball NULL | 1309 | #define omap4_wkup_cbl_cbs_ball NULL |
1310 | #endif | 1310 | #endif |
1311 | 1311 | ||
1312 | int __init omap4_mux_init(struct omap_board_mux *board_subset, int flags) | 1312 | int __init omap4_mux_init(struct omap_board_mux *board_subset, |
1313 | struct omap_board_mux *board_wkup_subset, int flags) | ||
1313 | { | 1314 | { |
1314 | struct omap_ball *package_balls_core; | 1315 | struct omap_ball *package_balls_core; |
1315 | struct omap_ball *package_balls_wkup = omap4_wkup_cbl_cbs_ball; | 1316 | struct omap_ball *package_balls_wkup = omap4_wkup_cbl_cbs_ball; |
@@ -1347,7 +1348,7 @@ int __init omap4_mux_init(struct omap_board_mux *board_subset, int flags) | |||
1347 | OMAP_MUX_GPIO_IN_MODE3, | 1348 | OMAP_MUX_GPIO_IN_MODE3, |
1348 | OMAP4_CTRL_MODULE_PAD_WKUP_MUX_PBASE, | 1349 | OMAP4_CTRL_MODULE_PAD_WKUP_MUX_PBASE, |
1349 | OMAP4_CTRL_MODULE_PAD_WKUP_MUX_SIZE, | 1350 | OMAP4_CTRL_MODULE_PAD_WKUP_MUX_SIZE, |
1350 | omap4_wkup_muxmodes, NULL, board_subset, | 1351 | omap4_wkup_muxmodes, NULL, board_wkup_subset, |
1351 | package_balls_wkup); | 1352 | package_balls_wkup); |
1352 | 1353 | ||
1353 | return ret; | 1354 | return ret; |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index e03429453ce..293fa6cd50e 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -1628,7 +1628,7 @@ int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data), | |||
1628 | void *data) | 1628 | void *data) |
1629 | { | 1629 | { |
1630 | struct omap_hwmod *temp_oh; | 1630 | struct omap_hwmod *temp_oh; |
1631 | int ret; | 1631 | int ret = 0; |
1632 | 1632 | ||
1633 | if (!fn) | 1633 | if (!fn) |
1634 | return -EINVAL; | 1634 | return -EINVAL; |
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index abc548a0c98..e1c69ffe0f6 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
@@ -5109,7 +5109,7 @@ static __initdata struct omap_hwmod *omap44xx_hwmods[] = { | |||
5109 | &omap44xx_iva_seq1_hwmod, | 5109 | &omap44xx_iva_seq1_hwmod, |
5110 | 5110 | ||
5111 | /* kbd class */ | 5111 | /* kbd class */ |
5112 | /* &omap44xx_kbd_hwmod, */ | 5112 | &omap44xx_kbd_hwmod, |
5113 | 5113 | ||
5114 | /* mailbox class */ | 5114 | /* mailbox class */ |
5115 | &omap44xx_mailbox_hwmod, | 5115 | &omap44xx_mailbox_hwmod, |
diff --git a/arch/arm/mach-omap2/omap_phy_internal.c b/arch/arm/mach-omap2/omap_phy_internal.c index f47813edd95..58775e3c847 100644 --- a/arch/arm/mach-omap2/omap_phy_internal.c +++ b/arch/arm/mach-omap2/omap_phy_internal.c | |||
@@ -56,8 +56,10 @@ int omap4430_phy_init(struct device *dev) | |||
56 | /* Power down the phy */ | 56 | /* Power down the phy */ |
57 | __raw_writel(PHY_PD, ctrl_base + CONTROL_DEV_CONF); | 57 | __raw_writel(PHY_PD, ctrl_base + CONTROL_DEV_CONF); |
58 | 58 | ||
59 | if (!dev) | 59 | if (!dev) { |
60 | iounmap(ctrl_base); | ||
60 | return 0; | 61 | return 0; |
62 | } | ||
61 | 63 | ||
62 | phyclk = clk_get(dev, "ocp2scp_usb_phy_ick"); | 64 | phyclk = clk_get(dev, "ocp2scp_usb_phy_ick"); |
63 | if (IS_ERR(phyclk)) { | 65 | if (IS_ERR(phyclk)) { |
diff --git a/arch/arm/mach-s3c2410/Makefile b/arch/arm/mach-s3c2410/Makefile index 0d468e96e83..81695353d8f 100644 --- a/arch/arm/mach-s3c2410/Makefile +++ b/arch/arm/mach-s3c2410/Makefile | |||
@@ -10,7 +10,6 @@ obj-n := | |||
10 | obj- := | 10 | obj- := |
11 | 11 | ||
12 | obj-$(CONFIG_CPU_S3C2410) += s3c2410.o | 12 | obj-$(CONFIG_CPU_S3C2410) += s3c2410.o |
13 | obj-$(CONFIG_CPU_S3C2410) += irq.o | ||
14 | obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o | 13 | obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o |
15 | obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o | 14 | obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o |
16 | obj-$(CONFIG_S3C2410_PM) += pm.o sleep.o | 15 | obj-$(CONFIG_S3C2410_PM) += pm.o sleep.o |
diff --git a/arch/arm/mach-s3c2410/irq.c b/arch/arm/mach-s3c2410/irq.c deleted file mode 100644 index 2854129f8cc..00000000000 --- a/arch/arm/mach-s3c2410/irq.c +++ /dev/null | |||
@@ -1,34 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c2410/irq.c | ||
2 | * | ||
3 | * Copyright (c) 2006 Simtec Electronics | ||
4 | * Ben Dooks <ben@simtec.co.uk> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #include <linux/init.h> | ||
23 | #include <linux/module.h> | ||
24 | #include <linux/interrupt.h> | ||
25 | #include <linux/ioport.h> | ||
26 | #include <linux/syscore_ops.h> | ||
27 | |||
28 | #include <plat/cpu.h> | ||
29 | #include <plat/pm.h> | ||
30 | |||
31 | struct syscore_ops s3c24xx_irq_syscore_ops = { | ||
32 | .suspend = s3c24xx_irq_suspend, | ||
33 | .resume = s3c24xx_irq_resume, | ||
34 | }; | ||
diff --git a/arch/arm/mach-s5pv210/cpufreq.c b/arch/arm/mach-s5pv210/cpufreq.c index 22046e2f53c..153af8b359e 100644 --- a/arch/arm/mach-s5pv210/cpufreq.c +++ b/arch/arm/mach-s5pv210/cpufreq.c | |||
@@ -101,12 +101,14 @@ static void s5pv210_set_refresh(enum s5pv210_dmc_port ch, unsigned long freq) | |||
101 | unsigned long tmp, tmp1; | 101 | unsigned long tmp, tmp1; |
102 | void __iomem *reg = NULL; | 102 | void __iomem *reg = NULL; |
103 | 103 | ||
104 | if (ch == DMC0) | 104 | if (ch == DMC0) { |
105 | reg = (S5P_VA_DMC0 + 0x30); | 105 | reg = (S5P_VA_DMC0 + 0x30); |
106 | else if (ch == DMC1) | 106 | } else if (ch == DMC1) { |
107 | reg = (S5P_VA_DMC1 + 0x30); | 107 | reg = (S5P_VA_DMC1 + 0x30); |
108 | else | 108 | } else { |
109 | printk(KERN_ERR "Cannot find DMC port\n"); | 109 | printk(KERN_ERR "Cannot find DMC port\n"); |
110 | return; | ||
111 | } | ||
110 | 112 | ||
111 | /* Find current DRAM frequency */ | 113 | /* Find current DRAM frequency */ |
112 | tmp = s5pv210_dram_conf[ch].freq; | 114 | tmp = s5pv210_dram_conf[ch].freq; |
diff --git a/arch/arm/mach-tegra/Makefile b/arch/arm/mach-tegra/Makefile index 823c703e573..ed58ef9019b 100644 --- a/arch/arm/mach-tegra/Makefile +++ b/arch/arm/mach-tegra/Makefile | |||
@@ -4,7 +4,6 @@ obj-y += io.o | |||
4 | obj-y += irq.o | 4 | obj-y += irq.o |
5 | obj-y += clock.o | 5 | obj-y += clock.o |
6 | obj-y += timer.o | 6 | obj-y += timer.o |
7 | obj-y += gpio.o | ||
8 | obj-y += pinmux.o | 7 | obj-y += pinmux.o |
9 | obj-y += powergate.o | 8 | obj-y += powergate.o |
10 | obj-y += fuse.o | 9 | obj-y += fuse.o |
diff --git a/arch/arm/mach-tegra/gpio.c b/arch/arm/mach-tegra/gpio.c deleted file mode 100644 index 919d6383773..00000000000 --- a/arch/arm/mach-tegra/gpio.c +++ /dev/null | |||
@@ -1,431 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-tegra/gpio.c | ||
3 | * | ||
4 | * Copyright (c) 2010 Google, Inc | ||
5 | * | ||
6 | * Author: | ||
7 | * Erik Gilling <konkers@google.com> | ||
8 | * | ||
9 | * This software is licensed under the terms of the GNU General Public | ||
10 | * License version 2, as published by the Free Software Foundation, and | ||
11 | * may be copied, distributed, and modified under those terms. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | */ | ||
19 | |||
20 | #include <linux/init.h> | ||
21 | #include <linux/irq.h> | ||
22 | #include <linux/interrupt.h> | ||
23 | |||
24 | #include <linux/io.h> | ||
25 | #include <linux/gpio.h> | ||
26 | |||
27 | #include <asm/mach/irq.h> | ||
28 | |||
29 | #include <mach/iomap.h> | ||
30 | #include <mach/suspend.h> | ||
31 | |||
32 | #define GPIO_BANK(x) ((x) >> 5) | ||
33 | #define GPIO_PORT(x) (((x) >> 3) & 0x3) | ||
34 | #define GPIO_BIT(x) ((x) & 0x7) | ||
35 | |||
36 | #define GPIO_REG(x) (IO_TO_VIRT(TEGRA_GPIO_BASE) + \ | ||
37 | GPIO_BANK(x) * 0x80 + \ | ||
38 | GPIO_PORT(x) * 4) | ||
39 | |||
40 | #define GPIO_CNF(x) (GPIO_REG(x) + 0x00) | ||
41 | #define GPIO_OE(x) (GPIO_REG(x) + 0x10) | ||
42 | #define GPIO_OUT(x) (GPIO_REG(x) + 0X20) | ||
43 | #define GPIO_IN(x) (GPIO_REG(x) + 0x30) | ||
44 | #define GPIO_INT_STA(x) (GPIO_REG(x) + 0x40) | ||
45 | #define GPIO_INT_ENB(x) (GPIO_REG(x) + 0x50) | ||
46 | #define GPIO_INT_LVL(x) (GPIO_REG(x) + 0x60) | ||
47 | #define GPIO_INT_CLR(x) (GPIO_REG(x) + 0x70) | ||
48 | |||
49 | #define GPIO_MSK_CNF(x) (GPIO_REG(x) + 0x800) | ||
50 | #define GPIO_MSK_OE(x) (GPIO_REG(x) + 0x810) | ||
51 | #define GPIO_MSK_OUT(x) (GPIO_REG(x) + 0X820) | ||
52 | #define GPIO_MSK_INT_STA(x) (GPIO_REG(x) + 0x840) | ||
53 | #define GPIO_MSK_INT_ENB(x) (GPIO_REG(x) + 0x850) | ||
54 | #define GPIO_MSK_INT_LVL(x) (GPIO_REG(x) + 0x860) | ||
55 | |||
56 | #define GPIO_INT_LVL_MASK 0x010101 | ||
57 | #define GPIO_INT_LVL_EDGE_RISING 0x000101 | ||
58 | #define GPIO_INT_LVL_EDGE_FALLING 0x000100 | ||
59 | #define GPIO_INT_LVL_EDGE_BOTH 0x010100 | ||
60 | #define GPIO_INT_LVL_LEVEL_HIGH 0x000001 | ||
61 | #define GPIO_INT_LVL_LEVEL_LOW 0x000000 | ||
62 | |||
63 | struct tegra_gpio_bank { | ||
64 | int bank; | ||
65 | int irq; | ||
66 | spinlock_t lvl_lock[4]; | ||
67 | #ifdef CONFIG_PM | ||
68 | u32 cnf[4]; | ||
69 | u32 out[4]; | ||
70 | u32 oe[4]; | ||
71 | u32 int_enb[4]; | ||
72 | u32 int_lvl[4]; | ||
73 | #endif | ||
74 | }; | ||
75 | |||
76 | |||
77 | static struct tegra_gpio_bank tegra_gpio_banks[] = { | ||
78 | {.bank = 0, .irq = INT_GPIO1}, | ||
79 | {.bank = 1, .irq = INT_GPIO2}, | ||
80 | {.bank = 2, .irq = INT_GPIO3}, | ||
81 | {.bank = 3, .irq = INT_GPIO4}, | ||
82 | {.bank = 4, .irq = INT_GPIO5}, | ||
83 | {.bank = 5, .irq = INT_GPIO6}, | ||
84 | {.bank = 6, .irq = INT_GPIO7}, | ||
85 | }; | ||
86 | |||
87 | static int tegra_gpio_compose(int bank, int port, int bit) | ||
88 | { | ||
89 | return (bank << 5) | ((port & 0x3) << 3) | (bit & 0x7); | ||
90 | } | ||
91 | |||
92 | static void tegra_gpio_mask_write(u32 reg, int gpio, int value) | ||
93 | { | ||
94 | u32 val; | ||
95 | |||
96 | val = 0x100 << GPIO_BIT(gpio); | ||
97 | if (value) | ||
98 | val |= 1 << GPIO_BIT(gpio); | ||
99 | __raw_writel(val, reg); | ||
100 | } | ||
101 | |||
102 | void tegra_gpio_enable(int gpio) | ||
103 | { | ||
104 | tegra_gpio_mask_write(GPIO_MSK_CNF(gpio), gpio, 1); | ||
105 | } | ||
106 | |||
107 | void tegra_gpio_disable(int gpio) | ||
108 | { | ||
109 | tegra_gpio_mask_write(GPIO_MSK_CNF(gpio), gpio, 0); | ||
110 | } | ||
111 | |||
112 | static void tegra_gpio_set(struct gpio_chip *chip, unsigned offset, int value) | ||
113 | { | ||
114 | tegra_gpio_mask_write(GPIO_MSK_OUT(offset), offset, value); | ||
115 | } | ||
116 | |||
117 | static int tegra_gpio_get(struct gpio_chip *chip, unsigned offset) | ||
118 | { | ||
119 | return (__raw_readl(GPIO_IN(offset)) >> GPIO_BIT(offset)) & 0x1; | ||
120 | } | ||
121 | |||
122 | static int tegra_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | ||
123 | { | ||
124 | tegra_gpio_mask_write(GPIO_MSK_OE(offset), offset, 0); | ||
125 | return 0; | ||
126 | } | ||
127 | |||
128 | static int tegra_gpio_direction_output(struct gpio_chip *chip, unsigned offset, | ||
129 | int value) | ||
130 | { | ||
131 | tegra_gpio_set(chip, offset, value); | ||
132 | tegra_gpio_mask_write(GPIO_MSK_OE(offset), offset, 1); | ||
133 | return 0; | ||
134 | } | ||
135 | |||
136 | |||
137 | |||
138 | static struct gpio_chip tegra_gpio_chip = { | ||
139 | .label = "tegra-gpio", | ||
140 | .direction_input = tegra_gpio_direction_input, | ||
141 | .get = tegra_gpio_get, | ||
142 | .direction_output = tegra_gpio_direction_output, | ||
143 | .set = tegra_gpio_set, | ||
144 | .base = 0, | ||
145 | .ngpio = TEGRA_NR_GPIOS, | ||
146 | }; | ||
147 | |||
148 | static void tegra_gpio_irq_ack(struct irq_data *d) | ||
149 | { | ||
150 | int gpio = d->irq - INT_GPIO_BASE; | ||
151 | |||
152 | __raw_writel(1 << GPIO_BIT(gpio), GPIO_INT_CLR(gpio)); | ||
153 | } | ||
154 | |||
155 | static void tegra_gpio_irq_mask(struct irq_data *d) | ||
156 | { | ||
157 | int gpio = d->irq - INT_GPIO_BASE; | ||
158 | |||
159 | tegra_gpio_mask_write(GPIO_MSK_INT_ENB(gpio), gpio, 0); | ||
160 | } | ||
161 | |||
162 | static void tegra_gpio_irq_unmask(struct irq_data *d) | ||
163 | { | ||
164 | int gpio = d->irq - INT_GPIO_BASE; | ||
165 | |||
166 | tegra_gpio_mask_write(GPIO_MSK_INT_ENB(gpio), gpio, 1); | ||
167 | } | ||
168 | |||
169 | static int tegra_gpio_irq_set_type(struct irq_data *d, unsigned int type) | ||
170 | { | ||
171 | int gpio = d->irq - INT_GPIO_BASE; | ||
172 | struct tegra_gpio_bank *bank = irq_data_get_irq_chip_data(d); | ||
173 | int port = GPIO_PORT(gpio); | ||
174 | int lvl_type; | ||
175 | int val; | ||
176 | unsigned long flags; | ||
177 | |||
178 | switch (type & IRQ_TYPE_SENSE_MASK) { | ||
179 | case IRQ_TYPE_EDGE_RISING: | ||
180 | lvl_type = GPIO_INT_LVL_EDGE_RISING; | ||
181 | break; | ||
182 | |||
183 | case IRQ_TYPE_EDGE_FALLING: | ||
184 | lvl_type = GPIO_INT_LVL_EDGE_FALLING; | ||
185 | break; | ||
186 | |||
187 | case IRQ_TYPE_EDGE_BOTH: | ||
188 | lvl_type = GPIO_INT_LVL_EDGE_BOTH; | ||
189 | break; | ||
190 | |||
191 | case IRQ_TYPE_LEVEL_HIGH: | ||
192 | lvl_type = GPIO_INT_LVL_LEVEL_HIGH; | ||
193 | break; | ||
194 | |||
195 | case IRQ_TYPE_LEVEL_LOW: | ||
196 | lvl_type = GPIO_INT_LVL_LEVEL_LOW; | ||
197 | break; | ||
198 | |||
199 | default: | ||
200 | return -EINVAL; | ||
201 | } | ||
202 | |||
203 | spin_lock_irqsave(&bank->lvl_lock[port], flags); | ||
204 | |||
205 | val = __raw_readl(GPIO_INT_LVL(gpio)); | ||
206 | val &= ~(GPIO_INT_LVL_MASK << GPIO_BIT(gpio)); | ||
207 | val |= lvl_type << GPIO_BIT(gpio); | ||
208 | __raw_writel(val, GPIO_INT_LVL(gpio)); | ||
209 | |||
210 | spin_unlock_irqrestore(&bank->lvl_lock[port], flags); | ||
211 | |||
212 | if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) | ||
213 | __irq_set_handler_locked(d->irq, handle_level_irq); | ||
214 | else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) | ||
215 | __irq_set_handler_locked(d->irq, handle_edge_irq); | ||
216 | |||
217 | return 0; | ||
218 | } | ||
219 | |||
220 | static void tegra_gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | ||
221 | { | ||
222 | struct tegra_gpio_bank *bank; | ||
223 | int port; | ||
224 | int pin; | ||
225 | int unmasked = 0; | ||
226 | struct irq_chip *chip = irq_desc_get_chip(desc); | ||
227 | |||
228 | chained_irq_enter(chip, desc); | ||
229 | |||
230 | bank = irq_get_handler_data(irq); | ||
231 | |||
232 | for (port = 0; port < 4; port++) { | ||
233 | int gpio = tegra_gpio_compose(bank->bank, port, 0); | ||
234 | unsigned long sta = __raw_readl(GPIO_INT_STA(gpio)) & | ||
235 | __raw_readl(GPIO_INT_ENB(gpio)); | ||
236 | u32 lvl = __raw_readl(GPIO_INT_LVL(gpio)); | ||
237 | |||
238 | for_each_set_bit(pin, &sta, 8) { | ||
239 | __raw_writel(1 << pin, GPIO_INT_CLR(gpio)); | ||
240 | |||
241 | /* if gpio is edge triggered, clear condition | ||
242 | * before executing the hander so that we don't | ||
243 | * miss edges | ||
244 | */ | ||
245 | if (lvl & (0x100 << pin)) { | ||
246 | unmasked = 1; | ||
247 | chained_irq_exit(chip, desc); | ||
248 | } | ||
249 | |||
250 | generic_handle_irq(gpio_to_irq(gpio + pin)); | ||
251 | } | ||
252 | } | ||
253 | |||
254 | if (!unmasked) | ||
255 | chained_irq_exit(chip, desc); | ||
256 | |||
257 | } | ||
258 | |||
259 | #ifdef CONFIG_PM | ||
260 | void tegra_gpio_resume(void) | ||
261 | { | ||
262 | unsigned long flags; | ||
263 | int b; | ||
264 | int p; | ||
265 | |||
266 | local_irq_save(flags); | ||
267 | |||
268 | for (b = 0; b < ARRAY_SIZE(tegra_gpio_banks); b++) { | ||
269 | struct tegra_gpio_bank *bank = &tegra_gpio_banks[b]; | ||
270 | |||
271 | for (p = 0; p < ARRAY_SIZE(bank->oe); p++) { | ||
272 | unsigned int gpio = (b<<5) | (p<<3); | ||
273 | __raw_writel(bank->cnf[p], GPIO_CNF(gpio)); | ||
274 | __raw_writel(bank->out[p], GPIO_OUT(gpio)); | ||
275 | __raw_writel(bank->oe[p], GPIO_OE(gpio)); | ||
276 | __raw_writel(bank->int_lvl[p], GPIO_INT_LVL(gpio)); | ||
277 | __raw_writel(bank->int_enb[p], GPIO_INT_ENB(gpio)); | ||
278 | } | ||
279 | } | ||
280 | |||
281 | local_irq_restore(flags); | ||
282 | } | ||
283 | |||
284 | void tegra_gpio_suspend(void) | ||
285 | { | ||
286 | unsigned long flags; | ||
287 | int b; | ||
288 | int p; | ||
289 | |||
290 | local_irq_save(flags); | ||
291 | for (b = 0; b < ARRAY_SIZE(tegra_gpio_banks); b++) { | ||
292 | struct tegra_gpio_bank *bank = &tegra_gpio_banks[b]; | ||
293 | |||
294 | for (p = 0; p < ARRAY_SIZE(bank->oe); p++) { | ||
295 | unsigned int gpio = (b<<5) | (p<<3); | ||
296 | bank->cnf[p] = __raw_readl(GPIO_CNF(gpio)); | ||
297 | bank->out[p] = __raw_readl(GPIO_OUT(gpio)); | ||
298 | bank->oe[p] = __raw_readl(GPIO_OE(gpio)); | ||
299 | bank->int_enb[p] = __raw_readl(GPIO_INT_ENB(gpio)); | ||
300 | bank->int_lvl[p] = __raw_readl(GPIO_INT_LVL(gpio)); | ||
301 | } | ||
302 | } | ||
303 | local_irq_restore(flags); | ||
304 | } | ||
305 | |||
306 | static int tegra_gpio_wake_enable(struct irq_data *d, unsigned int enable) | ||
307 | { | ||
308 | struct tegra_gpio_bank *bank = irq_data_get_irq_chip_data(d); | ||
309 | return irq_set_irq_wake(bank->irq, enable); | ||
310 | } | ||
311 | #endif | ||
312 | |||
313 | static struct irq_chip tegra_gpio_irq_chip = { | ||
314 | .name = "GPIO", | ||
315 | .irq_ack = tegra_gpio_irq_ack, | ||
316 | .irq_mask = tegra_gpio_irq_mask, | ||
317 | .irq_unmask = tegra_gpio_irq_unmask, | ||
318 | .irq_set_type = tegra_gpio_irq_set_type, | ||
319 | #ifdef CONFIG_PM | ||
320 | .irq_set_wake = tegra_gpio_wake_enable, | ||
321 | #endif | ||
322 | }; | ||
323 | |||
324 | |||
325 | /* This lock class tells lockdep that GPIO irqs are in a different | ||
326 | * category than their parents, so it won't report false recursion. | ||
327 | */ | ||
328 | static struct lock_class_key gpio_lock_class; | ||
329 | |||
330 | static int __init tegra_gpio_init(void) | ||
331 | { | ||
332 | struct tegra_gpio_bank *bank; | ||
333 | int i; | ||
334 | int j; | ||
335 | |||
336 | for (i = 0; i < 7; i++) { | ||
337 | for (j = 0; j < 4; j++) { | ||
338 | int gpio = tegra_gpio_compose(i, j, 0); | ||
339 | __raw_writel(0x00, GPIO_INT_ENB(gpio)); | ||
340 | } | ||
341 | } | ||
342 | |||
343 | gpiochip_add(&tegra_gpio_chip); | ||
344 | |||
345 | for (i = INT_GPIO_BASE; i < (INT_GPIO_BASE + TEGRA_NR_GPIOS); i++) { | ||
346 | bank = &tegra_gpio_banks[GPIO_BANK(irq_to_gpio(i))]; | ||
347 | |||
348 | irq_set_lockdep_class(i, &gpio_lock_class); | ||
349 | irq_set_chip_data(i, bank); | ||
350 | irq_set_chip_and_handler(i, &tegra_gpio_irq_chip, | ||
351 | handle_simple_irq); | ||
352 | set_irq_flags(i, IRQF_VALID); | ||
353 | } | ||
354 | |||
355 | for (i = 0; i < ARRAY_SIZE(tegra_gpio_banks); i++) { | ||
356 | bank = &tegra_gpio_banks[i]; | ||
357 | |||
358 | irq_set_chained_handler(bank->irq, tegra_gpio_irq_handler); | ||
359 | irq_set_handler_data(bank->irq, bank); | ||
360 | |||
361 | for (j = 0; j < 4; j++) | ||
362 | spin_lock_init(&bank->lvl_lock[j]); | ||
363 | } | ||
364 | |||
365 | return 0; | ||
366 | } | ||
367 | |||
368 | postcore_initcall(tegra_gpio_init); | ||
369 | |||
370 | void __init tegra_gpio_config(struct tegra_gpio_table *table, int num) | ||
371 | { | ||
372 | int i; | ||
373 | |||
374 | for (i = 0; i < num; i++) { | ||
375 | int gpio = table[i].gpio; | ||
376 | |||
377 | if (table[i].enable) | ||
378 | tegra_gpio_enable(gpio); | ||
379 | else | ||
380 | tegra_gpio_disable(gpio); | ||
381 | } | ||
382 | } | ||
383 | |||
384 | #ifdef CONFIG_DEBUG_FS | ||
385 | |||
386 | #include <linux/debugfs.h> | ||
387 | #include <linux/seq_file.h> | ||
388 | |||
389 | static int dbg_gpio_show(struct seq_file *s, void *unused) | ||
390 | { | ||
391 | int i; | ||
392 | int j; | ||
393 | |||
394 | for (i = 0; i < 7; i++) { | ||
395 | for (j = 0; j < 4; j++) { | ||
396 | int gpio = tegra_gpio_compose(i, j, 0); | ||
397 | seq_printf(s, | ||
398 | "%d:%d %02x %02x %02x %02x %02x %02x %06x\n", | ||
399 | i, j, | ||
400 | __raw_readl(GPIO_CNF(gpio)), | ||
401 | __raw_readl(GPIO_OE(gpio)), | ||
402 | __raw_readl(GPIO_OUT(gpio)), | ||
403 | __raw_readl(GPIO_IN(gpio)), | ||
404 | __raw_readl(GPIO_INT_STA(gpio)), | ||
405 | __raw_readl(GPIO_INT_ENB(gpio)), | ||
406 | __raw_readl(GPIO_INT_LVL(gpio))); | ||
407 | } | ||
408 | } | ||
409 | return 0; | ||
410 | } | ||
411 | |||
412 | static int dbg_gpio_open(struct inode *inode, struct file *file) | ||
413 | { | ||
414 | return single_open(file, dbg_gpio_show, &inode->i_private); | ||
415 | } | ||
416 | |||
417 | static const struct file_operations debug_fops = { | ||
418 | .open = dbg_gpio_open, | ||
419 | .read = seq_read, | ||
420 | .llseek = seq_lseek, | ||
421 | .release = single_release, | ||
422 | }; | ||
423 | |||
424 | static int __init tegra_gpio_debuginit(void) | ||
425 | { | ||
426 | (void) debugfs_create_file("tegra_gpio", S_IRUGO, | ||
427 | NULL, NULL, &debug_fops); | ||
428 | return 0; | ||
429 | } | ||
430 | late_initcall(tegra_gpio_debuginit); | ||
431 | #endif | ||
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index c3c417656bd..4598b06c8c5 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
@@ -159,6 +159,9 @@ static void __init db8500_add_gpios(void) | |||
159 | /* No custom data yet */ | 159 | /* No custom data yet */ |
160 | }; | 160 | }; |
161 | 161 | ||
162 | if (cpu_is_u8500v2()) | ||
163 | pdata.supports_sleepmode = true; | ||
164 | |||
162 | dbx500_add_gpios(ARRAY_AND_SIZE(db8500_gpio_base), | 165 | dbx500_add_gpios(ARRAY_AND_SIZE(db8500_gpio_base), |
163 | IRQ_DB8500_GPIO0, &pdata); | 166 | IRQ_DB8500_GPIO0, &pdata); |
164 | } | 167 | } |
diff --git a/arch/arm/plat-nomadik/include/plat/gpio.h b/arch/arm/plat-nomadik/include/plat/gpio.h index ea19a5b2f22..d5d7e651269 100644 --- a/arch/arm/plat-nomadik/include/plat/gpio.h +++ b/arch/arm/plat-nomadik/include/plat/gpio.h | |||
@@ -90,6 +90,7 @@ struct nmk_gpio_platform_data { | |||
90 | int num_gpio; | 90 | int num_gpio; |
91 | u32 (*get_secondary_status)(unsigned int bank); | 91 | u32 (*get_secondary_status)(unsigned int bank); |
92 | void (*set_ioforce)(bool enable); | 92 | void (*set_ioforce)(bool enable); |
93 | bool supports_sleepmode; | ||
93 | }; | 94 | }; |
94 | 95 | ||
95 | #endif /* __ASM_PLAT_GPIO_H */ | 96 | #endif /* __ASM_PLAT_GPIO_H */ |
diff --git a/arch/arm/plat-omap/include/plat/flash.h b/arch/arm/plat-omap/include/plat/flash.h index 3083195123e..0d88499b79e 100644 --- a/arch/arm/plat-omap/include/plat/flash.h +++ b/arch/arm/plat-omap/include/plat/flash.h | |||
@@ -11,6 +11,7 @@ | |||
11 | 11 | ||
12 | #include <linux/mtd/map.h> | 12 | #include <linux/mtd/map.h> |
13 | 13 | ||
14 | struct platform_device; | ||
14 | extern void omap1_set_vpp(struct platform_device *pdev, int enable); | 15 | extern void omap1_set_vpp(struct platform_device *pdev, int enable); |
15 | 16 | ||
16 | #endif | 17 | #endif |
diff --git a/arch/arm/plat-omap/include/plat/iovmm.h b/arch/arm/plat-omap/include/plat/iovmm.h index 32a2f6c4d39..e992b9655fb 100644 --- a/arch/arm/plat-omap/include/plat/iovmm.h +++ b/arch/arm/plat-omap/include/plat/iovmm.h | |||
@@ -29,9 +29,6 @@ struct iovm_struct { | |||
29 | * lower 16 bit is used for h/w and upper 16 bit is for s/w. | 29 | * lower 16 bit is used for h/w and upper 16 bit is for s/w. |
30 | */ | 30 | */ |
31 | #define IOVMF_SW_SHIFT 16 | 31 | #define IOVMF_SW_SHIFT 16 |
32 | #define IOVMF_HW_SIZE (1 << IOVMF_SW_SHIFT) | ||
33 | #define IOVMF_HW_MASK (IOVMF_HW_SIZE - 1) | ||
34 | #define IOVMF_SW_MASK (~IOVMF_HW_MASK)UL | ||
35 | 32 | ||
36 | /* | 33 | /* |
37 | * iovma: h/w flags derived from cam and ram attribute | 34 | * iovma: h/w flags derived from cam and ram attribute |
diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h index f38fef9f131..c7b874186c2 100644 --- a/arch/arm/plat-omap/include/plat/mmc.h +++ b/arch/arm/plat-omap/include/plat/mmc.h | |||
@@ -101,6 +101,9 @@ struct omap_mmc_platform_data { | |||
101 | /* If using power_saving and the MMC power is not to go off */ | 101 | /* If using power_saving and the MMC power is not to go off */ |
102 | unsigned no_off:1; | 102 | unsigned no_off:1; |
103 | 103 | ||
104 | /* eMMC does not handle power off when not in sleep state */ | ||
105 | unsigned no_regulator_off_init:1; | ||
106 | |||
104 | /* Regulator off remapped to sleep */ | 107 | /* Regulator off remapped to sleep */ |
105 | unsigned vcc_aux_disable_is_sleep:1; | 108 | unsigned vcc_aux_disable_is_sleep:1; |
106 | 109 | ||
diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c index 51ef43e8def..83a37c54342 100644 --- a/arch/arm/plat-omap/iovmm.c +++ b/arch/arm/plat-omap/iovmm.c | |||
@@ -648,7 +648,6 @@ u32 iommu_vmap(struct iommu *obj, u32 da, const struct sg_table *sgt, | |||
648 | return PTR_ERR(va); | 648 | return PTR_ERR(va); |
649 | } | 649 | } |
650 | 650 | ||
651 | flags &= IOVMF_HW_MASK; | ||
652 | flags |= IOVMF_DISCONT; | 651 | flags |= IOVMF_DISCONT; |
653 | flags |= IOVMF_MMIO; | 652 | flags |= IOVMF_MMIO; |
654 | 653 | ||
@@ -706,7 +705,6 @@ u32 iommu_vmalloc(struct iommu *obj, u32 da, size_t bytes, u32 flags) | |||
706 | if (!va) | 705 | if (!va) |
707 | return -ENOMEM; | 706 | return -ENOMEM; |
708 | 707 | ||
709 | flags &= IOVMF_HW_MASK; | ||
710 | flags |= IOVMF_DISCONT; | 708 | flags |= IOVMF_DISCONT; |
711 | flags |= IOVMF_ALLOC; | 709 | flags |= IOVMF_ALLOC; |
712 | 710 | ||
@@ -795,7 +793,6 @@ u32 iommu_kmap(struct iommu *obj, u32 da, u32 pa, size_t bytes, | |||
795 | if (!va) | 793 | if (!va) |
796 | return -ENOMEM; | 794 | return -ENOMEM; |
797 | 795 | ||
798 | flags &= IOVMF_HW_MASK; | ||
799 | flags |= IOVMF_LINEAR; | 796 | flags |= IOVMF_LINEAR; |
800 | flags |= IOVMF_MMIO; | 797 | flags |= IOVMF_MMIO; |
801 | 798 | ||
@@ -853,7 +850,6 @@ u32 iommu_kmalloc(struct iommu *obj, u32 da, size_t bytes, u32 flags) | |||
853 | return -ENOMEM; | 850 | return -ENOMEM; |
854 | pa = virt_to_phys(va); | 851 | pa = virt_to_phys(va); |
855 | 852 | ||
856 | flags &= IOVMF_HW_MASK; | ||
857 | flags |= IOVMF_LINEAR; | 853 | flags |= IOVMF_LINEAR; |
858 | flags |= IOVMF_ALLOC; | 854 | flags |= IOVMF_ALLOC; |
859 | 855 | ||
diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c index a3f50b34a90..6af3d0b1f8d 100644 --- a/arch/arm/plat-omap/sram.c +++ b/arch/arm/plat-omap/sram.c | |||
@@ -166,7 +166,7 @@ static void __init omap_detect_sram(void) | |||
166 | else if (cpu_is_omap1611()) | 166 | else if (cpu_is_omap1611()) |
167 | omap_sram_size = SZ_256K; | 167 | omap_sram_size = SZ_256K; |
168 | else { | 168 | else { |
169 | printk(KERN_ERR "Could not detect SRAM size\n"); | 169 | pr_err("Could not detect SRAM size\n"); |
170 | omap_sram_size = 0x4000; | 170 | omap_sram_size = 0x4000; |
171 | } | 171 | } |
172 | } | 172 | } |
@@ -221,10 +221,10 @@ static void __init omap_map_sram(void) | |||
221 | omap_sram_io_desc[0].length = ROUND_DOWN(omap_sram_size, PAGE_SIZE); | 221 | omap_sram_io_desc[0].length = ROUND_DOWN(omap_sram_size, PAGE_SIZE); |
222 | iotable_init(omap_sram_io_desc, ARRAY_SIZE(omap_sram_io_desc)); | 222 | iotable_init(omap_sram_io_desc, ARRAY_SIZE(omap_sram_io_desc)); |
223 | 223 | ||
224 | printk(KERN_INFO "SRAM: Mapped pa 0x%08lx to va 0x%08lx size: 0x%lx\n", | 224 | pr_info("SRAM: Mapped pa 0x%08llx to va 0x%08lx size: 0x%lx\n", |
225 | __pfn_to_phys(omap_sram_io_desc[0].pfn), | 225 | (long long) __pfn_to_phys(omap_sram_io_desc[0].pfn), |
226 | omap_sram_io_desc[0].virtual, | 226 | omap_sram_io_desc[0].virtual, |
227 | omap_sram_io_desc[0].length); | 227 | omap_sram_io_desc[0].length); |
228 | 228 | ||
229 | /* | 229 | /* |
230 | * Normally devicemaps_init() would flush caches and tlb after | 230 | * Normally devicemaps_init() would flush caches and tlb after |
@@ -252,7 +252,7 @@ static void __init omap_map_sram(void) | |||
252 | void *omap_sram_push_address(unsigned long size) | 252 | void *omap_sram_push_address(unsigned long size) |
253 | { | 253 | { |
254 | if (size > (omap_sram_ceil - (omap_sram_base + SRAM_BOOTLOADER_SZ))) { | 254 | if (size > (omap_sram_ceil - (omap_sram_base + SRAM_BOOTLOADER_SZ))) { |
255 | printk(KERN_ERR "Not enough space in SRAM\n"); | 255 | pr_err("Not enough space in SRAM\n"); |
256 | return NULL; | 256 | return NULL; |
257 | } | 257 | } |
258 | 258 | ||
diff --git a/arch/arm/plat-s3c24xx/dma.c b/arch/arm/plat-s3c24xx/dma.c index c10d10c56e2..2abf9660bc6 100644 --- a/arch/arm/plat-s3c24xx/dma.c +++ b/arch/arm/plat-s3c24xx/dma.c | |||
@@ -1199,7 +1199,7 @@ EXPORT_SYMBOL(s3c2410_dma_getposition); | |||
1199 | 1199 | ||
1200 | #ifdef CONFIG_PM | 1200 | #ifdef CONFIG_PM |
1201 | 1201 | ||
1202 | static void s3c2410_dma_suspend_chan(s3c2410_dma_chan *cp) | 1202 | static void s3c2410_dma_suspend_chan(struct s3c2410_dma_chan *cp) |
1203 | { | 1203 | { |
1204 | printk(KERN_DEBUG "suspending dma channel %d\n", cp->number); | 1204 | printk(KERN_DEBUG "suspending dma channel %d\n", cp->number); |
1205 | 1205 | ||
diff --git a/arch/arm/plat-s3c24xx/irq.c b/arch/arm/plat-s3c24xx/irq.c index 9aee7e1668b..fc8c5f89954 100644 --- a/arch/arm/plat-s3c24xx/irq.c +++ b/arch/arm/plat-s3c24xx/irq.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/interrupt.h> | 23 | #include <linux/interrupt.h> |
24 | #include <linux/ioport.h> | 24 | #include <linux/ioport.h> |
25 | #include <linux/sysdev.h> | 25 | #include <linux/sysdev.h> |
26 | #include <linux/syscore_ops.h> | ||
26 | 27 | ||
27 | #include <asm/irq.h> | 28 | #include <asm/irq.h> |
28 | #include <asm/mach/irq.h> | 29 | #include <asm/mach/irq.h> |
@@ -668,3 +669,8 @@ void __init s3c24xx_init_irq(void) | |||
668 | 669 | ||
669 | irqdbf("s3c2410: registered interrupt handlers\n"); | 670 | irqdbf("s3c2410: registered interrupt handlers\n"); |
670 | } | 671 | } |
672 | |||
673 | struct syscore_ops s3c24xx_irq_syscore_ops = { | ||
674 | .suspend = s3c24xx_irq_suspend, | ||
675 | .resume = s3c24xx_irq_resume, | ||
676 | }; | ||
diff --git a/arch/arm/plat-s5p/dev-onenand.c b/arch/arm/plat-s5p/dev-onenand.c index 6db926202ca..20336c8f247 100644 --- a/arch/arm/plat-s5p/dev-onenand.c +++ b/arch/arm/plat-s5p/dev-onenand.c | |||
@@ -15,8 +15,6 @@ | |||
15 | 15 | ||
16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/mtd/mtd.h> | ||
19 | #include <linux/mtd/onenand.h> | ||
20 | 18 | ||
21 | #include <mach/irqs.h> | 19 | #include <mach/irqs.h> |
22 | #include <mach/map.h> | 20 | #include <mach/map.h> |
@@ -45,13 +43,3 @@ struct platform_device s5p_device_onenand = { | |||
45 | .num_resources = ARRAY_SIZE(s5p_onenand_resources), | 43 | .num_resources = ARRAY_SIZE(s5p_onenand_resources), |
46 | .resource = s5p_onenand_resources, | 44 | .resource = s5p_onenand_resources, |
47 | }; | 45 | }; |
48 | |||
49 | void s5p_onenand_set_platdata(struct onenand_platform_data *pdata) | ||
50 | { | ||
51 | struct onenand_platform_data *pd; | ||
52 | |||
53 | pd = kmemdup(pdata, sizeof(struct onenand_platform_data), GFP_KERNEL); | ||
54 | if (!pd) | ||
55 | printk(KERN_ERR "%s: no memory for platform data\n", __func__); | ||
56 | s5p_device_onenand.dev.platform_data = pd; | ||
57 | } | ||
diff --git a/arch/arm/plat-s5p/include/plat/map-s5p.h b/arch/arm/plat-s5p/include/plat/map-s5p.h index a6c3d327ce7..d973d39666a 100644 --- a/arch/arm/plat-s5p/include/plat/map-s5p.h +++ b/arch/arm/plat-s5p/include/plat/map-s5p.h | |||
@@ -39,7 +39,7 @@ | |||
39 | #define S5P_VA_TWD S5P_VA_COREPERI(0x600) | 39 | #define S5P_VA_TWD S5P_VA_COREPERI(0x600) |
40 | #define S5P_VA_GIC_DIST S5P_VA_COREPERI(0x1000) | 40 | #define S5P_VA_GIC_DIST S5P_VA_COREPERI(0x1000) |
41 | 41 | ||
42 | #define S5P_VA_USB_HSPHY S3C_ADDR(0x02900000) | 42 | #define S3C_VA_USB_HSPHY S3C_ADDR(0x02900000) |
43 | 43 | ||
44 | #define VA_VIC(x) (S3C_VA_IRQ + ((x) * 0x10000)) | 44 | #define VA_VIC(x) (S3C_VA_IRQ + ((x) * 0x10000)) |
45 | #define VA_VIC0 VA_VIC(0) | 45 | #define VA_VIC0 VA_VIC(0) |
diff --git a/arch/arm/plat-samsung/dev-onenand.c b/arch/arm/plat-samsung/dev-onenand.c index 45ec73287d8..f54ae71f0cd 100644 --- a/arch/arm/plat-samsung/dev-onenand.c +++ b/arch/arm/plat-samsung/dev-onenand.c | |||
@@ -13,8 +13,6 @@ | |||
13 | 13 | ||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
16 | #include <linux/mtd/mtd.h> | ||
17 | #include <linux/mtd/onenand.h> | ||
18 | 16 | ||
19 | #include <mach/irqs.h> | 17 | #include <mach/irqs.h> |
20 | #include <mach/map.h> | 18 | #include <mach/map.h> |
@@ -43,13 +41,3 @@ struct platform_device s3c_device_onenand = { | |||
43 | .num_resources = ARRAY_SIZE(s3c_onenand_resources), | 41 | .num_resources = ARRAY_SIZE(s3c_onenand_resources), |
44 | .resource = s3c_onenand_resources, | 42 | .resource = s3c_onenand_resources, |
45 | }; | 43 | }; |
46 | |||
47 | void s3c_onenand_set_platdata(struct onenand_platform_data *pdata) | ||
48 | { | ||
49 | struct onenand_platform_data *pd; | ||
50 | |||
51 | pd = kmemdup(pdata, sizeof(struct onenand_platform_data), GFP_KERNEL); | ||
52 | if (!pd) | ||
53 | printk(KERN_ERR "%s: no memory for platform data\n", __func__); | ||
54 | s3c_device_onenand.dev.platform_data = pd; | ||
55 | } | ||
diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h index b61b8ee7cc5..4af108ff411 100644 --- a/arch/arm/plat-samsung/include/plat/devs.h +++ b/arch/arm/plat-samsung/include/plat/devs.h | |||
@@ -75,10 +75,8 @@ extern struct platform_device s5pc100_device_spi1; | |||
75 | extern struct platform_device s5pc100_device_spi2; | 75 | extern struct platform_device s5pc100_device_spi2; |
76 | extern struct platform_device s5pv210_device_spi0; | 76 | extern struct platform_device s5pv210_device_spi0; |
77 | extern struct platform_device s5pv210_device_spi1; | 77 | extern struct platform_device s5pv210_device_spi1; |
78 | extern struct platform_device s5p6440_device_spi0; | 78 | extern struct platform_device s5p64x0_device_spi0; |
79 | extern struct platform_device s5p6440_device_spi1; | 79 | extern struct platform_device s5p64x0_device_spi1; |
80 | extern struct platform_device s5p6450_device_spi0; | ||
81 | extern struct platform_device s5p6450_device_spi1; | ||
82 | 80 | ||
83 | extern struct platform_device s3c_device_hwmon; | 81 | extern struct platform_device s3c_device_hwmon; |
84 | 82 | ||
diff --git a/arch/mn10300/kernel/traps.c b/arch/mn10300/kernel/traps.c index f03cb278828..bd3e5e73826 100644 --- a/arch/mn10300/kernel/traps.c +++ b/arch/mn10300/kernel/traps.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include <linux/irq.h> | 28 | #include <linux/irq.h> |
29 | #include <asm/processor.h> | 29 | #include <asm/processor.h> |
30 | #include <asm/system.h> | 30 | #include <asm/system.h> |
31 | #include <asm/uaccess.h> | 31 | #include <linux/uaccess.h> |
32 | #include <asm/io.h> | 32 | #include <asm/io.h> |
33 | #include <asm/atomic.h> | 33 | #include <asm/atomic.h> |
34 | #include <asm/smp.h> | 34 | #include <asm/smp.h> |
@@ -156,7 +156,7 @@ int die_if_no_fixup(const char *str, struct pt_regs *regs, | |||
156 | 156 | ||
157 | case EXCEP_TRAP: | 157 | case EXCEP_TRAP: |
158 | case EXCEP_UNIMPINS: | 158 | case EXCEP_UNIMPINS: |
159 | if (get_user(opcode, (uint8_t __user *)regs->pc) != 0) | 159 | if (probe_kernel_read(&opcode, (u8 *)regs->pc, 1) < 0) |
160 | break; | 160 | break; |
161 | if (opcode == 0xff) { | 161 | if (opcode == 0xff) { |
162 | if (notify_die(DIE_BREAKPOINT, str, regs, code, 0, 0)) | 162 | if (notify_die(DIE_BREAKPOINT, str, regs, code, 0, 0)) |
diff --git a/arch/mn10300/kernel/vmlinux.lds.S b/arch/mn10300/kernel/vmlinux.lds.S index 6f702a6ab39..13c4814c29f 100644 --- a/arch/mn10300/kernel/vmlinux.lds.S +++ b/arch/mn10300/kernel/vmlinux.lds.S | |||
@@ -44,6 +44,7 @@ SECTIONS | |||
44 | RO_DATA(PAGE_SIZE) | 44 | RO_DATA(PAGE_SIZE) |
45 | 45 | ||
46 | /* writeable */ | 46 | /* writeable */ |
47 | _sdata = .; /* Start of rw data section */ | ||
47 | RW_DATA_SECTION(32, PAGE_SIZE, THREAD_SIZE) | 48 | RW_DATA_SECTION(32, PAGE_SIZE, THREAD_SIZE) |
48 | _edata = .; | 49 | _edata = .; |
49 | 50 | ||
diff --git a/arch/mn10300/mm/cache-dbg-flush-by-reg.S b/arch/mn10300/mm/cache-dbg-flush-by-reg.S index 665919f2ab6..a775ea5d7ce 100644 --- a/arch/mn10300/mm/cache-dbg-flush-by-reg.S +++ b/arch/mn10300/mm/cache-dbg-flush-by-reg.S | |||
@@ -120,14 +120,14 @@ debugger_local_cache_flushinv_one: | |||
120 | # conditionally purge this line in all ways | 120 | # conditionally purge this line in all ways |
121 | mov d1,(L1_CACHE_WAYDISP*0,a0) | 121 | mov d1,(L1_CACHE_WAYDISP*0,a0) |
122 | 122 | ||
123 | debugger_local_cache_flushinv_no_dcache: | 123 | debugger_local_cache_flushinv_one_no_dcache: |
124 | # | 124 | # |
125 | # now try to flush the icache | 125 | # now try to flush the icache |
126 | # | 126 | # |
127 | mov CHCTR,a0 | 127 | mov CHCTR,a0 |
128 | movhu (a0),d0 | 128 | movhu (a0),d0 |
129 | btst CHCTR_ICEN,d0 | 129 | btst CHCTR_ICEN,d0 |
130 | beq mn10300_local_icache_inv_range_reg_end | 130 | beq debugger_local_cache_flushinv_one_end |
131 | 131 | ||
132 | LOCAL_CLI_SAVE(d1) | 132 | LOCAL_CLI_SAVE(d1) |
133 | 133 | ||
diff --git a/arch/powerpc/boot/.gitignore b/arch/powerpc/boot/.gitignore index 3d80c3e9cf6..12da77ec022 100644 --- a/arch/powerpc/boot/.gitignore +++ b/arch/powerpc/boot/.gitignore | |||
@@ -1,5 +1,4 @@ | |||
1 | addnote | 1 | addnote |
2 | dtc | ||
3 | empty.c | 2 | empty.c |
4 | hack-coff | 3 | hack-coff |
5 | infblock.c | 4 | infblock.c |
diff --git a/arch/powerpc/boot/dtc-src/.gitignore b/arch/powerpc/boot/dtc-src/.gitignore deleted file mode 100644 index a7c3f94e5e7..00000000000 --- a/arch/powerpc/boot/dtc-src/.gitignore +++ /dev/null | |||
@@ -1,3 +0,0 @@ | |||
1 | dtc-lexer.lex.c | ||
2 | dtc-parser.tab.c | ||
3 | dtc-parser.tab.h | ||
diff --git a/arch/powerpc/include/asm/rio.h b/arch/powerpc/include/asm/rio.h index d902abd3399..b1d2deceeed 100644 --- a/arch/powerpc/include/asm/rio.h +++ b/arch/powerpc/include/asm/rio.h | |||
@@ -14,7 +14,7 @@ | |||
14 | #define ASM_PPC_RIO_H | 14 | #define ASM_PPC_RIO_H |
15 | 15 | ||
16 | extern void platform_rio_init(void); | 16 | extern void platform_rio_init(void); |
17 | #ifdef CONFIG_RAPIDIO | 17 | #ifdef CONFIG_FSL_RIO |
18 | extern int fsl_rio_mcheck_exception(struct pt_regs *); | 18 | extern int fsl_rio_mcheck_exception(struct pt_regs *); |
19 | #else | 19 | #else |
20 | static inline int fsl_rio_mcheck_exception(struct pt_regs *regs) {return 0; } | 20 | static inline int fsl_rio_mcheck_exception(struct pt_regs *regs) {return 0; } |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 34d2722b945..9fb933248ab 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -1979,7 +1979,7 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
1979 | .pvr_value = 0x80240000, | 1979 | .pvr_value = 0x80240000, |
1980 | .cpu_name = "e5500", | 1980 | .cpu_name = "e5500", |
1981 | .cpu_features = CPU_FTRS_E5500, | 1981 | .cpu_features = CPU_FTRS_E5500, |
1982 | .cpu_user_features = COMMON_USER_BOOKE, | 1982 | .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, |
1983 | .mmu_features = MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS | | 1983 | .mmu_features = MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS | |
1984 | MMU_FTR_USE_TLBILX, | 1984 | MMU_FTR_USE_TLBILX, |
1985 | .icache_bsize = 64, | 1985 | .icache_bsize = 64, |
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index f2c906b1d8d..8c3112a57cf 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -82,11 +82,29 @@ static int __init early_parse_mem(char *p) | |||
82 | } | 82 | } |
83 | early_param("mem", early_parse_mem); | 83 | early_param("mem", early_parse_mem); |
84 | 84 | ||
85 | /* | ||
86 | * overlaps_initrd - check for overlap with page aligned extension of | ||
87 | * initrd. | ||
88 | */ | ||
89 | static inline int overlaps_initrd(unsigned long start, unsigned long size) | ||
90 | { | ||
91 | #ifdef CONFIG_BLK_DEV_INITRD | ||
92 | if (!initrd_start) | ||
93 | return 0; | ||
94 | |||
95 | return (start + size) > _ALIGN_DOWN(initrd_start, PAGE_SIZE) && | ||
96 | start <= _ALIGN_UP(initrd_end, PAGE_SIZE); | ||
97 | #else | ||
98 | return 0; | ||
99 | #endif | ||
100 | } | ||
101 | |||
85 | /** | 102 | /** |
86 | * move_device_tree - move tree to an unused area, if needed. | 103 | * move_device_tree - move tree to an unused area, if needed. |
87 | * | 104 | * |
88 | * The device tree may be allocated beyond our memory limit, or inside the | 105 | * The device tree may be allocated beyond our memory limit, or inside the |
89 | * crash kernel region for kdump. If so, move it out of the way. | 106 | * crash kernel region for kdump, or within the page aligned range of initrd. |
107 | * If so, move it out of the way. | ||
90 | */ | 108 | */ |
91 | static void __init move_device_tree(void) | 109 | static void __init move_device_tree(void) |
92 | { | 110 | { |
@@ -99,7 +117,8 @@ static void __init move_device_tree(void) | |||
99 | size = be32_to_cpu(initial_boot_params->totalsize); | 117 | size = be32_to_cpu(initial_boot_params->totalsize); |
100 | 118 | ||
101 | if ((memory_limit && (start + size) > PHYSICAL_START + memory_limit) || | 119 | if ((memory_limit && (start + size) > PHYSICAL_START + memory_limit) || |
102 | overlaps_crashkernel(start, size)) { | 120 | overlaps_crashkernel(start, size) || |
121 | overlaps_initrd(start, size)) { | ||
103 | p = __va(memblock_alloc(size, PAGE_SIZE)); | 122 | p = __va(memblock_alloc(size, PAGE_SIZE)); |
104 | memcpy(p, initial_boot_params, size); | 123 | memcpy(p, initial_boot_params, size); |
105 | initial_boot_params = (struct boot_param_header *)p; | 124 | initial_boot_params = (struct boot_param_header *)p; |
@@ -555,7 +574,9 @@ static void __init early_reserve_mem(void) | |||
555 | #ifdef CONFIG_BLK_DEV_INITRD | 574 | #ifdef CONFIG_BLK_DEV_INITRD |
556 | /* then reserve the initrd, if any */ | 575 | /* then reserve the initrd, if any */ |
557 | if (initrd_start && (initrd_end > initrd_start)) | 576 | if (initrd_start && (initrd_end > initrd_start)) |
558 | memblock_reserve(__pa(initrd_start), initrd_end - initrd_start); | 577 | memblock_reserve(_ALIGN_DOWN(__pa(initrd_start), PAGE_SIZE), |
578 | _ALIGN_UP(initrd_end, PAGE_SIZE) - | ||
579 | _ALIGN_DOWN(initrd_start, PAGE_SIZE)); | ||
559 | #endif /* CONFIG_BLK_DEV_INITRD */ | 580 | #endif /* CONFIG_BLK_DEV_INITRD */ |
560 | 581 | ||
561 | #ifdef CONFIG_PPC32 | 582 | #ifdef CONFIG_PPC32 |
diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c index d65b591e555..5de0f254dbb 100644 --- a/arch/powerpc/mm/init_32.c +++ b/arch/powerpc/mm/init_32.c | |||
@@ -223,21 +223,6 @@ void free_initmem(void) | |||
223 | #undef FREESEC | 223 | #undef FREESEC |
224 | } | 224 | } |
225 | 225 | ||
226 | #ifdef CONFIG_BLK_DEV_INITRD | ||
227 | void free_initrd_mem(unsigned long start, unsigned long end) | ||
228 | { | ||
229 | if (start < end) | ||
230 | printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); | ||
231 | for (; start < end; start += PAGE_SIZE) { | ||
232 | ClearPageReserved(virt_to_page(start)); | ||
233 | init_page_count(virt_to_page(start)); | ||
234 | free_page(start); | ||
235 | totalram_pages++; | ||
236 | } | ||
237 | } | ||
238 | #endif | ||
239 | |||
240 | |||
241 | #ifdef CONFIG_8xx /* No 8xx specific .c file to put that in ... */ | 226 | #ifdef CONFIG_8xx /* No 8xx specific .c file to put that in ... */ |
242 | void setup_initial_memory_limit(phys_addr_t first_memblock_base, | 227 | void setup_initial_memory_limit(phys_addr_t first_memblock_base, |
243 | phys_addr_t first_memblock_size) | 228 | phys_addr_t first_memblock_size) |
diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c index 6374b2196a1..f6dbb4c20e6 100644 --- a/arch/powerpc/mm/init_64.c +++ b/arch/powerpc/mm/init_64.c | |||
@@ -99,20 +99,6 @@ void free_initmem(void) | |||
99 | ((unsigned long)__init_end - (unsigned long)__init_begin) >> 10); | 99 | ((unsigned long)__init_end - (unsigned long)__init_begin) >> 10); |
100 | } | 100 | } |
101 | 101 | ||
102 | #ifdef CONFIG_BLK_DEV_INITRD | ||
103 | void free_initrd_mem(unsigned long start, unsigned long end) | ||
104 | { | ||
105 | if (start < end) | ||
106 | printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); | ||
107 | for (; start < end; start += PAGE_SIZE) { | ||
108 | ClearPageReserved(virt_to_page(start)); | ||
109 | init_page_count(virt_to_page(start)); | ||
110 | free_page(start); | ||
111 | totalram_pages++; | ||
112 | } | ||
113 | } | ||
114 | #endif | ||
115 | |||
116 | static void pgd_ctor(void *addr) | 102 | static void pgd_ctor(void *addr) |
117 | { | 103 | { |
118 | memset(addr, 0, PGD_TABLE_SIZE); | 104 | memset(addr, 0, PGD_TABLE_SIZE); |
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 57e545b84bf..29d4dde65c4 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
@@ -382,6 +382,25 @@ void __init mem_init(void) | |||
382 | mem_init_done = 1; | 382 | mem_init_done = 1; |
383 | } | 383 | } |
384 | 384 | ||
385 | #ifdef CONFIG_BLK_DEV_INITRD | ||
386 | void __init free_initrd_mem(unsigned long start, unsigned long end) | ||
387 | { | ||
388 | if (start >= end) | ||
389 | return; | ||
390 | |||
391 | start = _ALIGN_DOWN(start, PAGE_SIZE); | ||
392 | end = _ALIGN_UP(end, PAGE_SIZE); | ||
393 | pr_info("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); | ||
394 | |||
395 | for (; start < end; start += PAGE_SIZE) { | ||
396 | ClearPageReserved(virt_to_page(start)); | ||
397 | init_page_count(virt_to_page(start)); | ||
398 | free_page(start); | ||
399 | totalram_pages++; | ||
400 | } | ||
401 | } | ||
402 | #endif | ||
403 | |||
385 | /* | 404 | /* |
386 | * This is called when a page has been modified by the kernel. | 405 | * This is called when a page has been modified by the kernel. |
387 | * It just marks the page as not i-cache clean. We do the i-cache | 406 | * It just marks the page as not i-cache clean. We do the i-cache |
diff --git a/arch/powerpc/sysdev/fsl_lbc.c b/arch/powerpc/sysdev/fsl_lbc.c index 0608b1657da..d917573cf1a 100644 --- a/arch/powerpc/sysdev/fsl_lbc.c +++ b/arch/powerpc/sysdev/fsl_lbc.c | |||
@@ -196,9 +196,6 @@ static int __devinit fsl_lbc_ctrl_init(struct fsl_lbc_ctrl *ctrl, | |||
196 | out_be32(&lbc->lteccr, LTECCR_CLEAR); | 196 | out_be32(&lbc->lteccr, LTECCR_CLEAR); |
197 | out_be32(&lbc->ltedr, LTEDR_ENABLE); | 197 | out_be32(&lbc->ltedr, LTEDR_ENABLE); |
198 | 198 | ||
199 | /* Enable interrupts for any detected events */ | ||
200 | out_be32(&lbc->lteir, LTEIR_ENABLE); | ||
201 | |||
202 | /* Set the monitor timeout value to the maximum for erratum A001 */ | 199 | /* Set the monitor timeout value to the maximum for erratum A001 */ |
203 | if (of_device_is_compatible(node, "fsl,elbc")) | 200 | if (of_device_is_compatible(node, "fsl,elbc")) |
204 | clrsetbits_be32(&lbc->lbcr, LBCR_BMT, LBCR_BMTPS); | 201 | clrsetbits_be32(&lbc->lbcr, LBCR_BMT, LBCR_BMTPS); |
@@ -322,6 +319,9 @@ static int __devinit fsl_lbc_ctrl_probe(struct platform_device *dev) | |||
322 | goto err; | 319 | goto err; |
323 | } | 320 | } |
324 | 321 | ||
322 | /* Enable interrupts for any detected events */ | ||
323 | out_be32(&fsl_lbc_ctrl_dev->regs->lteir, LTEIR_ENABLE); | ||
324 | |||
325 | return 0; | 325 | return 0; |
326 | 326 | ||
327 | err: | 327 | err: |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 9fab2aa9c2c..90d77bd078f 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -89,6 +89,7 @@ config S390 | |||
89 | select HAVE_GET_USER_PAGES_FAST | 89 | select HAVE_GET_USER_PAGES_FAST |
90 | select HAVE_ARCH_MUTEX_CPU_RELAX | 90 | select HAVE_ARCH_MUTEX_CPU_RELAX |
91 | select HAVE_ARCH_JUMP_LABEL if !MARCH_G5 | 91 | select HAVE_ARCH_JUMP_LABEL if !MARCH_G5 |
92 | select HAVE_RCU_TABLE_FREE if SMP | ||
92 | select ARCH_INLINE_SPIN_TRYLOCK | 93 | select ARCH_INLINE_SPIN_TRYLOCK |
93 | select ARCH_INLINE_SPIN_TRYLOCK_BH | 94 | select ARCH_INLINE_SPIN_TRYLOCK_BH |
94 | select ARCH_INLINE_SPIN_LOCK | 95 | select ARCH_INLINE_SPIN_LOCK |
diff --git a/arch/s390/include/asm/pgalloc.h b/arch/s390/include/asm/pgalloc.h index f6314af3b35..38e71ebcd3c 100644 --- a/arch/s390/include/asm/pgalloc.h +++ b/arch/s390/include/asm/pgalloc.h | |||
@@ -17,15 +17,15 @@ | |||
17 | #include <linux/gfp.h> | 17 | #include <linux/gfp.h> |
18 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
19 | 19 | ||
20 | #define check_pgt_cache() do {} while (0) | ||
21 | |||
22 | unsigned long *crst_table_alloc(struct mm_struct *); | 20 | unsigned long *crst_table_alloc(struct mm_struct *); |
23 | void crst_table_free(struct mm_struct *, unsigned long *); | 21 | void crst_table_free(struct mm_struct *, unsigned long *); |
24 | void crst_table_free_rcu(struct mm_struct *, unsigned long *); | ||
25 | 22 | ||
26 | unsigned long *page_table_alloc(struct mm_struct *); | 23 | unsigned long *page_table_alloc(struct mm_struct *); |
27 | void page_table_free(struct mm_struct *, unsigned long *); | 24 | void page_table_free(struct mm_struct *, unsigned long *); |
28 | void page_table_free_rcu(struct mm_struct *, unsigned long *); | 25 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE |
26 | void page_table_free_rcu(struct mmu_gather *, unsigned long *); | ||
27 | void __tlb_remove_table(void *_table); | ||
28 | #endif | ||
29 | 29 | ||
30 | static inline void clear_table(unsigned long *s, unsigned long val, size_t n) | 30 | static inline void clear_table(unsigned long *s, unsigned long val, size_t n) |
31 | { | 31 | { |
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index e4efacfe1b6..801fbe1d837 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
@@ -293,19 +293,6 @@ extern unsigned long VMALLOC_START; | |||
293 | * swap pte is 1011 and 0001, 0011, 0101, 0111 are invalid. | 293 | * swap pte is 1011 and 0001, 0011, 0101, 0111 are invalid. |
294 | */ | 294 | */ |
295 | 295 | ||
296 | /* Page status table bits for virtualization */ | ||
297 | #define RCP_ACC_BITS 0xf000000000000000UL | ||
298 | #define RCP_FP_BIT 0x0800000000000000UL | ||
299 | #define RCP_PCL_BIT 0x0080000000000000UL | ||
300 | #define RCP_HR_BIT 0x0040000000000000UL | ||
301 | #define RCP_HC_BIT 0x0020000000000000UL | ||
302 | #define RCP_GR_BIT 0x0004000000000000UL | ||
303 | #define RCP_GC_BIT 0x0002000000000000UL | ||
304 | |||
305 | /* User dirty / referenced bit for KVM's migration feature */ | ||
306 | #define KVM_UR_BIT 0x0000800000000000UL | ||
307 | #define KVM_UC_BIT 0x0000400000000000UL | ||
308 | |||
309 | #ifndef __s390x__ | 296 | #ifndef __s390x__ |
310 | 297 | ||
311 | /* Bits in the segment table address-space-control-element */ | 298 | /* Bits in the segment table address-space-control-element */ |
@@ -325,6 +312,19 @@ extern unsigned long VMALLOC_START; | |||
325 | #define _SEGMENT_ENTRY (_SEGMENT_ENTRY_PTL) | 312 | #define _SEGMENT_ENTRY (_SEGMENT_ENTRY_PTL) |
326 | #define _SEGMENT_ENTRY_EMPTY (_SEGMENT_ENTRY_INV) | 313 | #define _SEGMENT_ENTRY_EMPTY (_SEGMENT_ENTRY_INV) |
327 | 314 | ||
315 | /* Page status table bits for virtualization */ | ||
316 | #define RCP_ACC_BITS 0xf0000000UL | ||
317 | #define RCP_FP_BIT 0x08000000UL | ||
318 | #define RCP_PCL_BIT 0x00800000UL | ||
319 | #define RCP_HR_BIT 0x00400000UL | ||
320 | #define RCP_HC_BIT 0x00200000UL | ||
321 | #define RCP_GR_BIT 0x00040000UL | ||
322 | #define RCP_GC_BIT 0x00020000UL | ||
323 | |||
324 | /* User dirty / referenced bit for KVM's migration feature */ | ||
325 | #define KVM_UR_BIT 0x00008000UL | ||
326 | #define KVM_UC_BIT 0x00004000UL | ||
327 | |||
328 | #else /* __s390x__ */ | 328 | #else /* __s390x__ */ |
329 | 329 | ||
330 | /* Bits in the segment/region table address-space-control-element */ | 330 | /* Bits in the segment/region table address-space-control-element */ |
@@ -367,6 +367,19 @@ extern unsigned long VMALLOC_START; | |||
367 | #define _SEGMENT_ENTRY_LARGE 0x400 /* STE-format control, large page */ | 367 | #define _SEGMENT_ENTRY_LARGE 0x400 /* STE-format control, large page */ |
368 | #define _SEGMENT_ENTRY_CO 0x100 /* change-recording override */ | 368 | #define _SEGMENT_ENTRY_CO 0x100 /* change-recording override */ |
369 | 369 | ||
370 | /* Page status table bits for virtualization */ | ||
371 | #define RCP_ACC_BITS 0xf000000000000000UL | ||
372 | #define RCP_FP_BIT 0x0800000000000000UL | ||
373 | #define RCP_PCL_BIT 0x0080000000000000UL | ||
374 | #define RCP_HR_BIT 0x0040000000000000UL | ||
375 | #define RCP_HC_BIT 0x0020000000000000UL | ||
376 | #define RCP_GR_BIT 0x0004000000000000UL | ||
377 | #define RCP_GC_BIT 0x0002000000000000UL | ||
378 | |||
379 | /* User dirty / referenced bit for KVM's migration feature */ | ||
380 | #define KVM_UR_BIT 0x0000800000000000UL | ||
381 | #define KVM_UC_BIT 0x0000400000000000UL | ||
382 | |||
370 | #endif /* __s390x__ */ | 383 | #endif /* __s390x__ */ |
371 | 384 | ||
372 | /* | 385 | /* |
diff --git a/arch/s390/include/asm/qdio.h b/arch/s390/include/asm/qdio.h index 350e7ee5952..15c97625df8 100644 --- a/arch/s390/include/asm/qdio.h +++ b/arch/s390/include/asm/qdio.h | |||
@@ -139,110 +139,47 @@ struct slib { | |||
139 | struct slibe slibe[QDIO_MAX_BUFFERS_PER_Q]; | 139 | struct slibe slibe[QDIO_MAX_BUFFERS_PER_Q]; |
140 | } __attribute__ ((packed, aligned(2048))); | 140 | } __attribute__ ((packed, aligned(2048))); |
141 | 141 | ||
142 | /** | 142 | #define SBAL_EFLAGS_LAST_ENTRY 0x40 |
143 | * struct sbal_flags - storage block address list flags | 143 | #define SBAL_EFLAGS_CONTIGUOUS 0x20 |
144 | * @last: last entry | 144 | #define SBAL_EFLAGS_FIRST_FRAG 0x04 |
145 | * @cont: contiguous storage | 145 | #define SBAL_EFLAGS_MIDDLE_FRAG 0x08 |
146 | * @frag: fragmentation | 146 | #define SBAL_EFLAGS_LAST_FRAG 0x0c |
147 | */ | 147 | #define SBAL_EFLAGS_MASK 0x6f |
148 | struct sbal_flags { | ||
149 | u8 : 1; | ||
150 | u8 last : 1; | ||
151 | u8 cont : 1; | ||
152 | u8 : 1; | ||
153 | u8 frag : 2; | ||
154 | u8 : 2; | ||
155 | } __attribute__ ((packed)); | ||
156 | |||
157 | #define SBAL_FLAGS_FIRST_FRAG 0x04000000UL | ||
158 | #define SBAL_FLAGS_MIDDLE_FRAG 0x08000000UL | ||
159 | #define SBAL_FLAGS_LAST_FRAG 0x0c000000UL | ||
160 | #define SBAL_FLAGS_LAST_ENTRY 0x40000000UL | ||
161 | #define SBAL_FLAGS_CONTIGUOUS 0x20000000UL | ||
162 | 148 | ||
163 | #define SBAL_FLAGS0_DATA_CONTINUATION 0x20UL | 149 | #define SBAL_SFLAGS0_PCI_REQ 0x40 |
150 | #define SBAL_SFLAGS0_DATA_CONTINUATION 0x20 | ||
164 | 151 | ||
165 | /* Awesome OpenFCP extensions */ | 152 | /* Awesome OpenFCP extensions */ |
166 | #define SBAL_FLAGS0_TYPE_STATUS 0x00UL | 153 | #define SBAL_SFLAGS0_TYPE_STATUS 0x00 |
167 | #define SBAL_FLAGS0_TYPE_WRITE 0x08UL | 154 | #define SBAL_SFLAGS0_TYPE_WRITE 0x08 |
168 | #define SBAL_FLAGS0_TYPE_READ 0x10UL | 155 | #define SBAL_SFLAGS0_TYPE_READ 0x10 |
169 | #define SBAL_FLAGS0_TYPE_WRITE_READ 0x18UL | 156 | #define SBAL_SFLAGS0_TYPE_WRITE_READ 0x18 |
170 | #define SBAL_FLAGS0_MORE_SBALS 0x04UL | 157 | #define SBAL_SFLAGS0_MORE_SBALS 0x04 |
171 | #define SBAL_FLAGS0_COMMAND 0x02UL | 158 | #define SBAL_SFLAGS0_COMMAND 0x02 |
172 | #define SBAL_FLAGS0_LAST_SBAL 0x00UL | 159 | #define SBAL_SFLAGS0_LAST_SBAL 0x00 |
173 | #define SBAL_FLAGS0_ONLY_SBAL SBAL_FLAGS0_COMMAND | 160 | #define SBAL_SFLAGS0_ONLY_SBAL SBAL_SFLAGS0_COMMAND |
174 | #define SBAL_FLAGS0_MIDDLE_SBAL SBAL_FLAGS0_MORE_SBALS | 161 | #define SBAL_SFLAGS0_MIDDLE_SBAL SBAL_SFLAGS0_MORE_SBALS |
175 | #define SBAL_FLAGS0_FIRST_SBAL SBAL_FLAGS0_MORE_SBALS | SBAL_FLAGS0_COMMAND | 162 | #define SBAL_SFLAGS0_FIRST_SBAL (SBAL_SFLAGS0_MORE_SBALS | SBAL_SFLAGS0_COMMAND) |
176 | #define SBAL_FLAGS0_PCI 0x40 | ||
177 | |||
178 | /** | ||
179 | * struct sbal_sbalf_0 - sbal flags for sbale 0 | ||
180 | * @pci: PCI indicator | ||
181 | * @cont: data continuation | ||
182 | * @sbtype: storage-block type (FCP) | ||
183 | */ | ||
184 | struct sbal_sbalf_0 { | ||
185 | u8 : 1; | ||
186 | u8 pci : 1; | ||
187 | u8 cont : 1; | ||
188 | u8 sbtype : 2; | ||
189 | u8 : 3; | ||
190 | } __attribute__ ((packed)); | ||
191 | |||
192 | /** | ||
193 | * struct sbal_sbalf_1 - sbal flags for sbale 1 | ||
194 | * @key: storage key | ||
195 | */ | ||
196 | struct sbal_sbalf_1 { | ||
197 | u8 : 4; | ||
198 | u8 key : 4; | ||
199 | } __attribute__ ((packed)); | ||
200 | |||
201 | /** | ||
202 | * struct sbal_sbalf_14 - sbal flags for sbale 14 | ||
203 | * @erridx: error index | ||
204 | */ | ||
205 | struct sbal_sbalf_14 { | ||
206 | u8 : 4; | ||
207 | u8 erridx : 4; | ||
208 | } __attribute__ ((packed)); | ||
209 | |||
210 | /** | ||
211 | * struct sbal_sbalf_15 - sbal flags for sbale 15 | ||
212 | * @reason: reason for error state | ||
213 | */ | ||
214 | struct sbal_sbalf_15 { | ||
215 | u8 reason; | ||
216 | } __attribute__ ((packed)); | ||
217 | |||
218 | /** | ||
219 | * union sbal_sbalf - storage block address list flags | ||
220 | * @i0: sbalf0 | ||
221 | * @i1: sbalf1 | ||
222 | * @i14: sbalf14 | ||
223 | * @i15: sblaf15 | ||
224 | * @value: raw value | ||
225 | */ | ||
226 | union sbal_sbalf { | ||
227 | struct sbal_sbalf_0 i0; | ||
228 | struct sbal_sbalf_1 i1; | ||
229 | struct sbal_sbalf_14 i14; | ||
230 | struct sbal_sbalf_15 i15; | ||
231 | u8 value; | ||
232 | }; | ||
233 | 163 | ||
234 | /** | 164 | /** |
235 | * struct qdio_buffer_element - SBAL entry | 165 | * struct qdio_buffer_element - SBAL entry |
236 | * @flags: flags | 166 | * @eflags: SBAL entry flags |
167 | * @scount: SBAL count | ||
168 | * @sflags: whole SBAL flags | ||
237 | * @length: length | 169 | * @length: length |
238 | * @addr: address | 170 | * @addr: address |
239 | */ | 171 | */ |
240 | struct qdio_buffer_element { | 172 | struct qdio_buffer_element { |
241 | u32 flags; | 173 | u8 eflags; |
174 | /* private: */ | ||
175 | u8 res1; | ||
176 | /* public: */ | ||
177 | u8 scount; | ||
178 | u8 sflags; | ||
242 | u32 length; | 179 | u32 length; |
243 | #ifdef CONFIG_32BIT | 180 | #ifdef CONFIG_32BIT |
244 | /* private: */ | 181 | /* private: */ |
245 | void *reserved; | 182 | void *res2; |
246 | /* public: */ | 183 | /* public: */ |
247 | #endif | 184 | #endif |
248 | void *addr; | 185 | void *addr; |
diff --git a/arch/s390/include/asm/tlb.h b/arch/s390/include/asm/tlb.h index 77eee5477a5..c687a2c8346 100644 --- a/arch/s390/include/asm/tlb.h +++ b/arch/s390/include/asm/tlb.h | |||
@@ -26,67 +26,60 @@ | |||
26 | #include <linux/swap.h> | 26 | #include <linux/swap.h> |
27 | #include <asm/processor.h> | 27 | #include <asm/processor.h> |
28 | #include <asm/pgalloc.h> | 28 | #include <asm/pgalloc.h> |
29 | #include <asm/smp.h> | ||
30 | #include <asm/tlbflush.h> | 29 | #include <asm/tlbflush.h> |
31 | 30 | ||
32 | struct mmu_gather { | 31 | struct mmu_gather { |
33 | struct mm_struct *mm; | 32 | struct mm_struct *mm; |
33 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE | ||
34 | struct mmu_table_batch *batch; | ||
35 | #endif | ||
34 | unsigned int fullmm; | 36 | unsigned int fullmm; |
35 | unsigned int nr_ptes; | 37 | unsigned int need_flush; |
36 | unsigned int nr_pxds; | ||
37 | unsigned int max; | ||
38 | void **array; | ||
39 | void *local[8]; | ||
40 | }; | 38 | }; |
41 | 39 | ||
42 | static inline void __tlb_alloc_page(struct mmu_gather *tlb) | 40 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE |
43 | { | 41 | struct mmu_table_batch { |
44 | unsigned long addr = __get_free_pages(GFP_NOWAIT | __GFP_NOWARN, 0); | 42 | struct rcu_head rcu; |
43 | unsigned int nr; | ||
44 | void *tables[0]; | ||
45 | }; | ||
45 | 46 | ||
46 | if (addr) { | 47 | #define MAX_TABLE_BATCH \ |
47 | tlb->array = (void *) addr; | 48 | ((PAGE_SIZE - sizeof(struct mmu_table_batch)) / sizeof(void *)) |
48 | tlb->max = PAGE_SIZE / sizeof(void *); | 49 | |
49 | } | 50 | extern void tlb_table_flush(struct mmu_gather *tlb); |
50 | } | 51 | extern void tlb_remove_table(struct mmu_gather *tlb, void *table); |
52 | #endif | ||
51 | 53 | ||
52 | static inline void tlb_gather_mmu(struct mmu_gather *tlb, | 54 | static inline void tlb_gather_mmu(struct mmu_gather *tlb, |
53 | struct mm_struct *mm, | 55 | struct mm_struct *mm, |
54 | unsigned int full_mm_flush) | 56 | unsigned int full_mm_flush) |
55 | { | 57 | { |
56 | tlb->mm = mm; | 58 | tlb->mm = mm; |
57 | tlb->max = ARRAY_SIZE(tlb->local); | ||
58 | tlb->array = tlb->local; | ||
59 | tlb->fullmm = full_mm_flush; | 59 | tlb->fullmm = full_mm_flush; |
60 | tlb->need_flush = 0; | ||
61 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE | ||
62 | tlb->batch = NULL; | ||
63 | #endif | ||
60 | if (tlb->fullmm) | 64 | if (tlb->fullmm) |
61 | __tlb_flush_mm(mm); | 65 | __tlb_flush_mm(mm); |
62 | else | ||
63 | __tlb_alloc_page(tlb); | ||
64 | tlb->nr_ptes = 0; | ||
65 | tlb->nr_pxds = tlb->max; | ||
66 | } | 66 | } |
67 | 67 | ||
68 | static inline void tlb_flush_mmu(struct mmu_gather *tlb) | 68 | static inline void tlb_flush_mmu(struct mmu_gather *tlb) |
69 | { | 69 | { |
70 | if (!tlb->fullmm && (tlb->nr_ptes > 0 || tlb->nr_pxds < tlb->max)) | 70 | if (!tlb->need_flush) |
71 | __tlb_flush_mm(tlb->mm); | 71 | return; |
72 | while (tlb->nr_ptes > 0) | 72 | tlb->need_flush = 0; |
73 | page_table_free_rcu(tlb->mm, tlb->array[--tlb->nr_ptes]); | 73 | __tlb_flush_mm(tlb->mm); |
74 | while (tlb->nr_pxds < tlb->max) | 74 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE |
75 | crst_table_free_rcu(tlb->mm, tlb->array[tlb->nr_pxds++]); | 75 | tlb_table_flush(tlb); |
76 | #endif | ||
76 | } | 77 | } |
77 | 78 | ||
78 | static inline void tlb_finish_mmu(struct mmu_gather *tlb, | 79 | static inline void tlb_finish_mmu(struct mmu_gather *tlb, |
79 | unsigned long start, unsigned long end) | 80 | unsigned long start, unsigned long end) |
80 | { | 81 | { |
81 | tlb_flush_mmu(tlb); | 82 | tlb_flush_mmu(tlb); |
82 | |||
83 | rcu_table_freelist_finish(); | ||
84 | |||
85 | /* keep the page table cache within bounds */ | ||
86 | check_pgt_cache(); | ||
87 | |||
88 | if (tlb->array != tlb->local) | ||
89 | free_pages((unsigned long) tlb->array, 0); | ||
90 | } | 83 | } |
91 | 84 | ||
92 | /* | 85 | /* |
@@ -112,12 +105,11 @@ static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page) | |||
112 | static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, | 105 | static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, |
113 | unsigned long address) | 106 | unsigned long address) |
114 | { | 107 | { |
115 | if (!tlb->fullmm) { | 108 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE |
116 | tlb->array[tlb->nr_ptes++] = pte; | 109 | if (!tlb->fullmm) |
117 | if (tlb->nr_ptes >= tlb->nr_pxds) | 110 | return page_table_free_rcu(tlb, (unsigned long *) pte); |
118 | tlb_flush_mmu(tlb); | 111 | #endif |
119 | } else | 112 | page_table_free(tlb->mm, (unsigned long *) pte); |
120 | page_table_free(tlb->mm, (unsigned long *) pte); | ||
121 | } | 113 | } |
122 | 114 | ||
123 | /* | 115 | /* |
@@ -133,12 +125,11 @@ static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd, | |||
133 | #ifdef __s390x__ | 125 | #ifdef __s390x__ |
134 | if (tlb->mm->context.asce_limit <= (1UL << 31)) | 126 | if (tlb->mm->context.asce_limit <= (1UL << 31)) |
135 | return; | 127 | return; |
136 | if (!tlb->fullmm) { | 128 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE |
137 | tlb->array[--tlb->nr_pxds] = pmd; | 129 | if (!tlb->fullmm) |
138 | if (tlb->nr_ptes >= tlb->nr_pxds) | 130 | return tlb_remove_table(tlb, pmd); |
139 | tlb_flush_mmu(tlb); | 131 | #endif |
140 | } else | 132 | crst_table_free(tlb->mm, (unsigned long *) pmd); |
141 | crst_table_free(tlb->mm, (unsigned long *) pmd); | ||
142 | #endif | 133 | #endif |
143 | } | 134 | } |
144 | 135 | ||
@@ -155,12 +146,11 @@ static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud, | |||
155 | #ifdef __s390x__ | 146 | #ifdef __s390x__ |
156 | if (tlb->mm->context.asce_limit <= (1UL << 42)) | 147 | if (tlb->mm->context.asce_limit <= (1UL << 42)) |
157 | return; | 148 | return; |
158 | if (!tlb->fullmm) { | 149 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE |
159 | tlb->array[--tlb->nr_pxds] = pud; | 150 | if (!tlb->fullmm) |
160 | if (tlb->nr_ptes >= tlb->nr_pxds) | 151 | return tlb_remove_table(tlb, pud); |
161 | tlb_flush_mmu(tlb); | 152 | #endif |
162 | } else | 153 | crst_table_free(tlb->mm, (unsigned long *) pud); |
163 | crst_table_free(tlb->mm, (unsigned long *) pud); | ||
164 | #endif | 154 | #endif |
165 | } | 155 | } |
166 | 156 | ||
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 30ca85cce31..67345ae7ce8 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -731,6 +731,7 @@ static int __init kvm_s390_init(void) | |||
731 | } | 731 | } |
732 | memcpy(facilities, S390_lowcore.stfle_fac_list, 16); | 732 | memcpy(facilities, S390_lowcore.stfle_fac_list, 16); |
733 | facilities[0] &= 0xff00fff3f47c0000ULL; | 733 | facilities[0] &= 0xff00fff3f47c0000ULL; |
734 | facilities[1] &= 0x201c000000000000ULL; | ||
734 | return 0; | 735 | return 0; |
735 | } | 736 | } |
736 | 737 | ||
diff --git a/arch/s390/kvm/sie64a.S b/arch/s390/kvm/sie64a.S index ab0e041ac54..5faa1b1b23f 100644 --- a/arch/s390/kvm/sie64a.S +++ b/arch/s390/kvm/sie64a.S | |||
@@ -93,4 +93,6 @@ sie_err: | |||
93 | 93 | ||
94 | .section __ex_table,"a" | 94 | .section __ex_table,"a" |
95 | .quad sie_inst,sie_err | 95 | .quad sie_inst,sie_err |
96 | .quad sie_exit,sie_err | ||
97 | .quad sie_reenter,sie_err | ||
96 | .previous | 98 | .previous |
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index b09763fe5da..37a23c22370 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
@@ -24,94 +24,12 @@ | |||
24 | #include <asm/tlbflush.h> | 24 | #include <asm/tlbflush.h> |
25 | #include <asm/mmu_context.h> | 25 | #include <asm/mmu_context.h> |
26 | 26 | ||
27 | struct rcu_table_freelist { | ||
28 | struct rcu_head rcu; | ||
29 | struct mm_struct *mm; | ||
30 | unsigned int pgt_index; | ||
31 | unsigned int crst_index; | ||
32 | unsigned long *table[0]; | ||
33 | }; | ||
34 | |||
35 | #define RCU_FREELIST_SIZE \ | ||
36 | ((PAGE_SIZE - sizeof(struct rcu_table_freelist)) \ | ||
37 | / sizeof(unsigned long)) | ||
38 | |||
39 | static DEFINE_PER_CPU(struct rcu_table_freelist *, rcu_table_freelist); | ||
40 | |||
41 | static void __page_table_free(struct mm_struct *mm, unsigned long *table); | ||
42 | |||
43 | static struct rcu_table_freelist *rcu_table_freelist_get(struct mm_struct *mm) | ||
44 | { | ||
45 | struct rcu_table_freelist **batchp = &__get_cpu_var(rcu_table_freelist); | ||
46 | struct rcu_table_freelist *batch = *batchp; | ||
47 | |||
48 | if (batch) | ||
49 | return batch; | ||
50 | batch = (struct rcu_table_freelist *) __get_free_page(GFP_ATOMIC); | ||
51 | if (batch) { | ||
52 | batch->mm = mm; | ||
53 | batch->pgt_index = 0; | ||
54 | batch->crst_index = RCU_FREELIST_SIZE; | ||
55 | *batchp = batch; | ||
56 | } | ||
57 | return batch; | ||
58 | } | ||
59 | |||
60 | static void rcu_table_freelist_callback(struct rcu_head *head) | ||
61 | { | ||
62 | struct rcu_table_freelist *batch = | ||
63 | container_of(head, struct rcu_table_freelist, rcu); | ||
64 | |||
65 | while (batch->pgt_index > 0) | ||
66 | __page_table_free(batch->mm, batch->table[--batch->pgt_index]); | ||
67 | while (batch->crst_index < RCU_FREELIST_SIZE) | ||
68 | crst_table_free(batch->mm, batch->table[batch->crst_index++]); | ||
69 | free_page((unsigned long) batch); | ||
70 | } | ||
71 | |||
72 | void rcu_table_freelist_finish(void) | ||
73 | { | ||
74 | struct rcu_table_freelist **batchp = &get_cpu_var(rcu_table_freelist); | ||
75 | struct rcu_table_freelist *batch = *batchp; | ||
76 | |||
77 | if (!batch) | ||
78 | goto out; | ||
79 | call_rcu(&batch->rcu, rcu_table_freelist_callback); | ||
80 | *batchp = NULL; | ||
81 | out: | ||
82 | put_cpu_var(rcu_table_freelist); | ||
83 | } | ||
84 | |||
85 | static void smp_sync(void *arg) | ||
86 | { | ||
87 | } | ||
88 | |||
89 | #ifndef CONFIG_64BIT | 27 | #ifndef CONFIG_64BIT |
90 | #define ALLOC_ORDER 1 | 28 | #define ALLOC_ORDER 1 |
91 | #define TABLES_PER_PAGE 4 | 29 | #define FRAG_MASK 0x0f |
92 | #define FRAG_MASK 15UL | ||
93 | #define SECOND_HALVES 10UL | ||
94 | |||
95 | void clear_table_pgstes(unsigned long *table) | ||
96 | { | ||
97 | clear_table(table, _PAGE_TYPE_EMPTY, PAGE_SIZE/4); | ||
98 | memset(table + 256, 0, PAGE_SIZE/4); | ||
99 | clear_table(table + 512, _PAGE_TYPE_EMPTY, PAGE_SIZE/4); | ||
100 | memset(table + 768, 0, PAGE_SIZE/4); | ||
101 | } | ||
102 | |||
103 | #else | 30 | #else |
104 | #define ALLOC_ORDER 2 | 31 | #define ALLOC_ORDER 2 |
105 | #define TABLES_PER_PAGE 2 | 32 | #define FRAG_MASK 0x03 |
106 | #define FRAG_MASK 3UL | ||
107 | #define SECOND_HALVES 2UL | ||
108 | |||
109 | void clear_table_pgstes(unsigned long *table) | ||
110 | { | ||
111 | clear_table(table, _PAGE_TYPE_EMPTY, PAGE_SIZE/2); | ||
112 | memset(table + 256, 0, PAGE_SIZE/2); | ||
113 | } | ||
114 | |||
115 | #endif | 33 | #endif |
116 | 34 | ||
117 | unsigned long VMALLOC_START = VMALLOC_END - VMALLOC_SIZE; | 35 | unsigned long VMALLOC_START = VMALLOC_END - VMALLOC_SIZE; |
@@ -140,29 +58,6 @@ void crst_table_free(struct mm_struct *mm, unsigned long *table) | |||
140 | free_pages((unsigned long) table, ALLOC_ORDER); | 58 | free_pages((unsigned long) table, ALLOC_ORDER); |
141 | } | 59 | } |
142 | 60 | ||
143 | void crst_table_free_rcu(struct mm_struct *mm, unsigned long *table) | ||
144 | { | ||
145 | struct rcu_table_freelist *batch; | ||
146 | |||
147 | preempt_disable(); | ||
148 | if (atomic_read(&mm->mm_users) < 2 && | ||
149 | cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id()))) { | ||
150 | crst_table_free(mm, table); | ||
151 | goto out; | ||
152 | } | ||
153 | batch = rcu_table_freelist_get(mm); | ||
154 | if (!batch) { | ||
155 | smp_call_function(smp_sync, NULL, 1); | ||
156 | crst_table_free(mm, table); | ||
157 | goto out; | ||
158 | } | ||
159 | batch->table[--batch->crst_index] = table; | ||
160 | if (batch->pgt_index >= batch->crst_index) | ||
161 | rcu_table_freelist_finish(); | ||
162 | out: | ||
163 | preempt_enable(); | ||
164 | } | ||
165 | |||
166 | #ifdef CONFIG_64BIT | 61 | #ifdef CONFIG_64BIT |
167 | int crst_table_upgrade(struct mm_struct *mm, unsigned long limit) | 62 | int crst_table_upgrade(struct mm_struct *mm, unsigned long limit) |
168 | { | 63 | { |
@@ -238,124 +133,175 @@ void crst_table_downgrade(struct mm_struct *mm, unsigned long limit) | |||
238 | } | 133 | } |
239 | #endif | 134 | #endif |
240 | 135 | ||
136 | static inline unsigned int atomic_xor_bits(atomic_t *v, unsigned int bits) | ||
137 | { | ||
138 | unsigned int old, new; | ||
139 | |||
140 | do { | ||
141 | old = atomic_read(v); | ||
142 | new = old ^ bits; | ||
143 | } while (atomic_cmpxchg(v, old, new) != old); | ||
144 | return new; | ||
145 | } | ||
146 | |||
241 | /* | 147 | /* |
242 | * page table entry allocation/free routines. | 148 | * page table entry allocation/free routines. |
243 | */ | 149 | */ |
150 | #ifdef CONFIG_PGSTE | ||
151 | static inline unsigned long *page_table_alloc_pgste(struct mm_struct *mm) | ||
152 | { | ||
153 | struct page *page; | ||
154 | unsigned long *table; | ||
155 | |||
156 | page = alloc_page(GFP_KERNEL|__GFP_REPEAT); | ||
157 | if (!page) | ||
158 | return NULL; | ||
159 | pgtable_page_ctor(page); | ||
160 | atomic_set(&page->_mapcount, 3); | ||
161 | table = (unsigned long *) page_to_phys(page); | ||
162 | clear_table(table, _PAGE_TYPE_EMPTY, PAGE_SIZE/2); | ||
163 | clear_table(table + PTRS_PER_PTE, 0, PAGE_SIZE/2); | ||
164 | return table; | ||
165 | } | ||
166 | |||
167 | static inline void page_table_free_pgste(unsigned long *table) | ||
168 | { | ||
169 | struct page *page; | ||
170 | |||
171 | page = pfn_to_page(__pa(table) >> PAGE_SHIFT); | ||
172 | pgtable_page_ctor(page); | ||
173 | atomic_set(&page->_mapcount, -1); | ||
174 | __free_page(page); | ||
175 | } | ||
176 | #endif | ||
177 | |||
244 | unsigned long *page_table_alloc(struct mm_struct *mm) | 178 | unsigned long *page_table_alloc(struct mm_struct *mm) |
245 | { | 179 | { |
246 | struct page *page; | 180 | struct page *page; |
247 | unsigned long *table; | 181 | unsigned long *table; |
248 | unsigned long bits; | 182 | unsigned int mask, bit; |
249 | 183 | ||
250 | bits = (mm->context.has_pgste) ? 3UL : 1UL; | 184 | #ifdef CONFIG_PGSTE |
185 | if (mm_has_pgste(mm)) | ||
186 | return page_table_alloc_pgste(mm); | ||
187 | #endif | ||
188 | /* Allocate fragments of a 4K page as 1K/2K page table */ | ||
251 | spin_lock_bh(&mm->context.list_lock); | 189 | spin_lock_bh(&mm->context.list_lock); |
252 | page = NULL; | 190 | mask = FRAG_MASK; |
253 | if (!list_empty(&mm->context.pgtable_list)) { | 191 | if (!list_empty(&mm->context.pgtable_list)) { |
254 | page = list_first_entry(&mm->context.pgtable_list, | 192 | page = list_first_entry(&mm->context.pgtable_list, |
255 | struct page, lru); | 193 | struct page, lru); |
256 | if ((page->flags & FRAG_MASK) == ((1UL << TABLES_PER_PAGE) - 1)) | 194 | table = (unsigned long *) page_to_phys(page); |
257 | page = NULL; | 195 | mask = atomic_read(&page->_mapcount); |
196 | mask = mask | (mask >> 4); | ||
258 | } | 197 | } |
259 | if (!page) { | 198 | if ((mask & FRAG_MASK) == FRAG_MASK) { |
260 | spin_unlock_bh(&mm->context.list_lock); | 199 | spin_unlock_bh(&mm->context.list_lock); |
261 | page = alloc_page(GFP_KERNEL|__GFP_REPEAT); | 200 | page = alloc_page(GFP_KERNEL|__GFP_REPEAT); |
262 | if (!page) | 201 | if (!page) |
263 | return NULL; | 202 | return NULL; |
264 | pgtable_page_ctor(page); | 203 | pgtable_page_ctor(page); |
265 | page->flags &= ~FRAG_MASK; | 204 | atomic_set(&page->_mapcount, 1); |
266 | table = (unsigned long *) page_to_phys(page); | 205 | table = (unsigned long *) page_to_phys(page); |
267 | if (mm->context.has_pgste) | 206 | clear_table(table, _PAGE_TYPE_EMPTY, PAGE_SIZE); |
268 | clear_table_pgstes(table); | ||
269 | else | ||
270 | clear_table(table, _PAGE_TYPE_EMPTY, PAGE_SIZE); | ||
271 | spin_lock_bh(&mm->context.list_lock); | 207 | spin_lock_bh(&mm->context.list_lock); |
272 | list_add(&page->lru, &mm->context.pgtable_list); | 208 | list_add(&page->lru, &mm->context.pgtable_list); |
209 | } else { | ||
210 | for (bit = 1; mask & bit; bit <<= 1) | ||
211 | table += PTRS_PER_PTE; | ||
212 | mask = atomic_xor_bits(&page->_mapcount, bit); | ||
213 | if ((mask & FRAG_MASK) == FRAG_MASK) | ||
214 | list_del(&page->lru); | ||
273 | } | 215 | } |
274 | table = (unsigned long *) page_to_phys(page); | ||
275 | while (page->flags & bits) { | ||
276 | table += 256; | ||
277 | bits <<= 1; | ||
278 | } | ||
279 | page->flags |= bits; | ||
280 | if ((page->flags & FRAG_MASK) == ((1UL << TABLES_PER_PAGE) - 1)) | ||
281 | list_move_tail(&page->lru, &mm->context.pgtable_list); | ||
282 | spin_unlock_bh(&mm->context.list_lock); | 216 | spin_unlock_bh(&mm->context.list_lock); |
283 | return table; | 217 | return table; |
284 | } | 218 | } |
285 | 219 | ||
286 | static void __page_table_free(struct mm_struct *mm, unsigned long *table) | 220 | void page_table_free(struct mm_struct *mm, unsigned long *table) |
287 | { | 221 | { |
288 | struct page *page; | 222 | struct page *page; |
289 | unsigned long bits; | 223 | unsigned int bit, mask; |
290 | 224 | ||
291 | bits = ((unsigned long) table) & 15; | 225 | #ifdef CONFIG_PGSTE |
292 | table = (unsigned long *)(((unsigned long) table) ^ bits); | 226 | if (mm_has_pgste(mm)) |
227 | return page_table_free_pgste(table); | ||
228 | #endif | ||
229 | /* Free 1K/2K page table fragment of a 4K page */ | ||
293 | page = pfn_to_page(__pa(table) >> PAGE_SHIFT); | 230 | page = pfn_to_page(__pa(table) >> PAGE_SHIFT); |
294 | page->flags ^= bits; | 231 | bit = 1 << ((__pa(table) & ~PAGE_MASK)/(PTRS_PER_PTE*sizeof(pte_t))); |
295 | if (!(page->flags & FRAG_MASK)) { | 232 | spin_lock_bh(&mm->context.list_lock); |
233 | if ((atomic_read(&page->_mapcount) & FRAG_MASK) != FRAG_MASK) | ||
234 | list_del(&page->lru); | ||
235 | mask = atomic_xor_bits(&page->_mapcount, bit); | ||
236 | if (mask & FRAG_MASK) | ||
237 | list_add(&page->lru, &mm->context.pgtable_list); | ||
238 | spin_unlock_bh(&mm->context.list_lock); | ||
239 | if (mask == 0) { | ||
296 | pgtable_page_dtor(page); | 240 | pgtable_page_dtor(page); |
241 | atomic_set(&page->_mapcount, -1); | ||
297 | __free_page(page); | 242 | __free_page(page); |
298 | } | 243 | } |
299 | } | 244 | } |
300 | 245 | ||
301 | void page_table_free(struct mm_struct *mm, unsigned long *table) | 246 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE |
247 | |||
248 | static void __page_table_free_rcu(void *table, unsigned bit) | ||
302 | { | 249 | { |
303 | struct page *page; | 250 | struct page *page; |
304 | unsigned long bits; | ||
305 | 251 | ||
306 | bits = (mm->context.has_pgste) ? 3UL : 1UL; | 252 | #ifdef CONFIG_PGSTE |
307 | bits <<= (__pa(table) & (PAGE_SIZE - 1)) / 256 / sizeof(unsigned long); | 253 | if (bit == FRAG_MASK) |
254 | return page_table_free_pgste(table); | ||
255 | #endif | ||
256 | /* Free 1K/2K page table fragment of a 4K page */ | ||
308 | page = pfn_to_page(__pa(table) >> PAGE_SHIFT); | 257 | page = pfn_to_page(__pa(table) >> PAGE_SHIFT); |
309 | spin_lock_bh(&mm->context.list_lock); | 258 | if (atomic_xor_bits(&page->_mapcount, bit) == 0) { |
310 | page->flags ^= bits; | ||
311 | if (page->flags & FRAG_MASK) { | ||
312 | /* Page now has some free pgtable fragments. */ | ||
313 | if (!list_empty(&page->lru)) | ||
314 | list_move(&page->lru, &mm->context.pgtable_list); | ||
315 | page = NULL; | ||
316 | } else | ||
317 | /* All fragments of the 4K page have been freed. */ | ||
318 | list_del(&page->lru); | ||
319 | spin_unlock_bh(&mm->context.list_lock); | ||
320 | if (page) { | ||
321 | pgtable_page_dtor(page); | 259 | pgtable_page_dtor(page); |
260 | atomic_set(&page->_mapcount, -1); | ||
322 | __free_page(page); | 261 | __free_page(page); |
323 | } | 262 | } |
324 | } | 263 | } |
325 | 264 | ||
326 | void page_table_free_rcu(struct mm_struct *mm, unsigned long *table) | 265 | void page_table_free_rcu(struct mmu_gather *tlb, unsigned long *table) |
327 | { | 266 | { |
328 | struct rcu_table_freelist *batch; | 267 | struct mm_struct *mm; |
329 | struct page *page; | 268 | struct page *page; |
330 | unsigned long bits; | 269 | unsigned int bit, mask; |
331 | 270 | ||
332 | preempt_disable(); | 271 | mm = tlb->mm; |
333 | if (atomic_read(&mm->mm_users) < 2 && | 272 | #ifdef CONFIG_PGSTE |
334 | cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id()))) { | 273 | if (mm_has_pgste(mm)) { |
335 | page_table_free(mm, table); | 274 | table = (unsigned long *) (__pa(table) | FRAG_MASK); |
336 | goto out; | 275 | tlb_remove_table(tlb, table); |
337 | } | 276 | return; |
338 | batch = rcu_table_freelist_get(mm); | ||
339 | if (!batch) { | ||
340 | smp_call_function(smp_sync, NULL, 1); | ||
341 | page_table_free(mm, table); | ||
342 | goto out; | ||
343 | } | 277 | } |
344 | bits = (mm->context.has_pgste) ? 3UL : 1UL; | 278 | #endif |
345 | bits <<= (__pa(table) & (PAGE_SIZE - 1)) / 256 / sizeof(unsigned long); | 279 | bit = 1 << ((__pa(table) & ~PAGE_MASK) / (PTRS_PER_PTE*sizeof(pte_t))); |
346 | page = pfn_to_page(__pa(table) >> PAGE_SHIFT); | 280 | page = pfn_to_page(__pa(table) >> PAGE_SHIFT); |
347 | spin_lock_bh(&mm->context.list_lock); | 281 | spin_lock_bh(&mm->context.list_lock); |
348 | /* Delayed freeing with rcu prevents reuse of pgtable fragments */ | 282 | if ((atomic_read(&page->_mapcount) & FRAG_MASK) != FRAG_MASK) |
349 | list_del_init(&page->lru); | 283 | list_del(&page->lru); |
284 | mask = atomic_xor_bits(&page->_mapcount, bit | (bit << 4)); | ||
285 | if (mask & FRAG_MASK) | ||
286 | list_add_tail(&page->lru, &mm->context.pgtable_list); | ||
350 | spin_unlock_bh(&mm->context.list_lock); | 287 | spin_unlock_bh(&mm->context.list_lock); |
351 | table = (unsigned long *)(((unsigned long) table) | bits); | 288 | table = (unsigned long *) (__pa(table) | (bit << 4)); |
352 | batch->table[batch->pgt_index++] = table; | 289 | tlb_remove_table(tlb, table); |
353 | if (batch->pgt_index >= batch->crst_index) | ||
354 | rcu_table_freelist_finish(); | ||
355 | out: | ||
356 | preempt_enable(); | ||
357 | } | 290 | } |
358 | 291 | ||
292 | void __tlb_remove_table(void *_table) | ||
293 | { | ||
294 | void *table = (void *)((unsigned long) _table & PAGE_MASK); | ||
295 | unsigned type = (unsigned long) _table & ~PAGE_MASK; | ||
296 | |||
297 | if (type) | ||
298 | __page_table_free_rcu(table, type); | ||
299 | else | ||
300 | free_pages((unsigned long) table, ALLOC_ORDER); | ||
301 | } | ||
302 | |||
303 | #endif | ||
304 | |||
359 | /* | 305 | /* |
360 | * switch on pgstes for its userspace process (for kvm) | 306 | * switch on pgstes for its userspace process (for kvm) |
361 | */ | 307 | */ |
@@ -369,7 +315,7 @@ int s390_enable_sie(void) | |||
369 | return -EINVAL; | 315 | return -EINVAL; |
370 | 316 | ||
371 | /* Do we have pgstes? if yes, we are done */ | 317 | /* Do we have pgstes? if yes, we are done */ |
372 | if (tsk->mm->context.has_pgste) | 318 | if (mm_has_pgste(tsk->mm)) |
373 | return 0; | 319 | return 0; |
374 | 320 | ||
375 | /* lets check if we are allowed to replace the mm */ | 321 | /* lets check if we are allowed to replace the mm */ |
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index af32e17fa17..253986bd6bb 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
@@ -26,7 +26,6 @@ config SPARC | |||
26 | select HAVE_DMA_API_DEBUG | 26 | select HAVE_DMA_API_DEBUG |
27 | select HAVE_ARCH_JUMP_LABEL | 27 | select HAVE_ARCH_JUMP_LABEL |
28 | select HAVE_GENERIC_HARDIRQS | 28 | select HAVE_GENERIC_HARDIRQS |
29 | select GENERIC_HARDIRQS_NO_DEPRECATED | ||
30 | select GENERIC_IRQ_SHOW | 29 | select GENERIC_IRQ_SHOW |
31 | select USE_GENERIC_SMP_HELPERS if SMP | 30 | select USE_GENERIC_SMP_HELPERS if SMP |
32 | 31 | ||
@@ -528,6 +527,23 @@ config PCI_DOMAINS | |||
528 | config PCI_SYSCALL | 527 | config PCI_SYSCALL |
529 | def_bool PCI | 528 | def_bool PCI |
530 | 529 | ||
530 | config PCIC_PCI | ||
531 | bool | ||
532 | depends on PCI && SPARC32 && !SPARC_LEON | ||
533 | default y | ||
534 | |||
535 | config LEON_PCI | ||
536 | bool | ||
537 | depends on PCI && SPARC_LEON | ||
538 | default y | ||
539 | |||
540 | config GRPCI2 | ||
541 | bool "GRPCI2 Host Bridge Support" | ||
542 | depends on LEON_PCI | ||
543 | default y | ||
544 | help | ||
545 | Say Y here to include the GRPCI2 Host Bridge Driver. | ||
546 | |||
531 | source "drivers/pci/Kconfig" | 547 | source "drivers/pci/Kconfig" |
532 | 548 | ||
533 | source "drivers/pcmcia/Kconfig" | 549 | source "drivers/pcmcia/Kconfig" |
diff --git a/arch/sparc/include/asm/floppy_32.h b/arch/sparc/include/asm/floppy_32.h index 482c79e2a41..7440915e86d 100644 --- a/arch/sparc/include/asm/floppy_32.h +++ b/arch/sparc/include/asm/floppy_32.h | |||
@@ -138,7 +138,7 @@ static unsigned char sun_82072_fd_inb(int port) | |||
138 | return sun_fdc->data_82072; | 138 | return sun_fdc->data_82072; |
139 | case 7: /* FD_DIR */ | 139 | case 7: /* FD_DIR */ |
140 | return sun_read_dir(); | 140 | return sun_read_dir(); |
141 | }; | 141 | } |
142 | panic("sun_82072_fd_inb: How did I get here?"); | 142 | panic("sun_82072_fd_inb: How did I get here?"); |
143 | } | 143 | } |
144 | 144 | ||
@@ -161,7 +161,7 @@ static void sun_82072_fd_outb(unsigned char value, int port) | |||
161 | case 4: /* FD_STATUS */ | 161 | case 4: /* FD_STATUS */ |
162 | sun_fdc->status_82072 = value; | 162 | sun_fdc->status_82072 = value; |
163 | break; | 163 | break; |
164 | }; | 164 | } |
165 | return; | 165 | return; |
166 | } | 166 | } |
167 | 167 | ||
@@ -186,7 +186,7 @@ static unsigned char sun_82077_fd_inb(int port) | |||
186 | return sun_fdc->data_82077; | 186 | return sun_fdc->data_82077; |
187 | case 7: /* FD_DIR */ | 187 | case 7: /* FD_DIR */ |
188 | return sun_read_dir(); | 188 | return sun_read_dir(); |
189 | }; | 189 | } |
190 | panic("sun_82077_fd_inb: How did I get here?"); | 190 | panic("sun_82077_fd_inb: How did I get here?"); |
191 | } | 191 | } |
192 | 192 | ||
@@ -212,7 +212,7 @@ static void sun_82077_fd_outb(unsigned char value, int port) | |||
212 | case 3: /* FD_TDR */ | 212 | case 3: /* FD_TDR */ |
213 | sun_fdc->tapectl_82077 = value; | 213 | sun_fdc->tapectl_82077 = value; |
214 | break; | 214 | break; |
215 | }; | 215 | } |
216 | return; | 216 | return; |
217 | } | 217 | } |
218 | 218 | ||
diff --git a/arch/sparc/include/asm/floppy_64.h b/arch/sparc/include/asm/floppy_64.h index 6597ce874d7..bcef1f5a2a6 100644 --- a/arch/sparc/include/asm/floppy_64.h +++ b/arch/sparc/include/asm/floppy_64.h | |||
@@ -111,7 +111,7 @@ static unsigned char sun_82077_fd_inb(unsigned long port) | |||
111 | case 7: /* FD_DIR */ | 111 | case 7: /* FD_DIR */ |
112 | /* XXX: Is DCL on 0x80 in sun4m? */ | 112 | /* XXX: Is DCL on 0x80 in sun4m? */ |
113 | return sbus_readb(&sun_fdc->dir_82077); | 113 | return sbus_readb(&sun_fdc->dir_82077); |
114 | }; | 114 | } |
115 | panic("sun_82072_fd_inb: How did I get here?"); | 115 | panic("sun_82072_fd_inb: How did I get here?"); |
116 | } | 116 | } |
117 | 117 | ||
@@ -135,7 +135,7 @@ static void sun_82077_fd_outb(unsigned char value, unsigned long port) | |||
135 | case 4: /* FD_STATUS */ | 135 | case 4: /* FD_STATUS */ |
136 | sbus_writeb(value, &sun_fdc->status_82077); | 136 | sbus_writeb(value, &sun_fdc->status_82077); |
137 | break; | 137 | break; |
138 | }; | 138 | } |
139 | return; | 139 | return; |
140 | } | 140 | } |
141 | 141 | ||
diff --git a/arch/sparc/include/asm/leon.h b/arch/sparc/include/asm/leon.h index 6bdaf1e43d2..a4e457f003e 100644 --- a/arch/sparc/include/asm/leon.h +++ b/arch/sparc/include/asm/leon.h | |||
@@ -318,6 +318,9 @@ struct device_node; | |||
318 | extern unsigned int leon_build_device_irq(unsigned int real_irq, | 318 | extern unsigned int leon_build_device_irq(unsigned int real_irq, |
319 | irq_flow_handler_t flow_handler, | 319 | irq_flow_handler_t flow_handler, |
320 | const char *name, int do_ack); | 320 | const char *name, int do_ack); |
321 | extern void leon_update_virq_handling(unsigned int virq, | ||
322 | irq_flow_handler_t flow_handler, | ||
323 | const char *name, int do_ack); | ||
321 | extern void leon_clear_clock_irq(void); | 324 | extern void leon_clear_clock_irq(void); |
322 | extern void leon_load_profile_irq(int cpu, unsigned int limit); | 325 | extern void leon_load_profile_irq(int cpu, unsigned int limit); |
323 | extern void leon_init_timers(irq_handler_t counter_fn); | 326 | extern void leon_init_timers(irq_handler_t counter_fn); |
diff --git a/arch/sparc/include/asm/leon_pci.h b/arch/sparc/include/asm/leon_pci.h new file mode 100644 index 00000000000..42b4b31a82f --- /dev/null +++ b/arch/sparc/include/asm/leon_pci.h | |||
@@ -0,0 +1,21 @@ | |||
1 | /* | ||
2 | * asm/leon_pci.h | ||
3 | * | ||
4 | * Copyright (C) 2011 Aeroflex Gaisler AB, Daniel Hellstrom | ||
5 | */ | ||
6 | |||
7 | #ifndef _ASM_LEON_PCI_H_ | ||
8 | #define _ASM_LEON_PCI_H_ | ||
9 | |||
10 | /* PCI related definitions */ | ||
11 | struct leon_pci_info { | ||
12 | struct pci_ops *ops; | ||
13 | struct resource io_space; | ||
14 | struct resource mem_space; | ||
15 | int (*map_irq)(struct pci_dev *dev, u8 slot, u8 pin); | ||
16 | }; | ||
17 | |||
18 | extern void leon_pci_init(struct platform_device *ofdev, | ||
19 | struct leon_pci_info *info); | ||
20 | |||
21 | #endif /* _ASM_LEON_PCI_H_ */ | ||
diff --git a/arch/sparc/include/asm/pci_32.h b/arch/sparc/include/asm/pci_32.h index 332ac9ab36b..862e3ce92b1 100644 --- a/arch/sparc/include/asm/pci_32.h +++ b/arch/sparc/include/asm/pci_32.h | |||
@@ -47,7 +47,31 @@ extern struct device_node *pci_device_to_OF_node(struct pci_dev *pdev); | |||
47 | 47 | ||
48 | #endif /* __KERNEL__ */ | 48 | #endif /* __KERNEL__ */ |
49 | 49 | ||
50 | #ifndef CONFIG_LEON_PCI | ||
50 | /* generic pci stuff */ | 51 | /* generic pci stuff */ |
51 | #include <asm-generic/pci.h> | 52 | #include <asm-generic/pci.h> |
53 | #else | ||
54 | /* | ||
55 | * On LEON PCI Memory space is mapped 1:1 with physical address space. | ||
56 | * | ||
57 | * I/O space is located at low 64Kbytes in PCI I/O space. The I/O addresses | ||
58 | * are converted into CPU addresses to virtual addresses that are mapped with | ||
59 | * MMU to the PCI Host PCI I/O space window which are translated to the low | ||
60 | * 64Kbytes by the Host controller. | ||
61 | */ | ||
62 | |||
63 | extern void | ||
64 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
65 | struct resource *res); | ||
66 | |||
67 | extern void | ||
68 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
69 | struct pci_bus_region *region); | ||
70 | |||
71 | static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) | ||
72 | { | ||
73 | return PCI_IRQ_NONE; | ||
74 | } | ||
75 | #endif | ||
52 | 76 | ||
53 | #endif /* __SPARC_PCI_H */ | 77 | #endif /* __SPARC_PCI_H */ |
diff --git a/arch/sparc/include/asm/pcic.h b/arch/sparc/include/asm/pcic.h index 7eb5d78f521..6676cbcc8b6 100644 --- a/arch/sparc/include/asm/pcic.h +++ b/arch/sparc/include/asm/pcic.h | |||
@@ -29,7 +29,7 @@ struct linux_pcic { | |||
29 | int pcic_imdim; | 29 | int pcic_imdim; |
30 | }; | 30 | }; |
31 | 31 | ||
32 | #ifdef CONFIG_PCI | 32 | #ifdef CONFIG_PCIC_PCI |
33 | extern int pcic_present(void); | 33 | extern int pcic_present(void); |
34 | extern int pcic_probe(void); | 34 | extern int pcic_probe(void); |
35 | extern void pci_time_init(void); | 35 | extern void pci_time_init(void); |
diff --git a/arch/sparc/include/asm/system_32.h b/arch/sparc/include/asm/system_32.h index 47a7e862474..aba16092a81 100644 --- a/arch/sparc/include/asm/system_32.h +++ b/arch/sparc/include/asm/system_32.h | |||
@@ -220,7 +220,7 @@ static inline unsigned long __xchg(unsigned long x, __volatile__ void * ptr, int | |||
220 | switch (size) { | 220 | switch (size) { |
221 | case 4: | 221 | case 4: |
222 | return xchg_u32(ptr, x); | 222 | return xchg_u32(ptr, x); |
223 | }; | 223 | } |
224 | __xchg_called_with_bad_pointer(); | 224 | __xchg_called_with_bad_pointer(); |
225 | return x; | 225 | return x; |
226 | } | 226 | } |
diff --git a/arch/sparc/include/asm/system_64.h b/arch/sparc/include/asm/system_64.h index 3c96d3bb9f1..10bcabce97b 100644 --- a/arch/sparc/include/asm/system_64.h +++ b/arch/sparc/include/asm/system_64.h | |||
@@ -234,7 +234,7 @@ static inline unsigned long __xchg(unsigned long x, __volatile__ void * ptr, | |||
234 | return xchg32(ptr, x); | 234 | return xchg32(ptr, x); |
235 | case 8: | 235 | case 8: |
236 | return xchg64(ptr, x); | 236 | return xchg64(ptr, x); |
237 | }; | 237 | } |
238 | __xchg_called_with_bad_pointer(); | 238 | __xchg_called_with_bad_pointer(); |
239 | return x; | 239 | return x; |
240 | } | 240 | } |
diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile index 9cff2709a96..b90b4a1d070 100644 --- a/arch/sparc/kernel/Makefile +++ b/arch/sparc/kernel/Makefile | |||
@@ -73,7 +73,9 @@ obj-$(CONFIG_SPARC64_SMP) += cpumap.o | |||
73 | 73 | ||
74 | obj-y += dma.o | 74 | obj-y += dma.o |
75 | 75 | ||
76 | obj-$(CONFIG_SPARC32_PCI) += pcic.o | 76 | obj-$(CONFIG_PCIC_PCI) += pcic.o |
77 | obj-$(CONFIG_LEON_PCI) += leon_pci.o | ||
78 | obj-$(CONFIG_GRPCI2) += leon_pci_grpci2.o | ||
77 | 79 | ||
78 | obj-$(CONFIG_SMP) += trampoline_$(BITS).o smp_$(BITS).o | 80 | obj-$(CONFIG_SMP) += trampoline_$(BITS).o smp_$(BITS).o |
79 | obj-$(CONFIG_SPARC32_SMP) += sun4m_smp.o sun4d_smp.o leon_smp.o | 81 | obj-$(CONFIG_SPARC32_SMP) += sun4m_smp.o sun4d_smp.o leon_smp.o |
diff --git a/arch/sparc/kernel/apc.c b/arch/sparc/kernel/apc.c index 1e34f29e58b..caef9deb586 100644 --- a/arch/sparc/kernel/apc.c +++ b/arch/sparc/kernel/apc.c | |||
@@ -123,7 +123,7 @@ static long apc_ioctl(struct file *f, unsigned int cmd, unsigned long __arg) | |||
123 | 123 | ||
124 | default: | 124 | default: |
125 | return -EINVAL; | 125 | return -EINVAL; |
126 | }; | 126 | } |
127 | 127 | ||
128 | return 0; | 128 | return 0; |
129 | } | 129 | } |
diff --git a/arch/sparc/kernel/auxio_32.c b/arch/sparc/kernel/auxio_32.c index 8505e0ac78b..acf5151f3c1 100644 --- a/arch/sparc/kernel/auxio_32.c +++ b/arch/sparc/kernel/auxio_32.c | |||
@@ -101,7 +101,7 @@ void set_auxio(unsigned char bits_on, unsigned char bits_off) | |||
101 | break; | 101 | break; |
102 | default: | 102 | default: |
103 | panic("Can't set AUXIO register on this machine."); | 103 | panic("Can't set AUXIO register on this machine."); |
104 | }; | 104 | } |
105 | spin_unlock_irqrestore(&auxio_lock, flags); | 105 | spin_unlock_irqrestore(&auxio_lock, flags); |
106 | } | 106 | } |
107 | EXPORT_SYMBOL(set_auxio); | 107 | EXPORT_SYMBOL(set_auxio); |
diff --git a/arch/sparc/kernel/chmc.c b/arch/sparc/kernel/chmc.c index 668c7be5d36..5f450260981 100644 --- a/arch/sparc/kernel/chmc.c +++ b/arch/sparc/kernel/chmc.c | |||
@@ -664,7 +664,7 @@ static void chmc_interpret_one_decode_reg(struct chmc *p, int which_bank, u64 va | |||
664 | case 0x0: | 664 | case 0x0: |
665 | bp->interleave = 16; | 665 | bp->interleave = 16; |
666 | break; | 666 | break; |
667 | }; | 667 | } |
668 | 668 | ||
669 | /* UK[10] is reserved, and UK[11] is not set for the SDRAM | 669 | /* UK[10] is reserved, and UK[11] is not set for the SDRAM |
670 | * bank size definition. | 670 | * bank size definition. |
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S index 8341963f4c8..9fe08a1ea6c 100644 --- a/arch/sparc/kernel/entry.S +++ b/arch/sparc/kernel/entry.S | |||
@@ -229,7 +229,7 @@ real_irq_entry: | |||
229 | #ifdef CONFIG_SMP | 229 | #ifdef CONFIG_SMP |
230 | .globl patchme_maybe_smp_msg | 230 | .globl patchme_maybe_smp_msg |
231 | 231 | ||
232 | cmp %l7, 12 | 232 | cmp %l7, 11 |
233 | patchme_maybe_smp_msg: | 233 | patchme_maybe_smp_msg: |
234 | bgu maybe_smp4m_msg | 234 | bgu maybe_smp4m_msg |
235 | nop | 235 | nop |
@@ -293,7 +293,7 @@ maybe_smp4m_msg: | |||
293 | WRITE_PAUSE | 293 | WRITE_PAUSE |
294 | wr %l4, PSR_ET, %psr | 294 | wr %l4, PSR_ET, %psr |
295 | WRITE_PAUSE | 295 | WRITE_PAUSE |
296 | sll %o2, 28, %o2 ! shift for simpler checks below | 296 | sll %o3, 28, %o2 ! shift for simpler checks below |
297 | maybe_smp4m_msg_check_single: | 297 | maybe_smp4m_msg_check_single: |
298 | andcc %o2, 0x1, %g0 | 298 | andcc %o2, 0x1, %g0 |
299 | beq,a maybe_smp4m_msg_check_mask | 299 | beq,a maybe_smp4m_msg_check_mask |
@@ -1604,7 +1604,7 @@ restore_current: | |||
1604 | retl | 1604 | retl |
1605 | nop | 1605 | nop |
1606 | 1606 | ||
1607 | #ifdef CONFIG_PCI | 1607 | #ifdef CONFIG_PCIC_PCI |
1608 | #include <asm/pcic.h> | 1608 | #include <asm/pcic.h> |
1609 | 1609 | ||
1610 | .align 4 | 1610 | .align 4 |
@@ -1650,7 +1650,7 @@ pcic_nmi_trap_patch: | |||
1650 | rd %psr, %l0 | 1650 | rd %psr, %l0 |
1651 | .word 0 | 1651 | .word 0 |
1652 | 1652 | ||
1653 | #endif /* CONFIG_PCI */ | 1653 | #endif /* CONFIG_PCIC_PCI */ |
1654 | 1654 | ||
1655 | .globl flushw_all | 1655 | .globl flushw_all |
1656 | flushw_all: | 1656 | flushw_all: |
diff --git a/arch/sparc/kernel/leon_kernel.c b/arch/sparc/kernel/leon_kernel.c index 2f538ac2e13..d17255a2bba 100644 --- a/arch/sparc/kernel/leon_kernel.c +++ b/arch/sparc/kernel/leon_kernel.c | |||
@@ -236,6 +236,21 @@ static unsigned int _leon_build_device_irq(struct platform_device *op, | |||
236 | return leon_build_device_irq(real_irq, handle_simple_irq, "edge", 0); | 236 | return leon_build_device_irq(real_irq, handle_simple_irq, "edge", 0); |
237 | } | 237 | } |
238 | 238 | ||
239 | void leon_update_virq_handling(unsigned int virq, | ||
240 | irq_flow_handler_t flow_handler, | ||
241 | const char *name, int do_ack) | ||
242 | { | ||
243 | unsigned long mask = (unsigned long)irq_get_chip_data(virq); | ||
244 | |||
245 | mask &= ~LEON_DO_ACK_HW; | ||
246 | if (do_ack) | ||
247 | mask |= LEON_DO_ACK_HW; | ||
248 | |||
249 | irq_set_chip_and_handler_name(virq, &leon_irq, | ||
250 | flow_handler, name); | ||
251 | irq_set_chip_data(virq, (void *)mask); | ||
252 | } | ||
253 | |||
239 | void __init leon_init_timers(irq_handler_t counter_fn) | 254 | void __init leon_init_timers(irq_handler_t counter_fn) |
240 | { | 255 | { |
241 | int irq, eirq; | 256 | int irq, eirq; |
@@ -361,6 +376,22 @@ void __init leon_init_timers(irq_handler_t counter_fn) | |||
361 | prom_halt(); | 376 | prom_halt(); |
362 | } | 377 | } |
363 | 378 | ||
379 | #ifdef CONFIG_SMP | ||
380 | { | ||
381 | unsigned long flags; | ||
382 | |||
383 | /* | ||
384 | * In SMP, sun4m adds a IPI handler to IRQ trap handler that | ||
385 | * LEON never must take, sun4d and LEON overwrites the branch | ||
386 | * with a NOP. | ||
387 | */ | ||
388 | local_irq_save(flags); | ||
389 | patchme_maybe_smp_msg[0] = 0x01000000; /* NOP out the branch */ | ||
390 | local_flush_cache_all(); | ||
391 | local_irq_restore(flags); | ||
392 | } | ||
393 | #endif | ||
394 | |||
364 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[leon3_gptimer_idx].ctrl, | 395 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[leon3_gptimer_idx].ctrl, |
365 | LEON3_GPTIMER_EN | | 396 | LEON3_GPTIMER_EN | |
366 | LEON3_GPTIMER_RL | | 397 | LEON3_GPTIMER_RL | |
diff --git a/arch/sparc/kernel/leon_pci.c b/arch/sparc/kernel/leon_pci.c new file mode 100644 index 00000000000..a8a9a275037 --- /dev/null +++ b/arch/sparc/kernel/leon_pci.c | |||
@@ -0,0 +1,253 @@ | |||
1 | /* | ||
2 | * leon_pci.c: LEON Host PCI support | ||
3 | * | ||
4 | * Copyright (C) 2011 Aeroflex Gaisler AB, Daniel Hellstrom | ||
5 | * | ||
6 | * Code is partially derived from pcic.c | ||
7 | */ | ||
8 | |||
9 | #include <linux/of_device.h> | ||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/pci.h> | ||
12 | #include <asm/leon.h> | ||
13 | #include <asm/leon_pci.h> | ||
14 | |||
15 | /* The LEON architecture does not rely on a BIOS or bootloader to setup | ||
16 | * PCI for us. The Linux generic routines are used to setup resources, | ||
17 | * reset values of confuration-space registers settings ae preseved. | ||
18 | */ | ||
19 | void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info) | ||
20 | { | ||
21 | struct pci_bus *root_bus; | ||
22 | |||
23 | root_bus = pci_scan_bus_parented(&ofdev->dev, 0, info->ops, info); | ||
24 | if (root_bus) { | ||
25 | root_bus->resource[0] = &info->io_space; | ||
26 | root_bus->resource[1] = &info->mem_space; | ||
27 | root_bus->resource[2] = NULL; | ||
28 | |||
29 | /* Init all PCI devices into PCI tree */ | ||
30 | pci_bus_add_devices(root_bus); | ||
31 | |||
32 | /* Setup IRQs of all devices using custom routines */ | ||
33 | pci_fixup_irqs(pci_common_swizzle, info->map_irq); | ||
34 | |||
35 | /* Assign devices with resources */ | ||
36 | pci_assign_unassigned_resources(); | ||
37 | } | ||
38 | } | ||
39 | |||
40 | /* PCI Memory and Prefetchable Memory is direct-mapped. However I/O Space is | ||
41 | * accessed through a Window which is translated to low 64KB in PCI space, the | ||
42 | * first 4KB is not used so 60KB is available. | ||
43 | * | ||
44 | * This function is used by generic code to translate resource addresses into | ||
45 | * PCI addresses. | ||
46 | */ | ||
47 | void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
48 | struct resource *res) | ||
49 | { | ||
50 | struct leon_pci_info *info = dev->bus->sysdata; | ||
51 | |||
52 | region->start = res->start; | ||
53 | region->end = res->end; | ||
54 | |||
55 | if (res->flags & IORESOURCE_IO) { | ||
56 | region->start -= (info->io_space.start - 0x1000); | ||
57 | region->end -= (info->io_space.start - 0x1000); | ||
58 | } | ||
59 | } | ||
60 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
61 | |||
62 | /* see pcibios_resource_to_bus() comment */ | ||
63 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
64 | struct pci_bus_region *region) | ||
65 | { | ||
66 | struct leon_pci_info *info = dev->bus->sysdata; | ||
67 | |||
68 | res->start = region->start; | ||
69 | res->end = region->end; | ||
70 | |||
71 | if (res->flags & IORESOURCE_IO) { | ||
72 | res->start += (info->io_space.start - 0x1000); | ||
73 | res->end += (info->io_space.start - 0x1000); | ||
74 | } | ||
75 | } | ||
76 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
77 | |||
78 | void __devinit pcibios_fixup_bus(struct pci_bus *pbus) | ||
79 | { | ||
80 | struct leon_pci_info *info = pbus->sysdata; | ||
81 | struct pci_dev *dev; | ||
82 | int i, has_io, has_mem; | ||
83 | u16 cmd; | ||
84 | |||
85 | /* Generic PCI bus probing sets these to point at | ||
86 | * &io{port,mem}_resouce which is wrong for us. | ||
87 | */ | ||
88 | if (pbus->self == NULL) { | ||
89 | pbus->resource[0] = &info->io_space; | ||
90 | pbus->resource[1] = &info->mem_space; | ||
91 | pbus->resource[2] = NULL; | ||
92 | } | ||
93 | |||
94 | list_for_each_entry(dev, &pbus->devices, bus_list) { | ||
95 | /* | ||
96 | * We can not rely on that the bootloader has enabled I/O | ||
97 | * or memory access to PCI devices. Instead we enable it here | ||
98 | * if the device has BARs of respective type. | ||
99 | */ | ||
100 | has_io = has_mem = 0; | ||
101 | for (i = 0; i < PCI_ROM_RESOURCE; i++) { | ||
102 | unsigned long f = dev->resource[i].flags; | ||
103 | if (f & IORESOURCE_IO) | ||
104 | has_io = 1; | ||
105 | else if (f & IORESOURCE_MEM) | ||
106 | has_mem = 1; | ||
107 | } | ||
108 | /* ROM BARs are mapped into 32-bit memory space */ | ||
109 | if (dev->resource[PCI_ROM_RESOURCE].end != 0) { | ||
110 | dev->resource[PCI_ROM_RESOURCE].flags |= | ||
111 | IORESOURCE_ROM_ENABLE; | ||
112 | has_mem = 1; | ||
113 | } | ||
114 | pci_bus_read_config_word(pbus, dev->devfn, PCI_COMMAND, &cmd); | ||
115 | if (has_io && !(cmd & PCI_COMMAND_IO)) { | ||
116 | #ifdef CONFIG_PCI_DEBUG | ||
117 | printk(KERN_INFO "LEONPCI: Enabling I/O for dev %s\n", | ||
118 | pci_name(dev)); | ||
119 | #endif | ||
120 | cmd |= PCI_COMMAND_IO; | ||
121 | pci_bus_write_config_word(pbus, dev->devfn, PCI_COMMAND, | ||
122 | cmd); | ||
123 | } | ||
124 | if (has_mem && !(cmd & PCI_COMMAND_MEMORY)) { | ||
125 | #ifdef CONFIG_PCI_DEBUG | ||
126 | printk(KERN_INFO "LEONPCI: Enabling MEMORY for dev" | ||
127 | "%s\n", pci_name(dev)); | ||
128 | #endif | ||
129 | cmd |= PCI_COMMAND_MEMORY; | ||
130 | pci_bus_write_config_word(pbus, dev->devfn, PCI_COMMAND, | ||
131 | cmd); | ||
132 | } | ||
133 | } | ||
134 | } | ||
135 | |||
136 | /* | ||
137 | * Other archs parse arguments here. | ||
138 | */ | ||
139 | char * __devinit pcibios_setup(char *str) | ||
140 | { | ||
141 | return str; | ||
142 | } | ||
143 | |||
144 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, | ||
145 | resource_size_t size, resource_size_t align) | ||
146 | { | ||
147 | return res->start; | ||
148 | } | ||
149 | |||
150 | int pcibios_enable_device(struct pci_dev *dev, int mask) | ||
151 | { | ||
152 | return pci_enable_resources(dev, mask); | ||
153 | } | ||
154 | |||
155 | struct device_node *pci_device_to_OF_node(struct pci_dev *pdev) | ||
156 | { | ||
157 | /* | ||
158 | * Currently the OpenBoot nodes are not connected with the PCI device, | ||
159 | * this is because the LEON PROM does not create PCI nodes. Eventually | ||
160 | * this will change and the same approach as pcic.c can be used to | ||
161 | * match PROM nodes with pci devices. | ||
162 | */ | ||
163 | return NULL; | ||
164 | } | ||
165 | EXPORT_SYMBOL(pci_device_to_OF_node); | ||
166 | |||
167 | void __devinit pcibios_update_irq(struct pci_dev *dev, int irq) | ||
168 | { | ||
169 | #ifdef CONFIG_PCI_DEBUG | ||
170 | printk(KERN_DEBUG "LEONPCI: Assigning IRQ %02d to %s\n", irq, | ||
171 | pci_name(dev)); | ||
172 | #endif | ||
173 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); | ||
174 | } | ||
175 | |||
176 | /* in/out routines taken from pcic.c | ||
177 | * | ||
178 | * This probably belongs here rather than ioport.c because | ||
179 | * we do not want this crud linked into SBus kernels. | ||
180 | * Also, think for a moment about likes of floppy.c that | ||
181 | * include architecture specific parts. They may want to redefine ins/outs. | ||
182 | * | ||
183 | * We do not use horrible macros here because we want to | ||
184 | * advance pointer by sizeof(size). | ||
185 | */ | ||
186 | void outsb(unsigned long addr, const void *src, unsigned long count) | ||
187 | { | ||
188 | while (count) { | ||
189 | count -= 1; | ||
190 | outb(*(const char *)src, addr); | ||
191 | src += 1; | ||
192 | /* addr += 1; */ | ||
193 | } | ||
194 | } | ||
195 | EXPORT_SYMBOL(outsb); | ||
196 | |||
197 | void outsw(unsigned long addr, const void *src, unsigned long count) | ||
198 | { | ||
199 | while (count) { | ||
200 | count -= 2; | ||
201 | outw(*(const short *)src, addr); | ||
202 | src += 2; | ||
203 | /* addr += 2; */ | ||
204 | } | ||
205 | } | ||
206 | EXPORT_SYMBOL(outsw); | ||
207 | |||
208 | void outsl(unsigned long addr, const void *src, unsigned long count) | ||
209 | { | ||
210 | while (count) { | ||
211 | count -= 4; | ||
212 | outl(*(const long *)src, addr); | ||
213 | src += 4; | ||
214 | /* addr += 4; */ | ||
215 | } | ||
216 | } | ||
217 | EXPORT_SYMBOL(outsl); | ||
218 | |||
219 | void insb(unsigned long addr, void *dst, unsigned long count) | ||
220 | { | ||
221 | while (count) { | ||
222 | count -= 1; | ||
223 | *(unsigned char *)dst = inb(addr); | ||
224 | dst += 1; | ||
225 | /* addr += 1; */ | ||
226 | } | ||
227 | } | ||
228 | EXPORT_SYMBOL(insb); | ||
229 | |||
230 | void insw(unsigned long addr, void *dst, unsigned long count) | ||
231 | { | ||
232 | while (count) { | ||
233 | count -= 2; | ||
234 | *(unsigned short *)dst = inw(addr); | ||
235 | dst += 2; | ||
236 | /* addr += 2; */ | ||
237 | } | ||
238 | } | ||
239 | EXPORT_SYMBOL(insw); | ||
240 | |||
241 | void insl(unsigned long addr, void *dst, unsigned long count) | ||
242 | { | ||
243 | while (count) { | ||
244 | count -= 4; | ||
245 | /* | ||
246 | * XXX I am sure we are in for an unaligned trap here. | ||
247 | */ | ||
248 | *(unsigned long *)dst = inl(addr); | ||
249 | dst += 4; | ||
250 | /* addr += 4; */ | ||
251 | } | ||
252 | } | ||
253 | EXPORT_SYMBOL(insl); | ||
diff --git a/arch/sparc/kernel/leon_pci_grpci2.c b/arch/sparc/kernel/leon_pci_grpci2.c new file mode 100644 index 00000000000..44dc093ee33 --- /dev/null +++ b/arch/sparc/kernel/leon_pci_grpci2.c | |||
@@ -0,0 +1,897 @@ | |||
1 | /* | ||
2 | * leon_pci_grpci2.c: GRPCI2 Host PCI driver | ||
3 | * | ||
4 | * Copyright (C) 2011 Aeroflex Gaisler AB, Daniel Hellstrom | ||
5 | * | ||
6 | */ | ||
7 | |||
8 | #include <linux/of_device.h> | ||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/pci.h> | ||
11 | #include <linux/delay.h> | ||
12 | #include <linux/module.h> | ||
13 | #include <asm/io.h> | ||
14 | #include <asm/leon.h> | ||
15 | #include <asm/vaddrs.h> | ||
16 | #include <asm/sections.h> | ||
17 | #include <asm/leon_pci.h> | ||
18 | |||
19 | #include "irq.h" | ||
20 | |||
21 | struct grpci2_barcfg { | ||
22 | unsigned long pciadr; /* PCI Space Address */ | ||
23 | unsigned long ahbadr; /* PCI Base address mapped to this AHB addr */ | ||
24 | }; | ||
25 | |||
26 | /* Device Node Configuration options: | ||
27 | * - barcfgs : Custom Configuration of Host's 6 target BARs | ||
28 | * - irq_mask : Limit which PCI interrupts are enabled | ||
29 | * - do_reset : Force PCI Reset on startup | ||
30 | * | ||
31 | * barcfgs | ||
32 | * ======= | ||
33 | * | ||
34 | * Optional custom Target BAR configuration (see struct grpci2_barcfg). All | ||
35 | * addresses are physical. Array always contains 6 elements (len=2*4*6 bytes) | ||
36 | * | ||
37 | * -1 means not configured (let host driver do default setup). | ||
38 | * | ||
39 | * [i*2+0] = PCI Address of BAR[i] on target interface | ||
40 | * [i*2+1] = Accessing PCI address of BAR[i] result in this AMBA address | ||
41 | * | ||
42 | * | ||
43 | * irq_mask | ||
44 | * ======== | ||
45 | * | ||
46 | * Limit which PCI interrupts are enabled. 0=Disable, 1=Enable. By default | ||
47 | * all are enabled. Use this when PCI interrupt pins are floating on PCB. | ||
48 | * int, len=4. | ||
49 | * bit0 = PCI INTA# | ||
50 | * bit1 = PCI INTB# | ||
51 | * bit2 = PCI INTC# | ||
52 | * bit3 = PCI INTD# | ||
53 | * | ||
54 | * | ||
55 | * reset | ||
56 | * ===== | ||
57 | * | ||
58 | * Force PCI reset on startup. int, len=4 | ||
59 | */ | ||
60 | |||
61 | /* Enable Debugging Configuration Space Access */ | ||
62 | #undef GRPCI2_DEBUG_CFGACCESS | ||
63 | |||
64 | /* | ||
65 | * GRPCI2 APB Register MAP | ||
66 | */ | ||
67 | struct grpci2_regs { | ||
68 | unsigned int ctrl; /* 0x00 Control */ | ||
69 | unsigned int sts_cap; /* 0x04 Status / Capabilities */ | ||
70 | int res1; /* 0x08 */ | ||
71 | unsigned int io_map; /* 0x0C I/O Map address */ | ||
72 | unsigned int dma_ctrl; /* 0x10 DMA */ | ||
73 | unsigned int dma_bdbase; /* 0x14 DMA */ | ||
74 | int res2[2]; /* 0x18 */ | ||
75 | unsigned int bars[6]; /* 0x20 read-only PCI BARs */ | ||
76 | int res3[2]; /* 0x38 */ | ||
77 | unsigned int ahbmst_map[16]; /* 0x40 AHB->PCI Map per AHB Master */ | ||
78 | |||
79 | /* PCI Trace Buffer Registers (OPTIONAL) */ | ||
80 | unsigned int t_ctrl; /* 0x80 */ | ||
81 | unsigned int t_cnt; /* 0x84 */ | ||
82 | unsigned int t_adpat; /* 0x88 */ | ||
83 | unsigned int t_admask; /* 0x8C */ | ||
84 | unsigned int t_sigpat; /* 0x90 */ | ||
85 | unsigned int t_sigmask; /* 0x94 */ | ||
86 | unsigned int t_adstate; /* 0x98 */ | ||
87 | unsigned int t_sigstate; /* 0x9C */ | ||
88 | }; | ||
89 | |||
90 | #define REGLOAD(a) (be32_to_cpu(__raw_readl(&(a)))) | ||
91 | #define REGSTORE(a, v) (__raw_writel(cpu_to_be32(v), &(a))) | ||
92 | |||
93 | #define CTRL_BUS_BIT 16 | ||
94 | |||
95 | #define CTRL_RESET (1<<31) | ||
96 | #define CTRL_SI (1<<27) | ||
97 | #define CTRL_PE (1<<26) | ||
98 | #define CTRL_EI (1<<25) | ||
99 | #define CTRL_ER (1<<24) | ||
100 | #define CTRL_BUS (0xff<<CTRL_BUS_BIT) | ||
101 | #define CTRL_HOSTINT 0xf | ||
102 | |||
103 | #define STS_HOST_BIT 31 | ||
104 | #define STS_MST_BIT 30 | ||
105 | #define STS_TAR_BIT 29 | ||
106 | #define STS_DMA_BIT 28 | ||
107 | #define STS_DI_BIT 27 | ||
108 | #define STS_HI_BIT 26 | ||
109 | #define STS_IRQMODE_BIT 24 | ||
110 | #define STS_TRACE_BIT 23 | ||
111 | #define STS_CFGERRVALID_BIT 20 | ||
112 | #define STS_CFGERR_BIT 19 | ||
113 | #define STS_INTTYPE_BIT 12 | ||
114 | #define STS_INTSTS_BIT 8 | ||
115 | #define STS_FDEPTH_BIT 2 | ||
116 | #define STS_FNUM_BIT 0 | ||
117 | |||
118 | #define STS_HOST (1<<STS_HOST_BIT) | ||
119 | #define STS_MST (1<<STS_MST_BIT) | ||
120 | #define STS_TAR (1<<STS_TAR_BIT) | ||
121 | #define STS_DMA (1<<STS_DMA_BIT) | ||
122 | #define STS_DI (1<<STS_DI_BIT) | ||
123 | #define STS_HI (1<<STS_HI_BIT) | ||
124 | #define STS_IRQMODE (0x3<<STS_IRQMODE_BIT) | ||
125 | #define STS_TRACE (1<<STS_TRACE_BIT) | ||
126 | #define STS_CFGERRVALID (1<<STS_CFGERRVALID_BIT) | ||
127 | #define STS_CFGERR (1<<STS_CFGERR_BIT) | ||
128 | #define STS_INTTYPE (0x3f<<STS_INTTYPE_BIT) | ||
129 | #define STS_INTSTS (0xf<<STS_INTSTS_BIT) | ||
130 | #define STS_FDEPTH (0x7<<STS_FDEPTH_BIT) | ||
131 | #define STS_FNUM (0x3<<STS_FNUM_BIT) | ||
132 | |||
133 | #define STS_ISYSERR (1<<17) | ||
134 | #define STS_IDMA (1<<16) | ||
135 | #define STS_IDMAERR (1<<15) | ||
136 | #define STS_IMSTABRT (1<<14) | ||
137 | #define STS_ITGTABRT (1<<13) | ||
138 | #define STS_IPARERR (1<<12) | ||
139 | |||
140 | #define STS_ERR_IRQ (STS_ISYSERR | STS_IMSTABRT | STS_ITGTABRT | STS_IPARERR) | ||
141 | |||
142 | struct grpci2_bd_chan { | ||
143 | unsigned int ctrl; /* 0x00 DMA Control */ | ||
144 | unsigned int nchan; /* 0x04 Next DMA Channel Address */ | ||
145 | unsigned int nbd; /* 0x08 Next Data Descriptor in chan */ | ||
146 | unsigned int res; /* 0x0C Reserved */ | ||
147 | }; | ||
148 | |||
149 | #define BD_CHAN_EN 0x80000000 | ||
150 | #define BD_CHAN_TYPE 0x00300000 | ||
151 | #define BD_CHAN_BDCNT 0x0000ffff | ||
152 | #define BD_CHAN_EN_BIT 31 | ||
153 | #define BD_CHAN_TYPE_BIT 20 | ||
154 | #define BD_CHAN_BDCNT_BIT 0 | ||
155 | |||
156 | struct grpci2_bd_data { | ||
157 | unsigned int ctrl; /* 0x00 DMA Data Control */ | ||
158 | unsigned int pci_adr; /* 0x04 PCI Start Address */ | ||
159 | unsigned int ahb_adr; /* 0x08 AHB Start address */ | ||
160 | unsigned int next; /* 0x0C Next Data Descriptor in chan */ | ||
161 | }; | ||
162 | |||
163 | #define BD_DATA_EN 0x80000000 | ||
164 | #define BD_DATA_IE 0x40000000 | ||
165 | #define BD_DATA_DR 0x20000000 | ||
166 | #define BD_DATA_TYPE 0x00300000 | ||
167 | #define BD_DATA_ER 0x00080000 | ||
168 | #define BD_DATA_LEN 0x0000ffff | ||
169 | #define BD_DATA_EN_BIT 31 | ||
170 | #define BD_DATA_IE_BIT 30 | ||
171 | #define BD_DATA_DR_BIT 29 | ||
172 | #define BD_DATA_TYPE_BIT 20 | ||
173 | #define BD_DATA_ER_BIT 19 | ||
174 | #define BD_DATA_LEN_BIT 0 | ||
175 | |||
176 | /* GRPCI2 Capability */ | ||
177 | struct grpci2_cap_first { | ||
178 | unsigned int ctrl; | ||
179 | unsigned int pci2ahb_map[6]; | ||
180 | unsigned int ext2ahb_map; | ||
181 | unsigned int io_map; | ||
182 | unsigned int pcibar_size[6]; | ||
183 | }; | ||
184 | #define CAP9_CTRL_OFS 0 | ||
185 | #define CAP9_BAR_OFS 0x4 | ||
186 | #define CAP9_IOMAP_OFS 0x20 | ||
187 | #define CAP9_BARSIZE_OFS 0x24 | ||
188 | |||
189 | struct grpci2_priv { | ||
190 | struct leon_pci_info info; /* must be on top of this structure */ | ||
191 | struct grpci2_regs *regs; | ||
192 | char irq; | ||
193 | char irq_mode; /* IRQ Mode from CAPSTS REG */ | ||
194 | char bt_enabled; | ||
195 | char do_reset; | ||
196 | char irq_mask; | ||
197 | u32 pciid; /* PCI ID of Host */ | ||
198 | unsigned char irq_map[4]; | ||
199 | |||
200 | /* Virtual IRQ numbers */ | ||
201 | unsigned int virq_err; | ||
202 | unsigned int virq_dma; | ||
203 | |||
204 | /* AHB PCI Windows */ | ||
205 | unsigned long pci_area; /* MEMORY */ | ||
206 | unsigned long pci_area_end; | ||
207 | unsigned long pci_io; /* I/O */ | ||
208 | unsigned long pci_conf; /* CONFIGURATION */ | ||
209 | unsigned long pci_conf_end; | ||
210 | unsigned long pci_io_va; | ||
211 | |||
212 | struct grpci2_barcfg tgtbars[6]; | ||
213 | }; | ||
214 | |||
215 | DEFINE_SPINLOCK(grpci2_dev_lock); | ||
216 | struct grpci2_priv *grpci2priv; | ||
217 | |||
218 | int grpci2_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||
219 | { | ||
220 | struct grpci2_priv *priv = dev->bus->sysdata; | ||
221 | int irq_group; | ||
222 | |||
223 | /* Use default IRQ decoding on PCI BUS0 according slot numbering */ | ||
224 | irq_group = slot & 0x3; | ||
225 | pin = ((pin - 1) + irq_group) & 0x3; | ||
226 | |||
227 | return priv->irq_map[pin]; | ||
228 | } | ||
229 | |||
230 | static int grpci2_cfg_r32(struct grpci2_priv *priv, unsigned int bus, | ||
231 | unsigned int devfn, int where, u32 *val) | ||
232 | { | ||
233 | unsigned int *pci_conf; | ||
234 | unsigned long flags; | ||
235 | u32 tmp; | ||
236 | |||
237 | if (where & 0x3) | ||
238 | return -EINVAL; | ||
239 | |||
240 | if (bus == 0 && PCI_SLOT(devfn) != 0) | ||
241 | devfn += (0x8 * 6); | ||
242 | |||
243 | /* Select bus */ | ||
244 | spin_lock_irqsave(&grpci2_dev_lock, flags); | ||
245 | REGSTORE(priv->regs->ctrl, (REGLOAD(priv->regs->ctrl) & ~(0xff << 16)) | | ||
246 | (bus << 16)); | ||
247 | spin_unlock_irqrestore(&grpci2_dev_lock, flags); | ||
248 | |||
249 | /* clear old status */ | ||
250 | REGSTORE(priv->regs->sts_cap, (STS_CFGERR | STS_CFGERRVALID)); | ||
251 | |||
252 | pci_conf = (unsigned int *) (priv->pci_conf | | ||
253 | (devfn << 8) | (where & 0xfc)); | ||
254 | tmp = LEON3_BYPASS_LOAD_PA(pci_conf); | ||
255 | |||
256 | /* Wait until GRPCI2 signals that CFG access is done, it should be | ||
257 | * done instantaneously unless a DMA operation is ongoing... | ||
258 | */ | ||
259 | while ((REGLOAD(priv->regs->sts_cap) & STS_CFGERRVALID) == 0) | ||
260 | ; | ||
261 | |||
262 | if (REGLOAD(priv->regs->sts_cap) & STS_CFGERR) { | ||
263 | *val = 0xffffffff; | ||
264 | } else { | ||
265 | /* Bus always little endian (unaffected by byte-swapping) */ | ||
266 | *val = flip_dword(tmp); | ||
267 | } | ||
268 | |||
269 | return 0; | ||
270 | } | ||
271 | |||
272 | static int grpci2_cfg_r16(struct grpci2_priv *priv, unsigned int bus, | ||
273 | unsigned int devfn, int where, u32 *val) | ||
274 | { | ||
275 | u32 v; | ||
276 | int ret; | ||
277 | |||
278 | if (where & 0x1) | ||
279 | return -EINVAL; | ||
280 | ret = grpci2_cfg_r32(priv, bus, devfn, where & ~0x3, &v); | ||
281 | *val = 0xffff & (v >> (8 * (where & 0x3))); | ||
282 | return ret; | ||
283 | } | ||
284 | |||
285 | static int grpci2_cfg_r8(struct grpci2_priv *priv, unsigned int bus, | ||
286 | unsigned int devfn, int where, u32 *val) | ||
287 | { | ||
288 | u32 v; | ||
289 | int ret; | ||
290 | |||
291 | ret = grpci2_cfg_r32(priv, bus, devfn, where & ~0x3, &v); | ||
292 | *val = 0xff & (v >> (8 * (where & 3))); | ||
293 | |||
294 | return ret; | ||
295 | } | ||
296 | |||
297 | static int grpci2_cfg_w32(struct grpci2_priv *priv, unsigned int bus, | ||
298 | unsigned int devfn, int where, u32 val) | ||
299 | { | ||
300 | unsigned int *pci_conf; | ||
301 | unsigned long flags; | ||
302 | |||
303 | if (where & 0x3) | ||
304 | return -EINVAL; | ||
305 | |||
306 | if (bus == 0 && PCI_SLOT(devfn) != 0) | ||
307 | devfn += (0x8 * 6); | ||
308 | |||
309 | /* Select bus */ | ||
310 | spin_lock_irqsave(&grpci2_dev_lock, flags); | ||
311 | REGSTORE(priv->regs->ctrl, (REGLOAD(priv->regs->ctrl) & ~(0xff << 16)) | | ||
312 | (bus << 16)); | ||
313 | spin_unlock_irqrestore(&grpci2_dev_lock, flags); | ||
314 | |||
315 | /* clear old status */ | ||
316 | REGSTORE(priv->regs->sts_cap, (STS_CFGERR | STS_CFGERRVALID)); | ||
317 | |||
318 | pci_conf = (unsigned int *) (priv->pci_conf | | ||
319 | (devfn << 8) | (where & 0xfc)); | ||
320 | LEON3_BYPASS_STORE_PA(pci_conf, flip_dword(val)); | ||
321 | |||
322 | /* Wait until GRPCI2 signals that CFG access is done, it should be | ||
323 | * done instantaneously unless a DMA operation is ongoing... | ||
324 | */ | ||
325 | while ((REGLOAD(priv->regs->sts_cap) & STS_CFGERRVALID) == 0) | ||
326 | ; | ||
327 | |||
328 | return 0; | ||
329 | } | ||
330 | |||
331 | static int grpci2_cfg_w16(struct grpci2_priv *priv, unsigned int bus, | ||
332 | unsigned int devfn, int where, u32 val) | ||
333 | { | ||
334 | int ret; | ||
335 | u32 v; | ||
336 | |||
337 | if (where & 0x1) | ||
338 | return -EINVAL; | ||
339 | ret = grpci2_cfg_r32(priv, bus, devfn, where&~3, &v); | ||
340 | if (ret) | ||
341 | return ret; | ||
342 | v = (v & ~(0xffff << (8 * (where & 0x3)))) | | ||
343 | ((0xffff & val) << (8 * (where & 0x3))); | ||
344 | return grpci2_cfg_w32(priv, bus, devfn, where & ~0x3, v); | ||
345 | } | ||
346 | |||
347 | static int grpci2_cfg_w8(struct grpci2_priv *priv, unsigned int bus, | ||
348 | unsigned int devfn, int where, u32 val) | ||
349 | { | ||
350 | int ret; | ||
351 | u32 v; | ||
352 | |||
353 | ret = grpci2_cfg_r32(priv, bus, devfn, where & ~0x3, &v); | ||
354 | if (ret != 0) | ||
355 | return ret; | ||
356 | v = (v & ~(0xff << (8 * (where & 0x3)))) | | ||
357 | ((0xff & val) << (8 * (where & 0x3))); | ||
358 | return grpci2_cfg_w32(priv, bus, devfn, where & ~0x3, v); | ||
359 | } | ||
360 | |||
361 | /* Read from Configuration Space. When entering here the PCI layer has taken | ||
362 | * the pci_lock spinlock and IRQ is off. | ||
363 | */ | ||
364 | static int grpci2_read_config(struct pci_bus *bus, unsigned int devfn, | ||
365 | int where, int size, u32 *val) | ||
366 | { | ||
367 | struct grpci2_priv *priv = grpci2priv; | ||
368 | unsigned int busno = bus->number; | ||
369 | int ret; | ||
370 | |||
371 | if (PCI_SLOT(devfn) > 15 || (PCI_SLOT(devfn) == 0 && busno == 0)) { | ||
372 | *val = ~0; | ||
373 | return 0; | ||
374 | } | ||
375 | |||
376 | switch (size) { | ||
377 | case 1: | ||
378 | ret = grpci2_cfg_r8(priv, busno, devfn, where, val); | ||
379 | break; | ||
380 | case 2: | ||
381 | ret = grpci2_cfg_r16(priv, busno, devfn, where, val); | ||
382 | break; | ||
383 | case 4: | ||
384 | ret = grpci2_cfg_r32(priv, busno, devfn, where, val); | ||
385 | break; | ||
386 | default: | ||
387 | ret = -EINVAL; | ||
388 | break; | ||
389 | } | ||
390 | |||
391 | #ifdef GRPCI2_DEBUG_CFGACCESS | ||
392 | printk(KERN_INFO "grpci2_read_config: [%02x:%02x:%x] ofs=%d val=%x " | ||
393 | "size=%d\n", busno, PCI_SLOT(devfn), PCI_FUNC(devfn), where, | ||
394 | *val, size); | ||
395 | #endif | ||
396 | |||
397 | return ret; | ||
398 | } | ||
399 | |||
400 | /* Write to Configuration Space. When entering here the PCI layer has taken | ||
401 | * the pci_lock spinlock and IRQ is off. | ||
402 | */ | ||
403 | static int grpci2_write_config(struct pci_bus *bus, unsigned int devfn, | ||
404 | int where, int size, u32 val) | ||
405 | { | ||
406 | struct grpci2_priv *priv = grpci2priv; | ||
407 | unsigned int busno = bus->number; | ||
408 | |||
409 | if (PCI_SLOT(devfn) > 15 || (PCI_SLOT(devfn) == 0 && busno == 0)) | ||
410 | return 0; | ||
411 | |||
412 | #ifdef GRPCI2_DEBUG_CFGACCESS | ||
413 | printk(KERN_INFO "grpci2_write_config: [%02x:%02x:%x] ofs=%d size=%d " | ||
414 | "val=%x\n", busno, PCI_SLOT(devfn), PCI_FUNC(devfn), | ||
415 | where, size, val); | ||
416 | #endif | ||
417 | |||
418 | switch (size) { | ||
419 | default: | ||
420 | return -EINVAL; | ||
421 | case 1: | ||
422 | return grpci2_cfg_w8(priv, busno, devfn, where, val); | ||
423 | case 2: | ||
424 | return grpci2_cfg_w16(priv, busno, devfn, where, val); | ||
425 | case 4: | ||
426 | return grpci2_cfg_w32(priv, busno, devfn, where, val); | ||
427 | } | ||
428 | } | ||
429 | |||
430 | static struct pci_ops grpci2_ops = { | ||
431 | .read = grpci2_read_config, | ||
432 | .write = grpci2_write_config, | ||
433 | }; | ||
434 | |||
435 | /* GENIRQ IRQ chip implementation for GRPCI2 irqmode=0..2. In configuration | ||
436 | * 3 where all PCI Interrupts has a separate IRQ on the system IRQ controller | ||
437 | * this is not needed and the standard IRQ controller can be used. | ||
438 | */ | ||
439 | |||
440 | static void grpci2_mask_irq(struct irq_data *data) | ||
441 | { | ||
442 | unsigned long flags; | ||
443 | unsigned int irqidx; | ||
444 | struct grpci2_priv *priv = grpci2priv; | ||
445 | |||
446 | irqidx = (unsigned int)data->chip_data - 1; | ||
447 | if (irqidx > 3) /* only mask PCI interrupts here */ | ||
448 | return; | ||
449 | |||
450 | spin_lock_irqsave(&grpci2_dev_lock, flags); | ||
451 | REGSTORE(priv->regs->ctrl, REGLOAD(priv->regs->ctrl) & ~(1 << irqidx)); | ||
452 | spin_unlock_irqrestore(&grpci2_dev_lock, flags); | ||
453 | } | ||
454 | |||
455 | static void grpci2_unmask_irq(struct irq_data *data) | ||
456 | { | ||
457 | unsigned long flags; | ||
458 | unsigned int irqidx; | ||
459 | struct grpci2_priv *priv = grpci2priv; | ||
460 | |||
461 | irqidx = (unsigned int)data->chip_data - 1; | ||
462 | if (irqidx > 3) /* only unmask PCI interrupts here */ | ||
463 | return; | ||
464 | |||
465 | spin_lock_irqsave(&grpci2_dev_lock, flags); | ||
466 | REGSTORE(priv->regs->ctrl, REGLOAD(priv->regs->ctrl) | (1 << irqidx)); | ||
467 | spin_unlock_irqrestore(&grpci2_dev_lock, flags); | ||
468 | } | ||
469 | |||
470 | static unsigned int grpci2_startup_irq(struct irq_data *data) | ||
471 | { | ||
472 | grpci2_unmask_irq(data); | ||
473 | return 0; | ||
474 | } | ||
475 | |||
476 | static void grpci2_shutdown_irq(struct irq_data *data) | ||
477 | { | ||
478 | grpci2_mask_irq(data); | ||
479 | } | ||
480 | |||
481 | static struct irq_chip grpci2_irq = { | ||
482 | .name = "grpci2", | ||
483 | .irq_startup = grpci2_startup_irq, | ||
484 | .irq_shutdown = grpci2_shutdown_irq, | ||
485 | .irq_mask = grpci2_mask_irq, | ||
486 | .irq_unmask = grpci2_unmask_irq, | ||
487 | }; | ||
488 | |||
489 | /* Handle one or multiple IRQs from the PCI core */ | ||
490 | static void grpci2_pci_flow_irq(unsigned int irq, struct irq_desc *desc) | ||
491 | { | ||
492 | struct grpci2_priv *priv = grpci2priv; | ||
493 | int i, ack = 0; | ||
494 | unsigned int ctrl, sts_cap, pci_ints; | ||
495 | |||
496 | ctrl = REGLOAD(priv->regs->ctrl); | ||
497 | sts_cap = REGLOAD(priv->regs->sts_cap); | ||
498 | |||
499 | /* Error Interrupt? */ | ||
500 | if (sts_cap & STS_ERR_IRQ) { | ||
501 | generic_handle_irq(priv->virq_err); | ||
502 | ack = 1; | ||
503 | } | ||
504 | |||
505 | /* PCI Interrupt? */ | ||
506 | pci_ints = ((~sts_cap) >> STS_INTSTS_BIT) & ctrl & CTRL_HOSTINT; | ||
507 | if (pci_ints) { | ||
508 | /* Call respective PCI Interrupt handler */ | ||
509 | for (i = 0; i < 4; i++) { | ||
510 | if (pci_ints & (1 << i)) | ||
511 | generic_handle_irq(priv->irq_map[i]); | ||
512 | } | ||
513 | ack = 1; | ||
514 | } | ||
515 | |||
516 | /* | ||
517 | * Decode DMA Interrupt only when shared with Err and PCI INTX#, when | ||
518 | * the DMA is a unique IRQ the DMA interrupts doesn't end up here, they | ||
519 | * goes directly to DMA ISR. | ||
520 | */ | ||
521 | if ((priv->irq_mode == 0) && (sts_cap & (STS_IDMA | STS_IDMAERR))) { | ||
522 | generic_handle_irq(priv->virq_dma); | ||
523 | ack = 1; | ||
524 | } | ||
525 | |||
526 | /* | ||
527 | * Call "first level" IRQ chip end-of-irq handler. It will ACK LEON IRQ | ||
528 | * Controller, this must be done after IRQ sources have been handled to | ||
529 | * avoid double IRQ generation | ||
530 | */ | ||
531 | if (ack) | ||
532 | desc->irq_data.chip->irq_eoi(&desc->irq_data); | ||
533 | } | ||
534 | |||
535 | /* Create a virtual IRQ */ | ||
536 | static unsigned int grpci2_build_device_irq(unsigned int irq) | ||
537 | { | ||
538 | unsigned int virq = 0, pil; | ||
539 | |||
540 | pil = 1 << 8; | ||
541 | virq = irq_alloc(irq, pil); | ||
542 | if (virq == 0) | ||
543 | goto out; | ||
544 | |||
545 | irq_set_chip_and_handler_name(virq, &grpci2_irq, handle_simple_irq, | ||
546 | "pcilvl"); | ||
547 | irq_set_chip_data(virq, (void *)irq); | ||
548 | |||
549 | out: | ||
550 | return virq; | ||
551 | } | ||
552 | |||
553 | void grpci2_hw_init(struct grpci2_priv *priv) | ||
554 | { | ||
555 | u32 ahbadr, pciadr, bar_sz, capptr, io_map, data; | ||
556 | struct grpci2_regs *regs = priv->regs; | ||
557 | int i; | ||
558 | struct grpci2_barcfg *barcfg = priv->tgtbars; | ||
559 | |||
560 | /* Reset any earlier setup */ | ||
561 | if (priv->do_reset) { | ||
562 | printk(KERN_INFO "GRPCI2: Resetting PCI bus\n"); | ||
563 | REGSTORE(regs->ctrl, CTRL_RESET); | ||
564 | ssleep(1); /* Wait for boards to settle */ | ||
565 | } | ||
566 | REGSTORE(regs->ctrl, 0); | ||
567 | REGSTORE(regs->sts_cap, ~0); /* Clear Status */ | ||
568 | REGSTORE(regs->dma_ctrl, 0); | ||
569 | REGSTORE(regs->dma_bdbase, 0); | ||
570 | |||
571 | /* Translate I/O accesses to 0, I/O Space always @ PCI low 64Kbytes */ | ||
572 | REGSTORE(regs->io_map, REGLOAD(regs->io_map) & 0x0000ffff); | ||
573 | |||
574 | /* set 1:1 mapping between AHB -> PCI memory space, for all Masters | ||
575 | * Each AHB master has it's own mapping registers. Max 16 AHB masters. | ||
576 | */ | ||
577 | for (i = 0; i < 16; i++) | ||
578 | REGSTORE(regs->ahbmst_map[i], priv->pci_area); | ||
579 | |||
580 | /* Get the GRPCI2 Host PCI ID */ | ||
581 | grpci2_cfg_r32(priv, 0, 0, PCI_VENDOR_ID, &priv->pciid); | ||
582 | |||
583 | /* Get address to first (always defined) capability structure */ | ||
584 | grpci2_cfg_r8(priv, 0, 0, PCI_CAPABILITY_LIST, &capptr); | ||
585 | |||
586 | /* Enable/Disable Byte twisting */ | ||
587 | grpci2_cfg_r32(priv, 0, 0, capptr+CAP9_IOMAP_OFS, &io_map); | ||
588 | io_map = (io_map & ~0x1) | (priv->bt_enabled ? 1 : 0); | ||
589 | grpci2_cfg_w32(priv, 0, 0, capptr+CAP9_IOMAP_OFS, io_map); | ||
590 | |||
591 | /* Setup the Host's PCI Target BARs for other peripherals to access, | ||
592 | * and do DMA to the host's memory. The target BARs can be sized and | ||
593 | * enabled individually. | ||
594 | * | ||
595 | * User may set custom target BARs, but default is: | ||
596 | * The first BARs is used to map kernel low (DMA is part of normal | ||
597 | * region on sparc which is SRMMU_MAXMEM big) main memory 1:1 to the | ||
598 | * PCI bus, the other BARs are disabled. We assume that the first BAR | ||
599 | * is always available. | ||
600 | */ | ||
601 | for (i = 0; i < 6; i++) { | ||
602 | if (barcfg[i].pciadr != ~0 && barcfg[i].ahbadr != ~0) { | ||
603 | /* Target BARs must have the proper alignment */ | ||
604 | ahbadr = barcfg[i].ahbadr; | ||
605 | pciadr = barcfg[i].pciadr; | ||
606 | bar_sz = ((pciadr - 1) & ~pciadr) + 1; | ||
607 | } else { | ||
608 | if (i == 0) { | ||
609 | /* Map main memory */ | ||
610 | bar_sz = 0xf0000008; /* 256MB prefetchable */ | ||
611 | ahbadr = 0xf0000000 & (u32)__pa(PAGE_ALIGN( | ||
612 | (unsigned long) &_end)); | ||
613 | pciadr = ahbadr; | ||
614 | } else { | ||
615 | bar_sz = 0; | ||
616 | ahbadr = 0; | ||
617 | pciadr = 0; | ||
618 | } | ||
619 | } | ||
620 | grpci2_cfg_w32(priv, 0, 0, capptr+CAP9_BARSIZE_OFS+i*4, bar_sz); | ||
621 | grpci2_cfg_w32(priv, 0, 0, PCI_BASE_ADDRESS_0+i*4, pciadr); | ||
622 | grpci2_cfg_w32(priv, 0, 0, capptr+CAP9_BAR_OFS+i*4, ahbadr); | ||
623 | printk(KERN_INFO " TGT BAR[%d]: 0x%08x (PCI)-> 0x%08x\n", | ||
624 | i, pciadr, ahbadr); | ||
625 | } | ||
626 | |||
627 | /* set as bus master and enable pci memory responses */ | ||
628 | grpci2_cfg_r32(priv, 0, 0, PCI_COMMAND, &data); | ||
629 | data |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); | ||
630 | grpci2_cfg_w32(priv, 0, 0, PCI_COMMAND, data); | ||
631 | |||
632 | /* Enable Error respone (CPU-TRAP) on illegal memory access. */ | ||
633 | REGSTORE(regs->ctrl, CTRL_ER | CTRL_PE); | ||
634 | } | ||
635 | |||
636 | static irqreturn_t grpci2_jump_interrupt(int irq, void *arg) | ||
637 | { | ||
638 | printk(KERN_ERR "GRPCI2: Jump IRQ happened\n"); | ||
639 | return IRQ_NONE; | ||
640 | } | ||
641 | |||
642 | /* Handle GRPCI2 Error Interrupt */ | ||
643 | static irqreturn_t grpci2_err_interrupt(int irq, void *arg) | ||
644 | { | ||
645 | struct grpci2_priv *priv = arg; | ||
646 | struct grpci2_regs *regs = priv->regs; | ||
647 | unsigned int status; | ||
648 | |||
649 | status = REGLOAD(regs->sts_cap); | ||
650 | if ((status & STS_ERR_IRQ) == 0) | ||
651 | return IRQ_NONE; | ||
652 | |||
653 | if (status & STS_IPARERR) | ||
654 | printk(KERN_ERR "GRPCI2: Parity Error\n"); | ||
655 | |||
656 | if (status & STS_ITGTABRT) | ||
657 | printk(KERN_ERR "GRPCI2: Target Abort\n"); | ||
658 | |||
659 | if (status & STS_IMSTABRT) | ||
660 | printk(KERN_ERR "GRPCI2: Master Abort\n"); | ||
661 | |||
662 | if (status & STS_ISYSERR) | ||
663 | printk(KERN_ERR "GRPCI2: System Error\n"); | ||
664 | |||
665 | /* Clear handled INT TYPE IRQs */ | ||
666 | REGSTORE(regs->sts_cap, status & STS_ERR_IRQ); | ||
667 | |||
668 | return IRQ_HANDLED; | ||
669 | } | ||
670 | |||
671 | static int __devinit grpci2_of_probe(struct platform_device *ofdev) | ||
672 | { | ||
673 | struct grpci2_regs *regs; | ||
674 | struct grpci2_priv *priv; | ||
675 | int err, i, len; | ||
676 | const int *tmp; | ||
677 | unsigned int capability; | ||
678 | |||
679 | if (grpci2priv) { | ||
680 | printk(KERN_ERR "GRPCI2: only one GRPCI2 core supported\n"); | ||
681 | return -ENODEV; | ||
682 | } | ||
683 | |||
684 | if (ofdev->num_resources < 3) { | ||
685 | printk(KERN_ERR "GRPCI2: not enough APB/AHB resources\n"); | ||
686 | return -EIO; | ||
687 | } | ||
688 | |||
689 | /* Find Device Address */ | ||
690 | regs = of_ioremap(&ofdev->resource[0], 0, | ||
691 | resource_size(&ofdev->resource[0]), | ||
692 | "grlib-grpci2 regs"); | ||
693 | if (regs == NULL) { | ||
694 | printk(KERN_ERR "GRPCI2: ioremap failed\n"); | ||
695 | return -EIO; | ||
696 | } | ||
697 | |||
698 | /* | ||
699 | * Check that we're in Host Slot and that we can act as a Host Bridge | ||
700 | * and not only as target. | ||
701 | */ | ||
702 | capability = REGLOAD(regs->sts_cap); | ||
703 | if ((capability & STS_HOST) || !(capability & STS_MST)) { | ||
704 | printk(KERN_INFO "GRPCI2: not in host system slot\n"); | ||
705 | err = -EIO; | ||
706 | goto err1; | ||
707 | } | ||
708 | |||
709 | priv = grpci2priv = kzalloc(sizeof(struct grpci2_priv), GFP_KERNEL); | ||
710 | if (grpci2priv == NULL) { | ||
711 | err = -ENOMEM; | ||
712 | goto err1; | ||
713 | } | ||
714 | memset(grpci2priv, 0, sizeof(*grpci2priv)); | ||
715 | priv->regs = regs; | ||
716 | priv->irq = ofdev->archdata.irqs[0]; /* BASE IRQ */ | ||
717 | priv->irq_mode = (capability & STS_IRQMODE) >> STS_IRQMODE_BIT; | ||
718 | |||
719 | printk(KERN_INFO "GRPCI2: host found at %p, irq%d\n", regs, priv->irq); | ||
720 | |||
721 | /* Byte twisting should be made configurable from kernel command line */ | ||
722 | priv->bt_enabled = 1; | ||
723 | |||
724 | /* Let user do custom Target BAR assignment */ | ||
725 | tmp = of_get_property(ofdev->dev.of_node, "barcfg", &len); | ||
726 | if (tmp && (len == 2*4*6)) | ||
727 | memcpy(priv->tgtbars, tmp, 2*4*6); | ||
728 | else | ||
729 | memset(priv->tgtbars, -1, 2*4*6); | ||
730 | |||
731 | /* Limit IRQ unmasking in irq_mode 2 and 3 */ | ||
732 | tmp = of_get_property(ofdev->dev.of_node, "irq_mask", &len); | ||
733 | if (tmp && (len == 4)) | ||
734 | priv->do_reset = *tmp; | ||
735 | else | ||
736 | priv->irq_mask = 0xf; | ||
737 | |||
738 | /* Optional PCI reset. Force PCI reset on startup */ | ||
739 | tmp = of_get_property(ofdev->dev.of_node, "reset", &len); | ||
740 | if (tmp && (len == 4)) | ||
741 | priv->do_reset = *tmp; | ||
742 | else | ||
743 | priv->do_reset = 0; | ||
744 | |||
745 | /* Find PCI Memory, I/O and Configuration Space Windows */ | ||
746 | priv->pci_area = ofdev->resource[1].start; | ||
747 | priv->pci_area_end = ofdev->resource[1].end+1; | ||
748 | priv->pci_io = ofdev->resource[2].start; | ||
749 | priv->pci_conf = ofdev->resource[2].start + 0x10000; | ||
750 | priv->pci_conf_end = priv->pci_conf + 0x10000; | ||
751 | priv->pci_io_va = (unsigned long)ioremap(priv->pci_io, 0x10000); | ||
752 | if (!priv->pci_io_va) { | ||
753 | err = -EIO; | ||
754 | goto err2; | ||
755 | } | ||
756 | |||
757 | printk(KERN_INFO | ||
758 | "GRPCI2: MEMORY SPACE [0x%08lx - 0x%08lx]\n" | ||
759 | " I/O SPACE [0x%08lx - 0x%08lx]\n" | ||
760 | " CONFIG SPACE [0x%08lx - 0x%08lx]\n", | ||
761 | priv->pci_area, priv->pci_area_end-1, | ||
762 | priv->pci_io, priv->pci_conf-1, | ||
763 | priv->pci_conf, priv->pci_conf_end-1); | ||
764 | |||
765 | /* | ||
766 | * I/O Space resources in I/O Window mapped into Virtual Adr Space | ||
767 | * We never use low 4KB because some devices seem have problems using | ||
768 | * address 0. | ||
769 | */ | ||
770 | memset(&priv->info.io_space, 0, sizeof(struct resource)); | ||
771 | priv->info.io_space.name = "GRPCI2 PCI I/O Space"; | ||
772 | priv->info.io_space.start = priv->pci_io_va + 0x1000; | ||
773 | priv->info.io_space.end = priv->pci_io_va + 0x10000 - 1; | ||
774 | priv->info.io_space.flags = IORESOURCE_IO; | ||
775 | |||
776 | /* | ||
777 | * GRPCI2 has no prefetchable memory, map everything as | ||
778 | * non-prefetchable memory | ||
779 | */ | ||
780 | memset(&priv->info.mem_space, 0, sizeof(struct resource)); | ||
781 | priv->info.mem_space.name = "GRPCI2 PCI MEM Space"; | ||
782 | priv->info.mem_space.start = priv->pci_area; | ||
783 | priv->info.mem_space.end = priv->pci_area_end - 1; | ||
784 | priv->info.mem_space.flags = IORESOURCE_MEM; | ||
785 | |||
786 | if (request_resource(&iomem_resource, &priv->info.mem_space) < 0) | ||
787 | goto err3; | ||
788 | if (request_resource(&ioport_resource, &priv->info.io_space) < 0) | ||
789 | goto err4; | ||
790 | |||
791 | grpci2_hw_init(priv); | ||
792 | |||
793 | /* | ||
794 | * Get PCI Interrupt to System IRQ mapping and setup IRQ handling | ||
795 | * Error IRQ always on PCI INTA. | ||
796 | */ | ||
797 | if (priv->irq_mode < 2) { | ||
798 | /* All PCI interrupts are shared using the same system IRQ */ | ||
799 | leon_update_virq_handling(priv->irq, grpci2_pci_flow_irq, | ||
800 | "pcilvl", 0); | ||
801 | |||
802 | priv->irq_map[0] = grpci2_build_device_irq(1); | ||
803 | priv->irq_map[1] = grpci2_build_device_irq(2); | ||
804 | priv->irq_map[2] = grpci2_build_device_irq(3); | ||
805 | priv->irq_map[3] = grpci2_build_device_irq(4); | ||
806 | |||
807 | priv->virq_err = grpci2_build_device_irq(5); | ||
808 | if (priv->irq_mode & 1) | ||
809 | priv->virq_dma = ofdev->archdata.irqs[1]; | ||
810 | else | ||
811 | priv->virq_dma = grpci2_build_device_irq(6); | ||
812 | |||
813 | /* Enable IRQs on LEON IRQ controller */ | ||
814 | err = request_irq(priv->irq, grpci2_jump_interrupt, 0, | ||
815 | "GRPCI2_JUMP", priv); | ||
816 | if (err) | ||
817 | printk(KERN_ERR "GRPCI2: ERR IRQ request failed\n"); | ||
818 | } else { | ||
819 | /* All PCI interrupts have an unique IRQ interrupt */ | ||
820 | for (i = 0; i < 4; i++) { | ||
821 | /* Make LEON IRQ layer handle level IRQ by acking */ | ||
822 | leon_update_virq_handling(ofdev->archdata.irqs[i], | ||
823 | handle_fasteoi_irq, "pcilvl", | ||
824 | 1); | ||
825 | priv->irq_map[i] = ofdev->archdata.irqs[i]; | ||
826 | } | ||
827 | priv->virq_err = priv->irq_map[0]; | ||
828 | if (priv->irq_mode & 1) | ||
829 | priv->virq_dma = ofdev->archdata.irqs[4]; | ||
830 | else | ||
831 | priv->virq_dma = priv->irq_map[0]; | ||
832 | |||
833 | /* Unmask all PCI interrupts, request_irq will not do that */ | ||
834 | REGSTORE(regs->ctrl, REGLOAD(regs->ctrl)|(priv->irq_mask&0xf)); | ||
835 | } | ||
836 | |||
837 | /* Setup IRQ handler for non-configuration space access errors */ | ||
838 | err = request_irq(priv->virq_err, grpci2_err_interrupt, IRQF_SHARED, | ||
839 | "GRPCI2_ERR", priv); | ||
840 | if (err) { | ||
841 | printk(KERN_DEBUG "GRPCI2: ERR VIRQ request failed: %d\n", err); | ||
842 | goto err5; | ||
843 | } | ||
844 | |||
845 | /* | ||
846 | * Enable Error Interrupts. PCI interrupts are unmasked once request_irq | ||
847 | * is called by the PCI Device drivers | ||
848 | */ | ||
849 | REGSTORE(regs->ctrl, REGLOAD(regs->ctrl) | CTRL_EI | CTRL_SI); | ||
850 | |||
851 | /* Init common layer and scan buses */ | ||
852 | priv->info.ops = &grpci2_ops; | ||
853 | priv->info.map_irq = grpci2_map_irq; | ||
854 | leon_pci_init(ofdev, &priv->info); | ||
855 | |||
856 | return 0; | ||
857 | |||
858 | err5: | ||
859 | release_resource(&priv->info.io_space); | ||
860 | err4: | ||
861 | release_resource(&priv->info.mem_space); | ||
862 | err3: | ||
863 | err = -ENOMEM; | ||
864 | iounmap((void *)priv->pci_io_va); | ||
865 | err2: | ||
866 | kfree(priv); | ||
867 | err1: | ||
868 | of_iounmap(&ofdev->resource[0], regs, | ||
869 | resource_size(&ofdev->resource[0])); | ||
870 | return err; | ||
871 | } | ||
872 | |||
873 | static struct of_device_id grpci2_of_match[] = { | ||
874 | { | ||
875 | .name = "GAISLER_GRPCI2", | ||
876 | }, | ||
877 | { | ||
878 | .name = "01_07c", | ||
879 | }, | ||
880 | {}, | ||
881 | }; | ||
882 | |||
883 | static struct platform_driver grpci2_of_driver = { | ||
884 | .driver = { | ||
885 | .name = "grpci2", | ||
886 | .owner = THIS_MODULE, | ||
887 | .of_match_table = grpci2_of_match, | ||
888 | }, | ||
889 | .probe = grpci2_of_probe, | ||
890 | }; | ||
891 | |||
892 | static int __init grpci2_init(void) | ||
893 | { | ||
894 | return platform_driver_register(&grpci2_of_driver); | ||
895 | } | ||
896 | |||
897 | subsys_initcall(grpci2_init); | ||
diff --git a/arch/sparc/kernel/module.c b/arch/sparc/kernel/module.c index 8d348c474a2..99ba5baa949 100644 --- a/arch/sparc/kernel/module.c +++ b/arch/sparc/kernel/module.c | |||
@@ -214,7 +214,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, | |||
214 | me->name, | 214 | me->name, |
215 | (int) (ELF_R_TYPE(rel[i].r_info) & 0xff)); | 215 | (int) (ELF_R_TYPE(rel[i].r_info) & 0xff)); |
216 | return -ENOEXEC; | 216 | return -ENOEXEC; |
217 | }; | 217 | } |
218 | } | 218 | } |
219 | return 0; | 219 | return 0; |
220 | } | 220 | } |
diff --git a/arch/sparc/kernel/pci_common.c b/arch/sparc/kernel/pci_common.c index 6e3874b6448..a6895987fb7 100644 --- a/arch/sparc/kernel/pci_common.c +++ b/arch/sparc/kernel/pci_common.c | |||
@@ -281,7 +281,7 @@ static int sun4v_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, | |||
281 | case 4: | 281 | case 4: |
282 | *value = ret & 0xffffffff; | 282 | *value = ret & 0xffffffff; |
283 | break; | 283 | break; |
284 | }; | 284 | } |
285 | 285 | ||
286 | 286 | ||
287 | return PCIBIOS_SUCCESSFUL; | 287 | return PCIBIOS_SUCCESSFUL; |
@@ -456,7 +456,7 @@ void pci_determine_mem_io_space(struct pci_pbm_info *pbm) | |||
456 | 456 | ||
457 | default: | 457 | default: |
458 | break; | 458 | break; |
459 | }; | 459 | } |
460 | } | 460 | } |
461 | 461 | ||
462 | if (!saw_io || !saw_mem) { | 462 | if (!saw_io || !saw_mem) { |
diff --git a/arch/sparc/kernel/pci_schizo.c b/arch/sparc/kernel/pci_schizo.c index 283fbc329a4..f030b02eddd 100644 --- a/arch/sparc/kernel/pci_schizo.c +++ b/arch/sparc/kernel/pci_schizo.c | |||
@@ -264,7 +264,7 @@ static void schizo_check_iommu_error_pbm(struct pci_pbm_info *pbm, | |||
264 | default: | 264 | default: |
265 | type_string = "ECC Error"; | 265 | type_string = "ECC Error"; |
266 | break; | 266 | break; |
267 | }; | 267 | } |
268 | printk("%s: IOMMU Error, type[%s]\n", | 268 | printk("%s: IOMMU Error, type[%s]\n", |
269 | pbm->name, type_string); | 269 | pbm->name, type_string); |
270 | 270 | ||
@@ -319,7 +319,7 @@ static void schizo_check_iommu_error_pbm(struct pci_pbm_info *pbm, | |||
319 | default: | 319 | default: |
320 | type_string = "ECC Error"; | 320 | type_string = "ECC Error"; |
321 | break; | 321 | break; |
322 | }; | 322 | } |
323 | printk("%s: IOMMU TAG(%d)[error(%s) ctx(%x) wr(%d) str(%d) " | 323 | printk("%s: IOMMU TAG(%d)[error(%s) ctx(%x) wr(%d) str(%d) " |
324 | "sz(%dK) vpg(%08lx)]\n", | 324 | "sz(%dK) vpg(%08lx)]\n", |
325 | pbm->name, i, type_string, | 325 | pbm->name, i, type_string, |
@@ -1328,7 +1328,7 @@ static int __devinit schizo_pbm_init(struct pci_pbm_info *pbm, | |||
1328 | default: | 1328 | default: |
1329 | chipset_name = "SCHIZO"; | 1329 | chipset_name = "SCHIZO"; |
1330 | break; | 1330 | break; |
1331 | }; | 1331 | } |
1332 | 1332 | ||
1333 | /* For SCHIZO, three OBP regs: | 1333 | /* For SCHIZO, three OBP regs: |
1334 | * 1) PBM controller regs | 1334 | * 1) PBM controller regs |
diff --git a/arch/sparc/kernel/prom_irqtrans.c b/arch/sparc/kernel/prom_irqtrans.c index 570b98f6e89..40e4936bd47 100644 --- a/arch/sparc/kernel/prom_irqtrans.c +++ b/arch/sparc/kernel/prom_irqtrans.c | |||
@@ -694,7 +694,7 @@ static unsigned int sbus_of_build_irq(struct device_node *dp, | |||
694 | case 3: | 694 | case 3: |
695 | iclr = reg_base + SYSIO_ICLR_SLOT3; | 695 | iclr = reg_base + SYSIO_ICLR_SLOT3; |
696 | break; | 696 | break; |
697 | }; | 697 | } |
698 | 698 | ||
699 | iclr += ((unsigned long)sbus_level - 1UL) * 8UL; | 699 | iclr += ((unsigned long)sbus_level - 1UL) * 8UL; |
700 | } | 700 | } |
diff --git a/arch/sparc/kernel/psycho_common.c b/arch/sparc/kernel/psycho_common.c index fe2af66bb19..8db48e808ed 100644 --- a/arch/sparc/kernel/psycho_common.c +++ b/arch/sparc/kernel/psycho_common.c | |||
@@ -228,7 +228,7 @@ void psycho_check_iommu_error(struct pci_pbm_info *pbm, | |||
228 | default: | 228 | default: |
229 | type_str = "ECC Error"; | 229 | type_str = "ECC Error"; |
230 | break; | 230 | break; |
231 | }; | 231 | } |
232 | printk(KERN_ERR "%s: IOMMU Error, type[%s]\n", | 232 | printk(KERN_ERR "%s: IOMMU Error, type[%s]\n", |
233 | pbm->name, type_str); | 233 | pbm->name, type_str); |
234 | 234 | ||
diff --git a/arch/sparc/kernel/sbus.c b/arch/sparc/kernel/sbus.c index 2ca32d13abc..a161b9c77f0 100644 --- a/arch/sparc/kernel/sbus.c +++ b/arch/sparc/kernel/sbus.c | |||
@@ -97,7 +97,7 @@ void sbus_set_sbus64(struct device *dev, int bursts) | |||
97 | 97 | ||
98 | default: | 98 | default: |
99 | return; | 99 | return; |
100 | }; | 100 | } |
101 | 101 | ||
102 | val = upa_readq(cfg_reg); | 102 | val = upa_readq(cfg_reg); |
103 | if (val & (1UL << 14UL)) { | 103 | if (val & (1UL << 14UL)) { |
@@ -244,7 +244,7 @@ static unsigned int sbus_build_irq(struct platform_device *op, unsigned int ino) | |||
244 | case 3: | 244 | case 3: |
245 | iclr = reg_base + SYSIO_ICLR_SLOT3; | 245 | iclr = reg_base + SYSIO_ICLR_SLOT3; |
246 | break; | 246 | break; |
247 | }; | 247 | } |
248 | 248 | ||
249 | iclr += ((unsigned long)sbus_level - 1UL) * 8UL; | 249 | iclr += ((unsigned long)sbus_level - 1UL) * 8UL; |
250 | } | 250 | } |
diff --git a/arch/sparc/kernel/setup_32.c b/arch/sparc/kernel/setup_32.c index 3249d3f3234..d26e1f6c717 100644 --- a/arch/sparc/kernel/setup_32.c +++ b/arch/sparc/kernel/setup_32.c | |||
@@ -267,7 +267,7 @@ void __init setup_arch(char **cmdline_p) | |||
267 | default: | 267 | default: |
268 | printk("UNKNOWN!\n"); | 268 | printk("UNKNOWN!\n"); |
269 | break; | 269 | break; |
270 | }; | 270 | } |
271 | 271 | ||
272 | #ifdef CONFIG_DUMMY_CONSOLE | 272 | #ifdef CONFIG_DUMMY_CONSOLE |
273 | conswitchp = &dummy_con; | 273 | conswitchp = &dummy_con; |
diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c index f3b6850cc8d..c4dd0999da8 100644 --- a/arch/sparc/kernel/setup_64.c +++ b/arch/sparc/kernel/setup_64.c | |||
@@ -209,7 +209,7 @@ void __init per_cpu_patch(void) | |||
209 | default: | 209 | default: |
210 | prom_printf("Unknown cpu type, halting.\n"); | 210 | prom_printf("Unknown cpu type, halting.\n"); |
211 | prom_halt(); | 211 | prom_halt(); |
212 | }; | 212 | } |
213 | 213 | ||
214 | *(unsigned int *) (addr + 0) = insns[0]; | 214 | *(unsigned int *) (addr + 0) = insns[0]; |
215 | wmb(); | 215 | wmb(); |
diff --git a/arch/sparc/kernel/smp_32.c b/arch/sparc/kernel/smp_32.c index d5b3958be0b..21b125341bf 100644 --- a/arch/sparc/kernel/smp_32.c +++ b/arch/sparc/kernel/smp_32.c | |||
@@ -114,7 +114,7 @@ void __init smp_cpus_done(unsigned int max_cpus) | |||
114 | printk("UNKNOWN!\n"); | 114 | printk("UNKNOWN!\n"); |
115 | BUG(); | 115 | BUG(); |
116 | break; | 116 | break; |
117 | }; | 117 | } |
118 | } | 118 | } |
119 | 119 | ||
120 | void cpu_panic(void) | 120 | void cpu_panic(void) |
@@ -374,7 +374,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
374 | printk("UNKNOWN!\n"); | 374 | printk("UNKNOWN!\n"); |
375 | BUG(); | 375 | BUG(); |
376 | break; | 376 | break; |
377 | }; | 377 | } |
378 | } | 378 | } |
379 | 379 | ||
380 | /* Set this up early so that things like the scheduler can init | 380 | /* Set this up early so that things like the scheduler can init |
@@ -447,7 +447,7 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
447 | printk("UNKNOWN!\n"); | 447 | printk("UNKNOWN!\n"); |
448 | BUG(); | 448 | BUG(); |
449 | break; | 449 | break; |
450 | }; | 450 | } |
451 | 451 | ||
452 | if (!ret) { | 452 | if (!ret) { |
453 | cpumask_set_cpu(cpu, &smp_commenced_mask); | 453 | cpumask_set_cpu(cpu, &smp_commenced_mask); |
diff --git a/arch/sparc/kernel/sun4d_irq.c b/arch/sparc/kernel/sun4d_irq.c index a9ea60eb2c1..1d13c5bda0b 100644 --- a/arch/sparc/kernel/sun4d_irq.c +++ b/arch/sparc/kernel/sun4d_irq.c | |||
@@ -103,10 +103,9 @@ static void sun4d_sbus_handler_irq(int sbusl) | |||
103 | 103 | ||
104 | sbil = (sbusl << 2); | 104 | sbil = (sbusl << 2); |
105 | /* Loop for each pending SBI */ | 105 | /* Loop for each pending SBI */ |
106 | for (sbino = 0; bus_mask; sbino++) { | 106 | for (sbino = 0; bus_mask; sbino++, bus_mask >>= 1) { |
107 | unsigned int idx, mask; | 107 | unsigned int idx, mask; |
108 | 108 | ||
109 | bus_mask >>= 1; | ||
110 | if (!(bus_mask & 1)) | 109 | if (!(bus_mask & 1)) |
111 | continue; | 110 | continue; |
112 | /* XXX This seems to ACK the irq twice. acquire_sbi() | 111 | /* XXX This seems to ACK the irq twice. acquire_sbi() |
@@ -118,19 +117,16 @@ static void sun4d_sbus_handler_irq(int sbusl) | |||
118 | mask &= (0xf << sbil); | 117 | mask &= (0xf << sbil); |
119 | 118 | ||
120 | /* Loop for each pending SBI slot */ | 119 | /* Loop for each pending SBI slot */ |
121 | idx = 0; | ||
122 | slot = (1 << sbil); | 120 | slot = (1 << sbil); |
123 | while (mask != 0) { | 121 | for (idx = 0; mask != 0; idx++, slot <<= 1) { |
124 | unsigned int pil; | 122 | unsigned int pil; |
125 | struct irq_bucket *p; | 123 | struct irq_bucket *p; |
126 | 124 | ||
127 | idx++; | ||
128 | slot <<= 1; | ||
129 | if (!(mask & slot)) | 125 | if (!(mask & slot)) |
130 | continue; | 126 | continue; |
131 | 127 | ||
132 | mask &= ~slot; | 128 | mask &= ~slot; |
133 | pil = sun4d_encode_irq(sbino, sbil, idx); | 129 | pil = sun4d_encode_irq(sbino, sbusl, idx); |
134 | 130 | ||
135 | p = irq_map[pil]; | 131 | p = irq_map[pil]; |
136 | while (p) { | 132 | while (p) { |
@@ -218,10 +214,10 @@ static void sun4d_unmask_irq(struct irq_data *data) | |||
218 | 214 | ||
219 | #ifdef CONFIG_SMP | 215 | #ifdef CONFIG_SMP |
220 | spin_lock_irqsave(&sun4d_imsk_lock, flags); | 216 | spin_lock_irqsave(&sun4d_imsk_lock, flags); |
221 | cc_set_imsk_other(cpuid, cc_get_imsk_other(cpuid) | ~(1 << real_irq)); | 217 | cc_set_imsk_other(cpuid, cc_get_imsk_other(cpuid) & ~(1 << real_irq)); |
222 | spin_unlock_irqrestore(&sun4d_imsk_lock, flags); | 218 | spin_unlock_irqrestore(&sun4d_imsk_lock, flags); |
223 | #else | 219 | #else |
224 | cc_set_imsk(cc_get_imsk() | ~(1 << real_irq)); | 220 | cc_set_imsk(cc_get_imsk() & ~(1 << real_irq)); |
225 | #endif | 221 | #endif |
226 | } | 222 | } |
227 | 223 | ||
@@ -299,26 +295,68 @@ static void __init sun4d_load_profile_irqs(void) | |||
299 | } | 295 | } |
300 | } | 296 | } |
301 | 297 | ||
298 | unsigned int _sun4d_build_device_irq(unsigned int real_irq, | ||
299 | unsigned int pil, | ||
300 | unsigned int board) | ||
301 | { | ||
302 | struct sun4d_handler_data *handler_data; | ||
303 | unsigned int irq; | ||
304 | |||
305 | irq = irq_alloc(real_irq, pil); | ||
306 | if (irq == 0) { | ||
307 | prom_printf("IRQ: allocate for %d %d %d failed\n", | ||
308 | real_irq, pil, board); | ||
309 | goto err_out; | ||
310 | } | ||
311 | |||
312 | handler_data = irq_get_handler_data(irq); | ||
313 | if (unlikely(handler_data)) | ||
314 | goto err_out; | ||
315 | |||
316 | handler_data = kzalloc(sizeof(struct sun4d_handler_data), GFP_ATOMIC); | ||
317 | if (unlikely(!handler_data)) { | ||
318 | prom_printf("IRQ: kzalloc(sun4d_handler_data) failed.\n"); | ||
319 | prom_halt(); | ||
320 | } | ||
321 | handler_data->cpuid = board_to_cpu[board]; | ||
322 | handler_data->real_irq = real_irq; | ||
323 | irq_set_chip_and_handler_name(irq, &sun4d_irq, | ||
324 | handle_level_irq, "level"); | ||
325 | irq_set_handler_data(irq, handler_data); | ||
326 | |||
327 | err_out: | ||
328 | return irq; | ||
329 | } | ||
330 | |||
331 | |||
332 | |||
302 | unsigned int sun4d_build_device_irq(struct platform_device *op, | 333 | unsigned int sun4d_build_device_irq(struct platform_device *op, |
303 | unsigned int real_irq) | 334 | unsigned int real_irq) |
304 | { | 335 | { |
305 | struct device_node *dp = op->dev.of_node; | 336 | struct device_node *dp = op->dev.of_node; |
306 | struct device_node *io_unit, *sbi = dp->parent; | 337 | struct device_node *board_parent, *bus = dp->parent; |
338 | char *bus_connection; | ||
307 | const struct linux_prom_registers *regs; | 339 | const struct linux_prom_registers *regs; |
308 | struct sun4d_handler_data *handler_data; | ||
309 | unsigned int pil; | 340 | unsigned int pil; |
310 | unsigned int irq; | 341 | unsigned int irq; |
311 | int board, slot; | 342 | int board, slot; |
312 | int sbusl; | 343 | int sbusl; |
313 | 344 | ||
314 | irq = 0; | 345 | irq = real_irq; |
315 | while (sbi) { | 346 | while (bus) { |
316 | if (!strcmp(sbi->name, "sbi")) | 347 | if (!strcmp(bus->name, "sbi")) { |
348 | bus_connection = "io-unit"; | ||
349 | break; | ||
350 | } | ||
351 | |||
352 | if (!strcmp(bus->name, "bootbus")) { | ||
353 | bus_connection = "cpu-unit"; | ||
317 | break; | 354 | break; |
355 | } | ||
318 | 356 | ||
319 | sbi = sbi->parent; | 357 | bus = bus->parent; |
320 | } | 358 | } |
321 | if (!sbi) | 359 | if (!bus) |
322 | goto err_out; | 360 | goto err_out; |
323 | 361 | ||
324 | regs = of_get_property(dp, "reg", NULL); | 362 | regs = of_get_property(dp, "reg", NULL); |
@@ -328,17 +366,19 @@ unsigned int sun4d_build_device_irq(struct platform_device *op, | |||
328 | slot = regs->which_io; | 366 | slot = regs->which_io; |
329 | 367 | ||
330 | /* | 368 | /* |
331 | * If SBI's parent is not io-unit or the io-unit lacks | 369 | * If Bus nodes parent is not io-unit/cpu-unit or the io-unit/cpu-unit |
332 | * a "board#" property, something is very wrong. | 370 | * lacks a "board#" property, something is very wrong. |
333 | */ | 371 | */ |
334 | if (!sbi->parent || strcmp(sbi->parent->name, "io-unit")) { | 372 | if (!bus->parent || strcmp(bus->parent->name, bus_connection)) { |
335 | printk("%s: Error, parent is not io-unit.\n", sbi->full_name); | 373 | printk(KERN_ERR "%s: Error, parent is not %s.\n", |
374 | bus->full_name, bus_connection); | ||
336 | goto err_out; | 375 | goto err_out; |
337 | } | 376 | } |
338 | io_unit = sbi->parent; | 377 | board_parent = bus->parent; |
339 | board = of_getintprop_default(io_unit, "board#", -1); | 378 | board = of_getintprop_default(board_parent, "board#", -1); |
340 | if (board == -1) { | 379 | if (board == -1) { |
341 | printk("%s: Error, lacks board# property.\n", io_unit->full_name); | 380 | printk(KERN_ERR "%s: Error, lacks board# property.\n", |
381 | board_parent->full_name); | ||
342 | goto err_out; | 382 | goto err_out; |
343 | } | 383 | } |
344 | 384 | ||
@@ -348,29 +388,17 @@ unsigned int sun4d_build_device_irq(struct platform_device *op, | |||
348 | else | 388 | else |
349 | pil = real_irq; | 389 | pil = real_irq; |
350 | 390 | ||
351 | irq = irq_alloc(real_irq, pil); | 391 | irq = _sun4d_build_device_irq(real_irq, pil, board); |
352 | if (irq == 0) | ||
353 | goto err_out; | ||
354 | |||
355 | handler_data = irq_get_handler_data(irq); | ||
356 | if (unlikely(handler_data)) | ||
357 | goto err_out; | ||
358 | |||
359 | handler_data = kzalloc(sizeof(struct sun4d_handler_data), GFP_ATOMIC); | ||
360 | if (unlikely(!handler_data)) { | ||
361 | prom_printf("IRQ: kzalloc(sun4d_handler_data) failed.\n"); | ||
362 | prom_halt(); | ||
363 | } | ||
364 | handler_data->cpuid = board_to_cpu[board]; | ||
365 | handler_data->real_irq = real_irq; | ||
366 | irq_set_chip_and_handler_name(irq, &sun4d_irq, | ||
367 | handle_level_irq, "level"); | ||
368 | irq_set_handler_data(irq, handler_data); | ||
369 | |||
370 | err_out: | 392 | err_out: |
371 | return real_irq; | 393 | return irq; |
372 | } | 394 | } |
373 | 395 | ||
396 | unsigned int sun4d_build_timer_irq(unsigned int board, unsigned int real_irq) | ||
397 | { | ||
398 | return _sun4d_build_device_irq(real_irq, real_irq, board); | ||
399 | } | ||
400 | |||
401 | |||
374 | static void __init sun4d_fixup_trap_table(void) | 402 | static void __init sun4d_fixup_trap_table(void) |
375 | { | 403 | { |
376 | #ifdef CONFIG_SMP | 404 | #ifdef CONFIG_SMP |
@@ -402,6 +430,7 @@ static void __init sun4d_init_timers(irq_handler_t counter_fn) | |||
402 | unsigned int irq; | 430 | unsigned int irq; |
403 | const u32 *reg; | 431 | const u32 *reg; |
404 | int err; | 432 | int err; |
433 | int board; | ||
405 | 434 | ||
406 | dp = of_find_node_by_name(NULL, "cpu-unit"); | 435 | dp = of_find_node_by_name(NULL, "cpu-unit"); |
407 | if (!dp) { | 436 | if (!dp) { |
@@ -414,12 +443,19 @@ static void __init sun4d_init_timers(irq_handler_t counter_fn) | |||
414 | * bootbus. | 443 | * bootbus. |
415 | */ | 444 | */ |
416 | reg = of_get_property(dp, "reg", NULL); | 445 | reg = of_get_property(dp, "reg", NULL); |
417 | of_node_put(dp); | ||
418 | if (!reg) { | 446 | if (!reg) { |
419 | prom_printf("sun4d_init_timers: No reg property\n"); | 447 | prom_printf("sun4d_init_timers: No reg property\n"); |
420 | prom_halt(); | 448 | prom_halt(); |
421 | } | 449 | } |
422 | 450 | ||
451 | board = of_getintprop_default(dp, "board#", -1); | ||
452 | if (board == -1) { | ||
453 | prom_printf("sun4d_init_timers: No board# property on cpu-unit\n"); | ||
454 | prom_halt(); | ||
455 | } | ||
456 | |||
457 | of_node_put(dp); | ||
458 | |||
423 | res.start = reg[1]; | 459 | res.start = reg[1]; |
424 | res.end = reg[2] - 1; | 460 | res.end = reg[2] - 1; |
425 | res.flags = reg[0] & 0xff; | 461 | res.flags = reg[0] & 0xff; |
@@ -434,7 +470,7 @@ static void __init sun4d_init_timers(irq_handler_t counter_fn) | |||
434 | 470 | ||
435 | master_l10_counter = &sun4d_timers->l10_cur_count; | 471 | master_l10_counter = &sun4d_timers->l10_cur_count; |
436 | 472 | ||
437 | irq = sun4d_build_device_irq(NULL, SUN4D_TIMER_IRQ); | 473 | irq = sun4d_build_timer_irq(board, SUN4D_TIMER_IRQ); |
438 | err = request_irq(irq, counter_fn, IRQF_TIMER, "timer", NULL); | 474 | err = request_irq(irq, counter_fn, IRQF_TIMER, "timer", NULL); |
439 | if (err) { | 475 | if (err) { |
440 | prom_printf("sun4d_init_timers: request_irq() failed with %d\n", | 476 | prom_printf("sun4d_init_timers: request_irq() failed with %d\n", |
diff --git a/arch/sparc/kernel/sys_sparc32.c b/arch/sparc/kernel/sys_sparc32.c index 6db18c6927f..170cd8e8eb2 100644 --- a/arch/sparc/kernel/sys_sparc32.c +++ b/arch/sparc/kernel/sys_sparc32.c | |||
@@ -109,7 +109,7 @@ asmlinkage long compat_sys_ipc(u32 call, u32 first, u32 second, u32 third, compa | |||
109 | 109 | ||
110 | default: | 110 | default: |
111 | return -ENOSYS; | 111 | return -ENOSYS; |
112 | }; | 112 | } |
113 | 113 | ||
114 | return -ENOSYS; | 114 | return -ENOSYS; |
115 | } | 115 | } |
diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index 96082d30def..908b47a5ee2 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c | |||
@@ -460,7 +460,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second | |||
460 | default: | 460 | default: |
461 | err = -ENOSYS; | 461 | err = -ENOSYS; |
462 | goto out; | 462 | goto out; |
463 | }; | 463 | } |
464 | } | 464 | } |
465 | if (call <= MSGCTL) { | 465 | if (call <= MSGCTL) { |
466 | switch (call) { | 466 | switch (call) { |
@@ -481,7 +481,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second | |||
481 | default: | 481 | default: |
482 | err = -ENOSYS; | 482 | err = -ENOSYS; |
483 | goto out; | 483 | goto out; |
484 | }; | 484 | } |
485 | } | 485 | } |
486 | if (call <= SHMCTL) { | 486 | if (call <= SHMCTL) { |
487 | switch (call) { | 487 | switch (call) { |
@@ -507,7 +507,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second | |||
507 | default: | 507 | default: |
508 | err = -ENOSYS; | 508 | err = -ENOSYS; |
509 | goto out; | 509 | goto out; |
510 | }; | 510 | } |
511 | } else { | 511 | } else { |
512 | err = -ENOSYS; | 512 | err = -ENOSYS; |
513 | } | 513 | } |
diff --git a/arch/sparc/kernel/time_64.c b/arch/sparc/kernel/time_64.c index 2b8d54b2d85..1db6b18964d 100644 --- a/arch/sparc/kernel/time_64.c +++ b/arch/sparc/kernel/time_64.c | |||
@@ -708,7 +708,7 @@ static void sparc64_timer_setup(enum clock_event_mode mode, | |||
708 | case CLOCK_EVT_MODE_UNUSED: | 708 | case CLOCK_EVT_MODE_UNUSED: |
709 | WARN_ON(1); | 709 | WARN_ON(1); |
710 | break; | 710 | break; |
711 | }; | 711 | } |
712 | } | 712 | } |
713 | 713 | ||
714 | static struct clock_event_device sparc64_clockevent = { | 714 | static struct clock_event_device sparc64_clockevent = { |
diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c index 1ed547bd850..0cbdaa41cd1 100644 --- a/arch/sparc/kernel/traps_64.c +++ b/arch/sparc/kernel/traps_64.c | |||
@@ -1804,7 +1804,7 @@ static const char *sun4v_err_type_to_str(u32 type) | |||
1804 | return "warning resumable"; | 1804 | return "warning resumable"; |
1805 | default: | 1805 | default: |
1806 | return "unknown"; | 1806 | return "unknown"; |
1807 | }; | 1807 | } |
1808 | } | 1808 | } |
1809 | 1809 | ||
1810 | static void sun4v_log_error(struct pt_regs *regs, struct sun4v_error_entry *ent, int cpu, const char *pfx, atomic_t *ocnt) | 1810 | static void sun4v_log_error(struct pt_regs *regs, struct sun4v_error_entry *ent, int cpu, const char *pfx, atomic_t *ocnt) |
diff --git a/arch/sparc/kernel/unaligned_64.c b/arch/sparc/kernel/unaligned_64.c index c752c4c479b..b2b019ea8ca 100644 --- a/arch/sparc/kernel/unaligned_64.c +++ b/arch/sparc/kernel/unaligned_64.c | |||
@@ -211,7 +211,7 @@ static inline int do_int_store(int reg_num, int size, unsigned long *dst_addr, | |||
211 | default: | 211 | default: |
212 | BUG(); | 212 | BUG(); |
213 | break; | 213 | break; |
214 | }; | 214 | } |
215 | } | 215 | } |
216 | return __do_int_store(dst_addr, size, src_val, asi); | 216 | return __do_int_store(dst_addr, size, src_val, asi); |
217 | } | 217 | } |
@@ -328,7 +328,7 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn) | |||
328 | case ASI_SNFL: | 328 | case ASI_SNFL: |
329 | asi &= ~0x08; | 329 | asi &= ~0x08; |
330 | break; | 330 | break; |
331 | }; | 331 | } |
332 | switch (dir) { | 332 | switch (dir) { |
333 | case load: | 333 | case load: |
334 | reg_addr = fetch_reg_addr(((insn>>25)&0x1f), regs); | 334 | reg_addr = fetch_reg_addr(((insn>>25)&0x1f), regs); |
@@ -351,7 +351,7 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn) | |||
351 | default: | 351 | default: |
352 | BUG(); | 352 | BUG(); |
353 | break; | 353 | break; |
354 | }; | 354 | } |
355 | *reg_addr = val_in; | 355 | *reg_addr = val_in; |
356 | } | 356 | } |
357 | break; | 357 | break; |
diff --git a/arch/sparc/kernel/us2e_cpufreq.c b/arch/sparc/kernel/us2e_cpufreq.c index 531d54fc982..489fc15f319 100644 --- a/arch/sparc/kernel/us2e_cpufreq.c +++ b/arch/sparc/kernel/us2e_cpufreq.c | |||
@@ -176,7 +176,7 @@ static unsigned long index_to_estar_mode(unsigned int index) | |||
176 | 176 | ||
177 | default: | 177 | default: |
178 | BUG(); | 178 | BUG(); |
179 | }; | 179 | } |
180 | } | 180 | } |
181 | 181 | ||
182 | static unsigned long index_to_divisor(unsigned int index) | 182 | static unsigned long index_to_divisor(unsigned int index) |
@@ -199,7 +199,7 @@ static unsigned long index_to_divisor(unsigned int index) | |||
199 | 199 | ||
200 | default: | 200 | default: |
201 | BUG(); | 201 | BUG(); |
202 | }; | 202 | } |
203 | } | 203 | } |
204 | 204 | ||
205 | static unsigned long estar_to_divisor(unsigned long estar) | 205 | static unsigned long estar_to_divisor(unsigned long estar) |
@@ -224,7 +224,7 @@ static unsigned long estar_to_divisor(unsigned long estar) | |||
224 | break; | 224 | break; |
225 | default: | 225 | default: |
226 | BUG(); | 226 | BUG(); |
227 | }; | 227 | } |
228 | 228 | ||
229 | return ret; | 229 | return ret; |
230 | } | 230 | } |
diff --git a/arch/sparc/kernel/us3_cpufreq.c b/arch/sparc/kernel/us3_cpufreq.c index 9a8ceb70083..eb1624b931d 100644 --- a/arch/sparc/kernel/us3_cpufreq.c +++ b/arch/sparc/kernel/us3_cpufreq.c | |||
@@ -71,7 +71,7 @@ static unsigned long get_current_freq(unsigned int cpu, unsigned long safari_cfg | |||
71 | break; | 71 | break; |
72 | default: | 72 | default: |
73 | BUG(); | 73 | BUG(); |
74 | }; | 74 | } |
75 | 75 | ||
76 | return ret; | 76 | return ret; |
77 | } | 77 | } |
@@ -125,7 +125,7 @@ static void us3_set_cpu_divider_index(unsigned int cpu, unsigned int index) | |||
125 | 125 | ||
126 | default: | 126 | default: |
127 | BUG(); | 127 | BUG(); |
128 | }; | 128 | } |
129 | 129 | ||
130 | reg = read_safari_cfg(); | 130 | reg = read_safari_cfg(); |
131 | 131 | ||
diff --git a/arch/sparc/kernel/viohs.c b/arch/sparc/kernel/viohs.c index aa6ac70d4fd..29348ea139c 100644 --- a/arch/sparc/kernel/viohs.c +++ b/arch/sparc/kernel/viohs.c | |||
@@ -363,7 +363,7 @@ static int process_ver(struct vio_driver_state *vio, struct vio_ver_info *pkt) | |||
363 | 363 | ||
364 | default: | 364 | default: |
365 | return handshake_failure(vio); | 365 | return handshake_failure(vio); |
366 | }; | 366 | } |
367 | } | 367 | } |
368 | 368 | ||
369 | static int process_attr(struct vio_driver_state *vio, void *pkt) | 369 | static int process_attr(struct vio_driver_state *vio, void *pkt) |
diff --git a/arch/sparc/kernel/visemul.c b/arch/sparc/kernel/visemul.c index 9dfd2ebcb15..36357717d69 100644 --- a/arch/sparc/kernel/visemul.c +++ b/arch/sparc/kernel/visemul.c | |||
@@ -334,7 +334,7 @@ static void edge(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
334 | left = edge32_tab_l[(rs1 >> 2) & 0x1].left; | 334 | left = edge32_tab_l[(rs1 >> 2) & 0x1].left; |
335 | right = edge32_tab_l[(rs2 >> 2) & 0x1].right; | 335 | right = edge32_tab_l[(rs2 >> 2) & 0x1].right; |
336 | break; | 336 | break; |
337 | }; | 337 | } |
338 | 338 | ||
339 | if ((rs1 & ~0x7UL) == (rs2 & ~0x7UL)) | 339 | if ((rs1 & ~0x7UL) == (rs2 & ~0x7UL)) |
340 | rd_val = right & left; | 340 | rd_val = right & left; |
@@ -360,7 +360,7 @@ static void edge(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
360 | tstate = regs->tstate & ~(TSTATE_XCC | TSTATE_ICC); | 360 | tstate = regs->tstate & ~(TSTATE_XCC | TSTATE_ICC); |
361 | regs->tstate = tstate | (ccr << 32UL); | 361 | regs->tstate = tstate | (ccr << 32UL); |
362 | } | 362 | } |
363 | }; | 363 | } |
364 | } | 364 | } |
365 | 365 | ||
366 | static void array(struct pt_regs *regs, unsigned int insn, unsigned int opf) | 366 | static void array(struct pt_regs *regs, unsigned int insn, unsigned int opf) |
@@ -392,7 +392,7 @@ static void array(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
392 | 392 | ||
393 | case ARRAY32_OPF: | 393 | case ARRAY32_OPF: |
394 | rd_val <<= 2; | 394 | rd_val <<= 2; |
395 | }; | 395 | } |
396 | 396 | ||
397 | store_reg(regs, rd_val, RD(insn)); | 397 | store_reg(regs, rd_val, RD(insn)); |
398 | } | 398 | } |
@@ -577,7 +577,7 @@ static void pformat(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
577 | *fpd_regaddr(f, RD(insn)) = rd_val; | 577 | *fpd_regaddr(f, RD(insn)) = rd_val; |
578 | break; | 578 | break; |
579 | } | 579 | } |
580 | }; | 580 | } |
581 | } | 581 | } |
582 | 582 | ||
583 | static void pmul(struct pt_regs *regs, unsigned int insn, unsigned int opf) | 583 | static void pmul(struct pt_regs *regs, unsigned int insn, unsigned int opf) |
@@ -693,7 +693,7 @@ static void pmul(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
693 | *fpd_regaddr(f, RD(insn)) = rd_val; | 693 | *fpd_regaddr(f, RD(insn)) = rd_val; |
694 | break; | 694 | break; |
695 | } | 695 | } |
696 | }; | 696 | } |
697 | } | 697 | } |
698 | 698 | ||
699 | static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf) | 699 | static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf) |
@@ -786,7 +786,7 @@ static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
786 | rd_val |= 1 << i; | 786 | rd_val |= 1 << i; |
787 | } | 787 | } |
788 | break; | 788 | break; |
789 | }; | 789 | } |
790 | 790 | ||
791 | maybe_flush_windows(0, 0, RD(insn), 0); | 791 | maybe_flush_windows(0, 0, RD(insn), 0); |
792 | store_reg(regs, rd_val, RD(insn)); | 792 | store_reg(regs, rd_val, RD(insn)); |
@@ -885,7 +885,7 @@ int vis_emul(struct pt_regs *regs, unsigned int insn) | |||
885 | case BSHUFFLE_OPF: | 885 | case BSHUFFLE_OPF: |
886 | bshuffle(regs, insn); | 886 | bshuffle(regs, insn); |
887 | break; | 887 | break; |
888 | }; | 888 | } |
889 | 889 | ||
890 | regs->tpc = regs->tnpc; | 890 | regs->tpc = regs->tnpc; |
891 | regs->tnpc += 4; | 891 | regs->tnpc += 4; |
diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c index b10ac4d6237..7543ddbdadb 100644 --- a/arch/sparc/mm/fault_32.c +++ b/arch/sparc/mm/fault_32.c | |||
@@ -135,7 +135,7 @@ asmlinkage int lookup_fault(unsigned long pc, unsigned long ret_pc, | |||
135 | 135 | ||
136 | default: | 136 | default: |
137 | break; | 137 | break; |
138 | }; | 138 | } |
139 | 139 | ||
140 | memset(®s, 0, sizeof (regs)); | 140 | memset(®s, 0, sizeof (regs)); |
141 | regs.pc = pc; | 141 | regs.pc = pc; |
diff --git a/arch/sparc/mm/init_32.c b/arch/sparc/mm/init_32.c index ca217327e8d..7b00de61c5f 100644 --- a/arch/sparc/mm/init_32.c +++ b/arch/sparc/mm/init_32.c | |||
@@ -340,7 +340,7 @@ void __init paging_init(void) | |||
340 | prom_printf("paging_init: sparc_cpu_model = %d\n", sparc_cpu_model); | 340 | prom_printf("paging_init: sparc_cpu_model = %d\n", sparc_cpu_model); |
341 | prom_printf("paging_init: Halting...\n"); | 341 | prom_printf("paging_init: Halting...\n"); |
342 | prom_halt(); | 342 | prom_halt(); |
343 | }; | 343 | } |
344 | 344 | ||
345 | /* Initialize the protection map with non-constant, MMU dependent values. */ | 345 | /* Initialize the protection map with non-constant, MMU dependent values. */ |
346 | protection_map[0] = PAGE_NONE; | 346 | protection_map[0] = PAGE_NONE; |
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index e10cd03fab8..3fd8e18bed8 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c | |||
@@ -1625,7 +1625,7 @@ static void __init sun4v_ktsb_init(void) | |||
1625 | ktsb_descr[0].pgsz_idx = HV_PGSZ_IDX_4MB; | 1625 | ktsb_descr[0].pgsz_idx = HV_PGSZ_IDX_4MB; |
1626 | ktsb_descr[0].pgsz_mask = HV_PGSZ_MASK_4MB; | 1626 | ktsb_descr[0].pgsz_mask = HV_PGSZ_MASK_4MB; |
1627 | break; | 1627 | break; |
1628 | }; | 1628 | } |
1629 | 1629 | ||
1630 | ktsb_descr[0].assoc = 1; | 1630 | ktsb_descr[0].assoc = 1; |
1631 | ktsb_descr[0].num_ttes = KERNEL_TSB_NENTRIES; | 1631 | ktsb_descr[0].num_ttes = KERNEL_TSB_NENTRIES; |
@@ -2266,7 +2266,7 @@ unsigned long pte_sz_bits(unsigned long sz) | |||
2266 | return _PAGE_SZ512K_4V; | 2266 | return _PAGE_SZ512K_4V; |
2267 | case 4 * 1024 * 1024: | 2267 | case 4 * 1024 * 1024: |
2268 | return _PAGE_SZ4MB_4V; | 2268 | return _PAGE_SZ4MB_4V; |
2269 | }; | 2269 | } |
2270 | } else { | 2270 | } else { |
2271 | switch (sz) { | 2271 | switch (sz) { |
2272 | case 8 * 1024: | 2272 | case 8 * 1024: |
@@ -2278,7 +2278,7 @@ unsigned long pte_sz_bits(unsigned long sz) | |||
2278 | return _PAGE_SZ512K_4U; | 2278 | return _PAGE_SZ512K_4U; |
2279 | case 4 * 1024 * 1024: | 2279 | case 4 * 1024 * 1024: |
2280 | return _PAGE_SZ4MB_4U; | 2280 | return _PAGE_SZ4MB_4U; |
2281 | }; | 2281 | } |
2282 | } | 2282 | } |
2283 | } | 2283 | } |
2284 | 2284 | ||
diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index fe09fd8be69..cbef74e793b 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c | |||
@@ -1665,7 +1665,7 @@ static void __init init_swift(void) | |||
1665 | default: | 1665 | default: |
1666 | srmmu_modtype = Swift_ok; | 1666 | srmmu_modtype = Swift_ok; |
1667 | break; | 1667 | break; |
1668 | }; | 1668 | } |
1669 | 1669 | ||
1670 | BTFIXUPSET_CALL(flush_cache_all, swift_flush_cache_all, BTFIXUPCALL_NORM); | 1670 | BTFIXUPSET_CALL(flush_cache_all, swift_flush_cache_all, BTFIXUPCALL_NORM); |
1671 | BTFIXUPSET_CALL(flush_cache_mm, swift_flush_cache_mm, BTFIXUPCALL_NORM); | 1671 | BTFIXUPSET_CALL(flush_cache_mm, swift_flush_cache_mm, BTFIXUPCALL_NORM); |
@@ -2069,7 +2069,7 @@ static void __init get_srmmu_type(void) | |||
2069 | /* Some other Cypress revision, assume a 605. */ | 2069 | /* Some other Cypress revision, assume a 605. */ |
2070 | init_cypress_605(mod_rev); | 2070 | init_cypress_605(mod_rev); |
2071 | break; | 2071 | break; |
2072 | }; | 2072 | } |
2073 | return; | 2073 | return; |
2074 | } | 2074 | } |
2075 | 2075 | ||
diff --git a/arch/sparc/mm/sun4c.c b/arch/sparc/mm/sun4c.c index a2350b5e68a..1cf4f198709 100644 --- a/arch/sparc/mm/sun4c.c +++ b/arch/sparc/mm/sun4c.c | |||
@@ -318,7 +318,7 @@ void __init sun4c_probe_vac(void) | |||
318 | prom_printf("probe_vac: Didn't expect vac-linesize of %d, halting\n", | 318 | prom_printf("probe_vac: Didn't expect vac-linesize of %d, halting\n", |
319 | sun4c_vacinfo.linesize); | 319 | sun4c_vacinfo.linesize); |
320 | prom_halt(); | 320 | prom_halt(); |
321 | }; | 321 | } |
322 | 322 | ||
323 | sun4c_flush_all(); | 323 | sun4c_flush_all(); |
324 | sun4c_enable_vac(); | 324 | sun4c_enable_vac(); |
@@ -364,7 +364,7 @@ static void __init patch_kernel_fault_handler(void) | |||
364 | prom_printf("Unhandled number of segmaps: %d\n", | 364 | prom_printf("Unhandled number of segmaps: %d\n", |
365 | num_segmaps); | 365 | num_segmaps); |
366 | prom_halt(); | 366 | prom_halt(); |
367 | }; | 367 | } |
368 | switch (num_contexts) { | 368 | switch (num_contexts) { |
369 | case 8: | 369 | case 8: |
370 | /* Default, nothing to do. */ | 370 | /* Default, nothing to do. */ |
@@ -377,7 +377,7 @@ static void __init patch_kernel_fault_handler(void) | |||
377 | prom_printf("Unhandled number of contexts: %d\n", | 377 | prom_printf("Unhandled number of contexts: %d\n", |
378 | num_contexts); | 378 | num_contexts); |
379 | prom_halt(); | 379 | prom_halt(); |
380 | }; | 380 | } |
381 | 381 | ||
382 | if (sun4c_vacinfo.do_hwflushes != 0) { | 382 | if (sun4c_vacinfo.do_hwflushes != 0) { |
383 | PATCH_INSN(vac_hwflush_patch1_on, vac_hwflush_patch1); | 383 | PATCH_INSN(vac_hwflush_patch1_on, vac_hwflush_patch1); |
@@ -394,7 +394,7 @@ static void __init patch_kernel_fault_handler(void) | |||
394 | prom_printf("Impossible VAC linesize %d, halting...\n", | 394 | prom_printf("Impossible VAC linesize %d, halting...\n", |
395 | sun4c_vacinfo.linesize); | 395 | sun4c_vacinfo.linesize); |
396 | prom_halt(); | 396 | prom_halt(); |
397 | }; | 397 | } |
398 | } | 398 | } |
399 | } | 399 | } |
400 | 400 | ||
diff --git a/arch/sparc/mm/tsb.c b/arch/sparc/mm/tsb.c index 94846151349..a5f51b22fcb 100644 --- a/arch/sparc/mm/tsb.c +++ b/arch/sparc/mm/tsb.c | |||
@@ -180,7 +180,7 @@ static void setup_tsb_params(struct mm_struct *mm, unsigned long tsb_idx, unsign | |||
180 | printk(KERN_ERR "TSB[%s:%d]: Impossible TSB size %lu, killing process.\n", | 180 | printk(KERN_ERR "TSB[%s:%d]: Impossible TSB size %lu, killing process.\n", |
181 | current->comm, current->pid, tsb_bytes); | 181 | current->comm, current->pid, tsb_bytes); |
182 | do_exit(SIGSEGV); | 182 | do_exit(SIGSEGV); |
183 | }; | 183 | } |
184 | tte |= pte_sz_bits(page_sz); | 184 | tte |= pte_sz_bits(page_sz); |
185 | 185 | ||
186 | if (tlb_type == cheetah_plus || tlb_type == hypervisor) { | 186 | if (tlb_type == cheetah_plus || tlb_type == hypervisor) { |
@@ -215,7 +215,7 @@ static void setup_tsb_params(struct mm_struct *mm, unsigned long tsb_idx, unsign | |||
215 | #endif | 215 | #endif |
216 | default: | 216 | default: |
217 | BUG(); | 217 | BUG(); |
218 | }; | 218 | } |
219 | hp->assoc = 1; | 219 | hp->assoc = 1; |
220 | hp->num_ttes = tsb_bytes / 16; | 220 | hp->num_ttes = tsb_bytes / 16; |
221 | hp->ctx_idx = 0; | 221 | hp->ctx_idx = 0; |
@@ -230,7 +230,7 @@ static void setup_tsb_params(struct mm_struct *mm, unsigned long tsb_idx, unsign | |||
230 | #endif | 230 | #endif |
231 | default: | 231 | default: |
232 | BUG(); | 232 | BUG(); |
233 | }; | 233 | } |
234 | hp->tsb_base = tsb_paddr; | 234 | hp->tsb_base = tsb_paddr; |
235 | hp->resv = 0; | 235 | hp->resv = 0; |
236 | } | 236 | } |
diff --git a/arch/sparc/prom/console_32.c b/arch/sparc/prom/console_32.c index b05e3db5fa6..a00f47b16c1 100644 --- a/arch/sparc/prom/console_32.c +++ b/arch/sparc/prom/console_32.c | |||
@@ -38,7 +38,7 @@ static int prom_nbputchar(const char *buf) | |||
38 | break; | 38 | break; |
39 | default: | 39 | default: |
40 | break; | 40 | break; |
41 | }; | 41 | } |
42 | restore_current(); | 42 | restore_current(); |
43 | spin_unlock_irqrestore(&prom_lock, flags); | 43 | spin_unlock_irqrestore(&prom_lock, flags); |
44 | return i; /* Ugh, we could spin forever on unsupported proms ;( */ | 44 | return i; /* Ugh, we could spin forever on unsupported proms ;( */ |
diff --git a/arch/sparc/prom/init_32.c b/arch/sparc/prom/init_32.c index 0a601b30063..26c64cea3c9 100644 --- a/arch/sparc/prom/init_32.c +++ b/arch/sparc/prom/init_32.c | |||
@@ -53,7 +53,7 @@ void __init prom_init(struct linux_romvec *rp) | |||
53 | romvec->pv_romvers); | 53 | romvec->pv_romvers); |
54 | prom_halt(); | 54 | prom_halt(); |
55 | break; | 55 | break; |
56 | }; | 56 | } |
57 | 57 | ||
58 | prom_rev = romvec->pv_plugin_revision; | 58 | prom_rev = romvec->pv_plugin_revision; |
59 | prom_prev = romvec->pv_printrev; | 59 | prom_prev = romvec->pv_printrev; |
diff --git a/arch/sparc/prom/mp.c b/arch/sparc/prom/mp.c index 97c44c9ddbc..0da8256cf76 100644 --- a/arch/sparc/prom/mp.c +++ b/arch/sparc/prom/mp.c | |||
@@ -35,7 +35,7 @@ prom_startcpu(int cpunode, struct linux_prom_registers *ctable_reg, int ctx, cha | |||
35 | case PROM_V3: | 35 | case PROM_V3: |
36 | ret = (*(romvec->v3_cpustart))(cpunode, (int) ctable_reg, ctx, pc); | 36 | ret = (*(romvec->v3_cpustart))(cpunode, (int) ctable_reg, ctx, pc); |
37 | break; | 37 | break; |
38 | }; | 38 | } |
39 | restore_current(); | 39 | restore_current(); |
40 | spin_unlock_irqrestore(&prom_lock, flags); | 40 | spin_unlock_irqrestore(&prom_lock, flags); |
41 | 41 | ||
diff --git a/arch/unicore32/Kconfig b/arch/unicore32/Kconfig index d3a303246c9..e57dcce9bfd 100644 --- a/arch/unicore32/Kconfig +++ b/arch/unicore32/Kconfig | |||
@@ -231,10 +231,6 @@ config PUV3_PWM | |||
231 | help | 231 | help |
232 | Enable support for NB0916 PWM controllers | 232 | Enable support for NB0916 PWM controllers |
233 | 233 | ||
234 | config PUV3_RTC | ||
235 | tristate "PKUnity v3 RTC Support" | ||
236 | depends on !ARCH_FPGA | ||
237 | |||
238 | if PUV3_NB0916 | 234 | if PUV3_NB0916 |
239 | 235 | ||
240 | menu "PKUnity NetBook-0916 Features" | 236 | menu "PKUnity NetBook-0916 Features" |
diff --git a/arch/unicore32/Makefile b/arch/unicore32/Makefile index 76a8beec7d0..6af4bc415f2 100644 --- a/arch/unicore32/Makefile +++ b/arch/unicore32/Makefile | |||
@@ -40,42 +40,10 @@ core-y += arch/unicore32/mm/ | |||
40 | 40 | ||
41 | libs-y += arch/unicore32/lib/ | 41 | libs-y += arch/unicore32/lib/ |
42 | 42 | ||
43 | ASM_GENERATED_DIR := $(srctree)/arch/unicore32/include/generated | ||
44 | LINUXINCLUDE += -I$(ASM_GENERATED_DIR) | ||
45 | |||
46 | ASM_GENERIC_HEADERS := atomic.h auxvec.h | ||
47 | ASM_GENERIC_HEADERS += bitsperlong.h bug.h bugs.h | ||
48 | ASM_GENERIC_HEADERS += cputime.h current.h | ||
49 | ASM_GENERIC_HEADERS += device.h div64.h | ||
50 | ASM_GENERIC_HEADERS += emergency-restart.h errno.h | ||
51 | ASM_GENERIC_HEADERS += fb.h fcntl.h ftrace.h futex.h | ||
52 | ASM_GENERIC_HEADERS += hardirq.h hw_irq.h | ||
53 | ASM_GENERIC_HEADERS += ioctl.h ioctls.h ipcbuf.h irq_regs.h | ||
54 | ASM_GENERIC_HEADERS += kdebug.h kmap_types.h | ||
55 | ASM_GENERIC_HEADERS += local.h | ||
56 | ASM_GENERIC_HEADERS += mman.h module.h msgbuf.h | ||
57 | ASM_GENERIC_HEADERS += param.h parport.h percpu.h poll.h posix_types.h | ||
58 | ASM_GENERIC_HEADERS += resource.h | ||
59 | ASM_GENERIC_HEADERS += scatterlist.h sections.h segment.h sembuf.h serial.h | ||
60 | ASM_GENERIC_HEADERS += setup.h shmbuf.h shmparam.h | ||
61 | ASM_GENERIC_HEADERS += siginfo.h signal.h sizes.h | ||
62 | ASM_GENERIC_HEADERS += socket.h sockios.h stat.h statfs.h swab.h syscalls.h | ||
63 | ASM_GENERIC_HEADERS += termbits.h termios.h topology.h types.h | ||
64 | ASM_GENERIC_HEADERS += ucontext.h unaligned.h user.h | ||
65 | ASM_GENERIC_HEADERS += vga.h | ||
66 | ASM_GENERIC_HEADERS += xor.h | ||
67 | |||
68 | archprepare: | ||
69 | ifneq ($(ASM_GENERATED_DIR), $(wildcard $(ASM_GENERATED_DIR))) | ||
70 | $(Q)mkdir -p $(ASM_GENERATED_DIR)/asm | ||
71 | $(Q)$(foreach a, $(ASM_GENERIC_HEADERS), \ | ||
72 | echo '#include <asm-generic/$a>' \ | ||
73 | > $(ASM_GENERATED_DIR)/asm/$a; ) | ||
74 | endif | ||
75 | |||
76 | boot := arch/unicore32/boot | 43 | boot := arch/unicore32/boot |
77 | 44 | ||
78 | # Default target when executing plain make | 45 | # Default defconfig and target when executing plain make |
46 | KBUILD_DEFCONFIG := $(ARCH)_defconfig | ||
79 | KBUILD_IMAGE := zImage | 47 | KBUILD_IMAGE := zImage |
80 | 48 | ||
81 | all: $(KBUILD_IMAGE) | 49 | all: $(KBUILD_IMAGE) |
@@ -83,8 +51,6 @@ all: $(KBUILD_IMAGE) | |||
83 | zImage Image uImage: vmlinux | 51 | zImage Image uImage: vmlinux |
84 | $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ | 52 | $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ |
85 | 53 | ||
86 | MRPROPER_DIRS += $(ASM_GENERATED_DIR) | ||
87 | |||
88 | archclean: | 54 | archclean: |
89 | $(Q)$(MAKE) $(clean)=$(boot) | 55 | $(Q)$(MAKE) $(clean)=$(boot) |
90 | 56 | ||
diff --git a/arch/unicore32/boot/compressed/Makefile b/arch/unicore32/boot/compressed/Makefile index 95373428cb3..b0954a2d23c 100644 --- a/arch/unicore32/boot/compressed/Makefile +++ b/arch/unicore32/boot/compressed/Makefile | |||
@@ -59,7 +59,7 @@ $(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/head.o $(obj)/piggy.o \ | |||
59 | # We now have a PIC decompressor implementation. Decompressors running | 59 | # We now have a PIC decompressor implementation. Decompressors running |
60 | # from RAM should not define ZTEXTADDR. Decompressors running directly | 60 | # from RAM should not define ZTEXTADDR. Decompressors running directly |
61 | # from ROM or Flash must define ZTEXTADDR (preferably via the config) | 61 | # from ROM or Flash must define ZTEXTADDR (preferably via the config) |
62 | ZTEXTADDR := 0 | 62 | ZTEXTADDR := 0x03000000 |
63 | ZBSSADDR := ALIGN(4) | 63 | ZBSSADDR := ALIGN(4) |
64 | 64 | ||
65 | SEDFLAGS_lds = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/ | 65 | SEDFLAGS_lds = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/ |
diff --git a/arch/unicore32/configs/debug_defconfig b/arch/unicore32/configs/unicore32_defconfig index b5fbde9f1cb..c9dd3198b6f 100644 --- a/arch/unicore32/configs/debug_defconfig +++ b/arch/unicore32/configs/unicore32_defconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | ### General setup | 1 | ### General setup |
2 | CONFIG_EXPERIMENTAL=y | 2 | CONFIG_EXPERIMENTAL=y |
3 | CONFIG_LOCALVERSION="-debug" | 3 | CONFIG_LOCALVERSION="-unicore32" |
4 | CONFIG_SWAP=y | 4 | CONFIG_SWAP=y |
5 | CONFIG_SYSVIPC=y | 5 | CONFIG_SYSVIPC=y |
6 | CONFIG_POSIX_MQUEUE=y | 6 | CONFIG_POSIX_MQUEUE=y |
@@ -64,7 +64,6 @@ CONFIG_I2C_BATTERY_BQ27200=n | |||
64 | CONFIG_I2C_EEPROM_AT24=n | 64 | CONFIG_I2C_EEPROM_AT24=n |
65 | CONFIG_LCD_BACKLIGHT=n | 65 | CONFIG_LCD_BACKLIGHT=n |
66 | 66 | ||
67 | CONFIG_PUV3_RTC=y | ||
68 | CONFIG_PUV3_UMAL=y | 67 | CONFIG_PUV3_UMAL=y |
69 | CONFIG_PUV3_MUSB=n | 68 | CONFIG_PUV3_MUSB=n |
70 | CONFIG_PUV3_AC97=n | 69 | CONFIG_PUV3_AC97=n |
@@ -167,8 +166,9 @@ CONFIG_LEDS_TRIGGER_IDE_DISK=y | |||
167 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y | 166 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y |
168 | 167 | ||
169 | # Real Time Clock | 168 | # Real Time Clock |
170 | CONFIG_RTC_LIB=m | 169 | CONFIG_RTC_LIB=y |
171 | CONFIG_RTC_CLASS=m | 170 | CONFIG_RTC_CLASS=y |
171 | CONFIG_RTC_DRV_PUV3=y | ||
172 | 172 | ||
173 | ### File systems | 173 | ### File systems |
174 | CONFIG_EXT2_FS=m | 174 | CONFIG_EXT2_FS=m |
diff --git a/arch/unicore32/include/asm/Kbuild b/arch/unicore32/include/asm/Kbuild index b200fdaca44..ca113d6999c 100644 --- a/arch/unicore32/include/asm/Kbuild +++ b/arch/unicore32/include/asm/Kbuild | |||
@@ -1,2 +1,61 @@ | |||
1 | include include/asm-generic/Kbuild.asm | 1 | include include/asm-generic/Kbuild.asm |
2 | 2 | ||
3 | generic-y += atomic.h | ||
4 | generic-y += auxvec.h | ||
5 | generic-y += bitsperlong.h | ||
6 | generic-y += bug.h | ||
7 | generic-y += bugs.h | ||
8 | generic-y += cputime.h | ||
9 | generic-y += current.h | ||
10 | generic-y += device.h | ||
11 | generic-y += div64.h | ||
12 | generic-y += emergency-restart.h | ||
13 | generic-y += errno.h | ||
14 | generic-y += fb.h | ||
15 | generic-y += fcntl.h | ||
16 | generic-y += ftrace.h | ||
17 | generic-y += futex.h | ||
18 | generic-y += hardirq.h | ||
19 | generic-y += hw_irq.h | ||
20 | generic-y += ioctl.h | ||
21 | generic-y += ioctls.h | ||
22 | generic-y += ipcbuf.h | ||
23 | generic-y += irq_regs.h | ||
24 | generic-y += kdebug.h | ||
25 | generic-y += kmap_types.h | ||
26 | generic-y += local.h | ||
27 | generic-y += mman.h | ||
28 | generic-y += module.h | ||
29 | generic-y += msgbuf.h | ||
30 | generic-y += param.h | ||
31 | generic-y += parport.h | ||
32 | generic-y += percpu.h | ||
33 | generic-y += poll.h | ||
34 | generic-y += posix_types.h | ||
35 | generic-y += resource.h | ||
36 | generic-y += scatterlist.h | ||
37 | generic-y += sections.h | ||
38 | generic-y += segment.h | ||
39 | generic-y += sembuf.h | ||
40 | generic-y += serial.h | ||
41 | generic-y += setup.h | ||
42 | generic-y += shmbuf.h | ||
43 | generic-y += shmparam.h | ||
44 | generic-y += siginfo.h | ||
45 | generic-y += signal.h | ||
46 | generic-y += sizes.h | ||
47 | generic-y += socket.h | ||
48 | generic-y += sockios.h | ||
49 | generic-y += stat.h | ||
50 | generic-y += statfs.h | ||
51 | generic-y += swab.h | ||
52 | generic-y += syscalls.h | ||
53 | generic-y += termbits.h | ||
54 | generic-y += termios.h | ||
55 | generic-y += topology.h | ||
56 | generic-y += types.h | ||
57 | generic-y += ucontext.h | ||
58 | generic-y += unaligned.h | ||
59 | generic-y += user.h | ||
60 | generic-y += vga.h | ||
61 | generic-y += xor.h | ||
diff --git a/arch/unicore32/kernel/Makefile b/arch/unicore32/kernel/Makefile index ec23a2fb2f5..aeb0f181568 100644 --- a/arch/unicore32/kernel/Makefile +++ b/arch/unicore32/kernel/Makefile | |||
@@ -16,7 +16,6 @@ obj-$(CONFIG_UNICORE_FPU_F64) += fpu-ucf64.o | |||
16 | obj-$(CONFIG_ARCH_PUV3) += clock.o irq.o time.o | 16 | obj-$(CONFIG_ARCH_PUV3) += clock.o irq.o time.o |
17 | 17 | ||
18 | obj-$(CONFIG_PUV3_GPIO) += gpio.o | 18 | obj-$(CONFIG_PUV3_GPIO) += gpio.o |
19 | obj-$(CONFIG_PUV3_RTC) += rtc.o | ||
20 | obj-$(CONFIG_PUV3_PWM) += pwm.o | 19 | obj-$(CONFIG_PUV3_PWM) += pwm.o |
21 | obj-$(CONFIG_PUV3_PM) += pm.o sleep.o | 20 | obj-$(CONFIG_PUV3_PM) += pm.o sleep.o |
22 | obj-$(CONFIG_HIBERNATION) += hibernate.o hibernate_asm.o | 21 | obj-$(CONFIG_HIBERNATION) += hibernate.o hibernate_asm.o |
diff --git a/arch/unicore32/kernel/rtc.c b/arch/unicore32/kernel/rtc.c deleted file mode 100644 index 8cad70b3302..00000000000 --- a/arch/unicore32/kernel/rtc.c +++ /dev/null | |||
@@ -1,371 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/unicore32/kernel/rtc.c | ||
3 | * | ||
4 | * Code specific to PKUnity SoC and UniCore ISA | ||
5 | * | ||
6 | * Maintained by GUAN Xue-tao <gxt@mprc.pku.edu.cn> | ||
7 | * Copyright (C) 2001-2010 Guan Xuetao | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | #include <linux/module.h> | ||
15 | #include <linux/fs.h> | ||
16 | #include <linux/string.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/platform_device.h> | ||
19 | #include <linux/interrupt.h> | ||
20 | #include <linux/rtc.h> | ||
21 | #include <linux/bcd.h> | ||
22 | #include <linux/clk.h> | ||
23 | #include <linux/log2.h> | ||
24 | #include <linux/slab.h> | ||
25 | #include <linux/uaccess.h> | ||
26 | #include <linux/io.h> | ||
27 | |||
28 | #include <asm/irq.h> | ||
29 | #include <mach/hardware.h> | ||
30 | |||
31 | static struct resource *puv3_rtc_mem; | ||
32 | |||
33 | static int puv3_rtc_alarmno = IRQ_RTCAlarm; | ||
34 | static int puv3_rtc_tickno = IRQ_RTC; | ||
35 | |||
36 | static DEFINE_SPINLOCK(puv3_rtc_pie_lock); | ||
37 | |||
38 | /* IRQ Handlers */ | ||
39 | |||
40 | static irqreturn_t puv3_rtc_alarmirq(int irq, void *id) | ||
41 | { | ||
42 | struct rtc_device *rdev = id; | ||
43 | |||
44 | writel(readl(RTC_RTSR) | RTC_RTSR_AL, RTC_RTSR); | ||
45 | rtc_update_irq(rdev, 1, RTC_AF | RTC_IRQF); | ||
46 | return IRQ_HANDLED; | ||
47 | } | ||
48 | |||
49 | static irqreturn_t puv3_rtc_tickirq(int irq, void *id) | ||
50 | { | ||
51 | struct rtc_device *rdev = id; | ||
52 | |||
53 | writel(readl(RTC_RTSR) | RTC_RTSR_HZ, RTC_RTSR); | ||
54 | rtc_update_irq(rdev, 1, RTC_PF | RTC_IRQF); | ||
55 | return IRQ_HANDLED; | ||
56 | } | ||
57 | |||
58 | /* Update control registers */ | ||
59 | static void puv3_rtc_setaie(int to) | ||
60 | { | ||
61 | unsigned int tmp; | ||
62 | |||
63 | pr_debug("%s: aie=%d\n", __func__, to); | ||
64 | |||
65 | tmp = readl(RTC_RTSR) & ~RTC_RTSR_ALE; | ||
66 | |||
67 | if (to) | ||
68 | tmp |= RTC_RTSR_ALE; | ||
69 | |||
70 | writel(tmp, RTC_RTSR); | ||
71 | } | ||
72 | |||
73 | static int puv3_rtc_setpie(struct device *dev, int enabled) | ||
74 | { | ||
75 | unsigned int tmp; | ||
76 | |||
77 | pr_debug("%s: pie=%d\n", __func__, enabled); | ||
78 | |||
79 | spin_lock_irq(&puv3_rtc_pie_lock); | ||
80 | tmp = readl(RTC_RTSR) & ~RTC_RTSR_HZE; | ||
81 | |||
82 | if (enabled) | ||
83 | tmp |= RTC_RTSR_HZE; | ||
84 | |||
85 | writel(tmp, RTC_RTSR); | ||
86 | spin_unlock_irq(&puv3_rtc_pie_lock); | ||
87 | |||
88 | return 0; | ||
89 | } | ||
90 | |||
91 | /* Time read/write */ | ||
92 | |||
93 | static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) | ||
94 | { | ||
95 | rtc_time_to_tm(readl(RTC_RCNR), rtc_tm); | ||
96 | |||
97 | pr_debug("read time %02x.%02x.%02x %02x/%02x/%02x\n", | ||
98 | rtc_tm->tm_year, rtc_tm->tm_mon, rtc_tm->tm_mday, | ||
99 | rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec); | ||
100 | |||
101 | return 0; | ||
102 | } | ||
103 | |||
104 | static int puv3_rtc_settime(struct device *dev, struct rtc_time *tm) | ||
105 | { | ||
106 | unsigned long rtc_count = 0; | ||
107 | |||
108 | pr_debug("set time %02d.%02d.%02d %02d/%02d/%02d\n", | ||
109 | tm->tm_year, tm->tm_mon, tm->tm_mday, | ||
110 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
111 | |||
112 | rtc_tm_to_time(tm, &rtc_count); | ||
113 | writel(rtc_count, RTC_RCNR); | ||
114 | |||
115 | return 0; | ||
116 | } | ||
117 | |||
118 | static int puv3_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
119 | { | ||
120 | struct rtc_time *alm_tm = &alrm->time; | ||
121 | |||
122 | rtc_time_to_tm(readl(RTC_RTAR), alm_tm); | ||
123 | |||
124 | alrm->enabled = readl(RTC_RTSR) & RTC_RTSR_ALE; | ||
125 | |||
126 | pr_debug("read alarm %02x %02x.%02x.%02x %02x/%02x/%02x\n", | ||
127 | alrm->enabled, | ||
128 | alm_tm->tm_year, alm_tm->tm_mon, alm_tm->tm_mday, | ||
129 | alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec); | ||
130 | |||
131 | return 0; | ||
132 | } | ||
133 | |||
134 | static int puv3_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
135 | { | ||
136 | struct rtc_time *tm = &alrm->time; | ||
137 | unsigned long rtcalarm_count = 0; | ||
138 | |||
139 | pr_debug("puv3_rtc_setalarm: %d, %02x/%02x/%02x %02x.%02x.%02x\n", | ||
140 | alrm->enabled, | ||
141 | tm->tm_mday & 0xff, tm->tm_mon & 0xff, tm->tm_year & 0xff, | ||
142 | tm->tm_hour & 0xff, tm->tm_min & 0xff, tm->tm_sec); | ||
143 | |||
144 | rtc_tm_to_time(tm, &rtcalarm_count); | ||
145 | writel(rtcalarm_count, RTC_RTAR); | ||
146 | |||
147 | puv3_rtc_setaie(alrm->enabled); | ||
148 | |||
149 | if (alrm->enabled) | ||
150 | enable_irq_wake(puv3_rtc_alarmno); | ||
151 | else | ||
152 | disable_irq_wake(puv3_rtc_alarmno); | ||
153 | |||
154 | return 0; | ||
155 | } | ||
156 | |||
157 | static int puv3_rtc_proc(struct device *dev, struct seq_file *seq) | ||
158 | { | ||
159 | seq_printf(seq, "periodic_IRQ\t: %s\n", | ||
160 | (readl(RTC_RTSR) & RTC_RTSR_HZE) ? "yes" : "no"); | ||
161 | return 0; | ||
162 | } | ||
163 | |||
164 | static int puv3_rtc_open(struct device *dev) | ||
165 | { | ||
166 | struct platform_device *pdev = to_platform_device(dev); | ||
167 | struct rtc_device *rtc_dev = platform_get_drvdata(pdev); | ||
168 | int ret; | ||
169 | |||
170 | ret = request_irq(puv3_rtc_alarmno, puv3_rtc_alarmirq, | ||
171 | IRQF_DISABLED, "pkunity-rtc alarm", rtc_dev); | ||
172 | |||
173 | if (ret) { | ||
174 | dev_err(dev, "IRQ%d error %d\n", puv3_rtc_alarmno, ret); | ||
175 | return ret; | ||
176 | } | ||
177 | |||
178 | ret = request_irq(puv3_rtc_tickno, puv3_rtc_tickirq, | ||
179 | IRQF_DISABLED, "pkunity-rtc tick", rtc_dev); | ||
180 | |||
181 | if (ret) { | ||
182 | dev_err(dev, "IRQ%d error %d\n", puv3_rtc_tickno, ret); | ||
183 | goto tick_err; | ||
184 | } | ||
185 | |||
186 | return ret; | ||
187 | |||
188 | tick_err: | ||
189 | free_irq(puv3_rtc_alarmno, rtc_dev); | ||
190 | return ret; | ||
191 | } | ||
192 | |||
193 | static void puv3_rtc_release(struct device *dev) | ||
194 | { | ||
195 | struct platform_device *pdev = to_platform_device(dev); | ||
196 | struct rtc_device *rtc_dev = platform_get_drvdata(pdev); | ||
197 | |||
198 | /* do not clear AIE here, it may be needed for wake */ | ||
199 | |||
200 | puv3_rtc_setpie(dev, 0); | ||
201 | free_irq(puv3_rtc_alarmno, rtc_dev); | ||
202 | free_irq(puv3_rtc_tickno, rtc_dev); | ||
203 | } | ||
204 | |||
205 | static const struct rtc_class_ops puv3_rtcops = { | ||
206 | .open = puv3_rtc_open, | ||
207 | .release = puv3_rtc_release, | ||
208 | .read_time = puv3_rtc_gettime, | ||
209 | .set_time = puv3_rtc_settime, | ||
210 | .read_alarm = puv3_rtc_getalarm, | ||
211 | .set_alarm = puv3_rtc_setalarm, | ||
212 | .proc = puv3_rtc_proc, | ||
213 | }; | ||
214 | |||
215 | static void puv3_rtc_enable(struct platform_device *pdev, int en) | ||
216 | { | ||
217 | if (!en) { | ||
218 | writel(readl(RTC_RTSR) & ~RTC_RTSR_HZE, RTC_RTSR); | ||
219 | } else { | ||
220 | /* re-enable the device, and check it is ok */ | ||
221 | |||
222 | if ((readl(RTC_RTSR) & RTC_RTSR_HZE) == 0) { | ||
223 | dev_info(&pdev->dev, "rtc disabled, re-enabling\n"); | ||
224 | writel(readl(RTC_RTSR) | RTC_RTSR_HZE, RTC_RTSR); | ||
225 | } | ||
226 | } | ||
227 | } | ||
228 | |||
229 | static int puv3_rtc_remove(struct platform_device *dev) | ||
230 | { | ||
231 | struct rtc_device *rtc = platform_get_drvdata(dev); | ||
232 | |||
233 | platform_set_drvdata(dev, NULL); | ||
234 | rtc_device_unregister(rtc); | ||
235 | |||
236 | puv3_rtc_setpie(&dev->dev, 0); | ||
237 | puv3_rtc_setaie(0); | ||
238 | |||
239 | release_resource(puv3_rtc_mem); | ||
240 | kfree(puv3_rtc_mem); | ||
241 | |||
242 | return 0; | ||
243 | } | ||
244 | |||
245 | static int puv3_rtc_probe(struct platform_device *pdev) | ||
246 | { | ||
247 | struct rtc_device *rtc; | ||
248 | struct resource *res; | ||
249 | int ret; | ||
250 | |||
251 | pr_debug("%s: probe=%p\n", __func__, pdev); | ||
252 | |||
253 | /* find the IRQs */ | ||
254 | |||
255 | puv3_rtc_tickno = platform_get_irq(pdev, 1); | ||
256 | if (puv3_rtc_tickno < 0) { | ||
257 | dev_err(&pdev->dev, "no irq for rtc tick\n"); | ||
258 | return -ENOENT; | ||
259 | } | ||
260 | |||
261 | puv3_rtc_alarmno = platform_get_irq(pdev, 0); | ||
262 | if (puv3_rtc_alarmno < 0) { | ||
263 | dev_err(&pdev->dev, "no irq for alarm\n"); | ||
264 | return -ENOENT; | ||
265 | } | ||
266 | |||
267 | pr_debug("PKUnity_rtc: tick irq %d, alarm irq %d\n", | ||
268 | puv3_rtc_tickno, puv3_rtc_alarmno); | ||
269 | |||
270 | /* get the memory region */ | ||
271 | |||
272 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
273 | if (res == NULL) { | ||
274 | dev_err(&pdev->dev, "failed to get memory region resource\n"); | ||
275 | return -ENOENT; | ||
276 | } | ||
277 | |||
278 | puv3_rtc_mem = request_mem_region(res->start, | ||
279 | res->end-res->start+1, | ||
280 | pdev->name); | ||
281 | |||
282 | if (puv3_rtc_mem == NULL) { | ||
283 | dev_err(&pdev->dev, "failed to reserve memory region\n"); | ||
284 | ret = -ENOENT; | ||
285 | goto err_nores; | ||
286 | } | ||
287 | |||
288 | puv3_rtc_enable(pdev, 1); | ||
289 | |||
290 | /* register RTC and exit */ | ||
291 | |||
292 | rtc = rtc_device_register("pkunity", &pdev->dev, &puv3_rtcops, | ||
293 | THIS_MODULE); | ||
294 | |||
295 | if (IS_ERR(rtc)) { | ||
296 | dev_err(&pdev->dev, "cannot attach rtc\n"); | ||
297 | ret = PTR_ERR(rtc); | ||
298 | goto err_nortc; | ||
299 | } | ||
300 | |||
301 | /* platform setup code should have handled this; sigh */ | ||
302 | if (!device_can_wakeup(&pdev->dev)) | ||
303 | device_init_wakeup(&pdev->dev, 1); | ||
304 | |||
305 | platform_set_drvdata(pdev, rtc); | ||
306 | return 0; | ||
307 | |||
308 | err_nortc: | ||
309 | puv3_rtc_enable(pdev, 0); | ||
310 | release_resource(puv3_rtc_mem); | ||
311 | |||
312 | err_nores: | ||
313 | return ret; | ||
314 | } | ||
315 | |||
316 | #ifdef CONFIG_PM | ||
317 | |||
318 | /* RTC Power management control */ | ||
319 | |||
320 | static int ticnt_save; | ||
321 | |||
322 | static int puv3_rtc_suspend(struct platform_device *pdev, pm_message_t state) | ||
323 | { | ||
324 | /* save RTAR for anyone using periodic interrupts */ | ||
325 | ticnt_save = readl(RTC_RTAR); | ||
326 | puv3_rtc_enable(pdev, 0); | ||
327 | return 0; | ||
328 | } | ||
329 | |||
330 | static int puv3_rtc_resume(struct platform_device *pdev) | ||
331 | { | ||
332 | puv3_rtc_enable(pdev, 1); | ||
333 | writel(ticnt_save, RTC_RTAR); | ||
334 | return 0; | ||
335 | } | ||
336 | #else | ||
337 | #define puv3_rtc_suspend NULL | ||
338 | #define puv3_rtc_resume NULL | ||
339 | #endif | ||
340 | |||
341 | static struct platform_driver puv3_rtcdrv = { | ||
342 | .probe = puv3_rtc_probe, | ||
343 | .remove = __devexit_p(puv3_rtc_remove), | ||
344 | .suspend = puv3_rtc_suspend, | ||
345 | .resume = puv3_rtc_resume, | ||
346 | .driver = { | ||
347 | .name = "PKUnity-v3-RTC", | ||
348 | .owner = THIS_MODULE, | ||
349 | } | ||
350 | }; | ||
351 | |||
352 | static char __initdata banner[] = "PKUnity-v3 RTC, (c) 2009 PKUnity Co.\n"; | ||
353 | |||
354 | static int __init puv3_rtc_init(void) | ||
355 | { | ||
356 | printk(banner); | ||
357 | return platform_driver_register(&puv3_rtcdrv); | ||
358 | } | ||
359 | |||
360 | static void __exit puv3_rtc_exit(void) | ||
361 | { | ||
362 | platform_driver_unregister(&puv3_rtcdrv); | ||
363 | } | ||
364 | |||
365 | module_init(puv3_rtc_init); | ||
366 | module_exit(puv3_rtc_exit); | ||
367 | |||
368 | MODULE_DESCRIPTION("RTC Driver for the PKUnity v3 chip"); | ||
369 | MODULE_AUTHOR("Hu Dongliang"); | ||
370 | MODULE_LICENSE("GPL v2"); | ||
371 | |||
diff --git a/arch/unicore32/kernel/vmlinux.lds.S b/arch/unicore32/kernel/vmlinux.lds.S index 9bf7f7af52c..77e407e49a6 100644 --- a/arch/unicore32/kernel/vmlinux.lds.S +++ b/arch/unicore32/kernel/vmlinux.lds.S | |||
@@ -30,7 +30,7 @@ SECTIONS | |||
30 | HEAD_TEXT_SECTION | 30 | HEAD_TEXT_SECTION |
31 | INIT_TEXT_SECTION(PAGE_SIZE) | 31 | INIT_TEXT_SECTION(PAGE_SIZE) |
32 | INIT_DATA_SECTION(16) | 32 | INIT_DATA_SECTION(16) |
33 | PERCPU(L1_CACHE_BYTES, PAGE_SIZE) | 33 | PERCPU_SECTION(L1_CACHE_BYTES) |
34 | __init_end = .; | 34 | __init_end = .; |
35 | 35 | ||
36 | _stext = .; | 36 | _stext = .; |
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index cd8cbeb5fa3..7c3a95e54ec 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <asm/proto.h> | 30 | #include <asm/proto.h> |
31 | #include <asm/iommu.h> | 31 | #include <asm/iommu.h> |
32 | #include <asm/gart.h> | 32 | #include <asm/gart.h> |
33 | #include <asm/dma.h> | ||
33 | #include <asm/amd_iommu_proto.h> | 34 | #include <asm/amd_iommu_proto.h> |
34 | #include <asm/amd_iommu_types.h> | 35 | #include <asm/amd_iommu_types.h> |
35 | #include <asm/amd_iommu.h> | 36 | #include <asm/amd_iommu.h> |
@@ -154,6 +155,10 @@ static int iommu_init_device(struct device *dev) | |||
154 | pdev = pci_get_bus_and_slot(PCI_BUS(alias), alias & 0xff); | 155 | pdev = pci_get_bus_and_slot(PCI_BUS(alias), alias & 0xff); |
155 | if (pdev) | 156 | if (pdev) |
156 | dev_data->alias = &pdev->dev; | 157 | dev_data->alias = &pdev->dev; |
158 | else { | ||
159 | kfree(dev_data); | ||
160 | return -ENOTSUPP; | ||
161 | } | ||
157 | 162 | ||
158 | atomic_set(&dev_data->bind, 0); | 163 | atomic_set(&dev_data->bind, 0); |
159 | 164 | ||
@@ -163,6 +168,20 @@ static int iommu_init_device(struct device *dev) | |||
163 | return 0; | 168 | return 0; |
164 | } | 169 | } |
165 | 170 | ||
171 | static void iommu_ignore_device(struct device *dev) | ||
172 | { | ||
173 | u16 devid, alias; | ||
174 | |||
175 | devid = get_device_id(dev); | ||
176 | alias = amd_iommu_alias_table[devid]; | ||
177 | |||
178 | memset(&amd_iommu_dev_table[devid], 0, sizeof(struct dev_table_entry)); | ||
179 | memset(&amd_iommu_dev_table[alias], 0, sizeof(struct dev_table_entry)); | ||
180 | |||
181 | amd_iommu_rlookup_table[devid] = NULL; | ||
182 | amd_iommu_rlookup_table[alias] = NULL; | ||
183 | } | ||
184 | |||
166 | static void iommu_uninit_device(struct device *dev) | 185 | static void iommu_uninit_device(struct device *dev) |
167 | { | 186 | { |
168 | kfree(dev->archdata.iommu); | 187 | kfree(dev->archdata.iommu); |
@@ -192,7 +211,9 @@ int __init amd_iommu_init_devices(void) | |||
192 | continue; | 211 | continue; |
193 | 212 | ||
194 | ret = iommu_init_device(&pdev->dev); | 213 | ret = iommu_init_device(&pdev->dev); |
195 | if (ret) | 214 | if (ret == -ENOTSUPP) |
215 | iommu_ignore_device(&pdev->dev); | ||
216 | else if (ret) | ||
196 | goto out_free; | 217 | goto out_free; |
197 | } | 218 | } |
198 | 219 | ||
@@ -2383,6 +2404,23 @@ static struct dma_map_ops amd_iommu_dma_ops = { | |||
2383 | .dma_supported = amd_iommu_dma_supported, | 2404 | .dma_supported = amd_iommu_dma_supported, |
2384 | }; | 2405 | }; |
2385 | 2406 | ||
2407 | static unsigned device_dma_ops_init(void) | ||
2408 | { | ||
2409 | struct pci_dev *pdev = NULL; | ||
2410 | unsigned unhandled = 0; | ||
2411 | |||
2412 | for_each_pci_dev(pdev) { | ||
2413 | if (!check_device(&pdev->dev)) { | ||
2414 | unhandled += 1; | ||
2415 | continue; | ||
2416 | } | ||
2417 | |||
2418 | pdev->dev.archdata.dma_ops = &amd_iommu_dma_ops; | ||
2419 | } | ||
2420 | |||
2421 | return unhandled; | ||
2422 | } | ||
2423 | |||
2386 | /* | 2424 | /* |
2387 | * The function which clues the AMD IOMMU driver into dma_ops. | 2425 | * The function which clues the AMD IOMMU driver into dma_ops. |
2388 | */ | 2426 | */ |
@@ -2395,7 +2433,7 @@ void __init amd_iommu_init_api(void) | |||
2395 | int __init amd_iommu_init_dma_ops(void) | 2433 | int __init amd_iommu_init_dma_ops(void) |
2396 | { | 2434 | { |
2397 | struct amd_iommu *iommu; | 2435 | struct amd_iommu *iommu; |
2398 | int ret; | 2436 | int ret, unhandled; |
2399 | 2437 | ||
2400 | /* | 2438 | /* |
2401 | * first allocate a default protection domain for every IOMMU we | 2439 | * first allocate a default protection domain for every IOMMU we |
@@ -2421,7 +2459,11 @@ int __init amd_iommu_init_dma_ops(void) | |||
2421 | swiotlb = 0; | 2459 | swiotlb = 0; |
2422 | 2460 | ||
2423 | /* Make the driver finally visible to the drivers */ | 2461 | /* Make the driver finally visible to the drivers */ |
2424 | dma_ops = &amd_iommu_dma_ops; | 2462 | unhandled = device_dma_ops_init(); |
2463 | if (unhandled && max_pfn > MAX_DMA32_PFN) { | ||
2464 | /* There are unhandled devices - initialize swiotlb for them */ | ||
2465 | swiotlb = 1; | ||
2466 | } | ||
2425 | 2467 | ||
2426 | amd_iommu_stats_init(); | 2468 | amd_iommu_stats_init(); |
2427 | 2469 | ||
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index 9179c21120a..bfc8453bd98 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
@@ -731,8 +731,8 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu, | |||
731 | { | 731 | { |
732 | u8 *p = (u8 *)h; | 732 | u8 *p = (u8 *)h; |
733 | u8 *end = p, flags = 0; | 733 | u8 *end = p, flags = 0; |
734 | u16 dev_i, devid = 0, devid_start = 0, devid_to = 0; | 734 | u16 devid = 0, devid_start = 0, devid_to = 0; |
735 | u32 ext_flags = 0; | 735 | u32 dev_i, ext_flags = 0; |
736 | bool alias = false; | 736 | bool alias = false; |
737 | struct ivhd_entry *e; | 737 | struct ivhd_entry *e; |
738 | 738 | ||
@@ -887,7 +887,7 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu, | |||
887 | /* Initializes the device->iommu mapping for the driver */ | 887 | /* Initializes the device->iommu mapping for the driver */ |
888 | static int __init init_iommu_devices(struct amd_iommu *iommu) | 888 | static int __init init_iommu_devices(struct amd_iommu *iommu) |
889 | { | 889 | { |
890 | u16 i; | 890 | u32 i; |
891 | 891 | ||
892 | for (i = iommu->first_device; i <= iommu->last_device; ++i) | 892 | for (i = iommu->first_device; i <= iommu->last_device; ++i) |
893 | set_iommu_for_device(iommu, i); | 893 | set_iommu_for_device(iommu, i); |
@@ -1177,7 +1177,7 @@ static int __init init_memory_definitions(struct acpi_table_header *table) | |||
1177 | */ | 1177 | */ |
1178 | static void init_device_table(void) | 1178 | static void init_device_table(void) |
1179 | { | 1179 | { |
1180 | u16 devid; | 1180 | u32 devid; |
1181 | 1181 | ||
1182 | for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) { | 1182 | for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) { |
1183 | set_dev_entry_bit(devid, DEV_ENTRY_VALID); | 1183 | set_dev_entry_bit(devid, DEV_ENTRY_VALID); |
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index b961af86bfe..b9338b8cf42 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
@@ -390,7 +390,8 @@ static unsigned int reserve_eilvt_offset(int offset, unsigned int new) | |||
390 | 390 | ||
391 | /* | 391 | /* |
392 | * If mask=1, the LVT entry does not generate interrupts while mask=0 | 392 | * If mask=1, the LVT entry does not generate interrupts while mask=0 |
393 | * enables the vector. See also the BKDGs. | 393 | * enables the vector. See also the BKDGs. Must be called with |
394 | * preemption disabled. | ||
394 | */ | 395 | */ |
395 | 396 | ||
396 | int setup_APIC_eilvt(u8 offset, u8 vector, u8 msg_type, u8 mask) | 397 | int setup_APIC_eilvt(u8 offset, u8 vector, u8 msg_type, u8 mask) |
diff --git a/arch/x86/kernel/devicetree.c b/arch/x86/kernel/devicetree.c index 690bc846183..9aeb78a23de 100644 --- a/arch/x86/kernel/devicetree.c +++ b/arch/x86/kernel/devicetree.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
14 | #include <linux/pci.h> | 14 | #include <linux/pci.h> |
15 | #include <linux/of_pci.h> | 15 | #include <linux/of_pci.h> |
16 | #include <linux/initrd.h> | ||
16 | 17 | ||
17 | #include <asm/hpet.h> | 18 | #include <asm/hpet.h> |
18 | #include <asm/irq_controller.h> | 19 | #include <asm/irq_controller.h> |
@@ -98,6 +99,16 @@ void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) | |||
98 | return __alloc_bootmem(size, align, __pa(MAX_DMA_ADDRESS)); | 99 | return __alloc_bootmem(size, align, __pa(MAX_DMA_ADDRESS)); |
99 | } | 100 | } |
100 | 101 | ||
102 | #ifdef CONFIG_BLK_DEV_INITRD | ||
103 | void __init early_init_dt_setup_initrd_arch(unsigned long start, | ||
104 | unsigned long end) | ||
105 | { | ||
106 | initrd_start = (unsigned long)__va(start); | ||
107 | initrd_end = (unsigned long)__va(end); | ||
108 | initrd_below_start_ok = 1; | ||
109 | } | ||
110 | #endif | ||
111 | |||
101 | void __init add_dtb(u64 data) | 112 | void __init add_dtb(u64 data) |
102 | { | 113 | { |
103 | initial_dtb = data + offsetof(struct setup_data, data); | 114 | initial_dtb = data + offsetof(struct setup_data, data); |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 8d128783af4..a3d0dc59067 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
@@ -245,7 +245,6 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) | |||
245 | { | 245 | { |
246 | set_user_gs(regs, 0); | 246 | set_user_gs(regs, 0); |
247 | regs->fs = 0; | 247 | regs->fs = 0; |
248 | set_fs(USER_DS); | ||
249 | regs->ds = __USER_DS; | 248 | regs->ds = __USER_DS; |
250 | regs->es = __USER_DS; | 249 | regs->es = __USER_DS; |
251 | regs->ss = __USER_DS; | 250 | regs->ss = __USER_DS; |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 6c9dd922ac0..ca6f7ab8df3 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
@@ -338,7 +338,6 @@ start_thread_common(struct pt_regs *regs, unsigned long new_ip, | |||
338 | regs->cs = _cs; | 338 | regs->cs = _cs; |
339 | regs->ss = _ss; | 339 | regs->ss = _ss; |
340 | regs->flags = X86_EFLAGS_IF; | 340 | regs->flags = X86_EFLAGS_IF; |
341 | set_fs(USER_DS); | ||
342 | /* | 341 | /* |
343 | * Free the old FP and other extended state | 342 | * Free the old FP and other extended state |
344 | */ | 343 | */ |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 33a0c11797d..9fd3137230d 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -285,6 +285,19 @@ notrace static void __cpuinit start_secondary(void *unused) | |||
285 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; | 285 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; |
286 | x86_platform.nmi_init(); | 286 | x86_platform.nmi_init(); |
287 | 287 | ||
288 | /* | ||
289 | * Wait until the cpu which brought this one up marked it | ||
290 | * online before enabling interrupts. If we don't do that then | ||
291 | * we can end up waking up the softirq thread before this cpu | ||
292 | * reached the active state, which makes the scheduler unhappy | ||
293 | * and schedule the softirq thread on the wrong cpu. This is | ||
294 | * only observable with forced threaded interrupts, but in | ||
295 | * theory it could also happen w/o them. It's just way harder | ||
296 | * to achieve. | ||
297 | */ | ||
298 | while (!cpumask_test_cpu(smp_processor_id(), cpu_active_mask)) | ||
299 | cpu_relax(); | ||
300 | |||
288 | /* enable local interrupts */ | 301 | /* enable local interrupts */ |
289 | local_irq_enable(); | 302 | local_irq_enable(); |
290 | 303 | ||
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index d6e2477feb1..6df88c7885c 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -47,38 +47,40 @@ | |||
47 | #define DstDI (5<<1) /* Destination is in ES:(E)DI */ | 47 | #define DstDI (5<<1) /* Destination is in ES:(E)DI */ |
48 | #define DstMem64 (6<<1) /* 64bit memory operand */ | 48 | #define DstMem64 (6<<1) /* 64bit memory operand */ |
49 | #define DstImmUByte (7<<1) /* 8-bit unsigned immediate operand */ | 49 | #define DstImmUByte (7<<1) /* 8-bit unsigned immediate operand */ |
50 | #define DstMask (7<<1) | 50 | #define DstDX (8<<1) /* Destination is in DX register */ |
51 | #define DstMask (0xf<<1) | ||
51 | /* Source operand type. */ | 52 | /* Source operand type. */ |
52 | #define SrcNone (0<<4) /* No source operand. */ | 53 | #define SrcNone (0<<5) /* No source operand. */ |
53 | #define SrcReg (1<<4) /* Register operand. */ | 54 | #define SrcReg (1<<5) /* Register operand. */ |
54 | #define SrcMem (2<<4) /* Memory operand. */ | 55 | #define SrcMem (2<<5) /* Memory operand. */ |
55 | #define SrcMem16 (3<<4) /* Memory operand (16-bit). */ | 56 | #define SrcMem16 (3<<5) /* Memory operand (16-bit). */ |
56 | #define SrcMem32 (4<<4) /* Memory operand (32-bit). */ | 57 | #define SrcMem32 (4<<5) /* Memory operand (32-bit). */ |
57 | #define SrcImm (5<<4) /* Immediate operand. */ | 58 | #define SrcImm (5<<5) /* Immediate operand. */ |
58 | #define SrcImmByte (6<<4) /* 8-bit sign-extended immediate operand. */ | 59 | #define SrcImmByte (6<<5) /* 8-bit sign-extended immediate operand. */ |
59 | #define SrcOne (7<<4) /* Implied '1' */ | 60 | #define SrcOne (7<<5) /* Implied '1' */ |
60 | #define SrcImmUByte (8<<4) /* 8-bit unsigned immediate operand. */ | 61 | #define SrcImmUByte (8<<5) /* 8-bit unsigned immediate operand. */ |
61 | #define SrcImmU (9<<4) /* Immediate operand, unsigned */ | 62 | #define SrcImmU (9<<5) /* Immediate operand, unsigned */ |
62 | #define SrcSI (0xa<<4) /* Source is in the DS:RSI */ | 63 | #define SrcSI (0xa<<5) /* Source is in the DS:RSI */ |
63 | #define SrcImmFAddr (0xb<<4) /* Source is immediate far address */ | 64 | #define SrcImmFAddr (0xb<<5) /* Source is immediate far address */ |
64 | #define SrcMemFAddr (0xc<<4) /* Source is far address in memory */ | 65 | #define SrcMemFAddr (0xc<<5) /* Source is far address in memory */ |
65 | #define SrcAcc (0xd<<4) /* Source Accumulator */ | 66 | #define SrcAcc (0xd<<5) /* Source Accumulator */ |
66 | #define SrcImmU16 (0xe<<4) /* Immediate operand, unsigned, 16 bits */ | 67 | #define SrcImmU16 (0xe<<5) /* Immediate operand, unsigned, 16 bits */ |
67 | #define SrcMask (0xf<<4) | 68 | #define SrcDX (0xf<<5) /* Source is in DX register */ |
69 | #define SrcMask (0xf<<5) | ||
68 | /* Generic ModRM decode. */ | 70 | /* Generic ModRM decode. */ |
69 | #define ModRM (1<<8) | 71 | #define ModRM (1<<9) |
70 | /* Destination is only written; never read. */ | 72 | /* Destination is only written; never read. */ |
71 | #define Mov (1<<9) | 73 | #define Mov (1<<10) |
72 | #define BitOp (1<<10) | 74 | #define BitOp (1<<11) |
73 | #define MemAbs (1<<11) /* Memory operand is absolute displacement */ | 75 | #define MemAbs (1<<12) /* Memory operand is absolute displacement */ |
74 | #define String (1<<12) /* String instruction (rep capable) */ | 76 | #define String (1<<13) /* String instruction (rep capable) */ |
75 | #define Stack (1<<13) /* Stack instruction (push/pop) */ | 77 | #define Stack (1<<14) /* Stack instruction (push/pop) */ |
76 | #define GroupMask (7<<14) /* Opcode uses one of the group mechanisms */ | 78 | #define GroupMask (7<<15) /* Opcode uses one of the group mechanisms */ |
77 | #define Group (1<<14) /* Bits 3:5 of modrm byte extend opcode */ | 79 | #define Group (1<<15) /* Bits 3:5 of modrm byte extend opcode */ |
78 | #define GroupDual (2<<14) /* Alternate decoding of mod == 3 */ | 80 | #define GroupDual (2<<15) /* Alternate decoding of mod == 3 */ |
79 | #define Prefix (3<<14) /* Instruction varies with 66/f2/f3 prefix */ | 81 | #define Prefix (3<<15) /* Instruction varies with 66/f2/f3 prefix */ |
80 | #define RMExt (4<<14) /* Opcode extension in ModRM r/m if mod == 3 */ | 82 | #define RMExt (4<<15) /* Opcode extension in ModRM r/m if mod == 3 */ |
81 | #define Sse (1<<17) /* SSE Vector instruction */ | 83 | #define Sse (1<<18) /* SSE Vector instruction */ |
82 | /* Misc flags */ | 84 | /* Misc flags */ |
83 | #define Prot (1<<21) /* instruction generates #UD if not in prot-mode */ | 85 | #define Prot (1<<21) /* instruction generates #UD if not in prot-mode */ |
84 | #define VendorSpecific (1<<22) /* Vendor specific instruction */ | 86 | #define VendorSpecific (1<<22) /* Vendor specific instruction */ |
@@ -3154,8 +3156,8 @@ static struct opcode opcode_table[256] = { | |||
3154 | I(DstReg | SrcMem | ModRM | Src2Imm, em_imul_3op), | 3156 | I(DstReg | SrcMem | ModRM | Src2Imm, em_imul_3op), |
3155 | I(SrcImmByte | Mov | Stack, em_push), | 3157 | I(SrcImmByte | Mov | Stack, em_push), |
3156 | I(DstReg | SrcMem | ModRM | Src2ImmByte, em_imul_3op), | 3158 | I(DstReg | SrcMem | ModRM | Src2ImmByte, em_imul_3op), |
3157 | D2bvIP(DstDI | Mov | String, ins, check_perm_in), /* insb, insw/insd */ | 3159 | D2bvIP(DstDI | SrcDX | Mov | String, ins, check_perm_in), /* insb, insw/insd */ |
3158 | D2bvIP(SrcSI | ImplicitOps | String, outs, check_perm_out), /* outsb, outsw/outsd */ | 3160 | D2bvIP(SrcSI | DstDX | String, outs, check_perm_out), /* outsb, outsw/outsd */ |
3159 | /* 0x70 - 0x7F */ | 3161 | /* 0x70 - 0x7F */ |
3160 | X16(D(SrcImmByte)), | 3162 | X16(D(SrcImmByte)), |
3161 | /* 0x80 - 0x87 */ | 3163 | /* 0x80 - 0x87 */ |
@@ -3212,8 +3214,8 @@ static struct opcode opcode_table[256] = { | |||
3212 | /* 0xE8 - 0xEF */ | 3214 | /* 0xE8 - 0xEF */ |
3213 | D(SrcImm | Stack), D(SrcImm | ImplicitOps), | 3215 | D(SrcImm | Stack), D(SrcImm | ImplicitOps), |
3214 | D(SrcImmFAddr | No64), D(SrcImmByte | ImplicitOps), | 3216 | D(SrcImmFAddr | No64), D(SrcImmByte | ImplicitOps), |
3215 | D2bvIP(SrcNone | DstAcc, in, check_perm_in), | 3217 | D2bvIP(SrcDX | DstAcc, in, check_perm_in), |
3216 | D2bvIP(SrcAcc | ImplicitOps, out, check_perm_out), | 3218 | D2bvIP(SrcAcc | DstDX, out, check_perm_out), |
3217 | /* 0xF0 - 0xF7 */ | 3219 | /* 0xF0 - 0xF7 */ |
3218 | N, DI(ImplicitOps, icebp), N, N, | 3220 | N, DI(ImplicitOps, icebp), N, N, |
3219 | DI(ImplicitOps | Priv, hlt), D(ImplicitOps), | 3221 | DI(ImplicitOps | Priv, hlt), D(ImplicitOps), |
@@ -3613,6 +3615,12 @@ done_prefixes: | |||
3613 | memop.bytes = c->op_bytes + 2; | 3615 | memop.bytes = c->op_bytes + 2; |
3614 | goto srcmem_common; | 3616 | goto srcmem_common; |
3615 | break; | 3617 | break; |
3618 | case SrcDX: | ||
3619 | c->src.type = OP_REG; | ||
3620 | c->src.bytes = 2; | ||
3621 | c->src.addr.reg = &c->regs[VCPU_REGS_RDX]; | ||
3622 | fetch_register_operand(&c->src); | ||
3623 | break; | ||
3616 | } | 3624 | } |
3617 | 3625 | ||
3618 | if (rc != X86EMUL_CONTINUE) | 3626 | if (rc != X86EMUL_CONTINUE) |
@@ -3682,6 +3690,12 @@ done_prefixes: | |||
3682 | c->dst.addr.mem.seg = VCPU_SREG_ES; | 3690 | c->dst.addr.mem.seg = VCPU_SREG_ES; |
3683 | c->dst.val = 0; | 3691 | c->dst.val = 0; |
3684 | break; | 3692 | break; |
3693 | case DstDX: | ||
3694 | c->dst.type = OP_REG; | ||
3695 | c->dst.bytes = 2; | ||
3696 | c->dst.addr.reg = &c->regs[VCPU_REGS_RDX]; | ||
3697 | fetch_register_operand(&c->dst); | ||
3698 | break; | ||
3685 | case ImplicitOps: | 3699 | case ImplicitOps: |
3686 | /* Special instructions do their own operand decoding. */ | 3700 | /* Special instructions do their own operand decoding. */ |
3687 | default: | 3701 | default: |
@@ -4027,7 +4041,6 @@ special_insn: | |||
4027 | break; | 4041 | break; |
4028 | case 0xec: /* in al,dx */ | 4042 | case 0xec: /* in al,dx */ |
4029 | case 0xed: /* in (e/r)ax,dx */ | 4043 | case 0xed: /* in (e/r)ax,dx */ |
4030 | c->src.val = c->regs[VCPU_REGS_RDX]; | ||
4031 | do_io_in: | 4044 | do_io_in: |
4032 | if (!pio_in_emulated(ctxt, ops, c->dst.bytes, c->src.val, | 4045 | if (!pio_in_emulated(ctxt, ops, c->dst.bytes, c->src.val, |
4033 | &c->dst.val)) | 4046 | &c->dst.val)) |
@@ -4035,7 +4048,6 @@ special_insn: | |||
4035 | break; | 4048 | break; |
4036 | case 0xee: /* out dx,al */ | 4049 | case 0xee: /* out dx,al */ |
4037 | case 0xef: /* out dx,(e/r)ax */ | 4050 | case 0xef: /* out dx,(e/r)ax */ |
4038 | c->dst.val = c->regs[VCPU_REGS_RDX]; | ||
4039 | do_io_out: | 4051 | do_io_out: |
4040 | ops->pio_out_emulated(ctxt, c->src.bytes, c->dst.val, | 4052 | ops->pio_out_emulated(ctxt, c->src.bytes, c->dst.val, |
4041 | &c->src.val, 1); | 4053 | &c->src.val, 1); |
diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c index 9fd8a567fe1..9cbb710dc94 100644 --- a/arch/x86/oprofile/op_model_amd.c +++ b/arch/x86/oprofile/op_model_amd.c | |||
@@ -609,16 +609,21 @@ static int setup_ibs_ctl(int ibs_eilvt_off) | |||
609 | return 0; | 609 | return 0; |
610 | } | 610 | } |
611 | 611 | ||
612 | /* | ||
613 | * This runs only on the current cpu. We try to find an LVT offset and | ||
614 | * setup the local APIC. For this we must disable preemption. On | ||
615 | * success we initialize all nodes with this offset. This updates then | ||
616 | * the offset in the IBS_CTL per-node msr. The per-core APIC setup of | ||
617 | * the IBS interrupt vector is called from op_amd_setup_ctrs()/op_- | ||
618 | * amd_cpu_shutdown() using the new offset. | ||
619 | */ | ||
612 | static int force_ibs_eilvt_setup(void) | 620 | static int force_ibs_eilvt_setup(void) |
613 | { | 621 | { |
614 | int offset; | 622 | int offset; |
615 | int ret; | 623 | int ret; |
616 | 624 | ||
617 | /* | ||
618 | * find the next free available EILVT entry, skip offset 0, | ||
619 | * pin search to this cpu | ||
620 | */ | ||
621 | preempt_disable(); | 625 | preempt_disable(); |
626 | /* find the next free available EILVT entry, skip offset 0 */ | ||
622 | for (offset = 1; offset < APIC_EILVT_NR_MAX; offset++) { | 627 | for (offset = 1; offset < APIC_EILVT_NR_MAX; offset++) { |
623 | if (get_eilvt(offset)) | 628 | if (get_eilvt(offset)) |
624 | break; | 629 | break; |
diff --git a/arch/x86/xen/multicalls.c b/arch/x86/xen/multicalls.c index 8bff7e7c290..1b2b73ff0a6 100644 --- a/arch/x86/xen/multicalls.c +++ b/arch/x86/xen/multicalls.c | |||
@@ -189,10 +189,10 @@ struct multicall_space __xen_mc_entry(size_t args) | |||
189 | unsigned argidx = roundup(b->argidx, sizeof(u64)); | 189 | unsigned argidx = roundup(b->argidx, sizeof(u64)); |
190 | 190 | ||
191 | BUG_ON(preemptible()); | 191 | BUG_ON(preemptible()); |
192 | BUG_ON(b->argidx > MC_ARGS); | 192 | BUG_ON(b->argidx >= MC_ARGS); |
193 | 193 | ||
194 | if (b->mcidx == MC_BATCH || | 194 | if (b->mcidx == MC_BATCH || |
195 | (argidx + args) > MC_ARGS) { | 195 | (argidx + args) >= MC_ARGS) { |
196 | mc_stats_flush(b->mcidx == MC_BATCH ? FL_SLOTS : FL_ARGS); | 196 | mc_stats_flush(b->mcidx == MC_BATCH ? FL_SLOTS : FL_ARGS); |
197 | xen_mc_flush(); | 197 | xen_mc_flush(); |
198 | argidx = roundup(b->argidx, sizeof(u64)); | 198 | argidx = roundup(b->argidx, sizeof(u64)); |
@@ -206,7 +206,7 @@ struct multicall_space __xen_mc_entry(size_t args) | |||
206 | ret.args = &b->args[argidx]; | 206 | ret.args = &b->args[argidx]; |
207 | b->argidx = argidx + args; | 207 | b->argidx = argidx + args; |
208 | 208 | ||
209 | BUG_ON(b->argidx > MC_ARGS); | 209 | BUG_ON(b->argidx >= MC_ARGS); |
210 | return ret; | 210 | return ret; |
211 | } | 211 | } |
212 | 212 | ||
@@ -216,7 +216,7 @@ struct multicall_space xen_mc_extend_args(unsigned long op, size_t size) | |||
216 | struct multicall_space ret = { NULL, NULL }; | 216 | struct multicall_space ret = { NULL, NULL }; |
217 | 217 | ||
218 | BUG_ON(preemptible()); | 218 | BUG_ON(preemptible()); |
219 | BUG_ON(b->argidx > MC_ARGS); | 219 | BUG_ON(b->argidx >= MC_ARGS); |
220 | 220 | ||
221 | if (b->mcidx == 0) | 221 | if (b->mcidx == 0) |
222 | return ret; | 222 | return ret; |
@@ -224,14 +224,14 @@ struct multicall_space xen_mc_extend_args(unsigned long op, size_t size) | |||
224 | if (b->entries[b->mcidx - 1].op != op) | 224 | if (b->entries[b->mcidx - 1].op != op) |
225 | return ret; | 225 | return ret; |
226 | 226 | ||
227 | if ((b->argidx + size) > MC_ARGS) | 227 | if ((b->argidx + size) >= MC_ARGS) |
228 | return ret; | 228 | return ret; |
229 | 229 | ||
230 | ret.mc = &b->entries[b->mcidx - 1]; | 230 | ret.mc = &b->entries[b->mcidx - 1]; |
231 | ret.args = &b->args[b->argidx]; | 231 | ret.args = &b->args[b->argidx]; |
232 | b->argidx += size; | 232 | b->argidx += size; |
233 | 233 | ||
234 | BUG_ON(b->argidx > MC_ARGS); | 234 | BUG_ON(b->argidx >= MC_ARGS); |
235 | return ret; | 235 | return ret; |
236 | } | 236 | } |
237 | 237 | ||