Merge branches 'x86-urgent-for-linus' and 'irq-urgent-for-linus' of git://git.kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 13 Jun 2011 17:45:10 +0000 (10:45 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 13 Jun 2011 17:45:10 +0000 (10:45 -0700)
* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86: devicetree: Add missing early_init_dt_setup_initrd_arch stub
  x86: cpu-hotplug: Prevent softirq wakeup on wrong CPU

* 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  genirq: Prevent potential NULL dereference in irq_set_irq_wake()

312 files changed:
Documentation/kernel-parameters.txt
MAINTAINERS
Makefile
arch/arm/mach-ep93xx/core.c
arch/arm/mach-exynos4/Kconfig
arch/arm/mach-exynos4/Makefile
arch/arm/mach-exynos4/cpu.c
arch/arm/mach-exynos4/include/mach/regs-usb-phy.h
arch/arm/mach-exynos4/setup-usb-phy.c [moved from arch/arm/mach-exynos4/usb-phy.c with 100% similarity]
arch/arm/mach-exynos4/time.c
arch/arm/mach-s3c2410/Makefile
arch/arm/mach-s3c2410/irq.c [deleted file]
arch/arm/mach-s5pv210/cpufreq.c
arch/arm/mach-ux500/cpu-db8500.c
arch/arm/plat-nomadik/include/plat/gpio.h
arch/arm/plat-s3c24xx/dma.c
arch/arm/plat-s3c24xx/irq.c
arch/arm/plat-s5p/dev-onenand.c
arch/arm/plat-s5p/include/plat/map-s5p.h
arch/arm/plat-samsung/dev-onenand.c
arch/arm/plat-samsung/include/plat/devs.h
arch/powerpc/boot/.gitignore
arch/powerpc/boot/dtc-src/.gitignore [deleted file]
arch/powerpc/include/asm/rio.h
arch/powerpc/kernel/cputable.c
arch/powerpc/kernel/prom.c
arch/powerpc/mm/init_32.c
arch/powerpc/mm/init_64.c
arch/powerpc/mm/mem.c
arch/powerpc/sysdev/fsl_lbc.c
arch/sparc/Kconfig
arch/sparc/include/asm/floppy_32.h
arch/sparc/include/asm/floppy_64.h
arch/sparc/include/asm/leon.h
arch/sparc/include/asm/leon_pci.h [new file with mode: 0644]
arch/sparc/include/asm/pci_32.h
arch/sparc/include/asm/pcic.h
arch/sparc/include/asm/system_32.h
arch/sparc/include/asm/system_64.h
arch/sparc/kernel/Makefile
arch/sparc/kernel/apc.c
arch/sparc/kernel/auxio_32.c
arch/sparc/kernel/chmc.c
arch/sparc/kernel/entry.S
arch/sparc/kernel/leon_kernel.c
arch/sparc/kernel/leon_pci.c [new file with mode: 0644]
arch/sparc/kernel/leon_pci_grpci2.c [new file with mode: 0644]
arch/sparc/kernel/module.c
arch/sparc/kernel/pci_common.c
arch/sparc/kernel/pci_schizo.c
arch/sparc/kernel/prom_irqtrans.c
arch/sparc/kernel/psycho_common.c
arch/sparc/kernel/sbus.c
arch/sparc/kernel/setup_32.c
arch/sparc/kernel/setup_64.c
arch/sparc/kernel/smp_32.c
arch/sparc/kernel/sun4d_irq.c
arch/sparc/kernel/sys_sparc32.c
arch/sparc/kernel/sys_sparc_64.c
arch/sparc/kernel/time_64.c
arch/sparc/kernel/traps_64.c
arch/sparc/kernel/unaligned_64.c
arch/sparc/kernel/us2e_cpufreq.c
arch/sparc/kernel/us3_cpufreq.c
arch/sparc/kernel/viohs.c
arch/sparc/kernel/visemul.c
arch/sparc/mm/fault_32.c
arch/sparc/mm/init_32.c
arch/sparc/mm/init_64.c
arch/sparc/mm/srmmu.c
arch/sparc/mm/sun4c.c
arch/sparc/mm/tsb.c
arch/sparc/prom/console_32.c
arch/sparc/prom/init_32.c
arch/sparc/prom/mp.c
arch/unicore32/Kconfig
arch/unicore32/Makefile
arch/unicore32/boot/compressed/Makefile
arch/unicore32/configs/unicore32_defconfig [moved from arch/unicore32/configs/debug_defconfig with 97% similarity]
arch/unicore32/include/asm/Kbuild
arch/unicore32/kernel/Makefile
arch/unicore32/kernel/vmlinux.lds.S
arch/x86/kernel/process_32.c
arch/x86/kernel/process_64.c
arch/x86/xen/multicalls.c
drivers/ata/libata-eh.c
drivers/base/power/clock_ops.c
drivers/firmware/iscsi_ibft_find.c
drivers/gpio/Kconfig
drivers/gpio/gpio-exynos4.c
drivers/gpio/gpio-nomadik.c
drivers/gpio/gpio-omap.c
drivers/gpu/drm/radeon/radeon_cs.c
drivers/gpu/drm/radeon/radeon_device.c
drivers/gpu/drm/radeon/radeon_drv.c
drivers/ide/ide-cd.c
drivers/isdn/hardware/mISDN/hfcsusb.c
drivers/media/dvb/dvb-usb/anysee.c
drivers/media/media-devnode.c
drivers/media/video/cx23885/cx23885-cards.c
drivers/media/video/gspca/coarse_expo_autogain.h [deleted file]
drivers/media/video/gspca/ov519.c
drivers/media/video/gspca/sonixj.c
drivers/media/video/gspca/stv06xx/stv06xx_hdcs.h
drivers/media/video/ivtv/ivtv-driver.c
drivers/media/video/ivtv/ivtv-firmware.c
drivers/media/video/ivtv/ivtv-ioctl.c
drivers/media/video/ivtv/ivtv-ioctl.h
drivers/media/video/ivtv/ivtv-streams.c
drivers/media/video/ivtv/ivtv-vbi.c
drivers/media/video/ivtv/ivtvfb.c
drivers/media/video/omap3isp/isp.c
drivers/media/video/soc_camera.c
drivers/media/video/uvc/uvc_entity.c
drivers/net/arm/am79c961a.c
drivers/net/arm/ep93xx_eth.c
drivers/net/bonding/bond_main.c
drivers/net/dl2k.c
drivers/net/gianfar.c
drivers/net/gianfar.h
drivers/net/gianfar_ethtool.c
drivers/net/igb/igb_main.c
drivers/net/qlcnic/qlcnic_hw.c
drivers/net/qlcnic/qlcnic_main.c
drivers/net/smc91x.c
drivers/net/wireless/ath/ath5k/base.c
drivers/net/wireless/ath/ath5k/reset.c
drivers/net/wireless/iwlegacy/iwl-4965.c
drivers/net/wireless/iwlegacy/iwl-core.c
drivers/net/wireless/iwlegacy/iwl-core.h
drivers/net/wireless/iwlegacy/iwl-dev.h
drivers/net/wireless/iwlegacy/iwl4965-base.c
drivers/net/wireless/iwlwifi/iwl-2000.c
drivers/net/wireless/iwlwifi/iwl-5000.c
drivers/net/wireless/iwlwifi/iwl-6000.c
drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl-core.h
drivers/net/wireless/iwlwifi/iwl-dev.h
drivers/net/wireless/iwlwifi/iwl-rx.c
drivers/net/wireless/libertas/if_sdio.c
drivers/net/wireless/rt2x00/rt2x00config.c
drivers/net/wireless/rt2x00/rt2x00dev.c
drivers/net/wireless/rtlwifi/pci.c
drivers/pci/Makefile
drivers/pci/intel-iommu.c
drivers/rtc/Kconfig
drivers/rtc/Makefile
drivers/rtc/rtc-m41t93.c
drivers/rtc/rtc-puv3.c [moved from arch/unicore32/kernel/rtc.c with 98% similarity]
drivers/spi/amba-pl022.c
drivers/spi/omap2_mcspi.c
drivers/ssb/driver_pcicore.c
drivers/staging/Kconfig
drivers/staging/altera-stapl/altera-jtag.c
drivers/staging/altera-stapl/altera.c
drivers/staging/altera-stapl/altera.h [moved from include/staging/altera.h with 100% similarity]
drivers/staging/ath6kl/Kconfig
drivers/staging/ath6kl/os/linux/cfg80211.c
drivers/staging/brcm80211/brcmfmac/wl_iw.c
drivers/staging/gma500/psb_drv.c
drivers/staging/gma500/psb_fb.c
drivers/staging/gma500/psb_intel_bios.c
drivers/staging/iio/dac/max517.c
drivers/staging/iio/imu/adis16400_ring.c
drivers/staging/iio/industrialio-trigger.c
drivers/staging/mei/init.c
drivers/staging/olpc_dcon/Kconfig
drivers/staging/rts_pstor/sd.c
drivers/staging/usbip/stub_dev.c
drivers/staging/usbip/stub_rx.c
drivers/tty/tty_buffer.c
drivers/usb/class/cdc-acm.c
drivers/usb/core/hub.c
drivers/usb/gadget/Kconfig
drivers/usb/gadget/amd5536udc.c
drivers/usb/gadget/at91_udc.c
drivers/usb/gadget/dummy_hcd.c
drivers/usb/gadget/inode.c
drivers/usb/gadget/mv_udc_core.c
drivers/usb/gadget/net2280.c
drivers/usb/gadget/pxa25x_udc.c
drivers/usb/gadget/s3c-hsotg.c
drivers/usb/gadget/s3c-hsudc.c
drivers/usb/gadget/s3c2410_udc.c
drivers/usb/host/ohci-pxa27x.c
drivers/usb/host/xhci-dbg.c
drivers/usb/host/xhci-mem.c
drivers/usb/host/xhci-pci.c
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.c
drivers/usb/host/xhci.h
drivers/usb/musb/musb_core.c
drivers/usb/renesas_usbhs/mod_gadget.c
drivers/usb/serial/ftdi_sio.c
drivers/usb/serial/ftdi_sio_ids.h
drivers/usb/serial/option.c
drivers/usb/storage/transport.c
drivers/usb/storage/unusual_devs.h
drivers/usb/storage/usb.c
drivers/usb/storage/usb.h
drivers/xen/events.c
drivers/xen/swiotlb-xen.c
fs/btrfs/ctree.c
fs/btrfs/disk-io.c
fs/btrfs/extent-tree.c
fs/btrfs/extent_io.h
fs/btrfs/free-space-cache.c
fs/btrfs/inode.c
fs/btrfs/ioctl.c
fs/btrfs/scrub.c
fs/btrfs/transaction.c
fs/btrfs/volumes.c
fs/cifs/Kconfig
fs/cifs/cifsencrypt.c
fs/cifs/connect.c
fs/exec.c
fs/nilfs2/btree.c
fs/nilfs2/segment.c
include/linux/basic_mmio_gpio.h
include/linux/ethtool.h
include/linux/fs.h
include/linux/if_packet.h
include/linux/if_vlan.h
include/linux/netdevice.h
include/linux/netfilter/nf_conntrack_common.h
include/linux/perf_event.h
include/linux/seqlock.h
include/linux/skbuff.h
include/linux/swiotlb.h
include/linux/usb_usual.h
include/media/v4l2-dev.h
kernel/events/core.c
kernel/irq/manage.c
kernel/sysctl.c
lib/swiotlb.c
lib/vsprintf.c
net/8021q/vlan_core.c
net/bridge/br_netfilter.c
net/core/dev.c
net/core/net_namespace.c
net/core/netpoll.c
net/ipv4/ip_output.c
net/ipv4/netfilter/ip_queue.c
net/ipv4/netfilter/ipt_CLUSTERIP.c
net/ipv4/netfilter/ipt_MASQUERADE.c
net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
net/ipv4/netfilter/nf_conntrack_proto_icmp.c
net/ipv4/netfilter/nf_nat_core.c
net/ipv4/netfilter/nf_nat_helper.c
net/ipv4/netfilter/nf_nat_rule.c
net/ipv4/netfilter/nf_nat_standalone.c
net/ipv4/route.c
net/ipv6/af_inet6.c
net/ipv6/netfilter/ip6_queue.c
net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
net/irda/iriap.c
net/l2tp/l2tp_debugfs.c
net/mac80211/ibss.c
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/key.c
net/mac80211/mlme.c
net/mac80211/tx.c
net/netfilter/ipset/ip_set_core.c
net/netfilter/ipset/ip_set_hash_ipportnet.c
net/netfilter/ipset/ip_set_hash_net.c
net/netfilter/ipset/ip_set_hash_netport.c
net/netfilter/ipvs/ip_vs_core.c
net/netfilter/nf_conntrack_core.c
net/netfilter/nf_conntrack_ftp.c
net/netfilter/nf_conntrack_h323_main.c
net/netfilter/nf_conntrack_irc.c
net/netfilter/nf_conntrack_pptp.c
net/netfilter/nf_conntrack_sane.c
net/netfilter/nf_conntrack_sip.c
net/netfilter/xt_socket.c
net/packet/af_packet.c
net/sched/sch_generic.c
net/wireless/nl80211.c
net/xfrm/xfrm_replay.c
scripts/Makefile.asm-generic
scripts/depmod.sh [new file with mode: 0755]
security/apparmor/lsm.c
security/selinux/hooks.c
sound/core/misc.c
sound/pci/hda/patch_conexant.c
sound/pci/hda/patch_realtek.c
sound/soc/atmel/atmel_ssc_dai.c
sound/soc/blackfin/bf5xx-ad1836.c
sound/soc/codecs/ad1836.c
sound/soc/codecs/ad1836.h
sound/soc/codecs/wm8804.c
sound/soc/codecs/wm8915.c
sound/soc/codecs/wm8962.c
sound/soc/fsl/fsl_dma.c
sound/soc/samsung/i2s.c
sound/soc/soc-cache.c
sound/soc/soc-dapm.c
tools/perf/builtin-test.c
tools/perf/util/PERF-VERSION-GEN
tools/perf/util/event.c
tools/perf/util/event.h
tools/perf/util/evlist.c
tools/perf/util/evlist.h
tools/perf/util/evsel.c
tools/perf/util/evsel.h
tools/perf/util/python.c
tools/perf/util/session.c

index d9a203b..fd248a3 100644 (file)
@@ -2598,6 +2598,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
                                        unlock ejectable media);
                                m = MAX_SECTORS_64 (don't transfer more
                                        than 64 sectors = 32 KB at a time);
+                               n = INITIAL_READ10 (force a retry of the
+                                       initial READ(10) command);
                                o = CAPACITY_OK (accept the capacity
                                        reported by the device);
                                r = IGNORE_RESIDUE (the device reports
index fb02949..e50fc6e 100644 (file)
@@ -1739,7 +1739,7 @@ S:        Supported
 F:     drivers/net/enic/
 
 CIRRUS LOGIC EP93XX ETHERNET DRIVER
-M:     Lennert Buytenhek <kernel@wantstofly.org>
+M:     Hartley Sweeten <hsweeten@visionengravers.com>
 L:     netdev@vger.kernel.org
 S:     Maintained
 F:     drivers/net/arm/ep93xx_eth.c
@@ -4945,6 +4945,7 @@ T:        git git://git.kernel.org/pub/scm/linux/kernel/git/epip/linux-2.6-unicore32.gi
 F:     drivers/input/serio/i8042-unicore32io.h
 F:     drivers/i2c/busses/i2c-puv3.c
 F:     drivers/video/fb-puv3.c
+F:     drivers/rtc/rtc-puv3.c
 
 PMC SIERRA MaxRAID DRIVER
 M:     Anil Ravindranath <anil_ravindranath@pmc-sierra.com>
@@ -6444,9 +6445,11 @@ S:       Maintained
 F:     drivers/media/video/et61x251/
 
 USB GADGET/PERIPHERAL SUBSYSTEM
+M:     Felipe Balbi <balbi@ti.com>
 L:     linux-usb@vger.kernel.org
 W:     http://www.linux-usb.org/gadget
-S:     Orphan
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
+S:     Maintained
 F:     drivers/usb/gadget/
 F:     include/linux/usb/gadget*
 
index 0f1db8d..72c0e32 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -378,7 +378,7 @@ KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
 
 # Read KERNELRELEASE from include/config/kernel.release (if it exists)
 KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
-KERNELVERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
+KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)
 
 export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
 export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC
@@ -1005,7 +1005,7 @@ endef
 
 define filechk_version.h
        (echo \#define LINUX_VERSION_CODE $(shell                             \
-       expr $(VERSION) \* 65536 + $(PATCHLEVEL) \* 256 + $(SUBLEVEL));     \
+       expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL));    \
        echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';)
 endef
 
@@ -1110,11 +1110,6 @@ modules_install: _modinst_ _modinst_post
 
 PHONY += _modinst_
 _modinst_:
-       @if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \
-               echo "Warning: you may need to install module-init-tools"; \
-               echo "See http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt";\
-               sleep 1; \
-       fi
        @rm -rf $(MODLIB)/kernel
        @rm -f $(MODLIB)/source
        @mkdir -p $(MODLIB)/kernel
@@ -1531,12 +1526,7 @@ quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN   $(wildcard $(rm-files))
 
 # Run depmod only if we have System.map and depmod is executable
 quiet_cmd_depmod = DEPMOD  $(KERNELRELEASE)
-      cmd_depmod = \
-       if [ -r System.map -a -x $(DEPMOD) ]; then                              \
-               $(DEPMOD) -ae -F System.map                                     \
-               $(if $(strip $(INSTALL_MOD_PATH)), -b $(INSTALL_MOD_PATH) )     \
-               $(KERNELRELEASE);                                               \
-       fi
+      cmd_depmod = $(srctree)/scripts/depmod.sh $(DEPMOD) $(KERNELRELEASE)
 
 # Create temporary dir for module support files
 # clean it up only when building all modules
index 8207954..1d4b65f 100644 (file)
@@ -402,11 +402,15 @@ static struct resource ep93xx_eth_resource[] = {
        }
 };
 
+static u64 ep93xx_eth_dma_mask = DMA_BIT_MASK(32);
+
 static struct platform_device ep93xx_eth_device = {
        .name           = "ep93xx-eth",
        .id             = -1,
        .dev            = {
-               .platform_data  = &ep93xx_eth_data,
+               .platform_data          = &ep93xx_eth_data,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+               .dma_mask               = &ep93xx_eth_dma_mask,
        },
        .num_resources  = ARRAY_SIZE(ep93xx_eth_resource),
        .resource       = ep93xx_eth_resource,
index b92c1e5..1435fc3 100644 (file)
@@ -91,6 +91,11 @@ config EXYNOS4_SETUP_FIMC
        help
          Common setup code for the camera interfaces.
 
+config EXYNOS4_SETUP_USB_PHY
+       bool
+       help
+         Common setup code for USB PHY controller
+
 # machine support
 
 menu "EXYNOS4 Machines"
@@ -176,6 +181,7 @@ config MACH_NURI
        select EXYNOS4_SETUP_I2C3
        select EXYNOS4_SETUP_I2C5
        select EXYNOS4_SETUP_SDHCI
+       select EXYNOS4_SETUP_USB_PHY
        select SAMSUNG_DEV_PWM
        help
          Machine support for Samsung Mobile NURI Board.
index a9bb94f..60fe5ec 100644 (file)
@@ -56,4 +56,4 @@ obj-$(CONFIG_EXYNOS4_SETUP_KEYPAD)    += setup-keypad.o
 obj-$(CONFIG_EXYNOS4_SETUP_SDHCI)      += setup-sdhci.o
 obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o
 
-obj-$(CONFIG_USB_SUPPORT)              += usb-phy.o
+obj-$(CONFIG_EXYNOS4_SETUP_USB_PHY)    += setup-usb-phy.o
index 08813a6..9babe44 100644 (file)
@@ -98,7 +98,7 @@ static struct map_desc exynos4_iodesc[] __initdata = {
                .length         = SZ_4K,
                .type           = MT_DEVICE,
        }, {
-               .virtual        = (unsigned long)S5P_VA_USB_HSPHY,
+               .virtual        = (unsigned long)S3C_VA_USB_HSPHY,
                .pfn            = __phys_to_pfn(EXYNOS4_PA_HSPHY),
                .length         = SZ_4K,
                .type           = MT_DEVICE,
index 703118d..c337cf3 100644 (file)
@@ -11,7 +11,7 @@
 #ifndef __PLAT_S5P_REGS_USB_PHY_H
 #define __PLAT_S5P_REGS_USB_PHY_H
 
-#define EXYNOS4_HSOTG_PHYREG(x)                ((x) + S5P_VA_USB_HSPHY)
+#define EXYNOS4_HSOTG_PHYREG(x)                ((x) + S3C_VA_USB_HSPHY)
 
 #define EXYNOS4_PHYPWR                 EXYNOS4_HSOTG_PHYREG(0x00)
 #define PHY1_HSIC_NORMAL_MASK          (0xf << 9)
index 86b9fa0..ebb8f38 100644 (file)
@@ -206,6 +206,7 @@ static cycle_t exynos4_pwm4_read(struct clocksource *cs)
        return (cycle_t) ~__raw_readl(S3C_TIMERREG(0x40));
 }
 
+#ifdef CONFIG_PM
 static void exynos4_pwm4_resume(struct clocksource *cs)
 {
        unsigned long pclk;
@@ -218,6 +219,7 @@ static void exynos4_pwm4_resume(struct clocksource *cs)
        exynos4_pwm_init(4, ~0);
        exynos4_pwm_start(4, 1);
 }
+#endif
 
 struct clocksource pwm_clocksource = {
        .name           = "pwm_timer4",
index 0d468e9..8169535 100644 (file)
@@ -10,7 +10,6 @@ obj-n                         :=
 obj-                           :=
 
 obj-$(CONFIG_CPU_S3C2410)      += s3c2410.o
-obj-$(CONFIG_CPU_S3C2410)      += irq.o
 obj-$(CONFIG_CPU_S3C2410_DMA)  += dma.o
 obj-$(CONFIG_CPU_S3C2410_DMA)  += dma.o
 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 (file)
index 2854129..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/* linux/arch/arm/mach-s3c2410/irq.c
- *
- * Copyright (c) 2006 Simtec Electronics
- *     Ben Dooks <ben@simtec.co.uk>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
-*/
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/syscore_ops.h>
-
-#include <plat/cpu.h>
-#include <plat/pm.h>
-
-struct syscore_ops s3c24xx_irq_syscore_ops = {
-       .suspend        = s3c24xx_irq_suspend,
-       .resume         = s3c24xx_irq_resume,
-};
index 22046e2..153af8b 100644 (file)
@@ -101,12 +101,14 @@ static void s5pv210_set_refresh(enum s5pv210_dmc_port ch, unsigned long freq)
        unsigned long tmp, tmp1;
        void __iomem *reg = NULL;
 
-       if (ch == DMC0)
+       if (ch == DMC0) {
                reg = (S5P_VA_DMC0 + 0x30);
-       else if (ch == DMC1)
+       } else if (ch == DMC1) {
                reg = (S5P_VA_DMC1 + 0x30);
-       else
+       } else {
                printk(KERN_ERR "Cannot find DMC port\n");
+               return;
+       }
 
        /* Find current DRAM frequency */
        tmp = s5pv210_dram_conf[ch].freq;
index c3c4176..4598b06 100644 (file)
@@ -159,6 +159,9 @@ static void __init db8500_add_gpios(void)
                /* No custom data yet */
        };
 
+       if (cpu_is_u8500v2())
+               pdata.supports_sleepmode = true;
+
        dbx500_add_gpios(ARRAY_AND_SIZE(db8500_gpio_base),
                         IRQ_DB8500_GPIO0, &pdata);
 }
index ea19a5b..d5d7e65 100644 (file)
@@ -90,6 +90,7 @@ struct nmk_gpio_platform_data {
        int num_gpio;
        u32 (*get_secondary_status)(unsigned int bank);
        void (*set_ioforce)(bool enable);
+       bool supports_sleepmode;
 };
 
 #endif /* __ASM_PLAT_GPIO_H */
index c10d10c..2abf966 100644 (file)
@@ -1199,7 +1199,7 @@ EXPORT_SYMBOL(s3c2410_dma_getposition);
 
 #ifdef CONFIG_PM
 
-static void s3c2410_dma_suspend_chan(s3c2410_dma_chan *cp)
+static void s3c2410_dma_suspend_chan(struct s3c2410_dma_chan *cp)
 {
        printk(KERN_DEBUG "suspending dma channel %d\n", cp->number);
 
index 9aee7e1..fc8c5f8 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
 #include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
 
 #include <asm/irq.h>
 #include <asm/mach/irq.h>
@@ -668,3 +669,8 @@ void __init s3c24xx_init_irq(void)
 
        irqdbf("s3c2410: registered interrupt handlers\n");
 }
+
+struct syscore_ops s3c24xx_irq_syscore_ops = {
+       .suspend        = s3c24xx_irq_suspend,
+       .resume         = s3c24xx_irq_resume,
+};
index 6db9262..20336c8 100644 (file)
@@ -15,8 +15,6 @@
 
 #include <linux/kernel.h>
 #include <linux/platform_device.h>
-#include <linux/mtd/mtd.h>
-#include <linux/mtd/onenand.h>
 
 #include <mach/irqs.h>
 #include <mach/map.h>
@@ -45,13 +43,3 @@ struct platform_device s5p_device_onenand = {
        .num_resources  = ARRAY_SIZE(s5p_onenand_resources),
        .resource       = s5p_onenand_resources,
 };
-
-void s5p_onenand_set_platdata(struct onenand_platform_data *pdata)
-{
-       struct onenand_platform_data *pd;
-
-       pd = kmemdup(pdata, sizeof(struct onenand_platform_data), GFP_KERNEL);
-       if (!pd)
-               printk(KERN_ERR "%s: no memory for platform data\n", __func__);
-       s5p_device_onenand.dev.platform_data = pd;
-}
index a6c3d32..d973d39 100644 (file)
@@ -39,7 +39,7 @@
 #define S5P_VA_TWD             S5P_VA_COREPERI(0x600)
 #define S5P_VA_GIC_DIST                S5P_VA_COREPERI(0x1000)
 
-#define S5P_VA_USB_HSPHY       S3C_ADDR(0x02900000)
+#define S3C_VA_USB_HSPHY       S3C_ADDR(0x02900000)
 
 #define VA_VIC(x)              (S3C_VA_IRQ + ((x) * 0x10000))
 #define VA_VIC0                        VA_VIC(0)
index 45ec732..f54ae71 100644 (file)
@@ -13,8 +13,6 @@
 
 #include <linux/kernel.h>
 #include <linux/platform_device.h>
-#include <linux/mtd/mtd.h>
-#include <linux/mtd/onenand.h>
 
 #include <mach/irqs.h>
 #include <mach/map.h>
@@ -43,13 +41,3 @@ struct platform_device s3c_device_onenand = {
        .num_resources  = ARRAY_SIZE(s3c_onenand_resources),
        .resource       = s3c_onenand_resources,
 };
-
-void s3c_onenand_set_platdata(struct onenand_platform_data *pdata)
-{
-       struct onenand_platform_data *pd;
-
-       pd = kmemdup(pdata, sizeof(struct onenand_platform_data), GFP_KERNEL);
-       if (!pd)
-               printk(KERN_ERR "%s: no memory for platform data\n", __func__);
-       s3c_device_onenand.dev.platform_data = pd;
-}
index b61b8ee..4af108f 100644 (file)
@@ -75,10 +75,8 @@ extern struct platform_device s5pc100_device_spi1;
 extern struct platform_device s5pc100_device_spi2;
 extern struct platform_device s5pv210_device_spi0;
 extern struct platform_device s5pv210_device_spi1;
-extern struct platform_device s5p6440_device_spi0;
-extern struct platform_device s5p6440_device_spi1;
-extern struct platform_device s5p6450_device_spi0;
-extern struct platform_device s5p6450_device_spi1;
+extern struct platform_device s5p64x0_device_spi0;
+extern struct platform_device s5p64x0_device_spi1;
 
 extern struct platform_device s3c_device_hwmon;
 
index 3d80c3e..12da77e 100644 (file)
@@ -1,5 +1,4 @@
 addnote
-dtc
 empty.c
 hack-coff
 infblock.c
diff --git a/arch/powerpc/boot/dtc-src/.gitignore b/arch/powerpc/boot/dtc-src/.gitignore
deleted file mode 100644 (file)
index a7c3f94..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-dtc-lexer.lex.c
-dtc-parser.tab.c
-dtc-parser.tab.h
index d902abd..b1d2dec 100644 (file)
@@ -14,7 +14,7 @@
 #define ASM_PPC_RIO_H
 
 extern void platform_rio_init(void);
-#ifdef CONFIG_RAPIDIO
+#ifdef CONFIG_FSL_RIO
 extern int fsl_rio_mcheck_exception(struct pt_regs *);
 #else
 static inline int fsl_rio_mcheck_exception(struct pt_regs *regs) {return 0; }
index 34d2722..9fb9332 100644 (file)
@@ -1979,7 +1979,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
                .pvr_value              = 0x80240000,
                .cpu_name               = "e5500",
                .cpu_features           = CPU_FTRS_E5500,
-               .cpu_user_features      = COMMON_USER_BOOKE,
+               .cpu_user_features      = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
                .mmu_features           = MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS |
                        MMU_FTR_USE_TLBILX,
                .icache_bsize           = 64,
index f2c906b..8c3112a 100644 (file)
@@ -82,11 +82,29 @@ static int __init early_parse_mem(char *p)
 }
 early_param("mem", early_parse_mem);
 
+/*
+ * overlaps_initrd - check for overlap with page aligned extension of
+ * initrd.
+ */
+static inline int overlaps_initrd(unsigned long start, unsigned long size)
+{
+#ifdef CONFIG_BLK_DEV_INITRD
+       if (!initrd_start)
+               return 0;
+
+       return  (start + size) > _ALIGN_DOWN(initrd_start, PAGE_SIZE) &&
+                       start <= _ALIGN_UP(initrd_end, PAGE_SIZE);
+#else
+       return 0;
+#endif
+}
+
 /**
  * move_device_tree - move tree to an unused area, if needed.
  *
  * The device tree may be allocated beyond our memory limit, or inside the
- * crash kernel region for kdump. If so, move it out of the way.
+ * crash kernel region for kdump, or within the page aligned range of initrd.
+ * If so, move it out of the way.
  */
 static void __init move_device_tree(void)
 {
@@ -99,7 +117,8 @@ static void __init move_device_tree(void)
        size = be32_to_cpu(initial_boot_params->totalsize);
 
        if ((memory_limit && (start + size) > PHYSICAL_START + memory_limit) ||
-                       overlaps_crashkernel(start, size)) {
+                       overlaps_crashkernel(start, size) ||
+                       overlaps_initrd(start, size)) {
                p = __va(memblock_alloc(size, PAGE_SIZE));
                memcpy(p, initial_boot_params, size);
                initial_boot_params = (struct boot_param_header *)p;
@@ -555,7 +574,9 @@ static void __init early_reserve_mem(void)
 #ifdef CONFIG_BLK_DEV_INITRD
        /* then reserve the initrd, if any */
        if (initrd_start && (initrd_end > initrd_start))
-               memblock_reserve(__pa(initrd_start), initrd_end - initrd_start);
+               memblock_reserve(_ALIGN_DOWN(__pa(initrd_start), PAGE_SIZE),
+                       _ALIGN_UP(initrd_end, PAGE_SIZE) -
+                       _ALIGN_DOWN(initrd_start, PAGE_SIZE));
 #endif /* CONFIG_BLK_DEV_INITRD */
 
 #ifdef CONFIG_PPC32
index d65b591..5de0f25 100644 (file)
@@ -223,21 +223,6 @@ void free_initmem(void)
 #undef FREESEC
 }
 
-#ifdef CONFIG_BLK_DEV_INITRD
-void free_initrd_mem(unsigned long start, unsigned long end)
-{
-       if (start < end)
-               printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
-       for (; start < end; start += PAGE_SIZE) {
-               ClearPageReserved(virt_to_page(start));
-               init_page_count(virt_to_page(start));
-               free_page(start);
-               totalram_pages++;
-       }
-}
-#endif
-
-
 #ifdef CONFIG_8xx /* No 8xx specific .c file to put that in ... */
 void setup_initial_memory_limit(phys_addr_t first_memblock_base,
                                phys_addr_t first_memblock_size)
index 6374b21..f6dbb4c 100644 (file)
@@ -99,20 +99,6 @@ void free_initmem(void)
                ((unsigned long)__init_end - (unsigned long)__init_begin) >> 10);
 }
 
-#ifdef CONFIG_BLK_DEV_INITRD
-void free_initrd_mem(unsigned long start, unsigned long end)
-{
-       if (start < end)
-               printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
-       for (; start < end; start += PAGE_SIZE) {
-               ClearPageReserved(virt_to_page(start));
-               init_page_count(virt_to_page(start));
-               free_page(start);
-               totalram_pages++;
-       }
-}
-#endif
-
 static void pgd_ctor(void *addr)
 {
        memset(addr, 0, PGD_TABLE_SIZE);
index 57e545b..29d4dde 100644 (file)
@@ -382,6 +382,25 @@ void __init mem_init(void)
        mem_init_done = 1;
 }
 
+#ifdef CONFIG_BLK_DEV_INITRD
+void __init free_initrd_mem(unsigned long start, unsigned long end)
+{
+       if (start >= end)
+               return;
+
+       start = _ALIGN_DOWN(start, PAGE_SIZE);
+       end = _ALIGN_UP(end, PAGE_SIZE);
+       pr_info("Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
+
+       for (; start < end; start += PAGE_SIZE) {
+               ClearPageReserved(virt_to_page(start));
+               init_page_count(virt_to_page(start));
+               free_page(start);
+               totalram_pages++;
+       }
+}
+#endif
+
 /*
  * This is called when a page has been modified by the kernel.
  * It just marks the page as not i-cache clean.  We do the i-cache
index 0608b16..d917573 100644 (file)
@@ -196,9 +196,6 @@ static int __devinit fsl_lbc_ctrl_init(struct fsl_lbc_ctrl *ctrl,
        out_be32(&lbc->lteccr, LTECCR_CLEAR);
        out_be32(&lbc->ltedr, LTEDR_ENABLE);
 
-       /* Enable interrupts for any detected events */
-       out_be32(&lbc->lteir, LTEIR_ENABLE);
-
        /* Set the monitor timeout value to the maximum for erratum A001 */
        if (of_device_is_compatible(node, "fsl,elbc"))
                clrsetbits_be32(&lbc->lbcr, LBCR_BMT, LBCR_BMTPS);
@@ -322,6 +319,9 @@ static int __devinit fsl_lbc_ctrl_probe(struct platform_device *dev)
                goto err;
        }
 
+       /* Enable interrupts for any detected events */
+       out_be32(&fsl_lbc_ctrl_dev->regs->lteir, LTEIR_ENABLE);
+
        return 0;
 
 err:
index af32e17..253986b 100644 (file)
@@ -26,7 +26,6 @@ config SPARC
        select HAVE_DMA_API_DEBUG
        select HAVE_ARCH_JUMP_LABEL
        select HAVE_GENERIC_HARDIRQS
-       select GENERIC_HARDIRQS_NO_DEPRECATED
        select GENERIC_IRQ_SHOW
        select USE_GENERIC_SMP_HELPERS if SMP
 
@@ -528,6 +527,23 @@ config PCI_DOMAINS
 config PCI_SYSCALL
        def_bool PCI
 
+config PCIC_PCI
+       bool
+       depends on PCI && SPARC32 && !SPARC_LEON
+       default y
+
+config LEON_PCI
+       bool
+       depends on PCI && SPARC_LEON
+       default y
+
+config GRPCI2
+       bool "GRPCI2 Host Bridge Support"
+       depends on LEON_PCI
+       default y
+       help
+         Say Y here to include the GRPCI2 Host Bridge Driver.
+
 source "drivers/pci/Kconfig"
 
 source "drivers/pcmcia/Kconfig"
index 482c79e..7440915 100644 (file)
@@ -138,7 +138,7 @@ static unsigned char sun_82072_fd_inb(int port)
                return sun_fdc->data_82072;
        case 7: /* FD_DIR */
                return sun_read_dir();
-       };
+       }
        panic("sun_82072_fd_inb: How did I get here?");
 }
 
@@ -161,7 +161,7 @@ static void sun_82072_fd_outb(unsigned char value, int port)
        case 4: /* FD_STATUS */
                sun_fdc->status_82072 = value;
                break;
-       };
+       }
        return;
 }
 
@@ -186,7 +186,7 @@ static unsigned char sun_82077_fd_inb(int port)
                return sun_fdc->data_82077;
        case 7: /* FD_DIR */
                return sun_read_dir();
-       };
+       }
        panic("sun_82077_fd_inb: How did I get here?");
 }
 
@@ -212,7 +212,7 @@ static void sun_82077_fd_outb(unsigned char value, int port)
        case 3: /* FD_TDR */
                sun_fdc->tapectl_82077 = value;
                break;
-       };
+       }
        return;
 }
 
index 6597ce8..bcef1f5 100644 (file)
@@ -111,7 +111,7 @@ static unsigned char sun_82077_fd_inb(unsigned long port)
        case 7: /* FD_DIR */
                /* XXX: Is DCL on 0x80 in sun4m? */
                return sbus_readb(&sun_fdc->dir_82077);
-       };
+       }
        panic("sun_82072_fd_inb: How did I get here?");
 }
 
@@ -135,7 +135,7 @@ static void sun_82077_fd_outb(unsigned char value, unsigned long port)
        case 4: /* FD_STATUS */
                sbus_writeb(value, &sun_fdc->status_82077);
                break;
-       };
+       }
        return;
 }
 
index 6bdaf1e..a4e457f 100644 (file)
@@ -318,6 +318,9 @@ struct device_node;
 extern unsigned int leon_build_device_irq(unsigned int real_irq,
                                           irq_flow_handler_t flow_handler,
                                           const char *name, int do_ack);
+extern void leon_update_virq_handling(unsigned int virq,
+                             irq_flow_handler_t flow_handler,
+                             const char *name, int do_ack);
 extern void leon_clear_clock_irq(void);
 extern void leon_load_profile_irq(int cpu, unsigned int limit);
 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 (file)
index 0000000..42b4b31
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * asm/leon_pci.h
+ *
+ * Copyright (C) 2011 Aeroflex Gaisler AB, Daniel Hellstrom
+ */
+
+#ifndef _ASM_LEON_PCI_H_
+#define _ASM_LEON_PCI_H_
+
+/* PCI related definitions */
+struct leon_pci_info {
+       struct pci_ops *ops;
+       struct resource io_space;
+       struct resource mem_space;
+       int (*map_irq)(struct pci_dev *dev, u8 slot, u8 pin);
+};
+
+extern void leon_pci_init(struct platform_device *ofdev,
+                               struct leon_pci_info *info);
+
+#endif /* _ASM_LEON_PCI_H_ */
index 332ac9a..862e3ce 100644 (file)
@@ -47,7 +47,31 @@ extern struct device_node *pci_device_to_OF_node(struct pci_dev *pdev);
 
 #endif /* __KERNEL__ */
 
+#ifndef CONFIG_LEON_PCI
 /* generic pci stuff */
 #include <asm-generic/pci.h>
+#else
+/*
+ * On LEON PCI Memory space is mapped 1:1 with physical address space.
+ *
+ * I/O space is located at low 64Kbytes in PCI I/O space. The I/O addresses
+ * are converted into CPU addresses to virtual addresses that are mapped with
+ * MMU to the PCI Host PCI I/O space window which are translated to the low
+ * 64Kbytes by the Host controller.
+ */
+
+extern void
+pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
+                       struct resource *res);
+
+extern void
+pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
+                       struct pci_bus_region *region);
+
+static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
+{
+       return PCI_IRQ_NONE;
+}
+#endif
 
 #endif /* __SPARC_PCI_H */
index 7eb5d78..6676cbc 100644 (file)
@@ -29,7 +29,7 @@ struct linux_pcic {
        int                     pcic_imdim;
 };
 
-#ifdef CONFIG_PCI
+#ifdef CONFIG_PCIC_PCI
 extern int pcic_present(void);
 extern int pcic_probe(void);
 extern void pci_time_init(void);
index 47a7e86..aba1609 100644 (file)
@@ -220,7 +220,7 @@ static inline unsigned long __xchg(unsigned long x, __volatile__ void * ptr, int
        switch (size) {
        case 4:
                return xchg_u32(ptr, x);
-       };
+       }
        __xchg_called_with_bad_pointer();
        return x;
 }
index 3c96d3b..10bcabc 100644 (file)
@@ -234,7 +234,7 @@ static inline unsigned long __xchg(unsigned long x, __volatile__ void * ptr,
                return xchg32(ptr, x);
        case 8:
                return xchg64(ptr, x);
-       };
+       }
        __xchg_called_with_bad_pointer();
        return x;
 }
index 9cff270..b90b4a1 100644 (file)
@@ -73,7 +73,9 @@ obj-$(CONFIG_SPARC64_SMP) += cpumap.o
 
 obj-y                     += dma.o
 
-obj-$(CONFIG_SPARC32_PCI) += pcic.o
+obj-$(CONFIG_PCIC_PCI)    += pcic.o
+obj-$(CONFIG_LEON_PCI)    += leon_pci.o
+obj-$(CONFIG_GRPCI2)      += leon_pci_grpci2.o
 
 obj-$(CONFIG_SMP)         += trampoline_$(BITS).o smp_$(BITS).o
 obj-$(CONFIG_SPARC32_SMP) += sun4m_smp.o sun4d_smp.o leon_smp.o
index 1e34f29..caef9de 100644 (file)
@@ -123,7 +123,7 @@ static long apc_ioctl(struct file *f, unsigned int cmd, unsigned long __arg)
 
        default:
                return -EINVAL;
-       };
+       }
 
        return 0;
 }
index 8505e0a..acf5151 100644 (file)
@@ -101,7 +101,7 @@ void set_auxio(unsigned char bits_on, unsigned char bits_off)
                break;
        default:
                panic("Can't set AUXIO register on this machine.");
-       };
+       }
        spin_unlock_irqrestore(&auxio_lock, flags);
 }
 EXPORT_SYMBOL(set_auxio);
index 668c7be..5f45026 100644 (file)
@@ -664,7 +664,7 @@ static void chmc_interpret_one_decode_reg(struct chmc *p, int which_bank, u64 va
        case 0x0:
                bp->interleave = 16;
                break;
-       };
+       }
 
        /* UK[10] is reserved, and UK[11] is not set for the SDRAM
         * bank size definition.
index 8341963..9fe08a1 100644 (file)
@@ -229,7 +229,7 @@ real_irq_entry:
 #ifdef CONFIG_SMP
        .globl  patchme_maybe_smp_msg
 
-       cmp     %l7, 12
+       cmp     %l7, 11
 patchme_maybe_smp_msg:
        bgu     maybe_smp4m_msg
         nop
@@ -293,7 +293,7 @@ maybe_smp4m_msg:
        WRITE_PAUSE
        wr      %l4, PSR_ET, %psr
        WRITE_PAUSE
-       sll     %o2, 28, %o2            ! shift for simpler checks below
+       sll     %o3, 28, %o2            ! shift for simpler checks below
 maybe_smp4m_msg_check_single:
        andcc   %o2, 0x1, %g0
        beq,a   maybe_smp4m_msg_check_mask
@@ -1604,7 +1604,7 @@ restore_current:
        retl
         nop
 
-#ifdef CONFIG_PCI
+#ifdef CONFIG_PCIC_PCI
 #include <asm/pcic.h>
 
        .align  4
@@ -1650,7 +1650,7 @@ pcic_nmi_trap_patch:
         rd     %psr, %l0
        .word   0
 
-#endif /* CONFIG_PCI */
+#endif /* CONFIG_PCIC_PCI */
 
        .globl  flushw_all
 flushw_all:
index 2f538ac..d17255a 100644 (file)
@@ -236,6 +236,21 @@ static unsigned int _leon_build_device_irq(struct platform_device *op,
        return leon_build_device_irq(real_irq, handle_simple_irq, "edge", 0);
 }
 
+void leon_update_virq_handling(unsigned int virq,
+                             irq_flow_handler_t flow_handler,
+                             const char *name, int do_ack)
+{
+       unsigned long mask = (unsigned long)irq_get_chip_data(virq);
+
+       mask &= ~LEON_DO_ACK_HW;
+       if (do_ack)
+               mask |= LEON_DO_ACK_HW;
+
+       irq_set_chip_and_handler_name(virq, &leon_irq,
+                                     flow_handler, name);
+       irq_set_chip_data(virq, (void *)mask);
+}
+
 void __init leon_init_timers(irq_handler_t counter_fn)
 {
        int irq, eirq;
@@ -361,6 +376,22 @@ void __init leon_init_timers(irq_handler_t counter_fn)
                prom_halt();
        }
 
+#ifdef CONFIG_SMP
+       {
+               unsigned long flags;
+
+               /*
+                * In SMP, sun4m adds a IPI handler to IRQ trap handler that
+                * LEON never must take, sun4d and LEON overwrites the branch
+                * with a NOP.
+                */
+               local_irq_save(flags);
+               patchme_maybe_smp_msg[0] = 0x01000000; /* NOP out the branch */
+               local_flush_cache_all();
+               local_irq_restore(flags);
+       }
+#endif
+
        LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[leon3_gptimer_idx].ctrl,
                              LEON3_GPTIMER_EN |
                              LEON3_GPTIMER_RL |
diff --git a/arch/sparc/kernel/leon_pci.c b/arch/sparc/kernel/leon_pci.c
new file mode 100644 (file)
index 0000000..a8a9a27
--- /dev/null
@@ -0,0 +1,253 @@
+/*
+ * leon_pci.c: LEON Host PCI support
+ *
+ * Copyright (C) 2011 Aeroflex Gaisler AB, Daniel Hellstrom
+ *
+ * Code is partially derived from pcic.c
+ */
+
+#include <linux/of_device.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <asm/leon.h>
+#include <asm/leon_pci.h>
+
+/* The LEON architecture does not rely on a BIOS or bootloader to setup
+ * PCI for us. The Linux generic routines are used to setup resources,
+ * reset values of confuration-space registers settings ae preseved.
+ */
+void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info)
+{
+       struct pci_bus *root_bus;
+
+       root_bus = pci_scan_bus_parented(&ofdev->dev, 0, info->ops, info);
+       if (root_bus) {
+               root_bus->resource[0] = &info->io_space;
+               root_bus->resource[1] = &info->mem_space;
+               root_bus->resource[2] = NULL;
+
+               /* Init all PCI devices into PCI tree */
+               pci_bus_add_devices(root_bus);
+
+               /* Setup IRQs of all devices using custom routines */
+               pci_fixup_irqs(pci_common_swizzle, info->map_irq);
+
+               /* Assign devices with resources */
+               pci_assign_unassigned_resources();
+       }
+}
+
+/* PCI Memory and Prefetchable Memory is direct-mapped. However I/O Space is
+ * accessed through a Window which is translated to low 64KB in PCI space, the
+ * first 4KB is not used so 60KB is available.
+ *
+ * This function is used by generic code to translate resource addresses into
+ * PCI addresses.
+ */
+void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
+                            struct resource *res)
+{
+       struct leon_pci_info *info = dev->bus->sysdata;
+
+       region->start = res->start;
+       region->end = res->end;
+
+       if (res->flags & IORESOURCE_IO) {
+               region->start -= (info->io_space.start - 0x1000);
+               region->end -= (info->io_space.start - 0x1000);
+       }
+}
+EXPORT_SYMBOL(pcibios_resource_to_bus);
+
+/* see pcibios_resource_to_bus() comment */
+void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
+                            struct pci_bus_region *region)
+{
+       struct leon_pci_info *info = dev->bus->sysdata;
+
+       res->start = region->start;
+       res->end = region->end;
+
+       if (res->flags & IORESOURCE_IO) {
+               res->start += (info->io_space.start - 0x1000);
+               res->end += (info->io_space.start - 0x1000);
+       }
+}
+EXPORT_SYMBOL(pcibios_bus_to_resource);
+
+void __devinit pcibios_fixup_bus(struct pci_bus *pbus)
+{
+       struct leon_pci_info *info = pbus->sysdata;
+       struct pci_dev *dev;
+       int i, has_io, has_mem;
+       u16 cmd;
+
+       /* Generic PCI bus probing sets these to point at
+        * &io{port,mem}_resouce which is wrong for us.
+        */
+       if (pbus->self == NULL) {
+               pbus->resource[0] = &info->io_space;
+               pbus->resource[1] = &info->mem_space;
+               pbus->resource[2] = NULL;
+       }
+
+       list_for_each_entry(dev, &pbus->devices, bus_list) {
+               /*
+                * We can not rely on that the bootloader has enabled I/O
+                * or memory access to PCI devices. Instead we enable it here
+                * if the device has BARs of respective type.
+                */
+               has_io = has_mem = 0;
+               for (i = 0; i < PCI_ROM_RESOURCE; i++) {
+                       unsigned long f = dev->resource[i].flags;
+                       if (f & IORESOURCE_IO)
+                               has_io = 1;
+                       else if (f & IORESOURCE_MEM)
+                               has_mem = 1;
+               }
+               /* ROM BARs are mapped into 32-bit memory space */
+               if (dev->resource[PCI_ROM_RESOURCE].end != 0) {
+                       dev->resource[PCI_ROM_RESOURCE].flags |=
+                                                       IORESOURCE_ROM_ENABLE;
+                       has_mem = 1;
+               }
+               pci_bus_read_config_word(pbus, dev->devfn, PCI_COMMAND, &cmd);
+               if (has_io && !(cmd & PCI_COMMAND_IO)) {
+#ifdef CONFIG_PCI_DEBUG
+                       printk(KERN_INFO "LEONPCI: Enabling I/O for dev %s\n",
+                                        pci_name(dev));
+#endif
+                       cmd |= PCI_COMMAND_IO;
+                       pci_bus_write_config_word(pbus, dev->devfn, PCI_COMMAND,
+                                                                       cmd);
+               }
+               if (has_mem && !(cmd & PCI_COMMAND_MEMORY)) {
+#ifdef CONFIG_PCI_DEBUG
+                       printk(KERN_INFO "LEONPCI: Enabling MEMORY for dev"
+                                        "%s\n", pci_name(dev));
+#endif
+                       cmd |= PCI_COMMAND_MEMORY;
+                       pci_bus_write_config_word(pbus, dev->devfn, PCI_COMMAND,
+                                                                       cmd);
+               }
+       }
+}
+
+/*
+ * Other archs parse arguments here.
+ */
+char * __devinit pcibios_setup(char *str)
+{
+       return str;
+}
+
+resource_size_t pcibios_align_resource(void *data, const struct resource *res,
+                               resource_size_t size, resource_size_t align)
+{
+       return res->start;
+}
+
+int pcibios_enable_device(struct pci_dev *dev, int mask)
+{
+       return pci_enable_resources(dev, mask);
+}
+
+struct device_node *pci_device_to_OF_node(struct pci_dev *pdev)
+{
+       /*
+        * Currently the OpenBoot nodes are not connected with the PCI device,
+        * this is because the LEON PROM does not create PCI nodes. Eventually
+        * this will change and the same approach as pcic.c can be used to
+        * match PROM nodes with pci devices.
+        */
+       return NULL;
+}
+EXPORT_SYMBOL(pci_device_to_OF_node);
+
+void __devinit pcibios_update_irq(struct pci_dev *dev, int irq)
+{
+#ifdef CONFIG_PCI_DEBUG
+       printk(KERN_DEBUG "LEONPCI: Assigning IRQ %02d to %s\n", irq,
+               pci_name(dev));
+#endif
+       pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);
+}
+
+/* in/out routines taken from pcic.c
+ *
+ * This probably belongs here rather than ioport.c because
+ * we do not want this crud linked into SBus kernels.
+ * Also, think for a moment about likes of floppy.c that
+ * include architecture specific parts. They may want to redefine ins/outs.
+ *
+ * We do not use horrible macros here because we want to
+ * advance pointer by sizeof(size).
+ */
+void outsb(unsigned long addr, const void *src, unsigned long count)
+{
+       while (count) {
+               count -= 1;
+               outb(*(const char *)src, addr);
+               src += 1;
+               /* addr += 1; */
+       }
+}
+EXPORT_SYMBOL(outsb);
+
+void outsw(unsigned long addr, const void *src, unsigned long count)
+{
+       while (count) {
+               count -= 2;
+               outw(*(const short *)src, addr);
+               src += 2;
+               /* addr += 2; */
+       }
+}
+EXPORT_SYMBOL(outsw);
+
+void outsl(unsigned long addr, const void *src, unsigned long count)
+{
+       while (count) {
+               count -= 4;
+               outl(*(const long *)src, addr);
+               src += 4;
+               /* addr += 4; */
+       }
+}
+EXPORT_SYMBOL(outsl);
+
+void insb(unsigned long addr, void *dst, unsigned long count)
+{
+       while (count) {
+               count -= 1;
+               *(unsigned char *)dst = inb(addr);
+               dst += 1;
+               /* addr += 1; */
+       }
+}
+EXPORT_SYMBOL(insb);
+
+void insw(unsigned long addr, void *dst, unsigned long count)
+{
+       while (count) {
+               count -= 2;
+               *(unsigned short *)dst = inw(addr);
+               dst += 2;
+               /* addr += 2; */
+       }
+}
+EXPORT_SYMBOL(insw);
+
+void insl(unsigned long addr, void *dst, unsigned long count)
+{
+       while (count) {
+               count -= 4;
+               /*
+                * XXX I am sure we are in for an unaligned trap here.
+                */
+               *(unsigned long *)dst = inl(addr);
+               dst += 4;
+               /* addr += 4; */
+       }
+}
+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 (file)
index 0000000..44dc093
--- /dev/null
@@ -0,0 +1,897 @@
+/*
+ * leon_pci_grpci2.c: GRPCI2 Host PCI driver
+ *
+ * Copyright (C) 2011 Aeroflex Gaisler AB, Daniel Hellstrom
+ *
+ */
+
+#include <linux/of_device.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/delay.h>
+#include <linux/module.h>
+#include <asm/io.h>
+#include <asm/leon.h>
+#include <asm/vaddrs.h>
+#include <asm/sections.h>
+#include <asm/leon_pci.h>
+
+#include "irq.h"
+
+struct grpci2_barcfg {
+       unsigned long pciadr;   /* PCI Space Address */
+       unsigned long ahbadr;   /* PCI Base address mapped to this AHB addr */
+};
+
+/* Device Node Configuration options:
+ *  - barcfgs    : Custom Configuration of Host's 6 target BARs
+ *  - irq_mask   : Limit which PCI interrupts are enabled
+ *  - do_reset   : Force PCI Reset on startup
+ *
+ * barcfgs
+ * =======
+ *
+ * Optional custom Target BAR configuration (see struct grpci2_barcfg). All
+ * addresses are physical. Array always contains 6 elements (len=2*4*6 bytes)
+ *
+ * -1 means not configured (let host driver do default setup).
+ *
+ * [i*2+0] = PCI Address of BAR[i] on target interface
+ * [i*2+1] = Accessing PCI address of BAR[i] result in this AMBA address
+ *
+ *
+ * irq_mask
+ * ========
+ *
+ * Limit which PCI interrupts are enabled. 0=Disable, 1=Enable. By default
+ * all are enabled. Use this when PCI interrupt pins are floating on PCB.
+ * int, len=4.
+ *  bit0 = PCI INTA#
+ *  bit1 = PCI INTB#
+ *  bit2 = PCI INTC#
+ *  bit3 = PCI INTD#
+ *
+ *
+ * reset
+ * =====
+ *
+ * Force PCI reset on startup. int, len=4
+ */
+
+/* Enable Debugging Configuration Space Access */
+#undef GRPCI2_DEBUG_CFGACCESS
+
+/*
+ * GRPCI2 APB Register MAP
+ */
+struct grpci2_regs {
+       unsigned int ctrl;              /* 0x00 Control */
+       unsigned int sts_cap;           /* 0x04 Status / Capabilities */
+       int res1;                       /* 0x08 */
+       unsigned int io_map;            /* 0x0C I/O Map address */
+       unsigned int dma_ctrl;          /* 0x10 DMA */
+       unsigned int dma_bdbase;        /* 0x14 DMA */
+       int res2[2];                    /* 0x18 */
+       unsigned int bars[6];           /* 0x20 read-only PCI BARs */
+       int res3[2];                    /* 0x38 */
+       unsigned int ahbmst_map[16];    /* 0x40 AHB->PCI Map per AHB Master */
+
+       /* PCI Trace Buffer Registers (OPTIONAL) */
+       unsigned int t_ctrl;            /* 0x80 */
+       unsigned int t_cnt;             /* 0x84 */
+       unsigned int t_adpat;           /* 0x88 */
+       unsigned int t_admask;          /* 0x8C */
+       unsigned int t_sigpat;          /* 0x90 */
+       unsigned int t_sigmask;         /* 0x94 */
+       unsigned int t_adstate;         /* 0x98 */
+       unsigned int t_sigstate;        /* 0x9C */
+};
+
+#define REGLOAD(a)     (be32_to_cpu(__raw_readl(&(a))))
+#define REGSTORE(a, v) (__raw_writel(cpu_to_be32(v), &(a)))
+
+#define CTRL_BUS_BIT 16
+
+#define CTRL_RESET (1<<31)
+#define CTRL_SI (1<<27)
+#define CTRL_PE (1<<26)
+#define CTRL_EI (1<<25)
+#define CTRL_ER (1<<24)
+#define CTRL_BUS (0xff<<CTRL_BUS_BIT)
+#define CTRL_HOSTINT 0xf
+
+#define STS_HOST_BIT   31
+#define STS_MST_BIT    30
+#define STS_TAR_BIT    29
+#define STS_DMA_BIT    28
+#define STS_DI_BIT     27
+#define STS_HI_BIT     26
+#define STS_IRQMODE_BIT        24
+#define STS_TRACE_BIT  23
+#define STS_CFGERRVALID_BIT 20
+#define STS_CFGERR_BIT 19
+#define STS_INTTYPE_BIT        12
+#define STS_INTSTS_BIT 8
+#define STS_FDEPTH_BIT 2
+#define STS_FNUM_BIT   0
+
+#define STS_HOST       (1<<STS_HOST_BIT)
+#define STS_MST                (1<<STS_MST_BIT)
+#define STS_TAR                (1<<STS_TAR_BIT)
+#define STS_DMA                (1<<STS_DMA_BIT)
+#define STS_DI         (1<<STS_DI_BIT)
+#define STS_HI         (1<<STS_HI_BIT)
+#define STS_IRQMODE    (0x3<<STS_IRQMODE_BIT)
+#define STS_TRACE      (1<<STS_TRACE_BIT)
+#define STS_CFGERRVALID        (1<<STS_CFGERRVALID_BIT)
+#define STS_CFGERR     (1<<STS_CFGERR_BIT)
+#define STS_INTTYPE    (0x3f<<STS_INTTYPE_BIT)
+#define STS_INTSTS     (0xf<<STS_INTSTS_BIT)
+#define STS_FDEPTH     (0x7<<STS_FDEPTH_BIT)
+#define STS_FNUM       (0x3<<STS_FNUM_BIT)
+
+#define STS_ISYSERR    (1<<17)
+#define STS_IDMA       (1<<16)
+#define STS_IDMAERR    (1<<15)
+#define STS_IMSTABRT   (1<<14)
+#define STS_ITGTABRT   (1<<13)
+#define STS_IPARERR    (1<<12)
+
+#define STS_ERR_IRQ (STS_ISYSERR | STS_IMSTABRT | STS_ITGTABRT | STS_IPARERR)
+
+struct grpci2_bd_chan {
+       unsigned int ctrl;      /* 0x00 DMA Control */
+       unsigned int nchan;     /* 0x04 Next DMA Channel Address */
+       unsigned int nbd;       /* 0x08 Next Data Descriptor in chan */
+       unsigned int res;       /* 0x0C Reserved */
+};
+
+#define BD_CHAN_EN             0x80000000
+#define BD_CHAN_TYPE           0x00300000
+#define BD_CHAN_BDCNT          0x0000ffff
+#define BD_CHAN_EN_BIT         31
+#define BD_CHAN_TYPE_BIT       20
+#define BD_CHAN_BDCNT_BIT      0
+
+struct grpci2_bd_data {
+       unsigned int ctrl;      /* 0x00 DMA Data Control */
+       unsigned int pci_adr;   /* 0x04 PCI Start Address */
+       unsigned int ahb_adr;   /* 0x08 AHB Start address */
+       unsigned int next;      /* 0x0C Next Data Descriptor in chan */
+};
+
+#define BD_DATA_EN             0x80000000
+#define BD_DATA_IE             0x40000000
+#define BD_DATA_DR             0x20000000
+#define BD_DATA_TYPE           0x00300000
+#define BD_DATA_ER             0x00080000
+#define BD_DATA_LEN            0x0000ffff
+#define BD_DATA_EN_BIT         31
+#define BD_DATA_IE_BIT         30
+#define BD_DATA_DR_BIT         29
+#define BD_DATA_TYPE_BIT       20
+#define BD_DATA_ER_BIT         19
+#define BD_DATA_LEN_BIT                0
+
+/* GRPCI2 Capability */
+struct grpci2_cap_first {
+       unsigned int ctrl;
+       unsigned int pci2ahb_map[6];
+       unsigned int ext2ahb_map;
+       unsigned int io_map;
+       unsigned int pcibar_size[6];
+};
+#define CAP9_CTRL_OFS 0
+#define CAP9_BAR_OFS 0x4
+#define CAP9_IOMAP_OFS 0x20
+#define CAP9_BARSIZE_OFS 0x24
+
+struct grpci2_priv {
+       struct leon_pci_info    info; /* must be on top of this structure */
+       struct grpci2_regs      *regs;
+       char                    irq;
+       char                    irq_mode; /* IRQ Mode from CAPSTS REG */
+       char                    bt_enabled;
+       char                    do_reset;
+       char                    irq_mask;
+       u32                     pciid; /* PCI ID of Host */
+       unsigned char           irq_map[4];
+
+       /* Virtual IRQ numbers */
+       unsigned int            virq_err;
+       unsigned int            virq_dma;
+
+       /* AHB PCI Windows */
+       unsigned long           pci_area;       /* MEMORY */
+       unsigned long           pci_area_end;
+       unsigned long           pci_io;         /* I/O */
+       unsigned long           pci_conf;       /* CONFIGURATION */
+       unsigned long           pci_conf_end;
+       unsigned long           pci_io_va;
+
+       struct grpci2_barcfg    tgtbars[6];
+};
+
+DEFINE_SPINLOCK(grpci2_dev_lock);
+struct grpci2_priv *grpci2priv;
+
+int grpci2_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
+{
+       struct grpci2_priv *priv = dev->bus->sysdata;
+       int irq_group;
+
+       /* Use default IRQ decoding on PCI BUS0 according slot numbering */
+       irq_group = slot & 0x3;
+       pin = ((pin - 1) + irq_group) & 0x3;
+
+       return priv->irq_map[pin];
+}
+
+static int grpci2_cfg_r32(struct grpci2_priv *priv, unsigned int bus,
+                               unsigned int devfn, int where, u32 *val)
+{
+       unsigned int *pci_conf;
+       unsigned long flags;
+       u32 tmp;
+
+       if (where & 0x3)
+               return -EINVAL;
+
+       if (bus == 0 && PCI_SLOT(devfn) != 0)
+               devfn += (0x8 * 6);
+
+       /* Select bus */
+       spin_lock_irqsave(&grpci2_dev_lock, flags);
+       REGSTORE(priv->regs->ctrl, (REGLOAD(priv->regs->ctrl) & ~(0xff << 16)) |
+                                  (bus << 16));
+       spin_unlock_irqrestore(&grpci2_dev_lock, flags);
+
+       /* clear old status */
+       REGSTORE(priv->regs->sts_cap, (STS_CFGERR | STS_CFGERRVALID));
+
+       pci_conf = (unsigned int *) (priv->pci_conf |
+                                               (devfn << 8) | (where & 0xfc));
+       tmp = LEON3_BYPASS_LOAD_PA(pci_conf);
+
+       /* Wait until GRPCI2 signals that CFG access is done, it should be
+        * done instantaneously unless a DMA operation is ongoing...
+        */
+       while ((REGLOAD(priv->regs->sts_cap) & STS_CFGERRVALID) == 0)
+               ;
+
+       if (REGLOAD(priv->regs->sts_cap) & STS_CFGERR) {
+               *val = 0xffffffff;
+       } else {
+               /* Bus always little endian (unaffected by byte-swapping) */
+               *val = flip_dword(tmp);
+       }
+
+       return 0;
+}
+
+static int grpci2_cfg_r16(struct grpci2_priv *priv, unsigned int bus,
+                               unsigned int devfn, int where, u32 *val)
+{
+       u32 v;
+       int ret;
+
+       if (where & 0x1)
+               return -EINVAL;
+       ret = grpci2_cfg_r32(priv, bus, devfn, where & ~0x3, &v);
+       *val = 0xffff & (v >> (8 * (where & 0x3)));
+       return ret;
+}
+
+static int grpci2_cfg_r8(struct grpci2_priv *priv, unsigned int bus,
+                               unsigned int devfn, int where, u32 *val)
+{
+       u32 v;
+       int ret;
+
+       ret = grpci2_cfg_r32(priv, bus, devfn, where & ~0x3, &v);
+       *val = 0xff & (v >> (8 * (where & 3)));
+
+       return ret;
+}
+
+static int grpci2_cfg_w32(struct grpci2_priv *priv, unsigned int bus,
+                               unsigned int devfn, int where, u32 val)
+{
+       unsigned int *pci_conf;
+       unsigned long flags;
+
+       if (where & 0x3)
+               return -EINVAL;
+
+       if (bus == 0 && PCI_SLOT(devfn) != 0)
+               devfn += (0x8 * 6);
+
+       /* Select bus */
+       spin_lock_irqsave(&grpci2_dev_lock, flags);
+       REGSTORE(priv->regs->ctrl, (REGLOAD(priv->regs->ctrl) & ~(0xff << 16)) |
+                                  (bus << 16));
+       spin_unlock_irqrestore(&grpci2_dev_lock, flags);
+
+       /* clear old status */
+       REGSTORE(priv->regs->sts_cap, (STS_CFGERR | STS_CFGERRVALID));
+
+       pci_conf = (unsigned int *) (priv->pci_conf |
+                                               (devfn << 8) | (where & 0xfc));
+       LEON3_BYPASS_STORE_PA(pci_conf, flip_dword(val));
+
+       /* Wait until GRPCI2 signals that CFG access is done, it should be
+        * done instantaneously unless a DMA operation is ongoing...
+        */
+       while ((REGLOAD(priv->regs->sts_cap) & STS_CFGERRVALID) == 0)
+               ;
+
+       return 0;
+}
+
+static int grpci2_cfg_w16(struct grpci2_priv *priv, unsigned int bus,
+                               unsigned int devfn, int where, u32 val)
+{
+       int ret;
+       u32 v;
+
+       if (where & 0x1)
+               return -EINVAL;
+       ret = grpci2_cfg_r32(priv, bus, devfn, where&~3, &v);
+       if (ret)
+               return ret;
+       v = (v & ~(0xffff << (8 * (where & 0x3)))) |
+           ((0xffff & val) << (8 * (where & 0x3)));
+       return grpci2_cfg_w32(priv, bus, devfn, where & ~0x3, v);
+}
+
+static int grpci2_cfg_w8(struct grpci2_priv *priv, unsigned int bus,
+                               unsigned int devfn, int where, u32 val)
+{
+       int ret;
+       u32 v;
+
+       ret = grpci2_cfg_r32(priv, bus, devfn, where & ~0x3, &v);
+       if (ret != 0)
+               return ret;
+       v = (v & ~(0xff << (8 * (where & 0x3)))) |
+           ((0xff & val) << (8 * (where & 0x3)));
+       return grpci2_cfg_w32(priv, bus, devfn, where & ~0x3, v);
+}
+
+/* Read from Configuration Space. When entering here the PCI layer has taken
+ * the pci_lock spinlock and IRQ is off.
+ */
+static int grpci2_read_config(struct pci_bus *bus, unsigned int devfn,
+                             int where, int size, u32 *val)
+{
+       struct grpci2_priv *priv = grpci2priv;
+       unsigned int busno = bus->number;
+       int ret;
+
+       if (PCI_SLOT(devfn) > 15 || (PCI_SLOT(devfn) == 0 && busno == 0)) {
+               *val = ~0;
+               return 0;
+       }
+
+       switch (size) {
+       case 1:
+               ret = grpci2_cfg_r8(priv, busno, devfn, where, val);
+               break;
+       case 2:
+               ret = grpci2_cfg_r16(priv, busno, devfn, where, val);
+               break;
+       case 4:
+               ret = grpci2_cfg_r32(priv, busno, devfn, where, val);
+               break;
+       default:
+               ret = -EINVAL;
+               break;
+       }
+
+#ifdef GRPCI2_DEBUG_CFGACCESS
+       printk(KERN_INFO "grpci2_read_config: [%02x:%02x:%x] ofs=%d val=%x "
+               "size=%d\n", busno, PCI_SLOT(devfn), PCI_FUNC(devfn), where,
+               *val, size);
+#endif
+
+       return ret;
+}
+
+/* Write to Configuration Space. When entering here the PCI layer has taken
+ * the pci_lock spinlock and IRQ is off.
+ */
+static int grpci2_write_config(struct pci_bus *bus, unsigned int devfn,
+                              int where, int size, u32 val)
+{
+       struct grpci2_priv *priv = grpci2priv;
+       unsigned int busno = bus->number;
+
+       if (PCI_SLOT(devfn) > 15 || (PCI_SLOT(devfn) == 0 && busno == 0))
+               return 0;
+
+#ifdef GRPCI2_DEBUG_CFGACCESS
+       printk(KERN_INFO "grpci2_write_config: [%02x:%02x:%x] ofs=%d size=%d "
+               "val=%x\n", busno, PCI_SLOT(devfn), PCI_FUNC(devfn),
+               where, size, val);
+#endif
+
+       switch (size) {
+       default:
+               return -EINVAL;
+       case 1:
+               return grpci2_cfg_w8(priv, busno, devfn, where, val);
+       case 2:
+               return grpci2_cfg_w16(priv, busno, devfn, where, val);
+       case 4:
+               return grpci2_cfg_w32(priv, busno, devfn, where, val);
+       }
+}
+
+static struct pci_ops grpci2_ops = {
+       .read =         grpci2_read_config,
+       .write =        grpci2_write_config,
+};
+
+/* GENIRQ IRQ chip implementation for GRPCI2 irqmode=0..2. In configuration
+ * 3 where all PCI Interrupts has a separate IRQ on the system IRQ controller
+ * this is not needed and the standard IRQ controller can be used.
+ */
+
+static void grpci2_mask_irq(struct irq_data *data)
+{
+       unsigned long flags;
+       unsigned int irqidx;
+       struct grpci2_priv *priv = grpci2priv;
+
+       irqidx = (unsigned int)data->chip_data - 1;
+       if (irqidx > 3) /* only mask PCI interrupts here */
+               return;
+
+       spin_lock_irqsave(&grpci2_dev_lock, flags);
+       REGSTORE(priv->regs->ctrl, REGLOAD(priv->regs->ctrl) & ~(1 << irqidx));
+       spin_unlock_irqrestore(&grpci2_dev_lock, flags);
+}
+
+static void grpci2_unmask_irq(struct irq_data *data)
+{
+       unsigned long flags;
+       unsigned int irqidx;
+       struct grpci2_priv *priv = grpci2priv;
+
+       irqidx = (unsigned int)data->chip_data - 1;
+       if (irqidx > 3) /* only unmask PCI interrupts here */
+               return;
+
+       spin_lock_irqsave(&grpci2_dev_lock, flags);
+       REGSTORE(priv->regs->ctrl, REGLOAD(priv->regs->ctrl) | (1 << irqidx));
+       spin_unlock_irqrestore(&grpci2_dev_lock, flags);
+}
+
+static unsigned int grpci2_startup_irq(struct irq_data *data)
+{
+       grpci2_unmask_irq(data);
+       return 0;
+}
+
+static void grpci2_shutdown_irq(struct irq_data *data)
+{
+       grpci2_mask_irq(data);
+}
+
+static struct irq_chip grpci2_irq = {
+       .name           = "grpci2",
+       .irq_startup    = grpci2_startup_irq,
+       .irq_shutdown   = grpci2_shutdown_irq,
+       .irq_mask       = grpci2_mask_irq,
+       .irq_unmask     = grpci2_unmask_irq,
+};
+
+/* Handle one or multiple IRQs from the PCI core */
+static void grpci2_pci_flow_irq(unsigned int irq, struct irq_desc *desc)
+{
+       struct grpci2_priv *priv = grpci2priv;
+       int i, ack = 0;
+       unsigned int ctrl, sts_cap, pci_ints;
+
+       ctrl = REGLOAD(priv->regs->ctrl);
+       sts_cap = REGLOAD(priv->regs->sts_cap);
+
+       /* Error Interrupt? */
+       if (sts_cap & STS_ERR_IRQ) {
+               generic_handle_irq(priv->virq_err);
+               ack = 1;
+       }
+
+       /* PCI Interrupt? */
+       pci_ints = ((~sts_cap) >> STS_INTSTS_BIT) & ctrl & CTRL_HOSTINT;
+       if (pci_ints) {
+               /* Call respective PCI Interrupt handler */
+               for (i = 0; i < 4; i++) {
+                       if (pci_ints & (1 << i))
+                               generic_handle_irq(priv->irq_map[i]);
+               }
+               ack = 1;
+       }
+
+       /*
+        * Decode DMA Interrupt only when shared with Err and PCI INTX#, when
+        * the DMA is a unique IRQ the DMA interrupts doesn't end up here, they
+        * goes directly to DMA ISR.
+        */
+       if ((priv->irq_mode == 0) && (sts_cap & (STS_IDMA | STS_IDMAERR))) {
+               generic_handle_irq(priv->virq_dma);
+               ack = 1;
+       }
+
+       /*
+        * Call "first level" IRQ chip end-of-irq handler. It will ACK LEON IRQ
+        * Controller, this must be done after IRQ sources have been handled to
+        * avoid double IRQ generation
+        */
+       if (ack)
+               desc->irq_data.chip->irq_eoi(&desc->irq_data);
+}
+
+/* Create a virtual IRQ */
+static unsigned int grpci2_build_device_irq(unsigned int irq)
+{
+       unsigned int virq = 0, pil;
+
+       pil = 1 << 8;
+       virq = irq_alloc(irq, pil);
+       if (virq == 0)
+               goto out;
+
+       irq_set_chip_and_handler_name(virq, &grpci2_irq, handle_simple_irq,
+                                     "pcilvl");
+       irq_set_chip_data(virq, (void *)irq);
+
+out:
+       return virq;
+}
+
+void grpci2_hw_init(struct grpci2_priv *priv)
+{
+       u32 ahbadr, pciadr, bar_sz, capptr, io_map, data;
+       struct grpci2_regs *regs = priv->regs;
+       int i;
+       struct grpci2_barcfg *barcfg = priv->tgtbars;
+
+       /* Reset any earlier setup */
+       if (priv->do_reset) {
+               printk(KERN_INFO "GRPCI2: Resetting PCI bus\n");
+               REGSTORE(regs->ctrl, CTRL_RESET);
+               ssleep(1); /* Wait for boards to settle */
+       }
+       REGSTORE(regs->ctrl, 0);
+       REGSTORE(regs->sts_cap, ~0); /* Clear Status */
+       REGSTORE(regs->dma_ctrl, 0);
+       REGSTORE(regs->dma_bdbase, 0);
+
+       /* Translate I/O accesses to 0, I/O Space always @ PCI low 64Kbytes */
+       REGSTORE(regs->io_map, REGLOAD(regs->io_map) & 0x0000ffff);
+
+       /* set 1:1 mapping between AHB -> PCI memory space, for all Masters
+        * Each AHB master has it's own mapping registers. Max 16 AHB masters.
+        */
+       for (i = 0; i < 16; i++)
+               REGSTORE(regs->ahbmst_map[i], priv->pci_area);
+
+       /* Get the GRPCI2 Host PCI ID */
+       grpci2_cfg_r32(priv, 0, 0, PCI_VENDOR_ID, &priv->pciid);
+
+       /* Get address to first (always defined) capability structure */
+       grpci2_cfg_r8(priv, 0, 0, PCI_CAPABILITY_LIST, &capptr);
+
+       /* Enable/Disable Byte twisting */
+       grpci2_cfg_r32(priv, 0, 0, capptr+CAP9_IOMAP_OFS, &io_map);
+       io_map = (io_map & ~0x1) | (priv->bt_enabled ? 1 : 0);
+       grpci2_cfg_w32(priv, 0, 0, capptr+CAP9_IOMAP_OFS, io_map);
+
+       /* Setup the Host's PCI Target BARs for other peripherals to access,
+        * and do DMA to the host's memory. The target BARs can be sized and
+        * enabled individually.
+        *
+        * User may set custom target BARs, but default is:
+        * The first BARs is used to map kernel low (DMA is part of normal
+        * region on sparc which is SRMMU_MAXMEM big) main memory 1:1 to the
+        * PCI bus, the other BARs are disabled. We assume that the first BAR
+        * is always available.
+        */
+       for (i = 0; i < 6; i++) {
+               if (barcfg[i].pciadr != ~0 && barcfg[i].ahbadr != ~0) {
+                       /* Target BARs must have the proper alignment */
+                       ahbadr = barcfg[i].ahbadr;
+                       pciadr = barcfg[i].pciadr;
+                       bar_sz = ((pciadr - 1) & ~pciadr) + 1;
+               } else {
+                       if (i == 0) {
+                               /* Map main memory */
+                               bar_sz = 0xf0000008; /* 256MB prefetchable */
+                               ahbadr = 0xf0000000 & (u32)__pa(PAGE_ALIGN(
+                                       (unsigned long) &_end));
+                               pciadr = ahbadr;
+                       } else {
+                               bar_sz = 0;
+                               ahbadr = 0;
+                               pciadr = 0;
+                       }
+               }
+               grpci2_cfg_w32(priv, 0, 0, capptr+CAP9_BARSIZE_OFS+i*4, bar_sz);
+               grpci2_cfg_w32(priv, 0, 0, PCI_BASE_ADDRESS_0+i*4, pciadr);
+               grpci2_cfg_w32(priv, 0, 0, capptr+CAP9_BAR_OFS+i*4, ahbadr);
+               printk(KERN_INFO "        TGT BAR[%d]: 0x%08x (PCI)-> 0x%08x\n",
+                       i, pciadr, ahbadr);
+       }
+
+       /* set as bus master and enable pci memory responses */
+       grpci2_cfg_r32(priv, 0, 0, PCI_COMMAND, &data);
+       data |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
+       grpci2_cfg_w32(priv, 0, 0, PCI_COMMAND, data);
+
+       /* Enable Error respone (CPU-TRAP) on illegal memory access. */
+       REGSTORE(regs->ctrl, CTRL_ER | CTRL_PE);
+}
+
+static irqreturn_t grpci2_jump_interrupt(int irq, void *arg)
+{
+       printk(KERN_ERR "GRPCI2: Jump IRQ happened\n");
+       return IRQ_NONE;
+}
+
+/* Handle GRPCI2 Error Interrupt */
+static irqreturn_t grpci2_err_interrupt(int irq, void *arg)
+{
+       struct grpci2_priv *priv = arg;
+       struct grpci2_regs *regs = priv->regs;
+       unsigned int status;
+
+       status = REGLOAD(regs->sts_cap);
+       if ((status & STS_ERR_IRQ) == 0)
+               return IRQ_NONE;
+
+       if (status & STS_IPARERR)
+               printk(KERN_ERR "GRPCI2: Parity Error\n");
+
+       if (status & STS_ITGTABRT)
+               printk(KERN_ERR "GRPCI2: Target Abort\n");
+
+       if (status & STS_IMSTABRT)
+               printk(KERN_ERR "GRPCI2: Master Abort\n");
+
+       if (status & STS_ISYSERR)
+               printk(KERN_ERR "GRPCI2: System Error\n");
+
+       /* Clear handled INT TYPE IRQs */
+       REGSTORE(regs->sts_cap, status & STS_ERR_IRQ);
+
+       return IRQ_HANDLED;
+}
+
+static int __devinit grpci2_of_probe(struct platform_device *ofdev)
+{
+       struct grpci2_regs *regs;
+       struct grpci2_priv *priv;
+       int err, i, len;
+       const int *tmp;
+       unsigned int capability;
+
+       if (grpci2priv) {
+               printk(KERN_ERR "GRPCI2: only one GRPCI2 core supported\n");
+               return -ENODEV;
+       }
+
+       if (ofdev->num_resources < 3) {
+               printk(KERN_ERR "GRPCI2: not enough APB/AHB resources\n");
+               return -EIO;
+       }
+
+       /* Find Device Address */
+       regs = of_ioremap(&ofdev->resource[0], 0,
+                         resource_size(&ofdev->resource[0]),
+                         "grlib-grpci2 regs");
+       if (regs == NULL) {
+               printk(KERN_ERR "GRPCI2: ioremap failed\n");
+               return -EIO;
+       }
+
+       /*
+        * Check that we're in Host Slot and that we can act as a Host Bridge
+        * and not only as target.
+        */
+       capability = REGLOAD(regs->sts_cap);
+       if ((capability & STS_HOST) || !(capability & STS_MST)) {
+               printk(KERN_INFO "GRPCI2: not in host system slot\n");
+               err = -EIO;
+               goto err1;
+       }
+
+       priv = grpci2priv = kzalloc(sizeof(struct grpci2_priv), GFP_KERNEL);
+       if (grpci2priv == NULL) {
+               err = -ENOMEM;
+               goto err1;
+       }
+       memset(grpci2priv, 0, sizeof(*grpci2priv));
+       priv->regs = regs;
+       priv->irq = ofdev->archdata.irqs[0]; /* BASE IRQ */
+       priv->irq_mode = (capability & STS_IRQMODE) >> STS_IRQMODE_BIT;
+
+       printk(KERN_INFO "GRPCI2: host found at %p, irq%d\n", regs, priv->irq);
+
+       /* Byte twisting should be made configurable from kernel command line */
+       priv->bt_enabled = 1;
+
+       /* Let user do custom Target BAR assignment */
+       tmp = of_get_property(ofdev->dev.of_node, "barcfg", &len);
+       if (tmp && (len == 2*4*6))
+               memcpy(priv->tgtbars, tmp, 2*4*6);
+       else
+               memset(priv->tgtbars, -1, 2*4*6);
+
+       /* Limit IRQ unmasking in irq_mode 2 and 3 */
+       tmp = of_get_property(ofdev->dev.of_node, "irq_mask", &len);
+       if (tmp && (len == 4))
+               priv->do_reset = *tmp;
+       else
+               priv->irq_mask = 0xf;
+
+       /* Optional PCI reset. Force PCI reset on startup */
+       tmp = of_get_property(ofdev->dev.of_node, "reset", &len);
+       if (tmp && (len == 4))
+               priv->do_reset = *tmp;
+       else
+               priv->do_reset = 0;
+
+       /* Find PCI Memory, I/O and Configuration Space Windows */
+       priv->pci_area = ofdev->resource[1].start;
+       priv->pci_area_end = ofdev->resource[1].end+1;
+       priv->pci_io = ofdev->resource[2].start;
+       priv->pci_conf = ofdev->resource[2].start + 0x10000;
+       priv->pci_conf_end = priv->pci_conf + 0x10000;
+       priv->pci_io_va = (unsigned long)ioremap(priv->pci_io, 0x10000);
+       if (!priv->pci_io_va) {
+               err = -EIO;
+               goto err2;
+       }
+
+       printk(KERN_INFO
+               "GRPCI2: MEMORY SPACE [0x%08lx - 0x%08lx]\n"
+               "        I/O    SPACE [0x%08lx - 0x%08lx]\n"
+               "        CONFIG SPACE [0x%08lx - 0x%08lx]\n",
+               priv->pci_area, priv->pci_area_end-1,
+               priv->pci_io, priv->pci_conf-1,
+               priv->pci_conf, priv->pci_conf_end-1);
+
+       /*
+        * I/O Space resources in I/O Window mapped into Virtual Adr Space
+        * We never use low 4KB because some devices seem have problems using
+        * address 0.
+        */
+       memset(&priv->info.io_space, 0, sizeof(struct resource));
+       priv->info.io_space.name = "GRPCI2 PCI I/O Space";
+       priv->info.io_space.start = priv->pci_io_va + 0x1000;
+       priv->info.io_space.end = priv->pci_io_va + 0x10000 - 1;
+       priv->info.io_space.flags = IORESOURCE_IO;
+
+       /*
+        * GRPCI2 has no prefetchable memory, map everything as
+        * non-prefetchable memory
+        */
+       memset(&priv->info.mem_space, 0, sizeof(struct resource));
+       priv->info.mem_space.name = "GRPCI2 PCI MEM Space";
+       priv->info.mem_space.start = priv->pci_area;
+       priv->info.mem_space.end = priv->pci_area_end - 1;
+       priv->info.mem_space.flags = IORESOURCE_MEM;
+
+       if (request_resource(&iomem_resource, &priv->info.mem_space) < 0)
+               goto err3;
+       if (request_resource(&ioport_resource, &priv->info.io_space) < 0)
+               goto err4;
+
+       grpci2_hw_init(priv);
+
+       /*
+        * Get PCI Interrupt to System IRQ mapping and setup IRQ handling
+        * Error IRQ always on PCI INTA.
+        */
+       if (priv->irq_mode < 2) {
+               /* All PCI interrupts are shared using the same system IRQ */
+               leon_update_virq_handling(priv->irq, grpci2_pci_flow_irq,
+                                        "pcilvl", 0);
+
+               priv->irq_map[0] = grpci2_build_device_irq(1);
+               priv->irq_map[1] = grpci2_build_device_irq(2);
+               priv->irq_map[2] = grpci2_build_device_irq(3);
+               priv->irq_map[3] = grpci2_build_device_irq(4);
+
+               priv->virq_err = grpci2_build_device_irq(5);
+               if (priv->irq_mode & 1)
+                       priv->virq_dma = ofdev->archdata.irqs[1];
+               else
+                       priv->virq_dma = grpci2_build_device_irq(6);
+
+               /* Enable IRQs on LEON IRQ controller */
+               err = request_irq(priv->irq, grpci2_jump_interrupt, 0,
+                                       "GRPCI2_JUMP", priv);
+               if (err)
+                       printk(KERN_ERR "GRPCI2: ERR IRQ request failed\n");
+       } else {
+               /* All PCI interrupts have an unique IRQ interrupt */
+               for (i = 0; i < 4; i++) {
+                       /* Make LEON IRQ layer handle level IRQ by acking */
+                       leon_update_virq_handling(ofdev->archdata.irqs[i],
+                                                handle_fasteoi_irq, "pcilvl",
+                                                1);
+                       priv->irq_map[i] = ofdev->archdata.irqs[i];
+               }
+               priv->virq_err = priv->irq_map[0];
+               if (priv->irq_mode & 1)
+                       priv->virq_dma = ofdev->archdata.irqs[4];
+               else
+                       priv->virq_dma = priv->irq_map[0];
+
+               /* Unmask all PCI interrupts, request_irq will not do that */
+               REGSTORE(regs->ctrl, REGLOAD(regs->ctrl)|(priv->irq_mask&0xf));
+       }
+
+       /* Setup IRQ handler for non-configuration space access errors */
+       err = request_irq(priv->virq_err, grpci2_err_interrupt, IRQF_SHARED,
+                               "GRPCI2_ERR", priv);
+       if (err) {
+               printk(KERN_DEBUG "GRPCI2: ERR VIRQ request failed: %d\n", err);
+               goto err5;
+       }
+
+       /*
+        * Enable Error Interrupts. PCI interrupts are unmasked once request_irq
+        * is called by the PCI Device drivers
+        */
+       REGSTORE(regs->ctrl, REGLOAD(regs->ctrl) | CTRL_EI | CTRL_SI);
+
+       /* Init common layer and scan buses */
+       priv->info.ops = &grpci2_ops;
+       priv->info.map_irq = grpci2_map_irq;
+       leon_pci_init(ofdev, &priv->info);
+
+       return 0;
+
+err5:
+       release_resource(&priv->info.io_space);
+err4:
+       release_resource(&priv->info.mem_space);
+err3:
+       err = -ENOMEM;
+       iounmap((void *)priv->pci_io_va);
+err2:
+       kfree(priv);
+err1:
+       of_iounmap(&ofdev->resource[0], regs,
+               resource_size(&ofdev->resource[0]));
+       return err;
+}
+
+static struct of_device_id grpci2_of_match[] = {
+       {
+        .name = "GAISLER_GRPCI2",
+        },
+       {
+        .name = "01_07c",
+        },
+       {},
+};
+
+static struct platform_driver grpci2_of_driver = {
+       .driver = {
+               .name = "grpci2",
+               .owner = THIS_MODULE,
+               .of_match_table = grpci2_of_match,
+       },
+       .probe = grpci2_of_probe,
+};
+
+static int __init grpci2_init(void)
+{
+       return platform_driver_register(&grpci2_of_driver);
+}
+
+subsys_initcall(grpci2_init);
index 8d348c4..99ba5ba 100644 (file)
@@ -214,7 +214,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
                               me->name,
                               (int) (ELF_R_TYPE(rel[i].r_info) & 0xff));
                        return -ENOEXEC;
-               };
+               }
        }
        return 0;
 }
index 6e3874b..a689598 100644 (file)
@@ -281,7 +281,7 @@ static int sun4v_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
        case 4:
                *value = ret & 0xffffffff;
                break;
-       };
+       }
 
 
        return PCIBIOS_SUCCESSFUL;
@@ -456,7 +456,7 @@ void pci_determine_mem_io_space(struct pci_pbm_info *pbm)
 
                default:
                        break;
-               };
+               }
        }
 
        if (!saw_io || !saw_mem) {
index 283fbc3..f030b02 100644 (file)
@@ -264,7 +264,7 @@ static void schizo_check_iommu_error_pbm(struct pci_pbm_info *pbm,
                default:
                        type_string = "ECC Error";
                        break;
-               };
+               }
                printk("%s: IOMMU Error, type[%s]\n",
                       pbm->name, type_string);
 
@@ -319,7 +319,7 @@ static void schizo_check_iommu_error_pbm(struct pci_pbm_info *pbm,
                        default:
                                type_string = "ECC Error";
                                break;
-                       };
+                       }
                        printk("%s: IOMMU TAG(%d)[error(%s) ctx(%x) wr(%d) str(%d) "
                               "sz(%dK) vpg(%08lx)]\n",
                               pbm->name, i, type_string,
@@ -1328,7 +1328,7 @@ static int __devinit schizo_pbm_init(struct pci_pbm_info *pbm,
        default:
                chipset_name = "SCHIZO";
                break;
-       };
+       }
 
        /* For SCHIZO, three OBP regs:
         * 1) PBM controller regs
index 570b98f..40e4936 100644 (file)
@@ -694,7 +694,7 @@ static unsigned int sbus_of_build_irq(struct device_node *dp,
                case 3:
                        iclr = reg_base + SYSIO_ICLR_SLOT3;
                        break;
-               };
+               }
 
                iclr += ((unsigned long)sbus_level - 1UL) * 8UL;
        }
index fe2af66..8db48e8 100644 (file)
@@ -228,7 +228,7 @@ void psycho_check_iommu_error(struct pci_pbm_info *pbm,
                default:
                        type_str = "ECC Error";
                        break;
-               };
+               }
                printk(KERN_ERR "%s: IOMMU Error, type[%s]\n",
                       pbm->name, type_str);
 
index 2ca32d1..a161b9c 100644 (file)
@@ -97,7 +97,7 @@ void sbus_set_sbus64(struct device *dev, int bursts)
 
        default:
                return;
-       };
+       }
 
        val = upa_readq(cfg_reg);
        if (val & (1UL << 14UL)) {
@@ -244,7 +244,7 @@ static unsigned int sbus_build_irq(struct platform_device *op, unsigned int ino)
                case 3:
                        iclr = reg_base + SYSIO_ICLR_SLOT3;
                        break;
-               };
+               }
 
                iclr += ((unsigned long)sbus_level - 1UL) * 8UL;
        }
index 3249d3f..d26e1f6 100644 (file)
@@ -267,7 +267,7 @@ void __init setup_arch(char **cmdline_p)
        default:
                printk("UNKNOWN!\n");
                break;
-       };
+       }
 
 #ifdef CONFIG_DUMMY_CONSOLE
        conswitchp = &dummy_con;
index f3b6850..c4dd099 100644 (file)
@@ -209,7 +209,7 @@ void __init per_cpu_patch(void)
                default:
                        prom_printf("Unknown cpu type, halting.\n");
                        prom_halt();
-               };
+               }
 
                *(unsigned int *) (addr +  0) = insns[0];
                wmb();
index d5b3958..21b1253 100644 (file)
@@ -114,7 +114,7 @@ void __init smp_cpus_done(unsigned int max_cpus)
                printk("UNKNOWN!\n");
                BUG();
                break;
-       };
+       }
 }
 
 void cpu_panic(void)
@@ -374,7 +374,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
                printk("UNKNOWN!\n");
                BUG();
                break;
-       };
+       }
 }
 
 /* Set this up early so that things like the scheduler can init
@@ -447,7 +447,7 @@ int __cpuinit __cpu_up(unsigned int cpu)
                printk("UNKNOWN!\n");
                BUG();
                break;
-       };
+       }
 
        if (!ret) {
                cpumask_set_cpu(cpu, &smp_commenced_mask);
index a9ea60e..1d13c5b 100644 (file)
@@ -103,10 +103,9 @@ static void sun4d_sbus_handler_irq(int sbusl)
 
        sbil = (sbusl << 2);
        /* Loop for each pending SBI */
-       for (sbino = 0; bus_mask; sbino++) {
+       for (sbino = 0; bus_mask; sbino++, bus_mask >>= 1) {
                unsigned int idx, mask;
 
-               bus_mask >>= 1;
                if (!(bus_mask & 1))
                        continue;
                /* XXX This seems to ACK the irq twice.  acquire_sbi()
@@ -118,19 +117,16 @@ static void sun4d_sbus_handler_irq(int sbusl)
                mask &= (0xf << sbil);
 
                /* Loop for each pending SBI slot */
-               idx = 0;
                slot = (1 << sbil);
-               while (mask != 0) {
+               for (idx = 0; mask != 0; idx++, slot <<= 1) {
                        unsigned int pil;
                        struct irq_bucket *p;
 
-                       idx++;
-                       slot <<= 1;
                        if (!(mask & slot))
                                continue;
 
                        mask &= ~slot;
-                       pil = sun4d_encode_irq(sbino, sbil, idx);
+                       pil = sun4d_encode_irq(sbino, sbusl, idx);
 
                        p = irq_map[pil];
                        while (p) {
@@ -218,10 +214,10 @@ static void sun4d_unmask_irq(struct irq_data *data)
 
 #ifdef CONFIG_SMP
        spin_lock_irqsave(&sun4d_imsk_lock, flags);
-       cc_set_imsk_other(cpuid, cc_get_imsk_other(cpuid) | ~(1 << real_irq));
+       cc_set_imsk_other(cpuid, cc_get_imsk_other(cpuid) & ~(1 << real_irq));
        spin_unlock_irqrestore(&sun4d_imsk_lock, flags);
 #else
-       cc_set_imsk(cc_get_imsk() | ~(1 << real_irq));
+       cc_set_imsk(cc_get_imsk() & ~(1 << real_irq));
 #endif
 }
 
@@ -299,26 +295,68 @@ static void __init sun4d_load_profile_irqs(void)
        }
 }
 
+unsigned int _sun4d_build_device_irq(unsigned int real_irq,
+                                     unsigned int pil,
+                                     unsigned int board)
+{
+       struct sun4d_handler_data *handler_data;
+       unsigned int irq;
+
+       irq = irq_alloc(real_irq, pil);
+       if (irq == 0) {
+               prom_printf("IRQ: allocate for %d %d %d failed\n",
+                       real_irq, pil, board);
+               goto err_out;
+       }
+
+       handler_data = irq_get_handler_data(irq);
+       if (unlikely(handler_data))
+               goto err_out;
+
+       handler_data = kzalloc(sizeof(struct sun4d_handler_data), GFP_ATOMIC);
+       if (unlikely(!handler_data)) {
+               prom_printf("IRQ: kzalloc(sun4d_handler_data) failed.\n");
+               prom_halt();
+       }
+       handler_data->cpuid    = board_to_cpu[board];
+       handler_data->real_irq = real_irq;
+       irq_set_chip_and_handler_name(irq, &sun4d_irq,
+                                     handle_level_irq, "level");
+       irq_set_handler_data(irq, handler_data);
+
+err_out:
+       return irq;
+}
+
+
+
 unsigned int sun4d_build_device_irq(struct platform_device *op,
                                     unsigned int real_irq)
 {
        struct device_node *dp = op->dev.of_node;
-       struct device_node *io_unit, *sbi = dp->parent;
+       struct device_node *board_parent, *bus = dp->parent;
+       char *bus_connection;
        const struct linux_prom_registers *regs;
-       struct sun4d_handler_data *handler_data;
        unsigned int pil;
        unsigned int irq;
        int board, slot;
        int sbusl;
 
-       irq = 0;
-       while (sbi) {
-               if (!strcmp(sbi->name, "sbi"))
+       irq = real_irq;
+       while (bus) {
+               if (!strcmp(bus->name, "sbi")) {
+                       bus_connection = "io-unit";
+                       break;
+               }
+
+               if (!strcmp(bus->name, "bootbus")) {
+                       bus_connection = "cpu-unit";
                        break;
+               }
 
-               sbi = sbi->parent;
+               bus = bus->parent;
        }
-       if (!sbi)
+       if (!bus)
                goto err_out;
 
        regs = of_get_property(dp, "reg", NULL);
@@ -328,17 +366,19 @@ unsigned int sun4d_build_device_irq(struct platform_device *op,
        slot = regs->which_io;
 
        /*
-        *  If SBI's parent is not io-unit or the io-unit lacks
-        * a "board#" property, something is very wrong.
+        * If Bus nodes parent is not io-unit/cpu-unit or the io-unit/cpu-unit
+        * lacks a "board#" property, something is very wrong.
         */
-       if (!sbi->parent || strcmp(sbi->parent->name, "io-unit")) {
-               printk("%s: Error, parent is not io-unit.\n", sbi->full_name);
+       if (!bus->parent || strcmp(bus->parent->name, bus_connection)) {
+               printk(KERN_ERR "%s: Error, parent is not %s.\n",
+                       bus->full_name, bus_connection);
                goto err_out;
        }
-       io_unit = sbi->parent;
-       board = of_getintprop_default(io_unit, "board#", -1);
+       board_parent = bus->parent;
+       board = of_getintprop_default(board_parent, "board#", -1);
        if (board == -1) {
-               printk("%s: Error, lacks board# property.\n", io_unit->full_name);
+               printk(KERN_ERR "%s: Error, lacks board# property.\n",
+                       board_parent->full_name);
                goto err_out;
        }
 
@@ -348,29 +388,17 @@ unsigned int sun4d_build_device_irq(struct platform_device *op,
        else
                pil = real_irq;
 
-       irq = irq_alloc(real_irq, pil);
-       if (irq == 0)
-               goto err_out;
-
-       handler_data = irq_get_handler_data(irq);
-       if (unlikely(handler_data))
-               goto err_out;
-
-       handler_data = kzalloc(sizeof(struct sun4d_handler_data), GFP_ATOMIC);
-       if (unlikely(!handler_data)) {
-               prom_printf("IRQ: kzalloc(sun4d_handler_data) failed.\n");
-               prom_halt();
-       }
-       handler_data->cpuid    = board_to_cpu[board];
-       handler_data->real_irq = real_irq;
-       irq_set_chip_and_handler_name(irq, &sun4d_irq,
-                                     handle_level_irq, "level");
-       irq_set_handler_data(irq, handler_data);
-
+       irq = _sun4d_build_device_irq(real_irq, pil, board);
 err_out:
-       return real_irq;
+       return irq;
 }
 
+unsigned int sun4d_build_timer_irq(unsigned int board, unsigned int real_irq)
+{
+       return _sun4d_build_device_irq(real_irq, real_irq, board);
+}
+
+
 static void __init sun4d_fixup_trap_table(void)
 {
 #ifdef CONFIG_SMP
@@ -402,6 +430,7 @@ static void __init sun4d_init_timers(irq_handler_t counter_fn)
        unsigned int irq;
        const u32 *reg;
        int err;
+       int board;
 
        dp = of_find_node_by_name(NULL, "cpu-unit");
        if (!dp) {
@@ -414,12 +443,19 @@ static void __init sun4d_init_timers(irq_handler_t counter_fn)
         * bootbus.
         */
        reg = of_get_property(dp, "reg", NULL);
-       of_node_put(dp);
        if (!reg) {
                prom_printf("sun4d_init_timers: No reg property\n");
                prom_halt();
        }
 
+       board = of_getintprop_default(dp, "board#", -1);
+       if (board == -1) {
+               prom_printf("sun4d_init_timers: No board# property on cpu-unit\n");
+               prom_halt();
+       }
+
+       of_node_put(dp);
+
        res.start = reg[1];
        res.end = reg[2] - 1;
        res.flags = reg[0] & 0xff;
@@ -434,7 +470,7 @@ static void __init sun4d_init_timers(irq_handler_t counter_fn)
 
        master_l10_counter = &sun4d_timers->l10_cur_count;
 
-       irq = sun4d_build_device_irq(NULL, SUN4D_TIMER_IRQ);
+       irq = sun4d_build_timer_irq(board, SUN4D_TIMER_IRQ);
        err = request_irq(irq, counter_fn, IRQF_TIMER, "timer", NULL);
        if (err) {
                prom_printf("sun4d_init_timers: request_irq() failed with %d\n",
index 6db18c6..170cd8e 100644 (file)
@@ -109,7 +109,7 @@ asmlinkage long compat_sys_ipc(u32 call, u32 first, u32 second, u32 third, compa
 
        default:
                return -ENOSYS;
-       };
+       }
 
        return -ENOSYS;
 }
index 96082d3..908b47a 100644 (file)
@@ -460,7 +460,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second
                default:
                        err = -ENOSYS;
                        goto out;
-               };
+               }
        }
        if (call <= MSGCTL) {
                switch (call) {
@@ -481,7 +481,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second
                default:
                        err = -ENOSYS;
                        goto out;
-               };
+               }
        }
        if (call <= SHMCTL) {
                switch (call) {
@@ -507,7 +507,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second
                default:
                        err = -ENOSYS;
                        goto out;
-               };
+               }
        } else {
                err = -ENOSYS;
        }
index 2b8d54b..1db6b18 100644 (file)
@@ -708,7 +708,7 @@ static void sparc64_timer_setup(enum clock_event_mode mode,
        case CLOCK_EVT_MODE_UNUSED:
                WARN_ON(1);
                break;
-       };
+       }
 }
 
 static struct clock_event_device sparc64_clockevent = {
index 1ed547b..0cbdaa4 100644 (file)
@@ -1804,7 +1804,7 @@ static const char *sun4v_err_type_to_str(u32 type)
                return "warning resumable";
        default:
                return "unknown";
-       };
+       }
 }
 
 static void sun4v_log_error(struct pt_regs *regs, struct sun4v_error_entry *ent, int cpu, const char *pfx, atomic_t *ocnt)
index c752c4c..b2b019e 100644 (file)
@@ -211,7 +211,7 @@ static inline int do_int_store(int reg_num, int size, unsigned long *dst_addr,
                default:
                        BUG();
                        break;
-               };
+               }
        }
        return __do_int_store(dst_addr, size, src_val, asi);
 }
@@ -328,7 +328,7 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn)
                case ASI_SNFL:
                        asi &= ~0x08;
                        break;
-               };
+               }
                switch (dir) {
                case load:
                        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)
                                default:
                                        BUG();
                                        break;
-                               };
+                               }
                                *reg_addr = val_in;
                        }
                        break;
index 531d54f..489fc15 100644 (file)
@@ -176,7 +176,7 @@ static unsigned long index_to_estar_mode(unsigned int index)
 
        default:
                BUG();
-       };
+       }
 }
 
 static unsigned long index_to_divisor(unsigned int index)
@@ -199,7 +199,7 @@ static unsigned long index_to_divisor(unsigned int index)
 
        default:
                BUG();
-       };
+       }
 }
 
 static unsigned long estar_to_divisor(unsigned long estar)
@@ -224,7 +224,7 @@ static unsigned long estar_to_divisor(unsigned long estar)
                break;
        default:
                BUG();
-       };
+       }
 
        return ret;
 }
index 9a8ceb7..eb1624b 100644 (file)
@@ -71,7 +71,7 @@ static unsigned long get_current_freq(unsigned int cpu, unsigned long safari_cfg
                break;
        default:
                BUG();
-       };
+       }
 
        return ret;
 }
@@ -125,7 +125,7 @@ static void us3_set_cpu_divider_index(unsigned int cpu, unsigned int index)
 
        default:
                BUG();
-       };
+       }
 
        reg = read_safari_cfg();
 
index aa6ac70..29348ea 100644 (file)
@@ -363,7 +363,7 @@ static int process_ver(struct vio_driver_state *vio, struct vio_ver_info *pkt)
 
        default:
                return handshake_failure(vio);
-       };
+       }
 }
 
 static int process_attr(struct vio_driver_state *vio, void *pkt)
index 9dfd2eb..3635771 100644 (file)
@@ -334,7 +334,7 @@ static void edge(struct pt_regs *regs, unsigned int insn, unsigned int opf)
                left = edge32_tab_l[(rs1 >> 2) & 0x1].left;
                right = edge32_tab_l[(rs2 >> 2) & 0x1].right;
                break;
-       };
+       }
 
        if ((rs1 & ~0x7UL) == (rs2 & ~0x7UL))
                rd_val = right & left;
@@ -360,7 +360,7 @@ static void edge(struct pt_regs *regs, unsigned int insn, unsigned int opf)
                tstate = regs->tstate & ~(TSTATE_XCC | TSTATE_ICC);
                regs->tstate = tstate | (ccr << 32UL);
        }
-       };
+       }
 }
 
 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)
 
        case ARRAY32_OPF:
                rd_val <<= 2;
-       };
+       }
 
        store_reg(regs, rd_val, RD(insn));
 }
@@ -577,7 +577,7 @@ static void pformat(struct pt_regs *regs, unsigned int insn, unsigned int opf)
                *fpd_regaddr(f, RD(insn)) = rd_val;
                break;
        }
-       };
+       }
 }
 
 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)
                *fpd_regaddr(f, RD(insn)) = rd_val;
                break;
        }
-       };
+       }
 }
 
 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)
                                rd_val |= 1 << i;
                }
                break;
-       };
+       }
 
        maybe_flush_windows(0, 0, RD(insn), 0);
        store_reg(regs, rd_val, RD(insn));
@@ -885,7 +885,7 @@ int vis_emul(struct pt_regs *regs, unsigned int insn)
        case BSHUFFLE_OPF:
                bshuffle(regs, insn);
                break;
-       };
+       }
 
        regs->tpc = regs->tnpc;
        regs->tnpc += 4;
index b10ac4d..7543ddb 100644 (file)
@@ -135,7 +135,7 @@ asmlinkage int lookup_fault(unsigned long pc, unsigned long ret_pc,
 
        default:
                break;
-       };
+       }
 
        memset(&regs, 0, sizeof (regs));
        regs.pc = pc;
index ca21732..7b00de6 100644 (file)
@@ -340,7 +340,7 @@ void __init paging_init(void)
                prom_printf("paging_init: sparc_cpu_model = %d\n", sparc_cpu_model);
                prom_printf("paging_init: Halting...\n");
                prom_halt();
-       };
+       }
 
        /* Initialize the protection map with non-constant, MMU dependent values. */
        protection_map[0] = PAGE_NONE;
index e10cd03..3fd8e18 100644 (file)
@@ -1625,7 +1625,7 @@ static void __init sun4v_ktsb_init(void)
                ktsb_descr[0].pgsz_idx = HV_PGSZ_IDX_4MB;
                ktsb_descr[0].pgsz_mask = HV_PGSZ_MASK_4MB;
                break;
-       };
+       }
 
        ktsb_descr[0].assoc = 1;
        ktsb_descr[0].num_ttes = KERNEL_TSB_NENTRIES;
@@ -2266,7 +2266,7 @@ unsigned long pte_sz_bits(unsigned long sz)
                        return _PAGE_SZ512K_4V;
                case 4 * 1024 * 1024:
                        return _PAGE_SZ4MB_4V;
-               };
+               }
        } else {
                switch (sz) {
                case 8 * 1024:
@@ -2278,7 +2278,7 @@ unsigned long pte_sz_bits(unsigned long sz)
                        return _PAGE_SZ512K_4U;
                case 4 * 1024 * 1024:
                        return _PAGE_SZ4MB_4U;
-               };
+               }
        }
 }
 
index fe09fd8..cbef74e 100644 (file)
@@ -1665,7 +1665,7 @@ static void __init init_swift(void)
        default:
                srmmu_modtype = Swift_ok;
                break;
-       };
+       }
 
        BTFIXUPSET_CALL(flush_cache_all, swift_flush_cache_all, BTFIXUPCALL_NORM);
        BTFIXUPSET_CALL(flush_cache_mm, swift_flush_cache_mm, BTFIXUPCALL_NORM);
@@ -2069,7 +2069,7 @@ static void __init get_srmmu_type(void)
                        /* Some other Cypress revision, assume a 605. */
                        init_cypress_605(mod_rev);
                        break;
-               };
+               }
                return;
        }
        
index a2350b5..1cf4f19 100644 (file)
@@ -318,7 +318,7 @@ void __init sun4c_probe_vac(void)
                prom_printf("probe_vac: Didn't expect vac-linesize of %d, halting\n",
                            sun4c_vacinfo.linesize);
                prom_halt();
-       };
+       }
 
        sun4c_flush_all();
        sun4c_enable_vac();
@@ -364,7 +364,7 @@ static void __init patch_kernel_fault_handler(void)
                        prom_printf("Unhandled number of segmaps: %d\n",
                                    num_segmaps);
                        prom_halt();
-       };
+       }
        switch (num_contexts) {
                case 8:
                        /* Default, nothing to do. */
@@ -377,7 +377,7 @@ static void __init patch_kernel_fault_handler(void)
                        prom_printf("Unhandled number of contexts: %d\n",
                                    num_contexts);
                        prom_halt();
-       };
+       }
 
        if (sun4c_vacinfo.do_hwflushes != 0) {
                PATCH_INSN(vac_hwflush_patch1_on, vac_hwflush_patch1);
@@ -394,7 +394,7 @@ static void __init patch_kernel_fault_handler(void)
                        prom_printf("Impossible VAC linesize %d, halting...\n",
                                    sun4c_vacinfo.linesize);
                        prom_halt();
-               };
+               }
        }
 }
 
index 9484615..a5f51b2 100644 (file)
@@ -180,7 +180,7 @@ static void setup_tsb_params(struct mm_struct *mm, unsigned long tsb_idx, unsign
                printk(KERN_ERR "TSB[%s:%d]: Impossible TSB size %lu, killing process.\n",
                       current->comm, current->pid, tsb_bytes);
                do_exit(SIGSEGV);
-       };
+       }
        tte |= pte_sz_bits(page_sz);
 
        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
 #endif
                default:
                        BUG();
-               };
+               }
                hp->assoc = 1;
                hp->num_ttes = tsb_bytes / 16;
                hp->ctx_idx = 0;
@@ -230,7 +230,7 @@ static void setup_tsb_params(struct mm_struct *mm, unsigned long tsb_idx, unsign
 #endif
                default:
                        BUG();
-               };
+               }
                hp->tsb_base = tsb_paddr;
                hp->resv = 0;
        }
index b05e3db..a00f47b 100644 (file)
@@ -38,7 +38,7 @@ static int prom_nbputchar(const char *buf)
                break;
        default:
                break;
-       };
+       }
        restore_current();
        spin_unlock_irqrestore(&prom_lock, flags);
        return i; /* Ugh, we could spin forever on unsupported proms ;( */
index 0a601b3..26c64ce 100644 (file)
@@ -53,7 +53,7 @@ void __init prom_init(struct linux_romvec *rp)
                            romvec->pv_romvers);
                prom_halt();
                break;
-       };
+       }
 
        prom_rev = romvec->pv_plugin_revision;
        prom_prev = romvec->pv_printrev;
index 97c44c9..0da8256 100644 (file)
@@ -35,7 +35,7 @@ prom_startcpu(int cpunode, struct linux_prom_registers *ctable_reg, int ctx, cha
        case PROM_V3:
                ret = (*(romvec->v3_cpustart))(cpunode, (int) ctable_reg, ctx, pc);
                break;
-       };
+       }
        restore_current();
        spin_unlock_irqrestore(&prom_lock, flags);
 
index d3a3032..e57dcce 100644 (file)
@@ -231,10 +231,6 @@ config PUV3_PWM
        help
          Enable support for NB0916 PWM controllers
 
-config PUV3_RTC
-       tristate "PKUnity v3 RTC Support"
-       depends on !ARCH_FPGA
-
 if PUV3_NB0916
 
 menu "PKUnity NetBook-0916 Features"
index 76a8bee..6af4bc4 100644 (file)
@@ -40,42 +40,10 @@ core-y                      += arch/unicore32/mm/
 
 libs-y                 += arch/unicore32/lib/
 
-ASM_GENERATED_DIR      := $(srctree)/arch/unicore32/include/generated
-LINUXINCLUDE           += -I$(ASM_GENERATED_DIR)
-
-ASM_GENERIC_HEADERS    := atomic.h auxvec.h
-ASM_GENERIC_HEADERS    += bitsperlong.h bug.h bugs.h
-ASM_GENERIC_HEADERS    += cputime.h current.h
-ASM_GENERIC_HEADERS    += device.h div64.h
-ASM_GENERIC_HEADERS    += emergency-restart.h errno.h
-ASM_GENERIC_HEADERS    += fb.h fcntl.h ftrace.h futex.h
-ASM_GENERIC_HEADERS    += hardirq.h hw_irq.h
-ASM_GENERIC_HEADERS    += ioctl.h ioctls.h ipcbuf.h irq_regs.h
-ASM_GENERIC_HEADERS    += kdebug.h kmap_types.h
-ASM_GENERIC_HEADERS    += local.h
-ASM_GENERIC_HEADERS    += mman.h module.h msgbuf.h
-ASM_GENERIC_HEADERS    += param.h parport.h percpu.h poll.h posix_types.h
-ASM_GENERIC_HEADERS    += resource.h
-ASM_GENERIC_HEADERS    += scatterlist.h sections.h segment.h sembuf.h serial.h
-ASM_GENERIC_HEADERS    += setup.h shmbuf.h shmparam.h
-ASM_GENERIC_HEADERS    += siginfo.h signal.h sizes.h
-ASM_GENERIC_HEADERS    += socket.h sockios.h stat.h statfs.h swab.h syscalls.h
-ASM_GENERIC_HEADERS    += termbits.h termios.h topology.h types.h
-ASM_GENERIC_HEADERS    += ucontext.h unaligned.h user.h
-ASM_GENERIC_HEADERS    += vga.h
-ASM_GENERIC_HEADERS    += xor.h
-
-archprepare:
-ifneq ($(ASM_GENERATED_DIR), $(wildcard $(ASM_GENERATED_DIR)))
-       $(Q)mkdir -p $(ASM_GENERATED_DIR)/asm
-       $(Q)$(foreach a, $(ASM_GENERIC_HEADERS),        \
-               echo '#include <asm-generic/$a>'        \
-                       > $(ASM_GENERATED_DIR)/asm/$a; )
-endif
-
 boot                   := arch/unicore32/boot
 
-# Default target when executing plain make
+# Default defconfig and target when executing plain make
+KBUILD_DEFCONFIG       := $(ARCH)_defconfig
 KBUILD_IMAGE           := zImage
 
 all:   $(KBUILD_IMAGE)
@@ -83,8 +51,6 @@ all:  $(KBUILD_IMAGE)
 zImage Image uImage: vmlinux
        $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
 
-MRPROPER_DIRS          += $(ASM_GENERATED_DIR)
-
 archclean:
        $(Q)$(MAKE) $(clean)=$(boot)
 
index 9537342..b0954a2 100644 (file)
@@ -59,7 +59,7 @@ $(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/head.o $(obj)/piggy.o \
 # We now have a PIC decompressor implementation.  Decompressors running
 # from RAM should not define ZTEXTADDR.  Decompressors running directly
 # from ROM or Flash must define ZTEXTADDR (preferably via the config)
-ZTEXTADDR      := 0
+ZTEXTADDR      := 0x03000000
 ZBSSADDR       := ALIGN(4)
 
 SEDFLAGS_lds   = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
similarity index 97%
rename from arch/unicore32/configs/debug_defconfig
rename to arch/unicore32/configs/unicore32_defconfig
index b5fbde9..c9dd319 100644 (file)
@@ -1,6 +1,6 @@
 ### General setup
 CONFIG_EXPERIMENTAL=y
-CONFIG_LOCALVERSION="-debug"
+CONFIG_LOCALVERSION="-unicore32"
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
@@ -64,7 +64,6 @@ CONFIG_I2C_BATTERY_BQ27200=n
 CONFIG_I2C_EEPROM_AT24=n
 CONFIG_LCD_BACKLIGHT=n
 
-CONFIG_PUV3_RTC=y
 CONFIG_PUV3_UMAL=y
 CONFIG_PUV3_MUSB=n
 CONFIG_PUV3_AC97=n
@@ -167,8 +166,9 @@ CONFIG_LEDS_TRIGGER_IDE_DISK=y
 CONFIG_LEDS_TRIGGER_HEARTBEAT=y
 
 #      Real Time Clock
-CONFIG_RTC_LIB=m
-CONFIG_RTC_CLASS=m
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_PUV3=y
 
 ### File systems
 CONFIG_EXT2_FS=m
index b200fda..ca113d6 100644 (file)
@@ -1,2 +1,61 @@
 include include/asm-generic/Kbuild.asm
 
+generic-y += atomic.h
+generic-y += auxvec.h
+generic-y += bitsperlong.h
+generic-y += bug.h
+generic-y += bugs.h
+generic-y += cputime.h
+generic-y += current.h
+generic-y += device.h
+generic-y += div64.h
+generic-y += emergency-restart.h
+generic-y += errno.h
+generic-y += fb.h
+generic-y += fcntl.h
+generic-y += ftrace.h
+generic-y += futex.h
+generic-y += hardirq.h
+generic-y += hw_irq.h
+generic-y += ioctl.h
+generic-y += ioctls.h
+generic-y += ipcbuf.h
+generic-y += irq_regs.h
+generic-y += kdebug.h
+generic-y += kmap_types.h
+generic-y += local.h
+generic-y += mman.h
+generic-y += module.h
+generic-y += msgbuf.h
+generic-y += param.h
+generic-y += parport.h
+generic-y += percpu.h
+generic-y += poll.h
+generic-y += posix_types.h
+generic-y += resource.h
+generic-y += scatterlist.h
+generic-y += sections.h
+generic-y += segment.h
+generic-y += sembuf.h
+generic-y += serial.h
+generic-y += setup.h
+generic-y += shmbuf.h
+generic-y += shmparam.h
+generic-y += siginfo.h
+generic-y += signal.h
+generic-y += sizes.h
+generic-y += socket.h
+generic-y += sockios.h
+generic-y += stat.h
+generic-y += statfs.h
+generic-y += swab.h
+generic-y += syscalls.h
+generic-y += termbits.h
+generic-y += termios.h
+generic-y += topology.h
+generic-y += types.h
+generic-y += ucontext.h
+generic-y += unaligned.h
+generic-y += user.h
+generic-y += vga.h
+generic-y += xor.h
index ec23a2f..aeb0f18 100644 (file)
@@ -16,7 +16,6 @@ obj-$(CONFIG_UNICORE_FPU_F64) += fpu-ucf64.o
 obj-$(CONFIG_ARCH_PUV3)                += clock.o irq.o time.o
 
 obj-$(CONFIG_PUV3_GPIO)                += gpio.o
-obj-$(CONFIG_PUV3_RTC)         += rtc.o
 obj-$(CONFIG_PUV3_PWM)         += pwm.o
 obj-$(CONFIG_PUV3_PM)          += pm.o sleep.o
 obj-$(CONFIG_HIBERNATION)      += hibernate.o hibernate_asm.o
index 9bf7f7a..77e407e 100644 (file)
@@ -30,7 +30,7 @@ SECTIONS
        HEAD_TEXT_SECTION
        INIT_TEXT_SECTION(PAGE_SIZE)
        INIT_DATA_SECTION(16)
-       PERCPU(L1_CACHE_BYTES, PAGE_SIZE)
+       PERCPU_SECTION(L1_CACHE_BYTES)
        __init_end = .;
 
        _stext = .;
index 8d12878..a3d0dc5 100644 (file)
@@ -245,7 +245,6 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
 {
        set_user_gs(regs, 0);
        regs->fs                = 0;
-       set_fs(USER_DS);
        regs->ds                = __USER_DS;
        regs->es                = __USER_DS;
        regs->ss                = __USER_DS;
index 6c9dd92..ca6f7ab 100644 (file)
@@ -338,7 +338,6 @@ start_thread_common(struct pt_regs *regs, unsigned long new_ip,
        regs->cs                = _cs;
        regs->ss                = _ss;
        regs->flags             = X86_EFLAGS_IF;
-       set_fs(USER_DS);
        /*
         * Free the old FP and other extended state
         */
index 8bff7e7..1b2b73f 100644 (file)
@@ -189,10 +189,10 @@ struct multicall_space __xen_mc_entry(size_t args)
        unsigned argidx = roundup(b->argidx, sizeof(u64));
 
        BUG_ON(preemptible());
-       BUG_ON(b->argidx > MC_ARGS);
+       BUG_ON(b->argidx >= MC_ARGS);
 
        if (b->mcidx == MC_BATCH ||
-           (argidx + args) > MC_ARGS) {
+           (argidx + args) >= MC_ARGS) {
                mc_stats_flush(b->mcidx == MC_BATCH ? FL_SLOTS : FL_ARGS);
                xen_mc_flush();
                argidx = roundup(b->argidx, sizeof(u64));
@@ -206,7 +206,7 @@ struct multicall_space __xen_mc_entry(size_t args)
        ret.args = &b->args[argidx];
        b->argidx = argidx + args;
 
-       BUG_ON(b->argidx > MC_ARGS);
+       BUG_ON(b->argidx >= MC_ARGS);
        return ret;
 }
 
@@ -216,7 +216,7 @@ struct multicall_space xen_mc_extend_args(unsigned long op, size_t size)
        struct multicall_space ret = { NULL, NULL };
 
        BUG_ON(preemptible());
-       BUG_ON(b->argidx > MC_ARGS);
+       BUG_ON(b->argidx >= MC_ARGS);
 
        if (b->mcidx == 0)
                return ret;
@@ -224,14 +224,14 @@ struct multicall_space xen_mc_extend_args(unsigned long op, size_t size)
        if (b->entries[b->mcidx - 1].op != op)
                return ret;
 
-       if ((b->argidx + size) > MC_ARGS)
+       if ((b->argidx + size) >= MC_ARGS)
                return ret;
 
        ret.mc = &b->entries[b->mcidx - 1];
        ret.args = &b->args[b->argidx];
        b->argidx += size;
 
-       BUG_ON(b->argidx > MC_ARGS);
+       BUG_ON(b->argidx >= MC_ARGS);
        return ret;
 }
 
index dfb6e9d..7f099d6 100644 (file)
@@ -2802,10 +2802,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
        }
 
        /*
-        * Some controllers can't be frozen very well and may set
-        * spuruious error conditions during reset.  Clear accumulated
-        * error information.  As reset is the final recovery action,
-        * nothing is lost by doing this.
+        * Some controllers can't be frozen very well and may set spurious
+        * error conditions during reset.  Clear accumulated error
+        * information and re-thaw the port if frozen.  As reset is the
+        * final recovery action and we cross check link onlineness against
+        * device classification later, no hotplug event is lost by this.
         */
        spin_lock_irqsave(link->ap->lock, flags);
        memset(&link->eh_info, 0, sizeof(link->eh_info));
@@ -2814,6 +2815,9 @@ int ata_eh_reset(struct ata_link *link, int classify,
        ap->pflags &= ~ATA_PFLAG_EH_PENDING;
        spin_unlock_irqrestore(link->ap->lock, flags);
 
+       if (ap->pflags & ATA_PFLAG_FROZEN)
+               ata_eh_thaw_port(ap);
+
        /*
         * Make sure onlineness and classification result correspond.
         * Hotplug could have happened during reset and some
index c0dd09d..eaa8a85 100644 (file)
@@ -291,7 +291,7 @@ static int pm_runtime_clk_notify(struct notifier_block *nb,
 {
        struct pm_clk_notifier_block *clknb;
        struct device *dev = data;
-       char *con_id;
+       char **con_id;
        int error;
 
        dev_dbg(dev, "%s() %ld\n", __func__, action);
@@ -309,8 +309,8 @@ static int pm_runtime_clk_notify(struct notifier_block *nb,
 
                dev->pwr_domain = clknb->pwr_domain;
                if (clknb->con_ids[0]) {
-                       for (con_id = clknb->con_ids[0]; *con_id; con_id++)
-                               pm_runtime_clk_add(dev, con_id);
+                       for (con_id = clknb->con_ids; *con_id; con_id++)
+                               pm_runtime_clk_add(dev, *con_id);
                } else {
                        pm_runtime_clk_add(dev, NULL);
                }
@@ -380,7 +380,7 @@ static int pm_runtime_clk_notify(struct notifier_block *nb,
 {
        struct pm_clk_notifier_block *clknb;
        struct device *dev = data;
-       char *con_id;
+       char **con_id;
 
        dev_dbg(dev, "%s() %ld\n", __func__, action);
 
@@ -389,16 +389,16 @@ static int pm_runtime_clk_notify(struct notifier_block *nb,
        switch (action) {
        case BUS_NOTIFY_ADD_DEVICE:
                if (clknb->con_ids[0]) {
-                       for (con_id = clknb->con_ids[0]; *con_id; con_id++)
-                               enable_clock(dev, con_id);
+                       for (con_id = clknb->con_ids; *con_id; con_id++)
+                               enable_clock(dev, *con_id);
                } else {
                        enable_clock(dev, NULL);
                }
                break;
        case BUS_NOTIFY_DEL_DEVICE:
                if (clknb->con_ids[0]) {
-                       for (con_id = clknb->con_ids[0]; *con_id; con_id++)
-                               disable_clock(dev, con_id);
+                       for (con_id = clknb->con_ids; *con_id; con_id++)
+                               disable_clock(dev, *con_id);
                } else {
                        disable_clock(dev, NULL);
                }
index f032e44..bfe7232 100644 (file)
@@ -108,7 +108,9 @@ done:
  */
 unsigned long __init find_ibft_region(unsigned long *sizep)
 {
+#ifdef CONFIG_ACPI
        int i;
+#endif
        ibft_addr = NULL;
 
 #ifdef CONFIG_ACPI
index 4a7f631..2967002 100644 (file)
@@ -87,32 +87,20 @@ config GPIO_IT8761E
          Say yes here to support GPIO functionality of IT8761E super I/O chip.
 
 config GPIO_EXYNOS4
-       bool "Samsung Exynos4 GPIO library support"
-       default y if CPU_EXYNOS4210
-       depends on ARM
-       help
-         Say yes here to support Samsung Exynos4 series SoCs GPIO library
+       def_bool y
+       depends on CPU_EXYNOS4210
 
 config GPIO_PLAT_SAMSUNG
-       bool "Samsung SoCs GPIO library support"
-       default y if SAMSUNG_GPIOLIB_4BIT
-       depends on ARM
-       help
-         Say yes here to support Samsung SoCs GPIO library
+       def_bool y
+       depends on SAMSUNG_GPIOLIB_4BIT
 
 config GPIO_S5PC100
-       bool "Samsung S5PC100 GPIO library support"
-       default y if CPU_S5PC100
-       depends on ARM
-       help
-         Say yes here to support Samsung S5PC100 SoCs GPIO library
+       def_bool y
+       depends on CPU_S5PC100
 
 config GPIO_S5PV210
-       bool "Samsung S5PV210/S5PC110 GPIO library support"
-       default y if CPU_S5PV210
-       depends on ARM
-       help
-         Say yes here to support Samsung S5PV210/S5PC110 SoCs GPIO library
+       def_bool y
+       depends on CPU_S5PV210
 
 config GPIO_PL061
        bool "PrimeCell PL061 GPIO support"
index d54ca6a..9029835 100644 (file)
 #include <plat/gpio-cfg.h>
 #include <plat/gpio-cfg-helpers.h>
 
+int s3c_gpio_setpull_exynos4(struct s3c_gpio_chip *chip,
+                               unsigned int off, s3c_gpio_pull_t pull)
+{
+       if (pull == S3C_GPIO_PULL_UP)
+               pull = 3;
+
+       return s3c_gpio_setpull_updown(chip, off, pull);
+}
+
+s3c_gpio_pull_t s3c_gpio_getpull_exynos4(struct s3c_gpio_chip *chip,
+                                               unsigned int off)
+{
+       s3c_gpio_pull_t pull;
+
+       pull = s3c_gpio_getpull_updown(chip, off);
+       if (pull == 3)
+               pull = S3C_GPIO_PULL_UP;
+
+       return pull;
+}
+
 static struct s3c_gpio_cfg gpio_cfg = {
        .set_config     = s3c_gpio_setcfg_s3c64xx_4bit,
-       .set_pull       = s3c_gpio_setpull_updown,
-       .get_pull       = s3c_gpio_getpull_updown,
+       .set_pull       = s3c_gpio_setpull_exynos4,
+       .get_pull       = s3c_gpio_getpull_exynos4,
 };
 
 static struct s3c_gpio_cfg gpio_cfg_noint = {
        .set_config     = s3c_gpio_setcfg_s3c64xx_4bit,
-       .set_pull       = s3c_gpio_setpull_updown,
-       .get_pull       = s3c_gpio_getpull_updown,
+       .set_pull       = s3c_gpio_setpull_exynos4,
+       .get_pull       = s3c_gpio_getpull_exynos4,
 };
 
 /*
index 4961ef9..2c212c7 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 2008,2009 STMicroelectronics
  * Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it>
  *   Rewritten based on work by Prafulla WADASKAR <prafulla.wadaskar@st.com>
+ * Copyright (C) 2011 Linus Walleij <linus.walleij@linaro.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -49,6 +50,7 @@ struct nmk_gpio_chip {
        u32 (*get_secondary_status)(unsigned int bank);
        void (*set_ioforce)(bool enable);
        spinlock_t lock;
+       bool sleepmode;
        /* Keep track of configured edges */
        u32 edge_rising;
        u32 edge_falling;
@@ -393,14 +395,25 @@ EXPORT_SYMBOL(nmk_config_pins_sleep);
  * @gpio: pin number
  * @mode: NMK_GPIO_SLPM_INPUT or NMK_GPIO_SLPM_NOCHANGE,
  *
- * Sets the sleep mode of a pin.  If @mode is NMK_GPIO_SLPM_INPUT, the pin is
- * changed to an input (with pullup/down enabled) in sleep and deep sleep.  If
- * @mode is NMK_GPIO_SLPM_NOCHANGE, the pin remains in the state it was
- * configured even when in sleep and deep sleep.
+ * This register is actually in the pinmux layer, not the GPIO block itself.
+ * The GPIO1B_SLPM register defines the GPIO mode when SLEEP/DEEP-SLEEP
+ * mode is entered (i.e. when signal IOFORCE is HIGH by the platform code).
+ * Each GPIO can be configured to be forced into GPIO mode when IOFORCE is
+ * HIGH, overriding the normal setting defined by GPIO_AFSELx registers.
+ * When IOFORCE returns LOW (by software, after SLEEP/DEEP-SLEEP exit),
+ * the GPIOs return to the normal setting defined by GPIO_AFSELx registers.
  *
- * On DB8500v2 onwards, this setting loses the previous meaning and instead
- * indicates if wakeup detection is enabled on the pin.  Note that
- * enable_irq_wake() will automatically enable wakeup detection.
+ * If @mode is NMK_GPIO_SLPM_INPUT, the corresponding GPIO is switched to GPIO
+ * mode when signal IOFORCE is HIGH (i.e. when SLEEP/DEEP-SLEEP mode is
+ * entered) regardless of the altfunction selected. Also wake-up detection is
+ * ENABLED.
+ *
+ * If @mode is NMK_GPIO_SLPM_NOCHANGE, the corresponding GPIO remains
+ * controlled by NMK_GPIO_DATC, NMK_GPIO_DATS, NMK_GPIO_DIR, NMK_GPIO_PDIS
+ * (for altfunction GPIO) or respective on-chip peripherals (for other
+ * altfuncs) when IOFORCE is HIGH. Also wake-up detection DISABLED.
+ *
+ * Note that enable_irq_wake() will automatically enable wakeup detection.
  */
 int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode)
 {
@@ -551,6 +564,12 @@ static void __nmk_gpio_irq_modify(struct nmk_gpio_chip *nmk_chip,
 static void __nmk_gpio_set_wake(struct nmk_gpio_chip *nmk_chip,
                                int gpio, bool on)
 {
+       if (nmk_chip->sleepmode) {
+               __nmk_gpio_set_slpm(nmk_chip, gpio - nmk_chip->chip.base,
+                                   on ? NMK_GPIO_SLPM_WAKEUP_ENABLE
+                                   : NMK_GPIO_SLPM_WAKEUP_DISABLE);
+       }
+
        __nmk_gpio_irq_modify(nmk_chip, gpio, WAKE, on);
 }
 
@@ -901,7 +920,7 @@ void nmk_gpio_wakeups_suspend(void)
                writel(chip->fwimsc & chip->real_wake,
                       chip->addr + NMK_GPIO_FWIMSC);
 
-               if (cpu_is_u8500v2()) {
+               if (chip->sleepmode) {
                        chip->slpm = readl(chip->addr + NMK_GPIO_SLPC);
 
                        /* 0 -> wakeup enable */
@@ -923,7 +942,7 @@ void nmk_gpio_wakeups_resume(void)
                writel(chip->rwimsc, chip->addr + NMK_GPIO_RWIMSC);
                writel(chip->fwimsc, chip->addr + NMK_GPIO_FWIMSC);
 
-               if (cpu_is_u8500v2())
+               if (chip->sleepmode)
                        writel(chip->slpm, chip->addr + NMK_GPIO_SLPC);
        }
 }
@@ -1010,6 +1029,7 @@ static int __devinit nmk_gpio_probe(struct platform_device *dev)
        nmk_chip->secondary_parent_irq = secondary_irq;
        nmk_chip->get_secondary_status = pdata->get_secondary_status;
        nmk_chip->set_ioforce = pdata->set_ioforce;
+       nmk_chip->sleepmode = pdata->supports_sleepmode;
        spin_lock_init(&nmk_chip->lock);
 
        chip = &nmk_chip->chip;
@@ -1065,5 +1085,3 @@ core_initcall(nmk_gpio_init);
 MODULE_AUTHOR("Prafulla WADASKAR and Alessandro Rubini");
 MODULE_DESCRIPTION("Nomadik GPIO Driver");
 MODULE_LICENSE("GPL");
-
-
index 6c51191..01f74a8 100644 (file)
@@ -432,7 +432,6 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
 {
        void __iomem *base = bank->base;
        u32 gpio_bit = 1 << gpio;
-       u32 val;
 
        if (cpu_is_omap44xx()) {
                MOD_REG_BIT(OMAP4_GPIO_LEVELDETECT0, gpio_bit,
@@ -455,15 +454,8 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
        }
        if (likely(!(bank->non_wakeup_gpios & gpio_bit))) {
                if (cpu_is_omap44xx()) {
-                       if (trigger != 0)
-                               __raw_writel(1 << gpio, bank->base+
-                                               OMAP4_GPIO_IRQWAKEN0);
-                       else {
-                               val = __raw_readl(bank->base +
-                                                       OMAP4_GPIO_IRQWAKEN0);
-                               __raw_writel(val & (~(1 << gpio)), bank->base +
-                                                        OMAP4_GPIO_IRQWAKEN0);
-                       }
+                       MOD_REG_BIT(OMAP4_GPIO_IRQWAKEN0, gpio_bit,
+                               trigger != 0);
                } else {
                        /*
                         * GPIO wakeup request can only be generated on edge
@@ -1134,8 +1126,11 @@ static void gpio_irq_shutdown(struct irq_data *d)
 {
        unsigned int gpio = d->irq - IH_GPIO_BASE;
        struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
+       unsigned long flags;
 
+       spin_lock_irqsave(&bank->lock, flags);
        _reset_gpio(bank, gpio);
+       spin_unlock_irqrestore(&bank->lock, flags);
 }
 
 static void gpio_ack_irq(struct irq_data *d)
@@ -1150,9 +1145,12 @@ static void gpio_mask_irq(struct irq_data *d)
 {
        unsigned int gpio = d->irq - IH_GPIO_BASE;
        struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
+       unsigned long flags;
 
+       spin_lock_irqsave(&bank->lock, flags);
        _set_gpio_irqenable(bank, gpio, 0);
        _set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE);
+       spin_unlock_irqrestore(&bank->lock, flags);
 }
 
 static void gpio_unmask_irq(struct irq_data *d)
@@ -1161,7 +1159,9 @@ static void gpio_unmask_irq(struct irq_data *d)
        struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
        unsigned int irq_mask = 1 << get_gpio_index(gpio);
        u32 trigger = irqd_get_trigger_type(d);
+       unsigned long flags;
 
+       spin_lock_irqsave(&bank->lock, flags);
        if (trigger)
                _set_gpio_triggering(bank, get_gpio_index(gpio), trigger);
 
@@ -1173,6 +1173,7 @@ static void gpio_unmask_irq(struct irq_data *d)
        }
 
        _set_gpio_irqenable(bank, gpio, 1);
+       spin_unlock_irqrestore(&bank->lock, flags);
 }
 
 static struct irq_chip gpio_irq_chip = {
@@ -1524,7 +1525,7 @@ static void omap_gpio_mod_init(struct gpio_bank *bank, int id)
        }
 }
 
-static void __init omap_gpio_chip_init(struct gpio_bank *bank)
+static void __devinit omap_gpio_chip_init(struct gpio_bank *bank)
 {
        int j;
        static int gpio;
index 8c19169..fae00c0 100644 (file)
@@ -228,6 +228,7 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
        parser.filp = filp;
        parser.rdev = rdev;
        parser.dev = rdev->dev;
+       parser.family = rdev->family;
        r = radeon_cs_parser_init(&parser, data);
        if (r) {
                DRM_ERROR("Failed to initialize parser !\n");
index d77ede3..e680501 100644 (file)
@@ -754,6 +754,7 @@ int radeon_device_init(struct radeon_device *rdev,
        dma_bits = rdev->need_dma32 ? 32 : 40;
        r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits));
        if (r) {
+               rdev->need_dma32 = true;
                printk(KERN_WARNING "radeon: No suitable DMA available.\n");
        }
 
index 1d33060..73dfbe8 100644 (file)
@@ -113,7 +113,7 @@ int radeon_benchmarking = 0;
 int radeon_testing = 0;
 int radeon_connector_table = 0;
 int radeon_tv = 1;
-int radeon_audio = 1;
+int radeon_audio = 0;
 int radeon_disp_priority = 0;
 int radeon_hw_i2c = 0;
 int radeon_pcie_gen2 = 0;
@@ -151,7 +151,7 @@ module_param_named(connector_table, radeon_connector_table, int, 0444);
 MODULE_PARM_DESC(tv, "TV enable (0 = disable)");
 module_param_named(tv, radeon_tv, int, 0444);
 
-MODULE_PARM_DESC(audio, "Audio enable (0 = disable)");
+MODULE_PARM_DESC(audio, "Audio enable (1 = enable)");
 module_param_named(audio, radeon_audio, int, 0444);
 
 MODULE_PARM_DESC(disp_priority, "Display Priority (0 = auto, 1 = normal, 2 = high)");
index 144d272..04b0956 100644 (file)
@@ -778,7 +778,8 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,
                                        sector_t block)
 {
        struct ide_cmd cmd;
-       int uptodate = 0, nsectors;
+       int uptodate = 0;
+       unsigned int nsectors;
 
        ide_debug_log(IDE_DBG_RQ, "cmd: 0x%x, block: %llu",
                                  rq->cmd[0], (unsigned long long)block);
index 3ccbff1..71a8eb6 100644 (file)
@@ -283,6 +283,7 @@ hfcsusb_ph_info(struct hfcsusb *hw)
        _queue_data(&dch->dev.D, MPH_INFORMATION_IND, MISDN_ID_ANY,
                sizeof(struct ph_info_dch) + dch->dev.nrbchan *
                sizeof(struct ph_info_ch), phi, GFP_ATOMIC);
+       kfree(phi);
 }
 
 /*
index 4dc1ca3..7c327b5 100644 (file)
@@ -60,8 +60,6 @@ static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen,
        int act_len, ret;
        u8 buf[64];
 
-       if (slen > sizeof(buf))
-               slen = sizeof(buf);
        memcpy(&buf[0], sbuf, slen);
        buf[60] = state->seq++;
 
@@ -180,30 +178,37 @@ static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
 {
        struct dvb_usb_device *d = i2c_get_adapdata(adap);
        int ret = 0, inc, i = 0;
+       u8 buf[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */
 
        if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
                return -EAGAIN;
 
        while (i < num) {
                if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
-                       u8 buf[6];
+                       if (msg[i].len > 2 || msg[i+1].len > 60) {
+                               ret = -EOPNOTSUPP;
+                               break;
+                       }
                        buf[0] = CMD_I2C_READ;
                        buf[1] = (msg[i].addr << 1) | 0x01;
                        buf[2] = msg[i].buf[0];
                        buf[3] = msg[i].buf[1];
                        buf[4] = msg[i].len-1;
                        buf[5] = msg[i+1].len;
-                       ret = anysee_ctrl_msg(d, buf, sizeof(buf), msg[i+1].buf,
+                       ret = anysee_ctrl_msg(d, buf, 6, msg[i+1].buf,
                                msg[i+1].len);
                        inc = 2;
                } else {
-                       u8 buf[4+msg[i].len];
+                       if (msg[i].len > 48) {
+                               ret = -EOPNOTSUPP;
+                               break;
+                       }
                        buf[0] = CMD_I2C_WRITE;
                        buf[1] = (msg[i].addr << 1);
                        buf[2] = msg[i].len;
                        buf[3] = 0x01;
                        memcpy(&buf[4], msg[i].buf, msg[i].len);
-                       ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
+                       ret = anysee_ctrl_msg(d, buf, 4 + msg[i].len, NULL, 0);
                        inc = 1;
                }
                if (ret)
index af5263c..7b42ace 100644 (file)
@@ -213,14 +213,14 @@ int __must_check media_devnode_register(struct media_devnode *mdev)
 
        /* Part 1: Find a free minor number */
        mutex_lock(&media_devnode_lock);
-       minor = find_next_zero_bit(media_devnode_nums, 0, MEDIA_NUM_DEVICES);
+       minor = find_next_zero_bit(media_devnode_nums, MEDIA_NUM_DEVICES, 0);
        if (minor == MEDIA_NUM_DEVICES) {
                mutex_unlock(&media_devnode_lock);
                printk(KERN_ERR "could not get a free minor\n");
                return -ENFILE;
        }
 
-       set_bit(mdev->minor, media_devnode_nums);
+       set_bit(minor, media_devnode_nums);
        mutex_unlock(&media_devnode_lock);
 
        mdev->minor = minor;
index 2354336..934185c 100644 (file)
@@ -25,8 +25,8 @@
 #include <linux/delay.h>
 #include <media/cx25840.h>
 #include <linux/firmware.h>
-#include <staging/altera.h>
 
+#include "../../../staging/altera-stapl/altera.h"
 #include "cx23885.h"
 #include "tuner-xc2028.h"
 #include "netup-init.h"
diff --git a/drivers/media/video/gspca/coarse_expo_autogain.h b/drivers/media/video/gspca/coarse_expo_autogain.h
deleted file mode 100644 (file)
index 1cb9d94..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Auto gain algorithm for camera's with a coarse exposure control
- *
- * Copyright (C) 2010 Hans de Goede <hdegoede@redhat.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-/* Autogain + exposure algorithm for cameras with a coarse exposure control
-   (usually this means we can only control the clockdiv to change exposure)
-   As changing the clockdiv so that the fps drops from 30 to 15 fps for
-   example, will lead to a huge exposure change (it effectively doubles),
-   this algorithm normally tries to only adjust the gain (between 40 and
-   80 %) and if that does not help, only then changes exposure. This leads
-   to a much more stable image then using the knee algorithm which at
-   certain points of the knee graph will only try to adjust exposure,
-   which leads to oscilating as one exposure step is huge.
-
-   Note this assumes that the sd struct for the cam in question has
-   exp_too_high_cnt and exp_too_high_cnt int members for use by this function.
-
-   Returns 0 if no changes were made, 1 if the gain and or exposure settings
-   where changed. */
-static int gspca_coarse_grained_expo_autogain(struct gspca_dev *gspca_dev,
-       int avg_lum, int desired_avg_lum, int deadzone)
-{
-       int i, steps, gain, orig_gain, exposure, orig_exposure;
-       int gain_low, gain_high;
-       const struct ctrl *gain_ctrl = NULL;
-       const struct ctrl *exposure_ctrl = NULL;
-       struct sd *sd = (struct sd *) gspca_dev;
-       int retval = 0;
-
-       for (i = 0; i < gspca_dev->sd_desc->nctrls; i++) {
-               if (gspca_dev->ctrl_dis & (1 << i))
-                       continue;
-               if (gspca_dev->sd_desc->ctrls[i].qctrl.id == V4L2_CID_GAIN)
-                       gain_ctrl = &gspca_dev->sd_desc->ctrls[i];
-               if (gspca_dev->sd_desc->ctrls[i].qctrl.id == V4L2_CID_EXPOSURE)
-                       exposure_ctrl = &gspca_dev->sd_desc->ctrls[i];
-       }
-       if (!gain_ctrl || !exposure_ctrl) {
-               PDEBUG(D_ERR, "Error: gspca_coarse_grained_expo_autogain "
-                       "called on cam without gain or exposure");
-               return 0;
-       }
-
-       if (gain_ctrl->get(gspca_dev, &gain) ||
-           exposure_ctrl->get(gspca_dev, &exposure))
-               return 0;
-
-       orig_gain = gain;
-       orig_exposure = exposure;
-       gain_low =
-               (gain_ctrl->qctrl.maximum - gain_ctrl->qctrl.minimum) / 5 * 2;
-       gain_low += gain_ctrl->qctrl.minimum;
-       gain_high =
-               (gain_ctrl->qctrl.maximum - gain_ctrl->qctrl.minimum) / 5 * 4;
-       gain_high += gain_ctrl->qctrl.minimum;
-
-       /* If we are of a multiple of deadzone, do multiple steps to reach the
-          desired lumination fast (with the risc of a slight overshoot) */
-       steps = (desired_avg_lum - avg_lum) / deadzone;
-
-       PDEBUG(D_FRAM, "autogain: lum: %d, desired: %d, steps: %d",
-               avg_lum, desired_avg_lum, steps);
-
-       if ((gain + steps) > gain_high &&
-           sd->exposure < exposure_ctrl->qctrl.maximum) {
-               gain = gain_high;
-               sd->exp_too_low_cnt++;
-       } else if ((gain + steps) < gain_low &&
-                  sd->exposure > exposure_ctrl->qctrl.minimum) {
-               gain = gain_low;
-               sd->exp_too_high_cnt++;
-       } else {
-               gain += steps;
-               if (gain > gain_ctrl->qctrl.maximum)
-                       gain = gain_ctrl->qctrl.maximum;
-               else if (gain < gain_ctrl->qctrl.minimum)
-                       gain = gain_ctrl->qctrl.minimum;
-               sd->exp_too_high_cnt = 0;
-               sd->exp_too_low_cnt = 0;
-       }
-
-       if (sd->exp_too_high_cnt > 3) {
-               exposure--;
-               sd->exp_too_high_cnt = 0;
-       } else if (sd->exp_too_low_cnt > 3) {
-               exposure++;
-               sd->exp_too_low_cnt = 0;
-       }
-
-       if (gain != orig_gain) {
-               gain_ctrl->set(gspca_dev, gain);
-               retval = 1;
-       }
-       if (exposure != orig_exposure) {
-               exposure_ctrl->set(gspca_dev, exposure);
-               retval = 1;
-       }
-
-       return retval;
-}
index 36a46fc..057e287 100644 (file)
@@ -609,7 +609,7 @@ static const struct v4l2_pix_format ovfx2_ov3610_mode[] = {
  * buffers, there are some pretty strict real time constraints for
  * isochronous transfer for larger frame sizes).
  */
-/*jfm: this value works well for 1600x1200, but not 800x600 - see isoc_init */
+/*jfm: this value does not work for 800x600 - see isoc_init */
 #define OVFX2_BULK_SIZE (13 * 4096)
 
 /* I2C registers */
@@ -3307,6 +3307,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
 
        gspca_dev->cam.ctrls = sd->ctrls;
        sd->quality = QUALITY_DEF;
+       sd->frame_rate = 15;
 
        return 0;
 }
@@ -3469,7 +3470,6 @@ static int sd_init(struct gspca_dev *gspca_dev)
                                ARRAY_SIZE(init_519_ov7660));
                write_i2c_regvals(sd, norm_7660, ARRAY_SIZE(norm_7660));
                sd->gspca_dev.curr_mode = 1;    /* 640x480 */
-               sd->frame_rate = 15;
                ov519_set_mode(sd);
                ov519_set_fr(sd);
                sd->ctrls[COLORS].max = 4;      /* 0..4 */
@@ -3511,7 +3511,7 @@ static int sd_isoc_init(struct gspca_dev *gspca_dev)
 
        switch (sd->bridge) {
        case BRIDGE_OVFX2:
-               if (gspca_dev->width == 1600)
+               if (gspca_dev->width != 800)
                        gspca_dev->cam.bulk_size = OVFX2_BULK_SIZE;
                else
                        gspca_dev->cam.bulk_size = 7 * 4096;
@@ -4478,7 +4478,7 @@ static void ovfx2_pkt_scan(struct gspca_dev *gspca_dev,
        gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
 
        /* A short read signals EOF */
-       if (len < OVFX2_BULK_SIZE) {
+       if (len < gspca_dev->cam.bulk_size) {
                /* If the frame is short, and it is one of the first ones
                   the sensor and bridge are still syncing, so drop it. */
                if (sd->first_frame) {
index 6415aff..81b8a60 100644 (file)
@@ -60,7 +60,7 @@ struct sd {
 
        u32 pktsz;                      /* (used by pkt_scan) */
        u16 npkt;
-       u8 nchg;
+       s8 nchg;
        s8 short_mark;
 
        u8 quality;                     /* image quality */
index b538dce..a14a84a 100644 (file)
 #define HDCS_SLEEP_MODE                (1 << 1)
 
 #define HDCS_DEFAULT_EXPOSURE  48
-#define HDCS_DEFAULT_GAIN      128
+#define HDCS_DEFAULT_GAIN      50
 
 static int hdcs_probe_1x00(struct sd *sd);
 static int hdcs_probe_1020(struct sd *sd);
index a4e4dfd..0fb7552 100644 (file)
@@ -1328,6 +1328,8 @@ int ivtv_init_on_first_open(struct ivtv *itv)
        if (!itv->has_cx23415)
                write_reg_sync(0x03, IVTV_REG_DMACONTROL);
 
+       ivtv_s_std_enc(itv, &itv->tuner_std);
+
        /* Default interrupts enabled. For the PVR350 this includes the
           decoder VSYNC interrupt, which is always on. It is not only used
           during decoding but also by the OSD.
@@ -1336,12 +1338,10 @@ int ivtv_init_on_first_open(struct ivtv *itv)
        if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) {
                ivtv_clear_irq_mask(itv, IVTV_IRQ_MASK_INIT | IVTV_IRQ_DEC_VSYNC);
                ivtv_set_osd_alpha(itv);
-       }
-       else
+               ivtv_s_std_dec(itv, &itv->tuner_std);
+       } else {
                ivtv_clear_irq_mask(itv, IVTV_IRQ_MASK_INIT);
-
-       /* For cards with video out, this call needs interrupts enabled */
-       ivtv_s_std(NULL, &fh, &itv->tuner_std);
+       }
 
        /* Setup initial controls */
        cx2341x_handler_setup(&itv->cxhdl);
index 14a1cea..02c5ade 100644 (file)
@@ -280,8 +280,6 @@ int ivtv_firmware_restart(struct ivtv *itv)
 {
        int rc = 0;
        v4l2_std_id std;
-       struct ivtv_open_id fh;
-       fh.itv = itv;
 
        if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)
                /* Display test image during restart */
@@ -301,14 +299,19 @@ int ivtv_firmware_restart(struct ivtv *itv)
        /* Allow settings to reload */
        ivtv_mailbox_cache_invalidate(itv);
 
-       /* Restore video standard */
+       /* Restore encoder video standard */
        std = itv->std;
        itv->std = 0;
-       ivtv_s_std(NULL, &fh, &std);
+       ivtv_s_std_enc(itv, &std);
 
        if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) {
                ivtv_init_mpeg_decoder(itv);
 
+               /* Restore decoder video standard */
+               std = itv->std_out;
+               itv->std_out = 0;
+               ivtv_s_std_dec(itv, &std);
+
                /* Restore framebuffer if active */
                if (itv->ivtvfb_restore)
                        itv->ivtvfb_restore(itv);
index 1689783..f9e347d 100644 (file)
@@ -1071,28 +1071,8 @@ static int ivtv_g_std(struct file *file, void *fh, v4l2_std_id *std)
        return 0;
 }
 
-int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std)
+void ivtv_s_std_enc(struct ivtv *itv, v4l2_std_id *std)
 {
-       DEFINE_WAIT(wait);
-       struct ivtv *itv = fh2id(fh)->itv;
-       struct yuv_playback_info *yi = &itv->yuv_info;
-       int f;
-
-       if ((*std & V4L2_STD_ALL) == 0)
-               return -EINVAL;
-
-       if (*std == itv->std)
-               return 0;
-
-       if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ||
-           atomic_read(&itv->capturing) > 0 ||
-           atomic_read(&itv->decoding) > 0) {
-               /* Switching standard would turn off the radio or mess
-                  with already running streams, prevent that by
-                  returning EBUSY. */
-               return -EBUSY;
-       }
-
        itv->std = *std;
        itv->is_60hz = (*std & V4L2_STD_525_60) ? 1 : 0;
        itv->is_50hz = !itv->is_60hz;
@@ -1106,48 +1086,79 @@ int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std)
        if (itv->hw_flags & IVTV_HW_CX25840)
                itv->vbi.sliced_decoder_line_size = itv->is_60hz ? 272 : 284;
 
-       IVTV_DEBUG_INFO("Switching standard to %llx.\n", (unsigned long long)itv->std);
-
        /* Tuner */
        ivtv_call_all(itv, core, s_std, itv->std);
+}
 
-       if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) {
-               /* set display standard */
-               itv->std_out = *std;
-               itv->is_out_60hz = itv->is_60hz;
-               itv->is_out_50hz = itv->is_50hz;
-               ivtv_call_all(itv, video, s_std_output, itv->std_out);
-
-               /*
-                * The next firmware call is time sensitive. Time it to
-                * avoid risk of a hard lock, by trying to ensure the call
-                * happens within the first 100 lines of the top field.
-                * Make 4 attempts to sync to the decoder before giving up.
-                */
-               for (f = 0; f < 4; f++) {
-                       prepare_to_wait(&itv->vsync_waitq, &wait,
-                                       TASK_UNINTERRUPTIBLE);
-                       if ((read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16) < 100)
-                               break;
-                       schedule_timeout(msecs_to_jiffies(25));
-               }
-               finish_wait(&itv->vsync_waitq, &wait);
-
-               if (f == 4)
-                       IVTV_WARN("Mode change failed to sync to decoder\n");
-
-               ivtv_vapi(itv, CX2341X_DEC_SET_STANDARD, 1, itv->is_out_50hz);
-               itv->main_rect.left = itv->main_rect.top = 0;
-               itv->main_rect.width = 720;
-               itv->main_rect.height = itv->cxhdl.height;
-               ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
-                       720, itv->main_rect.height, 0, 0);
-               yi->main_rect = itv->main_rect;
-               if (!itv->osd_info) {
-                       yi->osd_full_w = 720;
-                       yi->osd_full_h = itv->is_out_50hz ? 576 : 480;
-               }
+void ivtv_s_std_dec(struct ivtv *itv, v4l2_std_id *std)
+{
+       struct yuv_playback_info *yi = &itv->yuv_info;
+       DEFINE_WAIT(wait);
+       int f;
+
+       /* set display standard */
+       itv->std_out = *std;
+       itv->is_out_60hz = (*std & V4L2_STD_525_60) ? 1 : 0;
+       itv->is_out_50hz = !itv->is_out_60hz;
+       ivtv_call_all(itv, video, s_std_output, itv->std_out);
+
+       /*
+        * The next firmware call is time sensitive. Time it to
+        * avoid risk of a hard lock, by trying to ensure the call
+        * happens within the first 100 lines of the top field.
+        * Make 4 attempts to sync to the decoder before giving up.
+        */
+       for (f = 0; f < 4; f++) {
+               prepare_to_wait(&itv->vsync_waitq, &wait,
+                               TASK_UNINTERRUPTIBLE);
+               if ((read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16) < 100)
+                       break;
+               schedule_timeout(msecs_to_jiffies(25));
        }
+       finish_wait(&itv->vsync_waitq, &wait);
+
+       if (f == 4)
+               IVTV_WARN("Mode change failed to sync to decoder\n");
+
+       ivtv_vapi(itv, CX2341X_DEC_SET_STANDARD, 1, itv->is_out_50hz);
+       itv->main_rect.left = 0;
+       itv->main_rect.top = 0;
+       itv->main_rect.width = 720;
+       itv->main_rect.height = itv->is_out_50hz ? 576 : 480;
+       ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
+               720, itv->main_rect.height, 0, 0);
+       yi->main_rect = itv->main_rect;
+       if (!itv->osd_info) {
+               yi->osd_full_w = 720;
+               yi->osd_full_h = itv->is_out_50hz ? 576 : 480;
+       }
+}
+
+int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std)
+{
+       struct ivtv *itv = fh2id(fh)->itv;
+
+       if ((*std & V4L2_STD_ALL) == 0)
+               return -EINVAL;
+
+       if (*std == itv->std)
+               return 0;
+
+       if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ||
+           atomic_read(&itv->capturing) > 0 ||
+           atomic_read(&itv->decoding) > 0) {
+               /* Switching standard would mess with already running
+                  streams, prevent that by returning EBUSY. */
+               return -EBUSY;
+       }
+
+       IVTV_DEBUG_INFO("Switching standard to %llx.\n",
+               (unsigned long long)itv->std);
+
+       ivtv_s_std_enc(itv, std);
+       if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)
+               ivtv_s_std_dec(itv, std);
+
        return 0;
 }
 
index 58f0034..89185ca 100644 (file)
@@ -27,7 +27,8 @@ u16 ivtv_get_service_set(struct v4l2_sliced_vbi_format *fmt);
 void ivtv_set_osd_alpha(struct ivtv *itv);
 int ivtv_set_speed(struct ivtv *itv, int speed);
 void ivtv_set_funcs(struct video_device *vdev);
-int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std);
+void ivtv_s_std_enc(struct ivtv *itv, v4l2_std_id *std);
+void ivtv_s_std_dec(struct ivtv *itv, v4l2_std_id *std);
 int ivtv_s_frequency(struct file *file, void *fh, struct v4l2_frequency *vf);
 int ivtv_s_input(struct file *file, void *fh, unsigned int inp);
 long ivtv_v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
index 9426833..e7794dc 100644 (file)
@@ -589,7 +589,7 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s)
                v4l2_subdev_call(itv->sd_audio, audio, s_stream, 1);
                /* Avoid unpredictable PCI bus hang - disable video clocks */
                v4l2_subdev_call(itv->sd_video, video, s_stream, 0);
-               ivtv_msleep_timeout(300, 1);
+               ivtv_msleep_timeout(300, 0);
                ivtv_vapi(itv, CX2341X_ENC_INITIALIZE_INPUT, 0);
                v4l2_subdev_call(itv->sd_video, video, s_stream, 1);
        }
@@ -834,7 +834,7 @@ int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end)
                }
 
                /* Handle any pending interrupts */
-               ivtv_msleep_timeout(100, 1);
+               ivtv_msleep_timeout(100, 0);
        }
 
        atomic_dec(&itv->capturing);
index b6eb51c..293db80 100644 (file)
@@ -71,7 +71,7 @@ static void ivtv_set_wss(struct ivtv *itv, int enabled, int mode)
           Turning this signal on and off can confuse certain
           TVs. As far as I can tell there is no reason not to
           transmit this signal. */
-       if ((itv->std & V4L2_STD_625_50) && !enabled) {
+       if ((itv->std_out & V4L2_STD_625_50) && !enabled) {
                enabled = 1;
                mode = 0x08;  /* 4x3 full format */
        }
index 1724745..6b7c9c8 100644 (file)
@@ -247,7 +247,7 @@ static int ivtvfb_set_osd_coords(struct ivtv *itv, const struct ivtv_osd_coords
 
 static int ivtvfb_set_display_window(struct ivtv *itv, struct v4l2_rect *ivtv_window)
 {
-       int osd_height_limit = itv->is_50hz ? 576 : 480;
+       int osd_height_limit = itv->is_out_50hz ? 576 : 480;
 
        /* Only fail if resolution too high, otherwise fudge the start coords. */
        if ((ivtv_window->height > osd_height_limit) || (ivtv_window->width > IVTV_OSD_MAX_WIDTH))
@@ -471,9 +471,9 @@ static int ivtvfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long ar
                        vblank.flags = FB_VBLANK_HAVE_COUNT |FB_VBLANK_HAVE_VCOUNT |
                                        FB_VBLANK_HAVE_VSYNC;
                        trace = read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16;
-                       if (itv->is_50hz && trace > 312)
+                       if (itv->is_out_50hz && trace > 312)
                                trace -= 312;
-                       else if (itv->is_60hz && trace > 262)
+                       else if (itv->is_out_60hz && trace > 262)
                                trace -= 262;
                        if (trace == 1)
                                vblank.flags |= FB_VBLANK_VSYNCING;
@@ -656,7 +656,7 @@ static int _ivtvfb_check_var(struct fb_var_screeninfo *var, struct ivtv *itv)
        IVTVFB_DEBUG_INFO("ivtvfb_check_var\n");
 
        /* Set base references for mode calcs. */
-       if (itv->is_50hz) {
+       if (itv->is_out_50hz) {
                pixclock = 84316;
                hlimit = 776;
                vlimit = 591;
@@ -784,12 +784,12 @@ static int _ivtvfb_check_var(struct fb_var_screeninfo *var, struct ivtv *itv)
           If the margins are too large, just center the screen
           (enforcing margins causes too many problems) */
 
-       if (var->left_margin + var->xres > IVTV_OSD_MAX_WIDTH + 1) {
+       if (var->left_margin + var->xres > IVTV_OSD_MAX_WIDTH + 1)
                var->left_margin = 1 + ((IVTV_OSD_MAX_WIDTH - var->xres) / 2);
-       }
-       if (var->upper_margin + var->yres > (itv->is_50hz ? 577 : 481)) {
-               var->upper_margin = 1 + (((itv->is_50hz ? 576 : 480) - var->yres) / 2);
-       }
+
+       if (var->upper_margin + var->yres > (itv->is_out_50hz ? 577 : 481))
+               var->upper_margin = 1 + (((itv->is_out_50hz ? 576 : 480) -
+                       var->yres) / 2);
 
        /* Maintain overall 'size' for a constant refresh rate */
        var->right_margin = hlimit - var->left_margin - var->xres;
@@ -836,7 +836,12 @@ static int ivtvfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *inf
        u32 osd_pan_index;
        struct ivtv *itv = (struct ivtv *) info->par;
 
-       osd_pan_index = (var->xoffset + (var->yoffset * var->xres_virtual))*var->bits_per_pixel/8;
+       if (var->yoffset + info->var.yres > info->var.yres_virtual ||
+           var->xoffset + info->var.xres > info->var.xres_virtual)
+               return -EINVAL;
+
+       osd_pan_index = var->yoffset * info->fix.line_length
+                     + var->xoffset * info->var.bits_per_pixel / 8;
        write_reg(osd_pan_index, 0x02A0C);
 
        /* Pass this info back the yuv handler */
@@ -1003,19 +1008,21 @@ static int ivtvfb_init_vidmode(struct ivtv *itv)
        /* Hardware coords start at 0, user coords start at 1. */
        osd_left--;
 
-       start_window.left = osd_left >= 0 ? osd_left : ((IVTV_OSD_MAX_WIDTH - start_window.width) / 2);
+       start_window.left = osd_left >= 0 ?
+                osd_left : ((IVTV_OSD_MAX_WIDTH - start_window.width) / 2);
 
        oi->display_byte_stride =
                        start_window.width * oi->bytes_per_pixel;
 
        /* Vertical size & position */
 
-       max_height = itv->is_50hz ? 576 : 480;
+       max_height = itv->is_out_50hz ? 576 : 480;
 
        if (osd_yres > max_height)
                osd_yres = max_height;
 
-       start_window.height = osd_yres ? osd_yres : itv->is_50hz ? 480 : 400;
+       start_window.height = osd_yres ?
+               osd_yres : itv->is_out_50hz ? 480 : 400;
 
        /* Check vertical start (osd_upper). */
        if (osd_upper + start_window.height > max_height + 1) {
index 472a693..c9fd04e 100644 (file)
@@ -391,7 +391,7 @@ static inline void isp_isr_dbg(struct isp_device *isp, u32 irqstatus)
        };
        int i;
 
-       dev_dbg(isp->dev, "");
+       dev_dbg(isp->dev, "ISP IRQ: ");
 
        for (i = 0; i < ARRAY_SIZE(name); i++) {
                if ((1 << i) & irqstatus)
index 3988643..4e4d412 100644 (file)
@@ -1512,7 +1512,7 @@ static int video_dev_create(struct soc_camera_device *icd)
  */
 static int soc_camera_video_start(struct soc_camera_device *icd)
 {
-       struct device_type *type = icd->vdev->dev.type;
+       const struct device_type *type = icd->vdev->dev.type;
        int ret;
 
        if (!icd->dev.parent)
index ede7852..c3ab0c8 100644 (file)
@@ -30,7 +30,7 @@ static int uvc_mc_register_entity(struct uvc_video_chain *chain,
        struct uvc_entity *remote;
        unsigned int i;
        u8 remote_pad;
-       int ret;
+       int ret = 0;
 
        for (i = 0; i < entity->num_pads; ++i) {
                struct media_entity *source;
index 0c9217f..7b3e23f 100644 (file)
@@ -50,7 +50,7 @@ static const char version[] =
 #ifdef __arm__
 static void write_rreg(u_long base, u_int reg, u_int val)
 {
-       __asm__(
+       asm volatile(
        "str%?h %1, [%2]        @ NET_RAP\n\t"
        "str%?h %0, [%2, #-4]   @ NET_RDP"
        :
@@ -60,7 +60,7 @@ static void write_rreg(u_long base, u_int reg, u_int val)
 static inline unsigned short read_rreg(u_long base_addr, u_int reg)
 {
        unsigned short v;
-       __asm__(
+       asm volatile(
        "str%?h %1, [%2]        @ NET_RAP\n\t"
        "ldr%?h %0, [%2, #-4]   @ NET_RDP"
        : "=r" (v)
@@ -70,7 +70,7 @@ static inline unsigned short read_rreg(u_long base_addr, u_int reg)
 
 static inline void write_ireg(u_long base, u_int reg, u_int val)
 {
-       __asm__(
+       asm volatile(
        "str%?h %1, [%2]        @ NET_RAP\n\t"
        "str%?h %0, [%2, #8]    @ NET_IDP"
        :
@@ -80,7 +80,7 @@ static inline void write_ireg(u_long base, u_int reg, u_int val)
 static inline unsigned short read_ireg(u_long base_addr, u_int reg)
 {
        u_short v;
-       __asm__(
+       asm volatile(
        "str%?h %1, [%2]        @ NAT_RAP\n\t"
        "ldr%?h %0, [%2, #8]    @ NET_IDP\n\t"
        : "=r" (v)
@@ -91,47 +91,48 @@ static inline unsigned short read_ireg(u_long base_addr, u_int reg)
 #define am_writeword(dev,off,val) __raw_writew(val, ISAMEM_BASE + ((off) << 1))
 #define am_readword(dev,off)      __raw_readw(ISAMEM_BASE + ((off) << 1))
 
-static inline void
+static void
 am_writebuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned int length)
 {
        offset = ISAMEM_BASE + (offset << 1);
        length = (length + 1) & ~1;
        if ((int)buf & 2) {
-               __asm__ __volatile__("str%?h    %2, [%0], #4"
+               asm volatile("str%?h    %2, [%0], #4"
                 : "=&r" (offset) : "0" (offset), "r" (buf[0] | (buf[1] << 8)));
                buf += 2;
                length -= 2;
        }
        while (length > 8) {
-               unsigned int tmp, tmp2;
-               __asm__ __volatile__(
-                       "ldm%?ia        %1!, {%2, %3}\n\t"
+               register unsigned int tmp asm("r2"), tmp2 asm("r3");
+               asm volatile(
+                       "ldm%?ia        %0!, {%1, %2}"
+                       : "+r" (buf), "=&r" (tmp), "=&r" (tmp2));
+               length -= 8;
+               asm volatile(
+                       "str%?h %1, [%0], #4\n\t"
+                       "mov%?  %1, %1, lsr #16\n\t"
+                       "str%?h %1, [%0], #4\n\t"
                        "str%?h %2, [%0], #4\n\t"
                        "mov%?  %2, %2, lsr #16\n\t"
-                       "str%?h %2, [%0], #4\n\t"
-                       "str%?h %3, [%0], #4\n\t"
-                       "mov%?  %3, %3, lsr #16\n\t"
-                       "str%?h %3, [%0], #4"
-               : "=&r" (offset), "=&r" (buf), "=r" (tmp), "=r" (tmp2)
-               : "0" (offset), "1" (buf));
-               length -= 8;
+                       "str%?h %2, [%0], #4"
+               : "+r" (offset), "=&r" (tmp), "=&r" (tmp2));
        }
        while (length > 0) {
-               __asm__ __volatile__("str%?h    %2, [%0], #4"
+               asm volatile("str%?h    %2, [%0], #4"
                 : "=&r" (offset) : "0" (offset), "r" (buf[0] | (buf[1] << 8)));
                buf += 2;
                length -= 2;
        }
 }
 
-static inline void
+static void
 am_readbuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned int length)
 {
        offset = ISAMEM_BASE + (offset << 1);
        length = (length + 1) & ~1;
        if ((int)buf & 2) {
                unsigned int tmp;
-               __asm__ __volatile__(
+               asm volatile(
                        "ldr%?h %2, [%0], #4\n\t"
                        "str%?b %2, [%1], #1\n\t"
                        "mov%?  %2, %2, lsr #8\n\t"
@@ -140,12 +141,12 @@ am_readbuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned
                length -= 2;
        }
        while (length > 8) {
-               unsigned int tmp, tmp2, tmp3;
-               __asm__ __volatile__(
+               register unsigned int tmp asm("r2"), tmp2 asm("r3"), tmp3;
+               asm volatile(
                        "ldr%?h %2, [%0], #4\n\t"
+                       "ldr%?h %4, [%0], #4\n\t"
                        "ldr%?h %3, [%0], #4\n\t"
-                       "orr%?  %2, %2, %3, lsl #16\n\t"
-                       "ldr%?h %3, [%0], #4\n\t"
+                       "orr%?  %2, %2, %4, lsl #16\n\t"
                        "ldr%?h %4, [%0], #4\n\t"
                        "orr%?  %3, %3, %4, lsl #16\n\t"
                        "stm%?ia        %1!, {%2, %3}"
@@ -155,7 +156,7 @@ am_readbuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned
        }
        while (length > 0) {
                unsigned int tmp;
-               __asm__ __volatile__(
+               asm volatile(
                        "ldr%?h %2, [%0], #4\n\t"
                        "str%?b %2, [%1], #1\n\t"
                        "mov%?  %2, %2, lsr #8\n\t"
@@ -196,6 +197,42 @@ am79c961_ramtest(struct net_device *dev, unsigned int val)
        return errorcount;
 }
 
+static void am79c961_mc_hash(char *addr, u16 *hash)
+{
+       if (addr[0] & 0x01) {
+               int idx, bit;
+               u32 crc;
+
+               crc = ether_crc_le(ETH_ALEN, addr);
+
+               idx = crc >> 30;
+               bit = (crc >> 26) & 15;
+
+               hash[idx] |= 1 << bit;
+       }
+}
+
+static unsigned int am79c961_get_rx_mode(struct net_device *dev, u16 *hash)
+{
+       unsigned int mode = MODE_PORT_10BT;
+
+       if (dev->flags & IFF_PROMISC) {
+               mode |= MODE_PROMISC;
+               memset(hash, 0xff, 4 * sizeof(*hash));
+       } else if (dev->flags & IFF_ALLMULTI) {
+               memset(hash, 0xff, 4 * sizeof(*hash));
+       } else {
+               struct netdev_hw_addr *ha;
+
+               memset(hash, 0, 4 * sizeof(*hash));
+
+               netdev_for_each_mc_addr(ha, dev)
+                       am79c961_mc_hash(ha->addr, hash);
+       }
+
+       return mode;
+}
+
 static void
 am79c961_init_for_open(struct net_device *dev)
 {
@@ -203,6 +240,7 @@ am79c961_init_for_open(struct net_device *dev)
        unsigned long flags;
        unsigned char *p;
        u_int hdr_addr, first_free_addr;
+       u16 multi_hash[4], mode = am79c961_get_rx_mode(dev, multi_hash);
        int i;
 
        /*
@@ -218,16 +256,12 @@ am79c961_init_for_open(struct net_device *dev)
        write_ireg (dev->base_addr, 2, 0x0000); /* MODE register selects media */
 
        for (i = LADRL; i <= LADRH; i++)
-               write_rreg (dev->base_addr, i, 0);
+               write_rreg (dev->base_addr, i, multi_hash[i - LADRL]);
 
        for (i = PADRL, p = dev->dev_addr; i <= PADRH; i++, p += 2)
                write_rreg (dev->base_addr, i, p[0] | (p[1] << 8));
 
-       i = MODE_PORT_10BT;
-       if (dev->flags & IFF_PROMISC)
-               i |= MODE_PROMISC;
-
-       write_rreg (dev->base_addr, MODE, i);
+       write_rreg (dev->base_addr, MODE, mode);
        write_rreg (dev->base_addr, POLLINT, 0);
        write_rreg (dev->base_addr, SIZERXR, -RX_BUFFERS);
        write_rreg (dev->base_addr, SIZETXR, -TX_BUFFERS);
@@ -340,21 +374,6 @@ am79c961_close(struct net_device *dev)
        return 0;
 }
 
-static void am79c961_mc_hash(char *addr, unsigned short *hash)
-{
-       if (addr[0] & 0x01) {
-               int idx, bit;
-               u32 crc;
-
-               crc = ether_crc_le(ETH_ALEN, addr);
-
-               idx = crc >> 30;
-               bit = (crc >> 26) & 15;
-
-               hash[idx] |= 1 << bit;
-       }
-}
-
 /*
  * Set or clear promiscuous/multicast mode filter for this adapter.
  */
@@ -362,24 +381,9 @@ static void am79c961_setmulticastlist (struct net_device *dev)
 {
        struct dev_priv *priv = netdev_priv(dev);
        unsigned long flags;
-       unsigned short multi_hash[4], mode;
+       u16 multi_hash[4], mode = am79c961_get_rx_mode(dev, multi_hash);
        int i, stopped;
 
-       mode = MODE_PORT_10BT;
-
-       if (dev->flags & IFF_PROMISC) {
-               mode |= MODE_PROMISC;
-       } else if (dev->flags & IFF_ALLMULTI) {
-               memset(multi_hash, 0xff, sizeof(multi_hash));
-       } else {
-               struct netdev_hw_addr *ha;
-
-               memset(multi_hash, 0x00, sizeof(multi_hash));
-
-               netdev_for_each_mc_addr(ha, dev)
-                       am79c961_mc_hash(ha->addr, multi_hash);
-       }
-
        spin_lock_irqsave(&priv->chip_lock, flags);
 
        stopped = read_rreg(dev->base_addr, CSR0) & CSR0_STOP;
index 5a77001..0b46b8e 100644 (file)
@@ -283,10 +283,14 @@ static int ep93xx_rx(struct net_device *dev, int processed, int budget)
 
                skb = dev_alloc_skb(length + 2);
                if (likely(skb != NULL)) {
+                       struct ep93xx_rdesc *rxd = &ep->descs->rdesc[entry];
                        skb_reserve(skb, 2);
-                       dma_sync_single_for_cpu(NULL, ep->descs->rdesc[entry].buf_addr,
+                       dma_sync_single_for_cpu(dev->dev.parent, rxd->buf_addr,
                                                length, DMA_FROM_DEVICE);
                        skb_copy_to_linear_data(skb, ep->rx_buf[entry], length);
+                       dma_sync_single_for_device(dev->dev.parent,
+                                                  rxd->buf_addr, length,
+                                                  DMA_FROM_DEVICE);
                        skb_put(skb, length);
                        skb->protocol = eth_type_trans(skb, dev);
 
@@ -348,6 +352,7 @@ poll_some_more:
 static int ep93xx_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct ep93xx_priv *ep = netdev_priv(dev);
+       struct ep93xx_tdesc *txd;
        int entry;
 
        if (unlikely(skb->len > MAX_PKT_SIZE)) {
@@ -359,11 +364,14 @@ static int ep93xx_xmit(struct sk_buff *skb, struct net_device *dev)
        entry = ep->tx_pointer;
        ep->tx_pointer = (ep->tx_pointer + 1) & (TX_QUEUE_ENTRIES - 1);
 
-       ep->descs->tdesc[entry].tdesc1 =
-               TDESC1_EOF | (entry << 16) | (skb->len & 0xfff);
+       txd = &ep->descs->tdesc[entry];
+
+       txd->tdesc1 = TDESC1_EOF | (entry << 16) | (skb->len & 0xfff);
+       dma_sync_single_for_cpu(dev->dev.parent, txd->buf_addr, skb->len,
+                               DMA_TO_DEVICE);
        skb_copy_and_csum_dev(skb, ep->tx_buf[entry]);
-       dma_sync_single_for_cpu(NULL, ep->descs->tdesc[entry].buf_addr,
-                               skb->len, DMA_TO_DEVICE);
+       dma_sync_single_for_device(dev->dev.parent, txd->buf_addr, skb->len,
+                                  DMA_TO_DEVICE);
        dev_kfree_skb(skb);
 
        spin_lock_irq(&ep->tx_pending_lock);
@@ -457,89 +465,80 @@ static irqreturn_t ep93xx_irq(int irq, void *dev_id)
 
 static void ep93xx_free_buffers(struct ep93xx_priv *ep)
 {
+       struct device *dev = ep->dev->dev.parent;
        int i;
 
-       for (i = 0; i < RX_QUEUE_ENTRIES; i += 2) {
+       for (i = 0; i < RX_QUEUE_ENTRIES; i++) {
                dma_addr_t d;
 
                d = ep->descs->rdesc[i].buf_addr;
                if (d)
-                       dma_unmap_single(NULL, d, PAGE_SIZE, DMA_FROM_DEVICE);
+                       dma_unmap_single(dev, d, PKT_BUF_SIZE, DMA_FROM_DEVICE);
 
                if (ep->rx_buf[i] != NULL)
-                       free_page((unsigned long)ep->rx_buf[i]);
+                       kfree(ep->rx_buf[i]);
        }
 
-       for (i = 0; i < TX_QUEUE_ENTRIES; i += 2) {
+       for (i = 0; i < TX_QUEUE_ENTRIES; i++) {
                dma_addr_t d;
 
                d = ep->descs->tdesc[i].buf_addr;
                if (d)
-                       dma_unmap_single(NULL, d, PAGE_SIZE, DMA_TO_DEVICE);
+                       dma_unmap_single(dev, d, PKT_BUF_SIZE, DMA_TO_DEVICE);
 
                if (ep->tx_buf[i] != NULL)
-                       free_page((unsigned long)ep->tx_buf[i]);
+                       kfree(ep->tx_buf[i]);
        }
 
-       dma_free_coherent(NULL, sizeof(struct ep93xx_descs), ep->descs,
+       dma_free_coherent(dev, sizeof(struct ep93xx_descs), ep->descs,
                                                        ep->descs_dma_addr);
 }
 
-/*
- * The hardware enforces a sub-2K maximum packet size, so we put
- * two buffers on every hardware page.
- */
 static int ep93xx_alloc_buffers(struct ep93xx_priv *ep)
 {
+       struct device *dev = ep->dev->dev.parent;
        int i;
 
-       ep->descs = dma_alloc_coherent(NULL, sizeof(struct ep93xx_descs),
-                               &ep->descs_dma_addr, GFP_KERNEL | GFP_DMA);
+       ep->descs = dma_alloc_coherent(dev, sizeof(struct ep93xx_descs),
+                               &ep->descs_dma_addr, GFP_KERNEL);
        if (ep->descs == NULL)
                return 1;
 
-       for (i = 0; i < RX_QUEUE_ENTRIES; i += 2) {
-               void *page;
+       for (i = 0; i < RX_QUEUE_ENTRIES; i++) {
+               void *buf;
                dma_addr_t d;
 
-               page = (void *)__get_free_page(GFP_KERNEL | GFP_DMA);
-               if (page == NULL)
+               buf = kmalloc(PKT_BUF_SIZE, GFP_KERNEL);
+               if (buf == NULL)
                        goto err;
 
-               d = dma_map_single(NULL, page, PAGE_SIZE, DMA_FROM_DEVICE);
-               if (dma_mapping_error(NULL, d)) {
-                       free_page((unsigned long)page);
+               d = dma_map_single(dev, buf, PKT_BUF_SIZE, DMA_FROM_DEVICE);
+               if (dma_mapping_error(dev, d)) {
+                       kfree(buf);
                        goto err;
                }
 
-               ep->rx_buf[i] = page;
+               ep->rx_buf[i] = buf;
                ep->descs->rdesc[i].buf_addr = d;
                ep->descs->rdesc[i].rdesc1 = (i << 16) | PKT_BUF_SIZE;
-
-               ep->rx_buf[i + 1] = page + PKT_BUF_SIZE;
-               ep->descs->rdesc[i + 1].buf_addr = d + PKT_BUF_SIZE;
-               ep->descs->rdesc[i + 1].rdesc1 = ((i + 1) << 16) | PKT_BUF_SIZE;
        }
 
-       for (i = 0; i < TX_QUEUE_ENTRIES; i += 2) {
-               void *page;
+       for (i = 0; i < TX_QUEUE_ENTRIES; i++) {
+               void *buf;
                dma_addr_t d;
 
-              &nbs